From 1c5421faffd2081f6a55d6fa5fefced3ef2fe74d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 9 Apr 2024 20:37:22 +1000 Subject: [PATCH] Fixes for inclusive taxes --- app/Helpers/Invoice/CustomValuer.php | 19 ++++++++++- app/Helpers/Invoice/InvoiceSumInclusive.php | 37 ++++++++++----------- app/Models/Invoice.php | 6 +++- tests/Unit/InvoiceInclusiveTest.php | 2 ++ 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/app/Helpers/Invoice/CustomValuer.php b/app/Helpers/Invoice/CustomValuer.php index 535a1369c698..90fad3481312 100644 --- a/app/Helpers/Invoice/CustomValuer.php +++ b/app/Helpers/Invoice/CustomValuer.php @@ -28,10 +28,27 @@ trait CustomValuer public function valuerTax($custom_value, $has_custom_invoice_taxes) { - if (isset($custom_value) && is_numeric($custom_value) && $has_custom_invoice_taxes) { + if (isset($custom_value) && is_numeric($custom_value) && $has_custom_invoice_taxes !== false) { return round($custom_value * ($this->invoice->tax_rate1 / 100), 2) + round($custom_value * ($this->invoice->tax_rate2 / 100), 2) + round($custom_value * ($this->invoice->tax_rate3 / 100), 2); } return 0; } + + public function multiInclusiveTax($value, $has_custom_invoice_taxes) { + + if (isset($custom_value) && is_numeric($custom_value) && $has_custom_invoice_taxes !== false) { + + $tax = 0; + + $tax += $this->formatValue($custom_value - ($custom_value / (1 + ($this->invoice->tax_rate1 / 100))), 2); + $tax += $this->formatValue($custom_value - ($custom_value / (1 + ($this->invoice->tax_rate2 / 100))), 2); + $tax += $this->formatValue($custom_value - ($custom_value / (1 + ($this->invoice->tax_rate3 / 100))), 2); + + return round($tax,2); + } + + return 0; + + } } diff --git a/app/Helpers/Invoice/InvoiceSumInclusive.php b/app/Helpers/Invoice/InvoiceSumInclusive.php index 5533f692ad4f..ae366e931f7f 100644 --- a/app/Helpers/Invoice/InvoiceSumInclusive.php +++ b/app/Helpers/Invoice/InvoiceSumInclusive.php @@ -106,27 +106,29 @@ class InvoiceSumInclusive private function calculateCustomValues() { - $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge1, $this->invoice->custom_surcharge_tax1); + + $this->total_taxes += $this->multiInclusiveTax($this->invoice->custom_surcharge1, $this->invoice->custom_surcharge_tax1); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge1); - $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge2, $this->invoice->custom_surcharge_tax2); + $this->total_taxes += $this->multiInclusiveTax($this->invoice->custom_surcharge2, $this->invoice->custom_surcharge_tax2); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge2); - $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge3, $this->invoice->custom_surcharge_tax3); + $this->total_taxes += $this->multiInclusiveTax($this->invoice->custom_surcharge3, $this->invoice->custom_surcharge_tax3); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge3); - $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge4, $this->invoice->custom_surcharge_tax4); + $this->total_taxes += $this->multiInclusiveTax($this->invoice->custom_surcharge4, $this->invoice->custom_surcharge_tax4); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge4); + $this->total += $this->total_custom_values; -nlog($this->total_taxes); + return $this; } private function calculateInvoiceTaxes() { $amount = $this->total; - + if ($this->invoice->discount > 0 && $this->invoice->is_amount_discount) { $amount = $this->formatValue(($this->sub_total - $this->invoice->discount), 2); } @@ -136,24 +138,22 @@ nlog($this->total_taxes); } //Handles cases where the surcharge is not taxed - if(is_numeric($this->invoice->custom_surcharge1) && $this->invoice->custom_surcharge1 > 0 && !$this->invoice->custom_surcharge_tax1) { - $amount -= $this->invoice->custom_surcharge1; + if(is_numeric($this->invoice->custom_surcharge1) && $this->invoice->custom_surcharge1 > 0 && $this->invoice->custom_surcharge_tax1) { + $amount += $this->invoice->custom_surcharge1; } - if(is_numeric($this->invoice->custom_surcharge2) && $this->invoice->custom_surcharge2 > 0 && !$this->invoice->custom_surcharge_tax2) { - $amount -= $this->invoice->custom_surcharge2; + if(is_numeric($this->invoice->custom_surcharge2) && $this->invoice->custom_surcharge2 > 0 && $this->invoice->custom_surcharge_tax2) { + $amount += $this->invoice->custom_surcharge2; } - if(is_numeric($this->invoice->custom_surcharge3) && $this->invoice->custom_surcharge3 > 0 && !$this->invoice->custom_surcharge_tax3) { - $amount -= $this->invoice->custom_surcharge3; + if(is_numeric($this->invoice->custom_surcharge3) && $this->invoice->custom_surcharge3 > 0 && $this->invoice->custom_surcharge_tax3) { + $amount += $this->invoice->custom_surcharge3; } - if(is_numeric($this->invoice->custom_surcharge4) && $this->invoice->custom_surcharge4 > 0 && !$this->invoice->custom_surcharge_tax4) { - $amount -= $this->invoice->custom_surcharge4; + if(is_numeric($this->invoice->custom_surcharge4) && $this->invoice->custom_surcharge4 > 0 && $this->invoice->custom_surcharge_tax4) { + $amount += $this->invoice->custom_surcharge4; } - - if (is_string($this->invoice->tax_name1) && strlen($this->invoice->tax_name1) > 1) { $tax = $this->calcInclusiveLineTax($this->invoice->tax_rate1, $amount); $this->total_taxes += $tax; @@ -172,8 +172,7 @@ nlog($this->total_taxes); $this->total_taxes += $tax; $this->total_tax_map[] = ['name' => $this->invoice->tax_name3.' '.floatval($this->invoice->tax_rate3).'%', 'total' => $tax]; } -nlog($this->total_taxes); -nlog($this->total_tax_map); + return $this; } @@ -374,7 +373,7 @@ nlog($this->total_tax_map); $this->total_taxes += $total_line_tax; } -nlog($this->total_taxes); + return $this; } diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index df5d6241cbe0..7dcca92df223 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -204,7 +204,11 @@ class Invoice extends BaseModel 'is_deleted' => 'bool', 'is_amount_discount' => 'bool', 'tax_data' => 'object', - 'partial_due_date' => 'date:Y-m-d' + 'partial_due_date' => 'date:Y-m-d', + 'custom_surcharge_tax1' => 'bool', + 'custom_surcharge_tax2' => 'bool', + 'custom_surcharge_tax3' => 'bool', + 'custom_surcharge_tax4' => 'bool', ]; protected $with = []; diff --git a/tests/Unit/InvoiceInclusiveTest.php b/tests/Unit/InvoiceInclusiveTest.php index 434dd3c97430..e84a12e10d23 100644 --- a/tests/Unit/InvoiceInclusiveTest.php +++ b/tests/Unit/InvoiceInclusiveTest.php @@ -109,7 +109,9 @@ class InvoiceInclusiveTest extends TestCase $this->invoice->tax_name1 = 'GST'; $this->invoice->tax_rate1 = 10; $this->invoice->is_amount_discount = true; + $this->invoice->line_items = $this->buildLineItems(); + nlog("xxx"); nlog($this->invoice->withoutRelations()->toArray()); $calc = $this->invoice->calc();