diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index 3597c3f47734..a7fad7e7e6c7 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -6,6 +6,7 @@ use App\Http\Requests\CreatePaymentRequest; use App\Http\Requests\PaymentRequest; use App\Http\Requests\UpdatePaymentRequest; use App\Models\Client; +use App\Models\Credit; use App\Models\Invoice; use App\Ninja\Datatables\PaymentDatatable; use App\Ninja\Mailers\ContactMailer; @@ -180,17 +181,28 @@ class PaymentController extends BaseController { // check payment has been marked sent $request->invoice->markSentIfUnsent(); - $input = $request->input(); - $input['invoice_id'] = Invoice::getPrivateId($input['invoice']); - $input['client_id'] = Client::getPrivateId($input['client']); - $payment = $this->paymentRepo->save($input); + $amount = Utils::parseFloat($input['amount']); + $credit = false; + + // if the payment amount is more than the balance create a credit + if ($amount > $request->invoice->balance) { + $credit = Credit::createNew(); + $credit->client_id = $request->invoice->client_id; + $credit->credit_date = date_create()->format('Y-m-d'); + $credit->amount = $credit->balance = $amount - $request->invoice->balance; + $credit->private_notes = trans('texts.credit_created_by', ['transaction_reference' => $input['transaction_reference']]); + $credit->save(); + $input['amount'] = $request->invoice->balance; + } + + $payment = $this->paymentService->save($input); if (Input::get('email_receipt')) { $this->contactMailer->sendPaymentConfirmation($payment); - Session::flash('message', trans('texts.created_payment_emailed_client')); + Session::flash('message', trans($credit ? 'texts.created_payment_and_credit_emailed_client' : 'texts.created_payment_emailed_client')); } else { - Session::flash('message', trans('texts.created_payment')); + Session::flash('message', trans($credit ? 'texts.created_payment_and_credit' : 'texts.created_payment')); } return redirect()->to($payment->client->getRoute() . '#payments'); diff --git a/app/Http/Requests/CreatePaymentRequest.php b/app/Http/Requests/CreatePaymentRequest.php index f2e1d468419a..9398cb13beb5 100644 --- a/app/Http/Requests/CreatePaymentRequest.php +++ b/app/Http/Requests/CreatePaymentRequest.php @@ -28,10 +28,15 @@ class CreatePaymentRequest extends PaymentRequest ->invoices() ->firstOrFail(); + $this->merge([ + 'invoice_id' => $invoice->id, + 'client_id' => $invoice->client->id, + ]); + $rules = [ 'client' => 'required', // TODO: change to client_id once views are updated 'invoice' => 'required', // TODO: change to invoice_id once views are updated - 'amount' => "required|numeric|between:0.01,{$invoice->balance}", + 'amount' => "required|numeric|min:0.01", 'payment_date' => 'required', ]; diff --git a/app/Services/PaymentService.php b/app/Services/PaymentService.php index 627381edc7cb..1f1f54e713e6 100644 --- a/app/Services/PaymentService.php +++ b/app/Services/PaymentService.php @@ -140,6 +140,12 @@ class PaymentService extends BaseService } } + public function save($input, $payment = null) + { + return $this->paymentRepo->save($input, $payment); + } + + public function getDatatable($clientPublicId, $search) { $datatable = new PaymentDatatable(true, $clientPublicId); diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index a81830cc26b1..9997cc2bc2fd 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -2389,6 +2389,9 @@ $LANG = array( 'updated_payment_term' => 'Successfully updated payment term', 'archived_payment_term' => 'Successfully archived payment term', 'resend_invite' => 'Resend Invitation', + 'credit_created_by' => 'Credit created by payment :transaction_reference', + 'created_payment_and_credit' => 'Successfully created payment and credit', + 'created_payment_and_credit_emailed_client' => 'Successfully created payment and credit, and emailed client', );