Incorrect Journal Balance (sales invoice) when many decimals in tax and price.
[fa-stable.git] / reporting / rep301.php
index 403e4b4ba28c89ccf5947a29a870d4b589b4989b..5d04754bc85286030f305c890bbfbdd0dadbfadb 100644 (file)
 ***********************************************************************/
 $page_security = 'SA_ITEMSVALREP';
 // ----------------------------------------------------------------
-// $ Revision: 2.0 $
-// Creator:    Joe Hunt
-// date_:      2005-05-19
-// Title:      Inventory Valuation
+// $ Revision: 2.4 $
+// Creator:            Joe Hunt, boxygen
+// date_:              2014-05-13
+// Title:              Inventory Valuation
 // ----------------------------------------------------------------
 $path_to_root="..";
 
@@ -28,70 +28,63 @@ include_once($path_to_root . "/inventory/includes/db/items_category_db.inc");
 
 print_inventory_valuation_report();
 
-function get_domestic_price($myrow, $stock_id, $qty, $old_std_cost, $old_qty)
+function get_domestic_price($myrow, $stock_id)
 {
-       if ($myrow['type'] == ST_SUPPRECEIVE || $myrow['type'] == ST_SUPPCREDIT)
-       {
-               $price = $myrow['price'];
-               if ($myrow['type'] == ST_SUPPRECEIVE)
-               {
-                       // Has the supplier invoice increased the receival price?
-                       $sql = "SELECT DISTINCT act_price 
-                               FROM ".TB_PREF."purch_order_details pod
-                                       INNER JOIN ".TB_PREF."grn_batch grn ON pod.order_no =
-                               grn.purch_order_no WHERE grn.id = ".$myrow['trans_no']." AND pod.item_code = '$stock_id'";
-                       $result = db_query($sql, "Could not retrieve act_price from purch_order_details");
-                       $row = db_fetch_row($result);
-                       if ($row[0] > 0 AND $row[0] <> $myrow['price'])
-                               $price = $row[0];
-               }
-               if ($myrow['person_id'] > 0)
-               {
-                       // Do we have foreign currency?
-                       $supp = get_supplier($myrow['person_id']);
-                       $currency = $supp['curr_code'];
-                       $ex_rate = get_exchange_rate_to_home_currency($currency, sql2date($myrow['tran_date']));
-                       $price /= $ex_rate;
-               }       
-       }
-       elseif ($myrow['type'] != ST_INVADJUST) // calcutale the price from avg. price
-               $price = ($myrow['standard_cost'] * $qty - $old_std_cost * $old_qty) / $myrow['qty'];
-       else
-               $price = $myrow['standard_cost']; // Item Adjustments just have the real cost
-       return $price;
-}      
+    if ($myrow['type'] == ST_SUPPRECEIVE || $myrow['type'] == ST_SUPPCREDIT)
+     {
+        $price = $myrow['price'];
+        if ($myrow['person_id'] > 0)
+        {
+            // Do we have foreign currency?
+            $supp = get_supplier($myrow['person_id']);
+            $currency = $supp['curr_code'];
+            $ex_rate = $myrow['ex_rate'];
+            $price *= $ex_rate;
+        }
+    }
+    else
+        $price = $myrow['standard_cost']; //pick standard_cost for sales deliveries
+
+    return $price;
+}
 
-function getAverageCost($stock_id, $to_date)
+function getAverageCost($stock_id, $location, $to_date)
 {
        if ($to_date == null)
                $to_date = Today();
 
        $to_date = date2sql($to_date);
 
-       $sql = "SELECT standard_cost, qty FROM ".TB_PREF."stock_moves
-               WHERE stock_id=".db_escape($stock_id)."
-               AND tran_date <= '$to_date' AND standard_cost > 0.001 AND qty <> 0 AND type <> ".ST_LOCTRANSFER;
+       $sql = "SELECT move.*, supplier.supplier_id person_id, IF(ISNULL(grn.rate), credit.rate, grn.rate) ex_rate
+               FROM ".TB_PREF."stock_moves move
+                               LEFT JOIN ".TB_PREF."supp_trans credit ON credit.trans_no=move.trans_no AND credit.type=move.type
+                               LEFT JOIN ".TB_PREF."grn_batch grn ON grn.id=move.trans_no AND 25=move.type
+                               LEFT JOIN ".TB_PREF."suppliers supplier ON IFNULL(grn.supplier_id, credit.supplier_id)=supplier.supplier_id
+                               LEFT JOIN ".TB_PREF."debtor_trans cust_trans ON cust_trans.trans_no=move.trans_no AND cust_trans.type=move.type
+                               LEFT JOIN ".TB_PREF."debtors_master debtor ON cust_trans.debtor_no=debtor.debtor_no
+                       WHERE stock_id=".db_escape($stock_id)."
+                       AND move.tran_date <= '$to_date' AND standard_cost > 0.001 AND qty <> 0 AND move.type <> ".ST_LOCTRANSFER;
+
+       if ($location != 'all')
+               $sql .= " AND move.loc_code = ".db_escape($location);
 
        $sql .= " ORDER BY tran_date";  
 
        $result = db_query($sql, "No standard cost transactions were returned");
+    
     if ($result == false)
        return 0;
-       $qty = $old_qty = $count = $old_std_cost = $tot_cost = 0;
+       $qty = $tot_cost = 0;
        while ($row=db_fetch($result))
        {
                $qty += $row['qty'];    
-
-               $price = get_domestic_price($row, $stock_id, $qty, $old_std_cost, $old_qty);
-
-               $old_std_cost = $row['standard_cost'];
-               $tot_cost += $price;
-               $count++;
-               $old_qty = $qty;
+               $price = get_domestic_price($row, $stock_id);
+        $tran_cost = $row['qty'] * $price;
+        $tot_cost += $tran_cost;
        }
-       if ($count == 0)
+       if ($qty == 0)
                return 0;
-       return $tot_cost / $count;
+       return $tot_cost / $qty;
 }
 
 function getTransactions($category, $location, $date)
@@ -104,24 +97,27 @@ function getTransactions($category, $location, $date)
                        item.units,
                        item.description, item.inactive,
                        move.loc_code,
+                       units.decimals,
                        SUM(move.qty) AS QtyOnHand, 
-                       item.material_cost + item.labour_cost + item.overhead_cost AS UnitCost,
-                       SUM(move.qty) *(item.material_cost + item.labour_cost + item.overhead_cost) AS ItemTotal 
+                       item.material_cost AS UnitCost,
+                       SUM(move.qty) * item.material_cost AS ItemTotal 
                        FROM "
                        .TB_PREF."stock_master item,"
                        .TB_PREF."stock_category category,"
-                       .TB_PREF."stock_moves move
+                       .TB_PREF."stock_moves move,"
+                       .TB_PREF."item_units units
                WHERE item.stock_id=move.stock_id
                AND item.category_id=category.category_id
                AND item.mb_flag<>'D' AND mb_flag <> 'F' 
                AND move.tran_date <= '$date'
+               AND item.units=units.abbr
                GROUP BY item.category_id,
                        category.description, ";
                if ($location != 'all')
                        $sql .= "move.loc_code, ";
                $sql .= "item.stock_id,
                        item.description
-               HAVING SUM(move.qty) != 0";
+               HAVING ROUND(SUM(move.qty), units.decimals) != 0";
                if ($category != 0)
                        $sql .= " AND item.category_id = ".db_escape($category);
                if ($location != 'all')
@@ -216,7 +212,7 @@ function print_inventory_valuation_report()
                }
                if (isset($SysPrefs->use_costed_values) && $SysPrefs->use_costed_values==1)
                {
-                       $UnitCost = getAverageCost($trans['stock_id'], $date);
+                       $UnitCost = getAverageCost($trans['stock_id'], $location, $date);
                        $ItemTotal = $trans['QtyOnHand'] * $UnitCost;
                }       
                else