From 6d91ae3845acf1a82ab046e6c5fcdd35da5e2cc7 Mon Sep 17 00:00:00 2001 From: SteveIreland Date: Sat, 4 Apr 2020 11:42:39 -0400 Subject: [PATCH] Fix included destination tax --- application/libraries/Sale_lib.php | 32 ++++++----- application/libraries/Tax_lib.php | 15 +++--- application/models/Sale.php | 65 ++++++++++++----------- application/views/configs/system_info.php | 2 +- 4 files changed, 58 insertions(+), 56 deletions(-) diff --git a/application/libraries/Sale_lib.php b/application/libraries/Sale_lib.php index 84a292e36..c4ec60de1 100644 --- a/application/libraries/Sale_lib.php +++ b/application/libraries/Sale_lib.php @@ -472,29 +472,27 @@ class Sale_lib $prediscount_subtotal= bcadd($prediscount_subtotal, $extended_amount); $total = bcadd($total, $extended_discounted_amount); - if($this->CI->config->item('tax_included')) - { - $subtotal = bcadd($subtotal, $this->get_extended_total_tax_exclusive($item['item_id'], $extended_discounted_amount, $item['quantity'], $item['price'], $item['discount'],$item['discount_type'])); - } - else - { - $subtotal = bcadd($subtotal, $extended_discounted_amount); - } + $subtotal = bcadd($subtotal, $extended_discounted_amount); } $totals['prediscount_subtotal'] = $prediscount_subtotal; $totals['total_discount'] = $total_discount; - $totals['subtotal'] = $subtotal; $sales_tax = 0; - foreach($taxes as $tax_excluded) + foreach($taxes as $tax) { - if($tax_excluded['tax_type'] == Tax_lib::TAX_TYPE_EXCLUDED) + if($tax['tax_type'] === Tax_lib::TAX_TYPE_EXCLUDED) { - $total = bcadd($total, $tax_excluded['sale_tax_amount']); - $sales_tax = bcadd($sales_tax, $tax_excluded['sale_tax_amount']); + $total = bcadd($total, $tax['sale_tax_amount']); + $sales_tax = bcadd($sales_tax, $tax['sale_tax_amount']); + } + else + { + $subtotal = bcsub($subtotal, $tax['sale_tax_amount']); } } + + $totals['subtotal'] = $subtotal; $totals['total'] = $total; $totals['tax_total'] = $sales_tax; @@ -1215,19 +1213,19 @@ class Sale_lib public function get_item_tax($quantity, $price, $discount, $discount_type, $tax_percentage) { - $price = $this->get_item_total($quantity, $price, $discount, $discount_type, TRUE); + $item_total = $this->get_item_total($quantity, $price, $discount, $discount_type, TRUE); if($this->CI->config->item('tax_included')) { $tax_fraction = bcdiv(bcadd(100, $tax_percentage), 100); - $price_tax_excl = bcdiv($price, $tax_fraction); + $price_tax_excl = bcdiv($item_total, $tax_fraction); - return bcsub($price, $price_tax_excl); + return bcsub($item_total, $price_tax_excl); } $tax_fraction = bcdiv($tax_percentage, 100); - return bcmul($price, $tax_fraction); + return bcmul($item_total, $tax_fraction); } public function calculate_subtotal($include_discount = FALSE, $exclude_tax = FALSE) diff --git a/application/libraries/Tax_lib.php b/application/libraries/Tax_lib.php index a66487d46..596fb1889 100644 --- a/application/libraries/Tax_lib.php +++ b/application/libraries/Tax_lib.php @@ -8,8 +8,8 @@ class Tax_lib { - const TAX_TYPE_EXCLUDED = 1; - const TAX_TYPE_INCLUDED = 0; + const TAX_TYPE_EXCLUDED = '1'; + const TAX_TYPE_INCLUDED = '0'; private $CI; @@ -150,9 +150,10 @@ class Tax_lib public function get_included_tax($quantity, $price, $discount_percentage, $discount_type, $tax_percentage, $tax_decimal, $rounding_code) { - $tax_amount = $this->CI->sale_lib->get_item_tax($quantity, $price, $discount_percentage, $discount_type, $tax_percentage); - - return Rounding_mode::round_number($rounding_code, $tax_amount, $tax_decimal); + $item_total = $this->CI->sale_lib->get_item_total($quantity, $price, $discount_percentage, $discount_type, TRUE); + $tax_fraction = bcdiv(bcadd(100, $tax_percentage), 100); + $price_tax_excl = bcdiv($item_total, $tax_fraction); + return bcsub($item_total, $price_tax_excl); } /* @@ -443,11 +444,11 @@ class Tax_lib $s1 = ''; $s2 = ''; - if($selected_tax_type == Tax_lib::TAX_TYPE_EXCLUDED) + if($selected_tax_type === Tax_lib::TAX_TYPE_EXCLUDED) { $s1 = $selected; } - else if($selected_tax_type == Tax_lib::TAX_TYPE_INCLUDED) + else if($selected_tax_type === Tax_lib::TAX_TYPE_INCLUDED) { $s2 = $selected; } diff --git a/application/models/Sale.php b/application/models/Sale.php index 3d7132058..5f34b0b47 100644 --- a/application/models/Sale.php +++ b/application/models/Sale.php @@ -28,17 +28,17 @@ class Sale extends CI_Model $decimals = totals_decimals(); $sale_price = 'CASE WHEN sales_items.discount_type = ' . PERCENT . ' THEN sales_items.item_unit_price * sales_items.quantity_purchased * (1 - sales_items.discount / 100) ELSE sales_items.item_unit_price * sales_items.quantity_purchased - sales_items.discount END'; - $tax = 'ROUND(IFNULL(SUM(sales_items_taxes.tax), 0), ' . $decimals . ')'; + + $sales_tax = 'ROUND(IFNULL(SUM(sales_items_taxes.sales_tax), 0), ' . $decimals . ')'; + $internal_tax = 'ROUND(IFNULL(SUM(sales_items_taxes.internal_tax), 0), ' . $decimals . ')'; if($this->config->item('tax_included')) { $sale_total = 'ROUND(SUM(' . $sale_price . '),' . $decimals . ')'; - $sale_subtotal = $sale_total . ' - ' . $tax; } else { - $sale_subtotal = 'ROUND(SUM(' . $sale_price . '),' . $decimals . ')'; - $sale_total = $sale_subtotal . ' + ' . $tax; + $sale_total = 'ROUND(SUM(' . $sale_price . '),' . $decimals . ') + ' . $sales_tax; } // create a temporary table to contain all the sum of taxes per sale item @@ -48,7 +48,8 @@ class Sale extends CI_Model SELECT sales_items_taxes.sale_id AS sale_id, sales_items_taxes.item_id AS item_id, sales_items_taxes.line AS line, - SUM(sales_items_taxes.item_tax_amount) AS tax + SUM(CASE WHEN sales_items_taxes.tax_type = 0 THEN sales_items_taxes.item_tax_amount ELSE 0 END) AS internal_tax, + SUM(CASE WHEN sales_items_taxes.tax_type = 1 THEN sales_items_taxes.item_tax_amount ELSE 0 END) AS sales_tax FROM ' . $this->db->dbprefix('sales_items_taxes') . ' AS sales_items_taxes INNER JOIN ' . $this->db->dbprefix('sales') . ' AS sales ON sales.sale_id = sales_items_taxes.sale_id @@ -75,9 +76,9 @@ class Sale extends CI_Model MAX(customer_p.email) AS email, MAX(customer_p.comments) AS comments, ' . " - IFNULL($sale_total, $sale_subtotal) AS amount_due, + MAX($sale_total) AS amount_due, IFNULL(MAX(payments.sale_payment_amount), 0) AS amount_tendered, - IFNULL(MAX(payments.sale_payment_amount) - IFNULL($sale_total, $sale_subtotal),0) AS change_due, + IFNULL(MAX(payments.sale_payment_amount) - MAX($sale_total),0) AS change_due, " . ' MAX(payments.payment_type) AS payment_type '); @@ -144,18 +145,13 @@ class Sale extends CI_Model $sale_price = 'CASE WHEN sales_items.discount_type = ' . PERCENT . ' THEN sales_items.item_unit_price * sales_items.quantity_purchased * (1 - sales_items.discount / 100) ELSE sales_items.item_unit_price * sales_items.quantity_purchased - sales_items.discount END'; $sale_cost = 'SUM(sales_items.item_cost_price * sales_items.quantity_purchased)'; - $tax = 'IFNULL(SUM(sales_items_taxes.tax), 0)'; - if($this->config->item('tax_included')) - { - $sale_total = 'ROUND(SUM(' . $sale_price . '), ' . $decimals . ')'; - $sale_subtotal = $sale_total . ' - ' . $tax; - } - else - { - $sale_subtotal = 'ROUND(SUM(' . $sale_price . '), ' . $decimals . ')'; - $sale_total = $sale_subtotal . ' + ' . $tax; - } + $tax = 'IFNULL(SUM(sales_items_taxes.tax), 0)'; + $sales_tax = 'IFNULL(SUM(sales_items_taxes.sales_tax), 0)'; + $internal_tax = 'IFNULL(SUM(sales_items_taxes.internal_tax), 0)'; + + $sale_subtotal = 'ROUND(SUM(' . $sale_price . '), ' . $decimals . ') - ' . $internal_tax; + $sale_total = 'ROUND(SUM(' . $sale_price . '), ' . $decimals . ') + ' . $sales_tax; // create a temporary table to contain all the sum of taxes per sale item $this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_items_taxes_temp') . @@ -164,7 +160,9 @@ class Sale extends CI_Model SELECT sales_items_taxes.sale_id AS sale_id, sales_items_taxes.item_id AS item_id, sales_items_taxes.line AS line, - SUM(sales_items_taxes.item_tax_amount) AS tax + SUM(sales_items_taxes.item_tax_amount) AS tax, + SUM(CASE WHEN sales_items_taxes.tax_type = 0 THEN sales_items_taxes.item_tax_amount ELSE 0 END) AS internal_tax, + SUM(CASE WHEN sales_items_taxes.tax_type = 1 THEN sales_items_taxes.item_tax_amount ELSE 0 END) AS sales_tax FROM ' . $this->db->dbprefix('sales_items_taxes') . ' AS sales_items_taxes INNER JOIN ' . $this->db->dbprefix('sales') . ' AS sales ON sales.sale_id = sales_items_taxes.sale_id @@ -192,14 +190,14 @@ class Sale extends CI_Model MAX(CONCAT(customer_p.first_name, " ", customer_p.last_name)) AS customer_name, MAX(customer.company_name) AS company_name, ' . " - IFNULL($sale_subtotal, $sale_total) AS subtotal, + $sale_subtotal AS subtotal, $tax AS tax, - IFNULL($sale_total, $sale_subtotal) AS total, + $sale_total AS total, $sale_cost AS cost, - (IFNULL($sale_subtotal, $sale_total) - $sale_cost) AS profit, - IFNULL($sale_total, $sale_subtotal) AS amount_due, + ($sale_total - $sale_cost) AS profit, + $sale_total AS amount_due, MAX(payments.sale_payment_amount) AS amount_tendered, - (MAX(payments.sale_payment_amount) - IFNULL($sale_total, $sale_subtotal)) AS change_due, + (MAX(payments.sale_payment_amount) - ($sale_total)) AS change_due, " . ' MAX(payments.payment_type) AS payment_type '); @@ -1089,17 +1087,20 @@ class Sale extends CI_Model $sale_price = 'CASE WHEN sales_items.discount_type = ' . PERCENT . ' THEN sales_items.item_unit_price * sales_items.quantity_purchased * (1 - sales_items.discount / 100) ELSE sales_items.item_unit_price * sales_items.quantity_purchased - sales_items.discount END'; $sale_cost = 'SUM(sales_items.item_cost_price * sales_items.quantity_purchased)'; + $tax = 'IFNULL(SUM(sales_items_taxes.tax), 0)'; + $sales_tax = 'IFNULL(SUM(sales_items_taxes.sales_tax), 0)'; + $internal_tax = 'IFNULL(SUM(sales_items_taxes.internal_tax), 0)'; if($this->config->item('tax_included')) { $sale_total = 'ROUND(SUM(' . $sale_price . '), ' . $decimals . ')'; - $sale_subtotal = $sale_total . ' - ' . $tax; + $sale_subtotal = $sale_total . ' - ' . $internal_tax; } else { - $sale_subtotal = 'ROUND(SUM(' . $sale_price . '), ' . $decimals . ')'; - $sale_total = $sale_subtotal . ' + ' . $tax; + $sale_subtotal = 'ROUND(SUM(' . $sale_price . '), ' . $decimals . ') - ' . $internal_tax; + $sale_total = 'ROUND(SUM(' . $sale_price . '), ' . $decimals . ') + ' . $sales_tax; } // create a temporary table to contain all the sum of taxes per sale item @@ -1109,7 +1110,9 @@ class Sale extends CI_Model SELECT sales_items_taxes.sale_id AS sale_id, sales_items_taxes.item_id AS item_id, sales_items_taxes.line AS line, - SUM(sales_items_taxes.item_tax_amount) AS tax + SUM(sales_items_taxes.item_tax_amount) AS tax, + SUM(CASE WHEN sales_items_taxes.tax_type = 0 THEN sales_items_taxes.item_tax_amount ELSE 0 END) AS internal_tax, + SUM(CASE WHEN sales_items_taxes.tax_type = 1 THEN sales_items_taxes.item_tax_amount ELSE 0 END) AS sales_tax FROM ' . $this->db->dbprefix('sales_items_taxes') . ' AS sales_items_taxes INNER JOIN ' . $this->db->dbprefix('sales') . ' AS sales ON sales.sale_id = sales_items_taxes.sale_id @@ -1173,11 +1176,11 @@ class Sale extends CI_Model MAX(payments.payment_type) AS payment_type, MAX(payments.sale_payment_amount) AS sale_payment_amount, ' . " - IFNULL($sale_subtotal, $sale_total) AS subtotal, + $sale_subtotal AS subtotal, $tax AS tax, - IFNULL($sale_total, $sale_subtotal) AS total, + $sale_total AS total, $sale_cost AS cost, - (IFNULL($sale_subtotal, $sale_total) - $sale_cost) AS profit + ($sale_subtotal - $sale_cost) AS profit " . ' FROM ' . $this->db->dbprefix('sales_items') . ' AS sales_items INNER JOIN ' . $this->db->dbprefix('sales') . ' AS sales diff --git a/application/views/configs/system_info.php b/application/views/configs/system_info.php index abcd19c3e..233ef5d6d 100644 --- a/application/views/configs/system_info.php +++ b/application/views/configs/system_info.php @@ -7,7 +7,7 @@ } - +
lang->line('config_server_notice'); ?>