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']));