diff --git a/app/Helpers/Invoice/InvoiceCalc.php b/app/Helpers/Invoice/InvoiceCalc.php index 63f5a649f6d6..a71a07ea52ac 100644 --- a/app/Helpers/Invoice/InvoiceCalc.php +++ b/app/Helpers/Invoice/InvoiceCalc.php @@ -3,13 +3,86 @@ namespace App\Helpers\Invoice; use App\Models\Invoice; +use App\Utils\Traits\NumberFormatter; class InvoiceCalc { - public function __construct(Invoice $invoice) + use NumberFormatter; + + protected $invoice; + + protected $balance; + + protected $paid_to_date; + + protected $amount; + + protected $line_items; + + protected $precision; + + protected $invoice_total; + + + public function __construct(Invoice $invoice, int $precision = 2) { $this->invoice = $invoice; + $this->precision = $precision; } + public function build() + { + $this->calcLineItems(); + } + + + private function calcLineItems() + { + + $new_line_items = []; + + foreach($this->invoice->line_items as $item) { + + $total = $this->formatValue($item->cost) * $this->formatValue($item->qty); + $total = $this->setDiscount($total, $item->discount, $item->is_amount_discount); + $total = $this->setTaxRate($total, $item->tax_name1, $item->tax_rate1); + + $item->line_total = $total; + + $new_line_items[] = $item; + + $this->setInvoiceTotal($total); + } + + $this->invoice->line_items = $new_line_items; + + } + + + private function setDiscount($amount, $discount, $is_amount_discount) + { + + if($is_amount_discount) + return $amount - $this->formatValue($discount); + else + return $amount - $this->formatValue($amount * $discount / 100); + + } + + private function getInvoiceTotal() + { + return $this->invoice_total; + } + + private function setInvoiceTotal($invoice_total) + { + $this->invoice_total = $invoice_total; + } + + + + + + } \ No newline at end of file diff --git a/app/Utils/Traits/NumberFormatter.php b/app/Utils/Traits/NumberFormatter.php new file mode 100644 index 000000000000..7eda13ffabdf --- /dev/null +++ b/app/Utils/Traits/NumberFormatter.php @@ -0,0 +1,28 @@ +parseFloat($value), $this->precision, '.', ''); + } + + private function parseFloat($value) : float + { + // check for comma as decimal separator + if (preg_match('/,[\d]{1,2}$/', $value)) { + $value = str_replace(',', '.', $value); + } + + $value = preg_replace('/[^0-9\.\-]/', '', $value); + + return floatval($value); + } + +} \ No newline at end of file