1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-10 05:02:36 +01:00

Fixes for payment side of ledger

This commit is contained in:
David Bomba 2020-06-06 11:07:31 +10:00
parent 8149251180
commit 4dca7da070
5 changed files with 51 additions and 56 deletions

View File

@ -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;

View File

@ -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

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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);