diff --git a/application/helpers/table_helper.php b/application/helpers/table_helper.php index 7e02b565a..93dd86221 100644 --- a/application/helpers/table_helper.php +++ b/application/helpers/table_helper.php @@ -8,8 +8,8 @@ function get_sales_manage_table_headers() array('sale_id' => $CI->lang->line('common_id')), array('sale_time' => $CI->lang->line('sales_sale_time')), array('customer_name' => $CI->lang->line('customers_customer')), - array('amount_tendered' => $CI->lang->line('sales_amount_tendered')), array('amount_due' => $CI->lang->line('sales_amount_due')), + array('amount_tendered' => $CI->lang->line('sales_amount_tendered')), array('change_due' => $CI->lang->line('sales_change_due')), array('payment_type' => $CI->lang->line('sales_payment_type')) ); @@ -29,23 +29,22 @@ function get_sales_manage_table_headers() function get_sale_data_last_row($sales, $controller) { $CI =& get_instance(); - $table_data_rows = ''; - $sum_amount_tendered = 0; $sum_amount_due = 0; + $sum_amount_tendered = 0; $sum_change_due = 0; foreach($sales->result() as $key=>$sale) { - $sum_amount_tendered += $sale->amount_tendered; $sum_amount_due += $sale->amount_due; + $sum_amount_tendered += $sale->amount_tendered; $sum_change_due += $sale->change_due; } return array( 'sale_id' => '-', 'sale_time' => ''.$CI->lang->line('sales_total').'', - 'amount_tendered' => ''. to_currency($sum_amount_tendered).'', 'amount_due' => ''.to_currency($sum_amount_due).'', + 'amount_tendered' => ''. to_currency($sum_amount_tendered).'', 'change_due' => ''.to_currency($sum_change_due).'' ); } @@ -59,8 +58,8 @@ function get_sale_data_row($sale, $controller) 'sale_id' => $sale->sale_id, 'sale_time' => date( $CI->config->item('dateformat') . ' ' . $CI->config->item('timeformat'), strtotime($sale->sale_time) ), 'customer_name' => $sale->customer_name, - 'amount_tendered' => to_currency($sale->amount_tendered), 'amount_due' => to_currency($sale->amount_due), + 'amount_tendered' => to_currency($sale->amount_tendered), 'change_due' => to_currency($sale->change_due), 'payment_type' => $sale->payment_type ); diff --git a/application/models/Sale.php b/application/models/Sale.php index deaffc089..1b5d4dee3 100644 --- a/application/models/Sale.php +++ b/application/models/Sale.php @@ -83,25 +83,8 @@ class Sale extends CI_Model */ public function search($search, $filters, $rows = 0, $limit_from = 0, $sort = 'sale_date', $order = 'desc') { - if($this->config->item('tax_included')) - { - $total = '1'; - $subtotal = '(1 - (SUM(1 - 100 / (100 + sales_items_taxes.percent))))'; - $tax = '(SUM(1 - 100 / (100 + sales_items_taxes.percent)))'; - } - else - { - $tax = '(SUM(sales_items_taxes.percent) / 100)'; - $total = '(1 + (SUM(sales_items_taxes.percent / 100)))'; - $subtotal = '1'; - } - - $sale_total = 'SUM(sales_items.item_unit_price * sales_items.quantity_purchased - sales_items.item_unit_price * sales_items.quantity_purchased * sales_items.discount_percent / 100)'; - $sale_cost = 'SUM(sales_items.item_cost_price * sales_items.quantity_purchased)'; - - $decimals = totals_decimals(); - - // create payments temp table to speed up the sales listing + // NOTE: temporary tables are created to speed up searches due to the fact that are ortogonal to the main query + // create a temporary table to contain all the payments per sale item $this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_payments_temp') . ' (PRIMARY KEY(sale_id), INDEX(sale_id)) ( @@ -116,6 +99,40 @@ class Sale extends CI_Model )' ); + // 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') . + ' (INDEX(sale_id), INDEX(item_id)) + ( + SELECT sales_items_taxes.sale_id AS sale_id, + sales_items_taxes.item_id AS item_id, + SUM(sales_items_taxes.percent) AS percent + 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 + INNER JOIN ' . $this->db->dbprefix('sales_items') . ' AS sales_items + ON sales_items.sale_id = sales_items_taxes.sale_id AND sales_items.line = sales_items_taxes.line + WHERE DATE(sales.sale_time) BETWEEN ' . $this->db->escape($filters['start_date']) . ' AND ' . $this->db->escape($filters['end_date']) . ' + GROUP BY sales_items_taxes.sale_id, sales_items_taxes.item_id + )' + ); + + if($this->config->item('tax_included')) + { + $sale_total = 'SUM(sales_items.item_unit_price * sales_items.quantity_purchased * (1 - sales_items.discount_percent / 100))'; + $sale_subtotal = 'SUM(sales_items.item_unit_price * sales_items.quantity_purchased * (1 - sales_items.discount_percent / 100) * (100 / (100 + sales_items_taxes.percent)))'; + $sale_tax = 'SUM(sales_items.item_unit_price * sales_items.quantity_purchased * (1 - sales_items.discount_percent / 100) * (1 - 100 / (100 + sales_items_taxes.percent)))'; + } + else + { + $sale_total = 'SUM(sales_items.item_unit_price * sales_items.quantity_purchased * (1 - sales_items.discount_percent / 100) * (1 + (sales_items_taxes.percent / 100)))'; + $sale_subtotal = 'SUM(sales_items.item_unit_price * sales_items.quantity_purchased * (1 - sales_items.discount_percent / 100))'; + $sale_tax = 'SUM(sales_items.item_unit_price * sales_items.quantity_purchased * (1 - sales_items.discount_percent / 100) * (sales_items_taxes.percent / 100))'; + } + + $sale_cost = 'SUM(sales_items.item_cost_price * sales_items.quantity_purchased)'; + + $decimals = totals_decimals(); + $this->db->select(' sales.sale_id AS sale_id, DATE(sales.sale_time) AS sale_date, @@ -124,13 +141,13 @@ class Sale extends CI_Model CONCAT(customer_p.first_name, " ", customer_p.last_name) AS customer_name, customer.company_name AS company_name, ' . " - ROUND($sale_total * $subtotal, $decimals) AS subtotal, - IFNULL(ROUND($sale_total * $total, $decimals), ROUND($sale_total * $subtotal, $decimals)) AS total, - IFNULL(ROUND($sale_total * $tax, $decimals), 0) AS tax, - ROUND($sale_total - $sale_cost, $decimals) AS profit, + ROUND($sale_subtotal, $decimals) AS subtotal, + IFNULL(ROUND($sale_total, $decimals), ROUND($sale_subtotal, $decimals)) AS total, + IFNULL(ROUND($sale_tax, $decimals), 0) AS tax, ROUND($sale_cost, $decimals) AS cost, - IFNULL(ROUND($sale_total * $total, $decimals), ROUND($sale_total * $subtotal, $decimals)) AS amount_due, - (payments.sale_payment_amount - IFNULL(ROUND($sale_total * $total, $decimals), ROUND($sale_total * $subtotal, $decimals))) AS change_due, + ROUND($sale_total - IFNULL($sale_tax, 0) - $sale_cost, $decimals) AS profit, + IFNULL(ROUND($sale_total, $decimals), ROUND($sale_subtotal, $decimals)) AS amount_due, + (payments.sale_payment_amount - IFNULL(ROUND($sale_total, $decimals), ROUND($sale_subtotal, $decimals))) AS change_due, " . ' payments.sale_payment_amount AS amount_tendered, payments.payment_type AS payment_type, @@ -142,7 +159,7 @@ class Sale extends CI_Model $this->db->join('people AS customer_p', 'sales.customer_id = customer_p.person_id', 'left'); $this->db->join('customers AS customer', 'sales.customer_id = customer.person_id', 'left'); $this->db->join('sales_payments_temp AS payments', 'sales.sale_id = payments.sale_id', 'left outer'); - $this->db->join('sales_items_taxes AS sales_items_taxes', 'sales_items.sale_id = sales_items_taxes.sale_id AND sales_items.item_id = sales_items_taxes.item_id AND sales_items.line = sales_items_taxes.line', 'left outer'); + $this->db->join('sales_items_taxes_temp AS sales_items_taxes', 'sales_items.sale_id = sales_items_taxes.sale_id AND sales_items.item_id = sales_items_taxes.item_id', 'left outer'); $this->db->where('DATE(sales.sale_time) BETWEEN ' . $this->db->escape($filters['start_date']) . ' AND ' . $this->db->escape($filters['end_date']));