diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index 3444d6983efe..5c3473f15eac 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -291,7 +291,7 @@ class BaseController extends Controller * Thresholds for displaying large account on first load */ if (request()->has('first_load') && request()->input('first_load') == 'true') { - if (auth()->user()->getCompany()->invoices->count() > 1000) { + if (auth()->user()->getCompany()->invoices->count() > 1000 || auth()->user()->getCompany()->products->count() > 1000) { $data = $mini_load; } else { $data = $first_load; diff --git a/app/Repositories/PaymentRepository.php b/app/Repositories/PaymentRepository.php index 86a24280ff4f..dd79fa91ab8d 100644 --- a/app/Repositories/PaymentRepository.php +++ b/app/Repositories/PaymentRepository.php @@ -56,7 +56,7 @@ class PaymentRepository extends BaseRepository return $this->applyPayment($data, $payment); } - return $this->refundPayment($data, $payment); + return $payment; } /** @@ -67,9 +67,17 @@ class PaymentRepository extends BaseRepository */ private function applyPayment(array $data, Payment $payment): ?Payment { + //check currencies here and fill the exchange rate data if necessary if (!$payment->id) { $this->processExchangeRates($data, $payment); + + /*We only update the paid to date ONCE per payment*/ + if (array_key_exists('invoices', $data) && is_array($data['invoices']) && count($data['invoices']) > 0) { + $invoice_totals = array_sum(array_column($data['invoices'], 'amount')); + $client = Client::find($data['client_id']); + $client->service()->updatePaidToDate($invoice_totals)->save(); + } } /*Fill the payment*/ @@ -77,6 +85,7 @@ class PaymentRepository extends BaseRepository $payment->status_id = Payment::STATUS_COMPLETED; $payment->save(); + /*Ensure payment number generated*/ if (!$payment->number || strlen($payment->number) == 0) { $payment->number = $payment->client->getNextPaymentNumber($payment->client); @@ -86,19 +95,33 @@ class PaymentRepository extends BaseRepository $credit_totals = 0; /*Iterate through invoices and apply payments*/ - if (array_key_exists('invoices', $data) && is_array($data['invoices'])) { + if (array_key_exists('invoices', $data) && is_array($data['invoices']) && count($data['invoices']) > 0) { $invoice_totals = array_sum(array_column($data['invoices'], 'amount')); $invoices = Invoice::whereIn('id', array_column($data['invoices'], 'invoice_id'))->get(); + $payment->invoices()->saveMany($invoices); + info("iterating through payment invoices"); + foreach ($data['invoices'] as $paid_invoice) { - $invoice = Invoice::whereId($paid_invoice['invoice_id'])->first(); + + $invoice = Invoice::whereId($paid_invoice['invoice_id'])->with('client')->first(); + + info("current client balance = {$invoice->client->balance}"); if ($invoice) { - $invoice->service()->applyPayment($payment, $paid_invoice['amount'])->save(); + + info("apply payment amount {$paid_invoice['amount']}"); + + $invoice = $invoice->service()->markSent()->applyPayment($payment, $paid_invoice['amount'])->save(); + + info("after processing invoice the client balance is now {$invoice->client->balance}"); + } + + } } else { //payment is made, but not to any invoice, therefore we are applying the payment to the clients paid_to_date only @@ -136,53 +159,6 @@ class PaymentRepository extends BaseRepository return $payment->fresh(); } - /** - * @deprecated Refundable trait replaces this. - */ - private function refundPayment(array $data, Payment $payment): string - { - // //temp variable to sum the total refund/credit amount - // $invoice_total_adjustment = 0; - - // if (array_key_exists('invoices', $data) && is_array($data['invoices'])) { - - // foreach ($data['invoices'] as $adjusted_invoice) { - - // $invoice = Invoice::whereId($adjusted_invoice['invoice_id'])->first(); - - // $invoice_total_adjustment += $adjusted_invoice['amount']; - - // if (array_key_exists('credits', $adjusted_invoice)) { - - // //process and insert credit notes - // foreach ($adjusted_invoice['credits'] as $credit) { - - // $credit = $this->credit_repo->save($credit, CreditFactory::create(auth()->user()->id, auth()->user()->id), $invoice); - - // } - - // } else { - // //todo - generate Credit Note for $amount on $invoice - the assumption here is that it is a FULL refund - // } - - // } - - // if (array_key_exists('amount', $data) && $data['amount'] != $invoice_total_adjustment) - // return 'Amount must equal the sum of invoice adjustments'; - // } - - - // //adjust applied amount - // $payment->applied += $invoice_total_adjustment; - - // //adjust clients paid to date - // $client = $payment->client; - // $client->paid_to_date += $invoice_total_adjustment; - - // $payment->save(); - // $client->save(); - } - /** * If the client is paying in a currency other than diff --git a/app/Services/Invoice/ApplyPayment.php b/app/Services/Invoice/ApplyPayment.php index dda5d1fcce6e..d8f5ead9213c 100644 --- a/app/Services/Invoice/ApplyPayment.php +++ b/app/Services/Invoice/ApplyPayment.php @@ -37,7 +37,14 @@ class ApplyPayment extends AbstractService ->ledger() ->updatePaymentBalance($this->payment_amount*-1); - $this->payment->client->service()->updateBalance($this->payment_amount*-1)->save(); + info("apply paymenet method - current client balance = {$this->payment->client->balance}"); + + info("reducing client balance by payment amount {$this->payment_amount}"); + + $this->invoice->client->service()->updateBalance($this->payment_amount*-1)->save(); +// $this->invoice->client->service()->updateBalance($this->payment_amount*-1)->updatePaidToDate($this->payment_amount)->save(); + + info("post client balance = {$this->invoice->client->balance}"); /* Update Pivot Record amount */ $this->payment->invoices->each(function ($inv) { @@ -47,6 +54,10 @@ class ApplyPayment extends AbstractService } }); + $this->invoice->fresh('client'); + + info("1 end of apply payment method the client balnace = {$this->invoice->client->balance}"); + if ($this->invoice->hasPartial()) { //is partial and amount is exactly the partial amount if ($this->invoice->partial == $this->payment_amount) { @@ -61,9 +72,11 @@ class ApplyPayment extends AbstractService } elseif ($this->payment_amount < $this->invoice->balance) { //partial invoice payment made $this->invoice->service()->clearPartial()->setStatus(Invoice::STATUS_PARTIAL)->updateBalance($this->payment_amount*-1); } + info("2 end of apply payment method the client balnace = {$this->invoice->client->balance}"); $this->invoice->service()->applyNumber()->save(); + info("3 end of apply payment method the client balnace = {$this->invoice->client->balance}"); return $this->invoice; } } diff --git a/app/Services/Invoice/MarkSent.php b/app/Services/Invoice/MarkSent.php index f31175598b08..314777d35769 100644 --- a/app/Services/Invoice/MarkSent.php +++ b/app/Services/Invoice/MarkSent.php @@ -48,10 +48,14 @@ class MarkSent extends AbstractService ->setDueDate() ->save(); + info("marking invoice sent currently client balance = {$this->client->balance}"); + $this->client->service()->updateBalance($this->invoice->balance)->save(); + info("after marking invoice sent currently client balance = {$this->client->balance}"); + $this->invoice->ledger()->updateInvoiceBalance($this->invoice->balance); - return $this->invoice; + return $this->invoice->fresh(); } } diff --git a/tests/Integration/CompanyLedgerTest.php b/tests/Integration/CompanyLedgerTest.php index cac91786f1a6..905c2b77f246 100644 --- a/tests/Integration/CompanyLedgerTest.php +++ b/tests/Integration/CompanyLedgerTest.php @@ -171,6 +171,7 @@ class CompanyLedgerTest extends TestCase $invoice = Invoice::find($this->decodePrimaryKey($acc['data']['id'])); + //client->balance should = 10 $invoice->service()->markSent()->save(); $this->assertEquals($invoice->client->balance, 10); @@ -193,6 +194,7 @@ class CompanyLedgerTest extends TestCase $invoice = Invoice::find($this->decodePrimaryKey($acc['data']['id'])); $invoice->service()->markSent()->save(); + //client balance should = 20 $this->assertEquals($invoice->client->balance, 20); $invoice_ledger = $invoice->company_ledger->sortByDesc('id')->first(); @@ -211,7 +213,6 @@ class CompanyLedgerTest extends TestCase ], ], 'date' => '2020/12/11', - ]; $response = $this->withHeaders([ @@ -224,7 +225,8 @@ class CompanyLedgerTest extends TestCase $payment = Payment::find($this->decodePrimaryKey($acc['data']['id'])); $payment_ledger = $payment->company_ledger->sortByDesc('id')->first(); - $invoice->fresh(); + +info($payment->client->balance); $this->assertEquals($payment->client->balance, $payment_ledger->balance); $this->assertEquals($payment->client->paid_to_date, 10);