More Improvements in Costing Valuations, Chaitanya.
authorJoe Hunt <joe.hunt.consulting@gmail.com>
Mon, 21 Mar 2011 08:45:14 +0000 (09:45 +0100)
committerJoe Hunt <joe.hunt.consulting@gmail.com>
Mon, 21 Mar 2011 08:45:14 +0000 (09:45 +0100)
includes/db/inventory_db.inc
inventory/includes/db/items_adjust_db.inc
inventory/manage/item_codes.php
inventory/purchasing_data.php
manufacturing/includes/db/work_order_issues_db.inc
manufacturing/includes/db/work_order_produce_items_db.inc
manufacturing/includes/db/work_orders_db.inc
manufacturing/includes/db/work_orders_quick_db.inc
manufacturing/work_order_costs.php
purchasing/includes/db/grn_db.inc
purchasing/includes/ui/po_ui.inc

index 6a1a7f52c1298c9986a6990412e3455af97d98c1..244cf93c2e14769838f1fd949bbe31b8f35c196c 100644 (file)
@@ -65,7 +65,8 @@ function get_item_edit_info($stock_id)
 
 function get_standard_cost($stock_id)
 {
-       $sql = "SELECT IF(s.mb_flag='D', 0, material_cost + labour_cost + overhead_cost) AS std_cost
+       //Chaitanya : Compatibility with service items
+       $sql = "SELECT (material_cost + labour_cost + overhead_cost) AS std_cost
                FROM ".TB_PREF."stock_master s WHERE stock_id=".db_escape($stock_id);
        $result = db_query($sql, "The standard cost cannot be retrieved");
 
@@ -140,8 +141,8 @@ function last_negative_stock_trans_id($stock_id, $to)
                        $flag = 1;
                        $negative_trans_id = $myrow['trans_id'];
                }
-               if ($qty > 0)
-                       $flag = 0;              
+               if ($qty >= 0)
+                       $flag = 0;      
        }
                
        return $negative_trans_id;
@@ -177,11 +178,19 @@ function get_deliveries_from_trans($stock_id, $from)
        
        // Get Std cost of previsous transaction before the cut-over delivery
        // This is useful to get inventory valuation
-       $prev_trans = $from - 1;
-       display_notification('From - '.$from.' Prev- '.$prev_trans);
+       //Chaitanya : Corrected
+       /*$sql = "SELECT max( `trans_id` )
+                       FROM ".TB_PREF."stock_moves
+                       WHERE stock_id = ".db_escape($stock_id)."
+                       AND trans_id<'$from'";
+       $result = db_query($sql, "The deliveries could not be updated");
+       $trans = db_fetch_row($result);
+       $prev_trans = $trans[0];*/
+       
+       display_notification('From - '.$from);
        $sql = "SELECT standard_cost FROM ".TB_PREF."stock_moves
-               WHERE stock_id=".db_escape($stock_id)." AND 
-                       trans_id ='$prev_trans'";
+               WHERE stock_id=".db_escape($stock_id)
+                       ." AND trans_id ='$from'";
        $result = db_query($sql, "The deliveries could not be updated");
        $cost = db_fetch_row($result);  
        
@@ -211,7 +220,8 @@ function get_purchases_from_trans($stock_id, $from)
        $sql = "SELECT SUM(qty), SUM(qty*standard_cost) FROM ".TB_PREF."stock_moves
                WHERE stock_id=".db_escape($stock_id)." AND qty > 0 AND 
                        trans_id>'$from' GROUP BY stock_id";
-       $result = db_query($sql, "The deliveries could not be updated");
+       display_notification($sql);
+       $result = db_query($sql, "Could not get get_purchases_from_trans");
        $row = db_fetch_row($result);
        
        display_notification('Purchase Qty - '.$row[0].' Cost- '.$row[1]);
@@ -272,6 +282,10 @@ function adjust_deliveries($stock_id, $material_cost, $to)
        $new_sales_cost = $row[0] * $material_cost;
        $sales_diff = $new_sales_cost - $old_sales_cost;
        
+       display_notification(_("new_sales_cost").' - '.$row[0] .' * '. $material_cost);
+       display_notification(_("new_sales_cost").' - '.$new_sales_cost.' old_sales_cost- '.$old_sales_cost);
+       display_notification(_("Sales Diff").' - '.$sales_diff);
+       
        $row = get_purchases_from_trans($stock_id, $from);
        $purchase_diff = 0;
        $old_purchase_cost = 0;
@@ -282,8 +296,13 @@ function adjust_deliveries($stock_id, $material_cost, $to)
                $purchase_diff = $new_purchase_cost - $old_purchase_cost;
        }
        
+       display_notification(_("new_purchase_cost").' - '.$new_purchase_cost.' old_purchase_cost- '.$old_purchase_cost);
+       display_notification(_("purchase_diff").' - '.$purchase_diff);  
+       
        $diff =  $sales_diff - $purchase_diff;
        
+       display_notification(_("Final diff").' - '.$diff);      
+       
        if ($diff != 0)
        {
                $update_no = get_next_trans_no(ST_COSTUPDATE);
@@ -309,8 +328,8 @@ function adjust_deliveries($stock_id, $material_cost, $to)
 function get_stock_gl_code($stock_id)
 {
        /*Gets the GL Codes relevant to the item account  */
-
-       $sql = "SELECT inventory_account, cogs_account,
+       //Chaitanya : Updated to also provide mb_flag
+       $sql = "SELECT mb_flag, inventory_account, cogs_account,
                adjustment_account, sales_account, assembly_account, dimension_id, dimension2_id FROM
                ".TB_PREF."stock_master WHERE stock_id = ".db_escape($stock_id);
 
@@ -318,6 +337,45 @@ function get_stock_gl_code($stock_id)
        return db_fetch($get);
 }
 
+//-----------------------------------------------------------------------------------------
+//Chaitanya : New Function handle negative stock effect
+//Called in add_stock_move
+function handle_negative_inventory($stock_id, $quantity, $standard_cost, $date_)
+{
+       //Chaitanya : If negative adjustment result in negative or zero inventory 
+       //then difference should be adjusted
+       $qoh = get_qoh_on_date($stock_id);
+       display_notification($qoh." : ".$quantity);
+       if ($qoh + $quantity <= 0 && $qoh > 0) //Positive inventory turning zero/negative
+       {
+               global $Refs;
+
+               $id = get_next_trans_no(ST_JOURNAL);
+               $ref = $Refs->get_next(ST_JOURNAL);
+               $diff = get_standard_cost($stock_id) - $standard_cost;
+               
+               if ($diff !=0)
+               {
+                       $stock_gl_code = get_stock_gl_code($stock_id);
+                       $memo = _("Zero/negative inventory handling");
+                       //Reverse the inventory effect if $qoh <=0
+                       add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, 
+                               $stock_gl_code["inventory_account"],
+                               $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo, 
+                               -$qoh * $diff);
+                       //GL Posting to inventory adjustment account
+                       add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, 
+                               $stock_gl_code["adjustment_account"],
+                               $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo,
+                               $qoh * $diff);
+                               
+                       add_audit_trail(ST_JOURNAL, $id, $date_);
+                       add_comments(ST_JOURNAL, $id, $date_, $memo);
+                       $Refs->save(ST_JOURNAL, $id, $ref);     
+               }
+       }
+}
+
 //--------------------------------------------------------------------------------------
 
 // $date_ - display / non-sql date
@@ -329,9 +387,12 @@ function add_stock_move($type, $stock_id, $trans_no, $location,
     $date_, $reference, $quantity, $std_cost, $person_id=0, $show_or_hide=1,
     $price=0, $discount_percent=0, $error_msg="")
 {
+       // Chaitanya : Removed following restriction considering WO issues
+       // Voiding issues and productions with Service items can not get the 
+       // Service items compatibility
        // do not add a stock move if it's a non-inventory item
-       if (!is_inventory_item($stock_id))
-               return null;
+       //if (!is_inventory_item($stock_id))
+               //return null;
 
        $date = date2sql($date_);
 
@@ -342,8 +403,8 @@ function add_stock_move($type, $stock_id, $trans_no, $location,
                .",     ".db_escape($location).", '$date', "
                .db_escape($person_id).", ".db_escape($reference).", "
                .db_escape($quantity).", ".db_escape($std_cost).","
-               .db_escape($show_or_hide).", ".db_escape($price).", "
-               .db_escape($discount_percent).")";
+               .db_escape($show_or_hide).", "
+               .db_escape($price).", ".db_escape($discount_percent).")";
 
        if ($error_msg == "")
                $error_msg = "The stock movement record cannot be inserted";
@@ -353,15 +414,23 @@ function add_stock_move($type, $stock_id, $trans_no, $location,
        return db_insert_id();
 }
 
-function update_stock_move_pid($type, $stock_id, $from, $to, $pid, $cost)
+//Chaitanya : Added function
+function update_stock_move($type, $trans_no, $stock_id, $cost)
 {
-       $from = date2sql($from);
-       $to = date2sql($to);
-               $sql = "UPDATE ".TB_PREF."stock_moves SET standard_cost=".db_escape($cost)
+       $sql = "UPDATE ".TB_PREF."stock_moves SET standard_cost=".db_escape($cost)
                        ." WHERE type=".db_escape($type)
-                       ."      AND stock_id=".db_escape($stock_id)
-                       ."  AND tran_date>='$from' AND tran_date<='$to' 
-                       AND person_id = ".db_escape($pid);
+                       ."      AND trans_no=".db_escape($trans_no)
+                       ."      AND stock_id=".db_escape($stock_id);
+       db_query($sql, "The stock movement standard_cost cannot be updated");
+}
+
+function update_stock_move_pid($type, $type_no, $stock_id, $pid, $cost)
+{
+       $sql = "UPDATE ".TB_PREF."stock_moves SET standard_cost=".db_escape($cost)
+               ." WHERE type=".db_escape($type)
+               ."      AND trans_no=".db_escape($type_no)
+               ."      AND stock_id=".db_escape($stock_id)
+               ."  AND person_id = ".db_escape($pid);
        db_query($sql, "The stock movement standard_cost cannot be updated");
 }
 
@@ -390,7 +459,7 @@ function void_stock_move($type, $type_no)
 {
     //Chaitanya : Reversing stock move rather than voiding as it is hazardous to lose stock movement trail with respect to costing
     /*$sql = "UPDATE ".TB_PREF."stock_moves SET qty=0, price=0, discount_percent=0,
-        standard_cost=0    WHERE type=".db_escape($type)." AND trans_no=".db_escape($type_no);
+        standard_cost=0 WHERE type=".db_escape($type)." AND trans_no=".db_escape($type_no);
         
     db_query($sql, "Could not void stock moves"); */
     
@@ -398,30 +467,27 @@ function void_stock_move($type, $type_no)
     $result = db_query($sql, "Could not void stock moves");
     while ($row = db_fetch($result))
     {
+               //Skip cost averaging of service items
+               if (is_inventory_item($row["stock_id"]))
+               {        
+                       // The cost has to be adjusted.
+                       //Chaitanya : Transaction rates are stored either as price or standard_cost depending
+                       //on types
+                       $types = array(ST_SUPPCREDIT);
+                       if (in_array($type,$types))
+                               $trans_rate = $row["price"];
+                       else
+                               $trans_rate = $row["standard_cost"];
+
+                       update_average_material_cost(0, $row["stock_id"],
+                               $trans_rate, -$row["qty"], sql2date($row["tran_date"]));
+               }
+               
+               //Post stock move for service items also
         add_stock_move($type, $row["stock_id"], $type_no, $row["loc_code"],
-            sql2date($row["tran_date"]), $row["reference"], -$row["qty"], $row["standard_cost"], $row["person_id"], $row["visible"],
-            $row["price"], $row["discount_percent"]);
-        
-        // If there is cost difference, then cost has to be adjusted.
-        // IMP : Adjusting cost is suitable instead of normal averaging as it will not work properly for manufactured items. Reason being Avg cost is suitable only for purchased items
-        
-        $curr_std_cost = get_standard_cost($row["stock_id"]);
-        
-        //Chaitanya : Transaction rates are stored either as price or standard_cost depending
-        //on types
-        $types = array(ST_SUPPCREDIT);
-        if (in_array($type,$types))
-            $trans_rate = $row["price"];
-        else
-            $trans_rate = $row["standard_cost"];
-        
-        if ($curr_std_cost != $trans_rate)
-        {
-            $cost_diff = $trans_rate - $curr_std_cost;
-            update_average_material_cost(0, $row["stock_id"],
-                $cost_diff, -$row["qty"], sql2date($row["tran_date"]), true);
-        }
-
+               sql2date($row["tran_date"]), $row["reference"], -$row["qty"]
+                       , $row["standard_cost"], $row["person_id"], $row["visible"],
+               $row["price"], $row["discount_percent"]);
     }
 }
 
index d0b87fc62e8d88994b1cc894992deb0bed0f3f31..77d5b02ea9adedb27e111cf3e48d76ea9cb9799c 100644 (file)
@@ -51,8 +51,7 @@ function add_stock_adjustment($items, $location, $date_, $type, $increase, $refe
 function void_stock_adjustment($type_no)
 {
        hook_db_prevoid(ST_INVADJUST, $type_no);
-
-       void_gl_trans(ST_INVADJUST, $type_no);
+       void_gl_trans(ST_INVADJUST, $type_no);\r
        void_stock_move(ST_INVADJUST, $type_no);
 }
 
@@ -82,6 +81,7 @@ function add_stock_adjustment_item($adj_id, $stock_id, $location, $date_, $type,
        display_db_error("Cannot do inventory adjustment for Service item : $stock_id", "");
     }
 
+       /* Logic shifted to function update_average_material_cost\r
        //Chaitanya : If negative adjustment result in negative or zero inventory \r
        //then difference should be adjusted\r
        $qoh = get_qoh_on_date($stock_id);\r
@@ -93,23 +93,26 @@ function add_stock_adjustment_item($adj_id, $stock_id, $location, $date_, $type,
                $ref = $Refs->get_next(ST_JOURNAL);\r
                $diff = get_standard_cost($stock_id) - $standard_cost;\r
                \r
-               $stock_gl_code = get_stock_gl_code($stock_id);\r
-               $memo = _("For zero inventory of ").$stock_id." INVADJ REF: ".$reference;\r
-               //Reverse the inventory effect if $qoh <=0\r
-               add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, \r
-                       $stock_gl_code["inventory_account"],\r
-                       $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo, \r
-                       -$qoh * $diff);\r
-               //GL Posting to inventory adjustment account\r
-               add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, \r
-                       $stock_gl_code["adjustment_account"],\r
-                       $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo,\r
-                       $qoh * $diff);\r
-                       \r
-               add_audit_trail(ST_JOURNAL, $id, $date_);\r
-               add_comments(ST_JOURNAL, $id, $date_, $memo);\r
-               $Refs->save(ST_JOURNAL, $id, $ref);                     \r
-       }       \r
+               if ($diff !=0)\r
+               {\r
+                       $stock_gl_code = get_stock_gl_code($stock_id);\r
+                       $memo = _("For zero inventory of ").$stock_id." INVADJ REF: ".$reference;\r
+                       //Reverse the inventory effect if $qoh <=0\r
+                       add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, \r
+                               $stock_gl_code["inventory_account"],\r
+                               $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo, \r
+                               -$qoh * $diff);\r
+                       //GL Posting to inventory adjustment account\r
+                       add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, \r
+                               $stock_gl_code["adjustment_account"],\r
+                               $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo,\r
+                               $qoh * $diff);\r
+                               \r
+                       add_audit_trail(ST_JOURNAL, $id, $date_);\r
+                       add_comments(ST_JOURNAL, $id, $date_, $memo);\r
+                       $Refs->save(ST_JOURNAL, $id, $ref);     \r
+               }               \r
+       }*/\r
 \r
        update_average_material_cost(null, $stock_id, $standard_cost, $quantity, $date_);
 
index d423b9211ae7d5b3d689915ce3772537ad25eac0..1b37162f6c548cf7f2c471e51baf22d8b92c62dd 100644 (file)
@@ -103,7 +103,9 @@ if (!isset($_POST['stock_id']))
        $_POST['stock_id'] = get_global_stock_item();
 
 echo "<center>" . _("Item:"). "&nbsp;";
-echo stock_purchasable_items_list('stock_id', $_POST['stock_id'], false, true);
+//Chaitanya : Manufcatured item visible\r
+echo stock_items_list('stock_id', $_POST['stock_id'], false, true);\r
+//echo stock_purchasable_items_list('stock_id', $_POST['stock_id'], false, true);\r
 
 echo "<hr></center>";
 
index 1969cf93f2c0aeb9aeb5ee1cbca8afbadc602724..f85bc089e29f47175155cb7442129f7729e4d5b9 100644 (file)
@@ -99,7 +99,9 @@ if (!isset($_POST['stock_id']))
        $_POST['stock_id'] = get_global_stock_item();
 
 echo "<center>" . _("Item:"). "&nbsp;";
-echo stock_purchasable_items_list('stock_id', $_POST['stock_id'], false, true);
+//Chaitanya : All items can be purchased\r
+echo stock_items_list('stock_id', $_POST['stock_id'], false, true);\r
+//echo stock_purchasable_items_list('stock_id', $_POST['stock_id'], false, true);\r
 
 echo "<hr></center>";
 
index 28167da7da3c9b7a43354280431229af03b06b49..7cc79f007c8eb6bfed55fd9d0dad6370e26a5e4f 100644 (file)
@@ -55,9 +55,11 @@ function add_work_order_issue($woid, $ref, $to_work_order, $items, $location, $w
                if ($to_work_order)
                        $item->quantity = -$item->quantity;
 
+               //Chaitanya: Stamp the standard_cost\r
+               $standard_cost = get_standard_cost($item->stock_id);\r
                // insert a -ve stock move for each item
                add_stock_move(ST_MANUISSUE, $item->stock_id, $number,
-                       $location, $date_, $memo_, -$item->quantity, 0);
+                       $location, $date_, $memo_, -$item->quantity, $standard_cost);\r
 
                $sql = "INSERT INTO ".TB_PREF."wo_issue_items (issue_id, stock_id, qty_issued)
                        VALUES (".db_escape($number).", ".db_escape($item->stock_id).", "
@@ -68,12 +70,20 @@ function add_work_order_issue($woid, $ref, $to_work_order, $items, $location, $w
                $issue_cost = $standard_cost * $item->quantity;
                $issue = get_stock_gl_code($item->stock_id);
         $stockitem = get_item($item->stock_id);
-        $total_cost += add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $issue["inventory_account"], 0, 0,
+               \r
+               //Chaitanya : Compatibility for Service Items\r
+               if (!is_service($issue["mb_flag"]))\r
+                       $ivaccount = $issue["inventory_account"];\r
+               else\r
+                       $ivaccount = $issue["cogs_account"];            \r
+               \r
+        $total_cost += add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $ivaccount, 0, 0,\r
                 $date_.": "._("Issue of")." ".$stockitem["description"], -$issue_cost);                        
                $issue_total += $issue_cost;
        }       
        if ($issue_total != 0)
-               add_issue_cost($details['stock_id'], $details['units_reqd'], $date_, $issue_total);
+               //Chaitanya : Apply cost to QOH as adjustment only\r
+               add_issue_cost($details['stock_id'], $details['units_reqd'], $date_, $issue_total, true);\r
        $issue = get_stock_gl_code($details['stock_id']);
     $stockitem = get_item($details['stock_id']);
     add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $issue["inventory_account"],
@@ -156,18 +166,63 @@ function void_work_order_issue($type_no)
 {
        begin_transaction();
        hook_db_prevoid(ST_MANUISSUE, $type_no);
+       \r
+       //Chaitanya : Skip processing already voided entry i.e. explicitly voided\r
+       $void_entry = get_voided_entry(ST_MANUISSUE, $type_no);\r
+       if ($void_entry)\r
+               return;\r
 
        // void the actual issue items and their quantities
        $sql = "UPDATE ".TB_PREF."wo_issue_items Set qty_issued = 0 WHERE issue_id="
                .db_escape($type_no);
        db_query($sql,"A work order issue item could not be voided");
 
-       // void all related stock moves
+       // void any related gl trans\r
+       //Chaitanya : Nothing happens due to next statement as all gl postings are done against WO\r
+       //void_gl_trans(ST_MANUISSUE, $type_no, true);\r
+       \r
+       //Chaitanya : Reverse the gl posting\r
+       $issue = get_work_order_issue($type_no);\r
+       $manf_stock_id = $issue["stock_id"];\r
+       $date_ = sql2date($issue["issue_date"]);\r
+       $woid = $issue["workorder_id"];\r
+               \r
+       $result = get_stock_moves(ST_MANUISSUE, $type_no);\r
+       $total_cost = 0;\r
+       $issue_total = 0;\r
+       while ($myrow = db_fetch($result))\r
+       {\r
+               $issue_cost = $myrow["qty"]*$myrow["standard_cost"];\r
+               $issue = get_stock_gl_code($myrow["stock_id"]);\r
+        $stockitem = get_item($myrow["stock_id"]);\r
+               \r
+               //Chaitanya : Compatibility for Service Items\r
+               if (!is_service($issue["mb_flag"]))\r
+                       $ivaccount = $issue["inventory_account"];\r
+               else\r
+                       $ivaccount = $issue["cogs_account"];            \r
+               \r
+               if ($issue_cost != 0)\r
+               {\r
+                       $total_cost += add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $ivaccount, 0, 0,\r
+                               $date_.": "._("Reversed the issue of")." ".$stockitem["description"],\r
+                               -$issue_cost);                  \r
+                       $issue_total += $issue_cost;\r
+               }\r
+       }\r
+       if ($issue_total != 0)\r
+               //Chaitanya : Revese cost effect on manfactured stock item as adjustment only\r
+               add_issue_cost($manf_stock_id, 0, $date_, $issue_total, true);\r
+       $issue = get_stock_gl_code($manf_stock_id);\r
+    $stockitem = get_item($manf_stock_id);\r
+       if ($total_cost != 0)\r
+               add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $issue["inventory_account"],\r
+                       0, 0, $date_.": "._("Reversed the issue to")." ".$stockitem["description"], \r
+                       -$total_cost);  \r
+       \r
+       //Chaitanya : Shifted below void all related stock moves\r
        void_stock_move(ST_MANUISSUE, $type_no);
-
-       // void any related gl trans
-       void_gl_trans(ST_MANUISSUE, $type_no, true);
-
+       \r
        commit_transaction();
 }
 
index 9b2095c076141fdce58e949a8ab2c5ed1999d4d7..1c72f94f3cc8d8e25409aa9d93380a549d35753a 100644 (file)
@@ -44,20 +44,29 @@ function work_order_produce($woid, $ref, $quantity, $date_, $memo_, $close_wo)
        db_query($sql,"A work order manufacture could not be added");
 
        $id = db_insert_id();
+       \r
+       // -------------------------------------------------------------------------\r
 
+       work_order_quick_costs($woid, $details["stock_id"], $quantity, $date_, $id);\r
+       \r
        // -------------------------------------------------------------------------
 
-       work_order_quick_costs($woid, $details["stock_id"], $quantity, $date_, $id);
+       // Chaitanya: stamp BOM cost to finished item\r
+       $m_cost = 0;\r
+    $result = get_bom($details["stock_id"]);\r
+       while ($bom_item = db_fetch($result))\r
+       {\r
+               $standard_cost = get_standard_cost($bom_item['component']);\r
+               $m_cost += ($bom_item['quantity'] * $standard_cost);\r
+       }       \r
 
-       // -------------------------------------------------------------------------
        // insert a +ve stock move for the item being manufactured
        // negative means "unproduce" or unassemble
        add_stock_move(ST_MANURECEIVE, $details["stock_id"], $id,
-               $details["loc_code"], $date_, $ref, $quantity, 0);
+               $details["loc_code"], $date_, $ref, $quantity, $m_cost);\r
        // update wo quantity and close wo if requested
        work_order_update_finished_quantity($woid, $quantity, $close_wo);
 
-
        if ($memo_)
                add_comments(ST_MANURECEIVE, $id, $date_, $memo_);
 
@@ -109,24 +118,56 @@ function void_work_order_produce($type_no)
 {
        begin_transaction();
        hook_db_prevoid(ST_MANURECEIVE, $type_no);
+       \r
+       //Chaitanya : Skip processing already voided entry i.e. explicitly voided\r
+       $void_entry = get_voided_entry(ST_MANURECEIVE, $type_no);\r
+       if ($void_entry)\r
+               return; \r
 
        $row = get_work_order_produce($type_no);
 
        // deduct the quantity of this production from the parent work order
        work_order_update_finished_quantity($row["workorder_id"], -$row["quantity"]);
 
-       work_order_quick_costs($row['workorder_id'], $row['stock_id'], -$row['quantity'], sql2date($row['date_']), $type_no);
-
+       //Chaitanya : skipped this step as BOM may have got changed\r
+       //work_order_quick_costs($row['workorder_id'], $row['stock_id'], -$row['quantity'], sql2date($row['date_']), $type_no);\r
+
+       // void any related gl trans\r
+       //Chaitanya : Nothing happens due to next statement as all gl postings are done against WO\r
+       //void_gl_trans(ST_MANURECEIVE, $type_no, true);\r
+       \r
+       $woid = $row["workorder_id"];\r
+       $date_ = sql2date($row["date_"]);\r
+               \r
+       $result = get_stock_moves(ST_MANURECEIVE, $type_no);\r
+       while ($myrow = db_fetch($result))\r
+       {\r
+               $issue_cost = $myrow["qty"]*$myrow["standard_cost"];\r
+               $issue = get_stock_gl_code($myrow["stock_id"]);\r
+        $stockitem = get_item($myrow["stock_id"]);\r
+               \r
+               //Chaitanya : Compatibility for Service Items\r
+               if (!is_service($issue["mb_flag"]))\r
+                       $ivaccount = $issue["inventory_account"];\r
+               else\r
+                       $ivaccount = $issue["cogs_account"];            \r
+               \r
+               if ($issue_cost != 0)\r
+               {\r
+                       add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $ivaccount, 0, 0,\r
+                               $date_.": "._("Reversed the production ")." ".$stockitem["description"],\r
+                               -$issue_cost);\r
+               }\r
+       }       \r
+                       \r
        // clear the production record
        $sql = "UPDATE ".TB_PREF."wo_manufacture SET quantity=0 WHERE id=".db_escape($type_no);
-       db_query($sql, "Cannot void a wo production");
-
+       db_query($sql, "Cannot void a wo production");                  \r
+       \r
+       //Chaitanya : Shifted below\r
        // void all related stock moves
        void_stock_move(ST_MANURECEIVE, $type_no);
 
-       // void any related gl trans
-       void_gl_trans(ST_MANURECEIVE, $type_no, true);
-
        commit_transaction();
 }
 
index e39d334c8ba38177d7aae9a4cb7b84e46661a7af..8cee8bd946948b9f6ad0be853034e1a495c4cb97 100644 (file)
@@ -11,7 +11,8 @@
 ***********************************************************************/
 //--------------------------------------------------------------------------------------
 
-function add_material_cost($stock_id, $qty, $date_)
+//Chaitanya : Added $advanced Parameter for Advanced Manufacturing\r
+function add_material_cost($stock_id, $qty, $date_, $advanced=false)\r
 {
        $m_cost = 0;
     $result = get_bom($stock_id);
@@ -20,26 +21,46 @@ function add_material_cost($stock_id, $qty, $date_)
                $standard_cost = get_standard_cost($bom_item['component']);
                $m_cost += ($bom_item['quantity'] * $standard_cost);
        }
+       $bom_cost = $m_cost;\r
+       \r
        //$dec = user_price_dec();
        //price_decimal_format($m_cost, $dec);
-       $sql = "SELECT material_cost FROM ".TB_PREF."stock_master WHERE stock_id = "
+       $sql = "SELECT material_cost, labour_cost, overhead_cost FROM ".TB_PREF."stock_master WHERE stock_id = "\r
                .db_escape($stock_id);
        $result = db_query($sql);
        $myrow = db_fetch($result);
        $material_cost =  $myrow['material_cost'];
+       \r
+       //Chaitanya : Upating material cost without considering labour, overhead costs results in invalid costing       \r
+       if ($advanced)\r
+       {\r
+               //reduce overhead_cost and labour_cost from price as those will remain as is\r
+               $m_cost = $m_cost - $myrow['labour_cost'] - $myrow['overhead_cost'];\r
+       }\r
+       \r
        //$qoh = get_qoh_on_date($stock_id, null, $date_);
        $qoh = get_qoh_on_date($stock_id);
+       $cost_adjust = false;\r
        if ($qoh < 0)
+       {\r
+               if ($qoh + $qty >= 0)\r
+                       $cost_adjust = true;\r
                $qoh = 0;
+       }               \r
        if ($qoh + $qty != 0)   
                $material_cost = ($qoh * $material_cost + $qty * $m_cost) /     ($qoh + $qty);
-       //$material_cost = round2($material_cost, $dec);        
-       $sql = "UPDATE ".TB_PREF."stock_master SET material_cost=$material_cost
-               WHERE stock_id=".db_escape($stock_id);
+       //$material_cost = round2($material_cost, $dec);\r
+       \r
+       if ($advanced && $cost_adjust) // new 2010-02-10\r
+               adjust_deliveries($stock_id, $bom_cost, $date_);        \r
+       \r
+       $sql = "UPDATE ".TB_PREF."stock_master SET material_cost=".db_escape($material_cost)."\r
+                   WHERE stock_id=".db_escape($stock_id);\r
        db_query($sql,"The cost details for the inventory item could not be updated");
 }
 
-function add_overhead_cost($stock_id, $qty, $date_, $costs)
+//Chaitanya : Added Adjustement Only Parameter\r
+function add_overhead_cost($stock_id, $qty, $date_, $costs, $adj_only=false)\r
 {
        //$dec = user_price_dec();
        //price_decimal_format($costs, $dec); 
@@ -54,15 +75,50 @@ function add_overhead_cost($stock_id, $qty, $date_, $costs)
        $qoh = get_qoh_on_date($stock_id);
        if ($qoh < 0)
                $qoh = 0;
-       if ($qoh + $qty != 0)   
-               $overhead_cost = ($qoh * $overhead_cost + $qty * $costs) /      ($qoh + $qty);
+       if ($adj_only)\r
+       {\r
+               if ($qty != 0)\r
+                       $costs = $qty * $costs;\r
+               if ($qoh>0)\r
+                       $overhead_cost = ($qoh * $overhead_cost + $costs) / $qoh;\r
+               else //Chaitanya : Pass JV if qoh is 0/negative \r
+               {\r
+                       global $Refs;\r
+\r
+                       $id = get_next_trans_no(ST_JOURNAL);\r
+                       $ref = $Refs->get_next(ST_JOURNAL);\r
+                       \r
+                       $stock_gl_code = get_stock_gl_code($stock_id);\r
+                       $memo = "WO Overhead cost settlement JV for zero/negative respository of ".$stock_id;\r
+                       //Reverse the inventory effect if $qoh <=0\r
+                       add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, \r
+                               $stock_gl_code["inventory_account"],\r
+                               $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo, \r
+                               -$costs);\r
+                       //GL Posting to inventory adjustment account\r
+                       add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, \r
+                               $stock_gl_code["adjustment_account"],\r
+                               $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo,\r
+                               $costs);\r
+                               \r
+                       add_audit_trail(ST_JOURNAL, $id, $date_);\r
+                       add_comments(ST_JOURNAL, $id, $date_, $memo);\r
+                       $Refs->save(ST_JOURNAL, $id, $ref);     \r
+               }\r
+       }\r
+       else\r
+       {               \r
+               if ($qoh + $qty != 0)   \r
+                       $overhead_cost = ($qoh * $overhead_cost + $qty * $costs) /      ($qoh + $qty);\r
+       }\r
        //$overhead_cost = round2($overhead_cost, $dec);        
        $sql = "UPDATE ".TB_PREF."stock_master SET overhead_cost=".db_escape($overhead_cost)."
                WHERE stock_id=".db_escape($stock_id);
        db_query($sql,"The cost details for the inventory item could not be updated");
 }
 
-function add_labour_cost($stock_id, $qty, $date_, $costs)
+//Chaitanya : Added Adjustement Only Parameter\r
+function add_labour_cost($stock_id, $qty, $date_, $costs, $adj_only=false)\r
 {
        //$dec = user_price_dec();
        //price_decimal_format($costs, $dec); 
@@ -77,15 +133,50 @@ function add_labour_cost($stock_id, $qty, $date_, $costs)
        $qoh = get_qoh_on_date($stock_id);
        if ($qoh < 0)
                $qoh = 0;
-       if ($qoh + $qty != 0)   
-               $labour_cost = ($qoh * $labour_cost + $qty * $costs) /  ($qoh + $qty);
+       if ($adj_only)\r
+       {\r
+               if ($qty != 0)\r
+                       $costs = $qty * $costs;\r
+               if ($qoh>0)\r
+                       $labour_cost = ($qoh * $labour_cost + $costs) / $qoh;   \r
+               else //Chaitanya : Pass JV if qoh is 0/negative \r
+               {\r
+                       global $Refs;\r
+\r
+                       $id = get_next_trans_no(ST_JOURNAL);\r
+                       $ref = $Refs->get_next(ST_JOURNAL);\r
+                       \r
+                       $stock_gl_code = get_stock_gl_code($stock_id);\r
+                       $memo = "WO labour cost settlement JV for zero/negative respository of ".$stock_id;\r
+                       //Reverse the inventory effect if $qoh <=0\r
+                       add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, \r
+                               $stock_gl_code["inventory_account"],\r
+                               $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo, \r
+                               -$costs);\r
+                       //GL Posting to inventory adjustment account\r
+                       add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, \r
+                               $stock_gl_code["adjustment_account"],\r
+                               $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo,\r
+                               $costs);\r
+                               \r
+                       add_audit_trail(ST_JOURNAL, $id, $date_);\r
+                       add_comments(ST_JOURNAL, $id, $date_, $memo);\r
+                       $Refs->save(ST_JOURNAL, $id, $ref);     \r
+               }\r
+       }\r
+       else\r
+       {               \r
+               if ($qoh + $qty != 0)   \r
+                       $labour_cost = ($qoh * $labour_cost + $qty * $costs) /  ($qoh + $qty);\r
+       }\r
        //$labour_cost = round2($labour_cost, $dec);    
        $sql = "UPDATE ".TB_PREF."stock_master SET labour_cost=".db_escape($labour_cost)."
                WHERE stock_id=".db_escape($stock_id);
        db_query($sql,"The cost details for the inventory item could not be updated");
 }
 
-function add_issue_cost($stock_id, $qty, $date_, $costs)
+//Chaitanya : Added Adjustement Only Parameter\r
+function add_issue_cost($stock_id, $qty, $date_, $costs, $adj_only=false)\r
 {
        if ($qty != 0)
                $costs /= $qty;
@@ -100,8 +191,42 @@ function add_issue_cost($stock_id, $qty, $date_, $costs)
        $qoh = get_qoh_on_date($stock_id);
        if ($qoh < 0)
                $qoh = 0;
-       if ($qoh + $qty != 0)   
-               $material_cost = ($qty * $costs) /      ($qoh + $qty);
+       if ($adj_only)\r
+       {\r
+               if ($qty != 0)\r
+                       $costs = $qty * $costs;\r
+               if ($qoh>0)\r
+                       $material_cost = $costs / $qoh;\r
+               else //Chaitanya : Pass JV if qoh is 0/negative \r
+               {\r
+                       global $Refs;\r
+\r
+                       $id = get_next_trans_no(ST_JOURNAL);\r
+                       $ref = $Refs->get_next(ST_JOURNAL);\r
+                       \r
+                       $stock_gl_code = get_stock_gl_code($stock_id);\r
+                       $memo = "WO Issue settlement JV for zero/negative respository of ".$stock_id;\r
+                       //Reverse the inventory effect if $qoh <=0\r
+                       add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, \r
+                               $stock_gl_code["inventory_account"],\r
+                               $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo, \r
+                               -$costs);\r
+                       //GL Posting to inventory adjustment account\r
+                       add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, \r
+                               $stock_gl_code["adjustment_account"],\r
+                               $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo,\r
+                               $costs);\r
+                               \r
+                       add_audit_trail(ST_JOURNAL, $id, $date_);\r
+                       add_comments(ST_JOURNAL, $id, $date_, $memo);\r
+                       $Refs->save(ST_JOURNAL, $id, $ref);     \r
+               }\r
+       }\r
+       else\r
+       {\r
+               if ($qoh + $qty != 0)   \r
+                       $material_cost = ($qty * $costs) /      ($qoh + $qty);\r
+       }\r
        //$material_cost = round2($material_cost, $dec);        
        $sql = "UPDATE ".TB_PREF."stock_master SET material_cost=material_cost+"
                .db_escape($material_cost)
@@ -124,7 +249,8 @@ function add_work_order($wo_ref, $loc_code, $units_reqd, $stock_id,
        $args->woid = 0;
        hook_db_prewrite($args, ST_WORKORDER);
 
-       add_material_cost($stock_id, $units_reqd, $date_);
+       //Chaitanya : Material cost should be added at time of production as per BOM at the time.\r
+       //add_material_cost($stock_id, $units_reqd, $date_);\r
 
        $date = date2sql($date_);
        $required = date2sql($required_by);
@@ -161,8 +287,9 @@ function update_work_order($woid, $loc_code, $units_reqd, $stock_id,
                'date_', 'required_by', 'memo_'), $args);
        hook_db_prewrite($args, ST_WORKORDER);
 
-       add_material_cost($_POST['old_stk_id'], -$_POST['old_qty'], $date_);
-       add_material_cost($stock_id, $units_reqd, $date_);
+       //Chaitanya: Material Cost to be calculated at production\r
+       //add_material_cost($_POST['old_stk_id'], -$_POST['old_qty'], $date_);\r
+       //add_material_cost($stock_id, $units_reqd, $date_);\r
 
        $date = date2sql($date_);
        $required = date2sql($required_by);
@@ -187,7 +314,8 @@ function delete_work_order($woid)
        begin_transaction();
        hook_db_prevoid(ST_WORKORDER, $woid);
 
-       add_material_cost($_POST['stock_id'], -$_POST['quantity'], $_POST['date_']);
+       //Chaitanya : Cost calculation are affected only at time of production\r
+       //add_material_cost($_POST['stock_id'], -$_POST['quantity'], $_POST['date_']);\r
 
        // delete the work order requirements
        delete_wo_requirements($woid);
@@ -317,7 +445,9 @@ function void_work_order($woid)
        $work_order = get_work_order($woid);
        if (!($work_order["type"] == WO_ADVANCED))
        {
-               $date = sql2date($work_order['date_']);
+               //Chaitanya : Removed WO costing from here. Handled in void_stock_move\r
+               //Reason - if BOM is changed since WO was executed then add_material_cost will result in incorrect costing as it is based on current BOM for material cost.\r
+               /*$date = sql2date($work_order['date_']);\r
                $qty = $work_order['units_reqd'];
                add_material_cost($work_order['stock_id'], -$qty, $date); // remove avg. cost for qty
                $cost = get_gl_wo_cost($woid, WO_LABOUR); // get the labour cost and reduce avg cost
@@ -325,7 +455,7 @@ function void_work_order($woid)
                        add_labour_cost($work_order['stock_id'], -$qty, $date, $cost);
                $cost = get_gl_wo_cost($woid, WO_OVERHEAD); // get the overhead cost and reduce avg cost
                if ($cost != 0)
-                       add_overhead_cost($work_order['stock_id'], -$qty, $date, $cost);
+                       add_overhead_cost($work_order['stock_id'], -$qty, $date, $cost);*/\r
 
                $sql = "UPDATE ".TB_PREF."workorders SET closed=1,units_reqd=0,units_issued=0 WHERE id = "
                        .db_escape($woid);
@@ -344,24 +474,52 @@ function void_work_order($woid)
        {
                // void everything inside the work order : issues, productions, payments
                $date = sql2date($work_order['date_']);
-               add_material_cost($work_order['stock_id'], -$work_order['units_reqd'], $date); // remove avg. cost for qty
+               \r
+               //Chaitanya : Removed WO costing from here. Handled in void_stock_move\r
+               //Reason - if BOM is changed since WO was executed then add_material_cost will result in incorrect costing as it is based on current BOM for material cost.\r
+               //add_material_cost($work_order['stock_id'], -$work_order['units_reqd'], $date); // remove avg. cost for qty\r
+               \r
                $result = get_work_order_productions($woid); // check the produced quantity
                $qty = 0;
                while ($row = db_fetch($result))
                {
-                       $qty += $row['quantity'];
+                       //Chaitanya : Use native function for voiding\r
+                       void_work_order_produce($row['id']);\r
+                       \r
+                       //Post voided entry if not prevoided explicitly\r
+                       $void_entry = get_voided_entry(ST_MANURECEIVE, $row['id']);\r
+                       if ($void_entry)\r
+                               continue;\r
+                       $memo_ = _("Voiding Work Order Trans # ").$woid;\r
+                       add_audit_trail(ST_MANURECEIVE, $row['id'], today(), _("Voided.")."\n".$memo_);\r
+                       add_voided_entry(ST_MANURECEIVE, $row['id'], today(), $memo_);                  \r
+               \r
+                       /*$qty += $row['quantity'];\r
                        // clear the production record
-                       $sql = "UPDATE ".TB_PREF."wo_manufacture SET quantity=0 WHERE id=".$$row['id'];
+                       $sql = "UPDATE ".TB_PREF."wo_manufacture SET quantity=0 WHERE id=".$row['id'];\r
                        db_query($sql, "Cannot void a wo production");
                        
-                       void_stock_move(ST_MANURECEIVE, $row['id']); // and void the stock moves; 
+                       void_stock_move(ST_MANURECEIVE, $row['id']); // and void the stock moves; */\r
                }
-               $result = get_additional_issues($woid); // check the issued quantities
+               //Chaitanya : Get all work order issues\r
+               //$result = get_additional_issues($woid); // check the issued quantities\r
+               $result = get_work_order_issues($woid);\r
                $cost = 0;
                $issue_no = 0;
                while ($row = db_fetch($result))
                {
-                       $std_cost = get_standard_cost($row['stock_id']);
+                       //Chaitanya : Use native function for voiding\r
+                       void_work_order_issue($row['issue_no']);\r
+                       \r
+                       //Post voided entry if not prevoided explicitly\r
+                       $void_entry = get_voided_entry(ST_MANUISSUE, $row['issue_no']);\r
+                       if ($void_entry)\r
+                               continue;\r
+                       $memo_ = _("Voiding Work Order Trans # ").$woid;\r
+                       add_audit_trail(ST_MANUISSUE, $row['issue_no'], today(), _("Voided.")."\n".$memo_);\r
+                       add_voided_entry(ST_MANUISSUE, $row['issue_no'], today(), $memo_);                              \r
+                       \r
+                       /*$std_cost = get_standard_cost($row['stock_id']);\r
                        $icost = $std_cost * $row['qty_issued'];
                        $cost += $icost;
                        if ($issue_no == 0)
@@ -369,19 +527,24 @@ function void_work_order($woid)
                        // void the actual issue items and their quantities
                        $sql = "UPDATE ".TB_PREF."wo_issue_items SET qty_issued = 0 WHERE issue_id="
                                .db_escape($row['id']);
-                       db_query($sql,"A work order issue item could not be voided");
-               }       
-               if ($issue_no != 0)
-                       void_stock_move(ST_MANUISSUE, $issue_no); // and void the stock moves 
-               if ($cost != 0)
-                       add_issue_cost($work_order['stock_id'], -$qty, $date, $cost);
-
+                       db_query($sql,"A work order issue item could not be voided");*/ \r
+               }\r
+               \r
+               //Chaitaya : Voiding each issue handles the \r
+               //if ($issue_no != 0)\r
+                       //void_stock_move(ST_MANUISSUE, $issue_no); // and void the stock moves \r
+               //if ($cost != 0)\r
+                       //add_issue_cost($work_order['stock_id'], -$qty, $date, $cost);\r
+
+               //Chaitanya : Reverse the cost effects on $work_order['stock_id'] as adjustement\r
                $cost = get_gl_wo_cost($woid, WO_LABOUR); // get the labour cost and reduce avg cost
                if ($cost != 0)
-                       add_labour_cost($work_order['stock_id'], -$qty, $date, $cost);
+                       //add_labour_cost($work_order['stock_id'], -$qty, $date, $cost);\r
+                       add_labour_cost($work_order['stock_id'], 1, $date, -$cost, true);\r
                $cost = get_gl_wo_cost($woid, WO_OVERHEAD); // get the overhead cost and reduce avg cost
                if ($cost != 0)
-                       add_overhead_cost($work_order['stock_id'], -$qty, $date, $cost);
+                       //add_overhead_cost($work_order['stock_id'], -$qty, $date, $cost);\r
+                       add_overhead_cost($work_order['stock_id'], 1, $date, -$cost, true);\r
                
                $sql = "UPDATE ".TB_PREF."workorders SET closed=1,units_reqd=0,units_issued=0 WHERE id = "
                        .db_escape($woid);
index 1534e277a076920f6305684f63b1af0f9f8bab1e..31fbadb87202f5b835c0c1b12eb5c02113d50b5d 100644 (file)
@@ -66,10 +66,21 @@ function add_work_order_quick($wo_ref, $loc_code, $units_reqd, $stock_id, $type,
         db_query($sql, "The work order requirements could not be added");
 
                // insert a -ve stock move for each item
+               // Chaitanya: Updated to record price and cost as std_cost for work order issued item\r
+               $UnitCost = get_standard_cost($bom_item["component"]);\r
                add_stock_move(ST_WORKORDER, $bom_item["component"], $woid,
-                       $bom_item["loc_code"], $date_, $wo_ref, -$item_quantity, 0);
+                       $bom_item["loc_code"], $date_, $wo_ref, -$item_quantity, $UnitCost, 0, 1, $UnitCost);\r
        }
-
+       \r
+       // -------------------------------------------------------------------------\r
+       //Negative Stock Handling\r
+       $qoh = get_qoh_on_date($stock_id);\r
+       $cost_adjust = false;\r
+       if ($qoh < 0)\r
+       {\r
+               if ($qoh + $units_reqd > 0)\r
+                       $cost_adjust = true;\r
+       }\r
 
        // -------------------------------------------------------------------------
 
@@ -82,6 +93,12 @@ function add_work_order_quick($wo_ref, $loc_code, $units_reqd, $stock_id, $type,
        work_order_quick_costs($woid, $stock_id, $units_reqd, $date_, 0, $costs, $cr_acc, $labour, $cr_lab_acc);
 
        // -------------------------------------------------------------------------
+       \r
+       //Negative Stock Handling\r
+       if ($cost_adjust)\r
+               adjust_deliveries($stock_id, get_standard_cost($stock_id), $date_);\r
+               \r
+       //--------------------------------------------------------------------------\r
 
        add_comments(ST_WORKORDER, $woid, $date_, $memo_);
 
@@ -103,9 +120,10 @@ function work_order_quick_costs($woid, $stock_id, $units_reqd, $date_, $advanced
 
        // credit all the components
        $total_cost = 0;
+       //Chaitanya : capture the exact i.e. non-rounded cost to avoid rounding error amplification\r
+       $total_material_cost = 0;\r
        while ($bom_item = db_fetch($result))
        {
-
                $bom_accounts = get_stock_gl_code($bom_item["component"]);
 
                $bom_cost = $bom_item["ComponentCost"] * $units_reqd;
@@ -116,15 +134,26 @@ function work_order_quick_costs($woid, $stock_id, $units_reqd, $date_, $advanced
                        $memo = $date_.": ".$memo; 
                        update_wo_requirement_issued($woid, $bom_item['component'], $bom_item["quantity"] * $units_reqd);                       
                        // insert a -ve stock move for each item
+                       // Chaitanya: Updated to record price and cost as std_cost for work order issued item\r
+                       $UnitCost = get_standard_cost($bom_item["component"]);                  \r
                        add_stock_move(ST_MANURECEIVE, $bom_item["component"], $advanced,
-                               $bom_item["loc_code"], $date_, "", -$bom_item["quantity"] * $units_reqd, 0);
+                               $bom_item["loc_code"], $date_, "", -$bom_item["quantity"] * $units_reqd, $UnitCost, 0, 1, $UnitCost);\r
                }
-               $total_cost += add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $bom_accounts["inventory_account"], 0, 0,
+               \r
+               //Chaitanya : Compatibility for Service Items\r
+               if (!is_service($bom_accounts["mb_flag"]))\r
+                       $ivaccount = $bom_accounts["inventory_account"];\r
+               else\r
+                       $ivaccount = $bom_accounts["cogs_account"];\r
+               $total_cost += add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $ivaccount, 0, 0,\r
                        $memo, -$bom_cost);
-
+               $total_material_cost += $bom_cost;\r
        }
        if ($advanced)
        {
+               //Chaitanya: Material cost added at time of production as per BOM at the time and in adjustment mode.\r
+               add_material_cost($stock_id, $units_reqd, $date_, true);        \r
+       \r
                $wo = get_work_order($woid);
                // also take the additional issues
                // moved to work_order_issues_db.inc
@@ -144,10 +173,13 @@ function work_order_quick_costs($woid, $stock_id, $units_reqd, $date_, $advanced
                if ($issue_total != 0)
                        add_issue_cost($stock_id, $units_reqd, $date_, $issue_total);
                */      
+               \r
+               // Logic moved to work_order_costs.php\r
+               /*\r
                $lcost = get_gl_wo_cost($woid, WO_LABOUR);
                add_labour_cost($stock_id, $units_reqd, $date_, $lcost * $units_reqd / $wo['units_reqd']);
                $ocost = get_gl_wo_cost($woid, WO_OVERHEAD);
-               add_overhead_cost($stock_id, $units_reqd, $date_, $ocost * $units_reqd / $wo['units_reqd']);
+               add_overhead_cost($stock_id, $units_reqd, $date_, $ocost * $units_reqd / $wo['units_reqd']); */\r
        }
        // credit additional costs
        $item_accounts = get_stock_gl_code($stock_id);
@@ -190,6 +222,10 @@ function work_order_quick_costs($woid, $stock_id, $units_reqd, $date_, $advanced
                $memo = $date_.": ".$memo;
     add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $item_accounts["inventory_account"],
         0, 0, $memo, -$total_cost);    
+               \r
+       //Chaitanya : Update cost of the manufactured item in stock moves table\r
+       $UnitWOCost = ($total_material_cost + $costs + $labour)/$units_reqd;\r
+       update_stock_move(ST_WORKORDER, $woid, $stock_id, $UnitWOCost);         \r
 }
 
 //--------------------------------------------------------------------------------------
index 50e7f7feaf9309922c60f650c768439d95775ca0..590b80c3417beef27d0919e6abd4d222168989d5 100644 (file)
@@ -76,7 +76,7 @@ function can_process()
                display_error(_("The amount entered is not a valid number or less then zero."));
                set_focus('costs');
                return false;
-       }
+       }       \r
 
        if (!is_date($_POST['date_']))
        {
@@ -119,6 +119,14 @@ if (isset($_POST['process']) && can_process() == true)
        add_gl_trans_std_cost(ST_WORKORDER, $_POST['selected_id'], $_POST['date_'], $_POST['db_acc'],
                $_POST['dim1'], $_POST['dim2'], $date.": ".$wo_cost_types[$_POST['PaymentType']], input_num('costs'), PT_WORKORDER, 
                        $_POST['PaymentType']);
+                       \r
+       //Chaitanya : Apply the costs to manfuctured stock item as adjustement\r
+       $wo = get_work_order($_POST['selected_id']);\r
+       if ($_POST['PaymentType'] == 0)\r
+               add_labour_cost($wo['stock_id'], 0, $_POST['date_'], input_num('costs'), true);\r
+       else\r
+               add_overhead_cost($wo['stock_id'], 0, $_POST['date_'], input_num('costs'), true);\r
+                       \r
        commit_transaction();   
 
        meta_forward($_SERVER['PHP_SELF'], "AddedID=".$_POST['selected_id']);
index f76f6c75fcdb8ffb6374476bccc1c9e62f281c81..1e9f71be23769b860cba371dd26e5ecf891d80bb 100644 (file)
 //------------------- update average material cost ------------------------------------------ Joe Hunt Mar-03-2008
 function update_average_material_cost($supplier, $stock_id, $price, $qty, $date, $adj_only=false)
 {
+       //Handle if inventory will become negative
+       if (is_inventory_item($stock_id))
+               handle_negative_inventory($stock_id, $qty, $price, $date);
+
        // probably this function should be optimized
        // passing transaction cart as argument. This would
        // save a couple of db calls like get_supplier()
@@ -36,10 +40,23 @@ function update_average_material_cost($supplier, $stock_id, $price, $qty, $date,
        }       
        else
                $price_in_home_currency = $price;
-       $sql = "SELECT material_cost FROM ".TB_PREF."stock_master WHERE stock_id=".db_escape($stock_id);
+       
+       $price_in_home_currency_ = $price_in_home_currency;
+       
+       $sql = "SELECT mb_flag, material_cost, labour_cost, overhead_cost FROM ".TB_PREF."stock_master WHERE stock_id=".db_escape($stock_id);
        $result = db_query($sql);
        $myrow = db_fetch($result);
        $material_cost = $myrow['material_cost'];
+       
+       //Chaitanya : For Manufactured Items 
+       //IF inventory adjustment is made for manufactured item, the material cost averages and labour, overhead remains as is, but in inventory valuation total standard_cost matters resulting in invalid  valuation. 
+       if (!$adj_only && $myrow['mb_flag'] == 'M') //For manufactured items price is adjusted
+       {
+               $standard_cost = get_standard_cost($stock_id);
+               //reduce overhead_cost and labour_cost from price as those will remain as is
+               $price_in_home_currency = $price_in_home_currency - $myrow['labour_cost'] - $myrow['overhead_cost'];
+       }
+       
        //if ($price > -0.0001 && $price < 0.0001) commented out by Chaitanya
        //      return $material_cost;
        if ($adj_only)
@@ -49,7 +66,7 @@ function update_average_material_cost($supplier, $stock_id, $price, $qty, $date,
        $cost_adjust = false;
        //$qoh = get_qoh_on_date($stock_id, null, $date, $exclude);
        $qoh = get_qoh_on_date($stock_id);
-       
+
        if ($adj_only)
        {
                if ($qoh > 0)
@@ -59,17 +76,18 @@ function update_average_material_cost($supplier, $stock_id, $price, $qty, $date,
        {
                if ($qoh < 0)
                {
-                       if ($qoh + $qty > 0)
+                       if ($qoh + $qty >= 0)
                                $cost_adjust = true;
                        $qoh = 0;
                }
-               if ($qoh + $qty != 0)
-                       $material_cost = ($qoh * $material_cost + $qty * $price_in_home_currency) /     ($qoh + $qty);
+               if ($qoh + $qty > 0)
+                       $material_cost 
+= ($qoh * $material_cost + $qty * $price_in_home_currency) /   ($qoh + $qty);
        }       
        //$material_cost = round2($material_cost, $dec);
        
-       if ($cost_adjust) // new 2010-02-10
-               adjust_deliveries($stock_id, $material_cost, $date);
+       if ($cost_adjust) // new 2010-02-10 //Chaitanya : Material_cost replaced with price
+               adjust_deliveries($stock_id, $price_in_home_currency_, $date);
        $sql = "UPDATE ".TB_PREF."stock_master SET material_cost=".db_escape($material_cost)."
                WHERE stock_id=".db_escape($stock_id);
        db_query($sql,"The cost details for the inventory item could not be updated");
index d0aa40acb3edab8a2321bafad10ab610ce6df20f..ec5ad432683a4dfbb8503c4511739eedfdb1abdb 100644 (file)
@@ -397,7 +397,9 @@ function po_item_controls(&$order, &$rowcounter, $line_no=-1)
        {
 //             hidden('line_no', ($_SESSION['PO']->lines_on_order + 1));
 
-               stock_purchasable_items_list_cells(null, 'stock_id', null, false, true, true);
+               //Chaitanya : Manufcatured item can be purchased
+               stock_items_list_cells(null, 'stock_id', null, false, true, true);
+               //stock_purchasable_items_list_cells(null, 'stock_id', null, false, true, true);
                if (list_updated('stock_id')) {
                            $Ajax->activate('price');
                            $Ajax->activate('units');