From 31bfb83875bba950fba484c37601b86809872b9c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 19 Jun 2023 22:13:34 +1000 Subject: [PATCH] Minor fixes --- app/Helpers/Invoice/InvoiceItemSum.php | 8 ++++ app/Services/Report/ProfitLoss.php | 9 ++-- tests/Unit/InvoiceTest.php | 62 ++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 3 deletions(-) diff --git a/app/Helpers/Invoice/InvoiceItemSum.php b/app/Helpers/Invoice/InvoiceItemSum.php index fe5c075b99ac..78917770e954 100644 --- a/app/Helpers/Invoice/InvoiceItemSum.php +++ b/app/Helpers/Invoice/InvoiceItemSum.php @@ -161,12 +161,20 @@ class InvoiceItemSum ->sumLineItem() ->setDiscount() ->calcTaxes() + ->roundLineItem() ->push(); } return $this; } + private function roundLineItem(): self + { + $this->item->line_total = round($this->item->line_total, $this->currency->precision); + + return $this; + } + private function shouldCalculateTax(): self { diff --git a/app/Services/Report/ProfitLoss.php b/app/Services/Report/ProfitLoss.php index 4bdbac75bbfa..b6b8ab223ddd 100644 --- a/app/Services/Report/ProfitLoss.php +++ b/app/Services/Report/ProfitLoss.php @@ -297,9 +297,12 @@ class ProfitLoss $amount_payment_paid += $pivot->amount - $pivot->refunded; $amount_payment_paid_converted += $amount_payment_paid / ($payment->exchange_rate ?: 1); - - $tax_amount += ($amount_payment_paid / $invoice->amount) * $invoice->total_taxes; - $tax_amount_converted += (($amount_payment_paid / $invoice->amount) * $invoice->total_taxes) / $payment->exchange_rate; + + if ($invoice->amount > 0) { + $tax_amount += ($amount_payment_paid / $invoice->amount) * $invoice->total_taxes; + $tax_amount_converted += (($amount_payment_paid / $invoice->amount) * $invoice->total_taxes) / $payment->exchange_rate; + } + } if ($pivot->paymentable_type == 'credits') { diff --git a/tests/Unit/InvoiceTest.php b/tests/Unit/InvoiceTest.php index e580155cacb2..305e1e86704d 100644 --- a/tests/Unit/InvoiceTest.php +++ b/tests/Unit/InvoiceTest.php @@ -49,6 +49,68 @@ class InvoiceTest extends TestCase $this->invoice_calc = new InvoiceSum($this->invoice); } + public function testTaskRoundingPrecisionThree() + { + $invoice = InvoiceFactory::create($this->company->id, $this->user->id); + $invoice->client_id = $this->client->id; + $invoice->uses_inclusive_taxes = false; + + $line_items = []; + + $line_item = new InvoiceItem; + $line_item->quantity = 25; + $line_item->cost = 0.333; + $line_item->tax_rate1 = 0; + $line_item->tax_name1 = ''; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $line_item = new InvoiceItem; + $line_item->quantity = 25; + $line_item->cost = 0.333; + $line_item->tax_rate1 = 0; + $line_item->tax_name1 = ''; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $line_item = new InvoiceItem; + $line_item->quantity = 25; + $line_item->cost = 1.333; + $line_item->tax_rate1 = 0; + $line_item->tax_name1 = ''; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $line_item = new InvoiceItem; + $line_item->quantity = 25; + $line_item->cost = 0.267; + $line_item->tax_rate1 = 0; + $line_item->tax_name1 = ''; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $line_item = new InvoiceItem; + $line_item->quantity = 25; + $line_item->cost = 0.05; + $line_item->tax_rate1 = 0; + $line_item->tax_name1 = ''; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $invoice->line_items = $line_items; + $invoice->save(); + + $invoice = $invoice->calc()->getInvoice(); + + $this->assertEquals(57.92, $invoice->amount); + + } + public function testRoundingWithLargeUnitCostPrecision() { $invoice = InvoiceFactory::create($this->company->id, $this->user->id);