X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=manufacturing%2Fincludes%2Fdb%2Fwork_order_costing_db.inc;h=2502be7640281964d3833c885518da0010d0c9e5;hb=fc449c48a8d4ba23bfb18318dff08746340a440c;hp=8d8e1517f812bb88141c856cca74c3491d709b68;hpb=d1babda7c01b314d35fb89f2d195553b55936532;p=fa-stable.git diff --git a/manufacturing/includes/db/work_order_costing_db.inc b/manufacturing/includes/db/work_order_costing_db.inc index 8d8e1517..2502be76 100644 --- a/manufacturing/includes/db/work_order_costing_db.inc +++ b/manufacturing/includes/db/work_order_costing_db.inc @@ -35,164 +35,74 @@ function delete_wo_costing($trans_type, $trans_no) db_query($sql, "could not delete work order costing"); } -//-------------------------------------------------------------------------------------- -function add_material_cost($stock_id, $qty, $date_, $advanced=false) +/* + Updates average material cost for item. +*/ +function update_material_cost($stock_id, $qty, $unit_cost, $date) { - $m_cost = 0; - $result = get_bom($stock_id); - while ($bom_item = db_fetch($result)) - { - $standard_cost = get_standard_cost($bom_item['component']); - $m_cost += ($bom_item['quantity'] * $standard_cost); - } - $bom_cost = $m_cost; - - $sql = "SELECT 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']; - - if ($advanced) + global $Refs; + + $product = get_item($stock_id); + $avg_cost = $product['material_cost']; + + $qoh = get_qoh_on_date($stock_id, null, $date); + + // unit_cost*qty is already posted on inventory GL +/* + if ($qoh > 0) { - //reduce overhead_cost and labour_cost from price as those will remain as is - $m_cost = $m_cost - $myrow['labour_cost'] - $myrow['overhead_cost']; + if ($qty<0) + $qty_done = max(-$qoh, $qty); + else + $qty_done = $qty; + } else { + if ($qty>0) + $qty_done = max($qoh+$qty, 0); + else + $qty_done = 0; } - - $qoh = get_qoh_on_date($stock_id); - $cost_adjust = false; + $qty_delayed = $qty-$qty_done; +*/ if ($qoh < 0) { - if ($qoh + $qty >= 0) - $cost_adjust = true; - $qoh = 0; + $qty_delayed = min(-$qoh, $qty); + } else { + $qty_delayed = 0; } - if ($qoh + $qty != 0) - { - if ($qoh == 0) - $material_cost += $m_cost; - else - $material_cost = ($qoh * $material_cost + $qty * $m_cost) / ($qoh + $qty); - } - - if ($advanced && $cost_adjust) // new 2010-02-10 - adjust_deliveries($stock_id, $bom_cost, $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"); -} + $qty_new = $qty - $qty_delayed; -function add_overhead_cost($stock_id, $qty, $date_, $costs, $adj_only=false) -{ - if ($qty != 0) - $costs /= $qty; - $sql = "SELECT overhead_cost FROM ".TB_PREF."stock_master WHERE stock_id = " - .db_escape($stock_id); - $result = db_query($sql); - $myrow = db_fetch($result); - $overhead_cost = $myrow['overhead_cost']; - $qoh = get_qoh_on_date($stock_id); - if ($qoh < 0) - $qoh = 0; - if ($adj_only) + if ($qty_delayed > 0 && ($unit_cost != $avg_cost)) { - if ($qty != 0) - $costs = $qty * $costs; - if ($qoh>0) - $overhead_cost = ($qoh * $overhead_cost + $costs) / $qoh; - else // Journal Entry if QOH is 0/negative - { - global $Refs; + // post $qty_delayed*($avg_cost-$unit_cost) + $diff = $qty_delayed*($unit_cost-$avg_cost); + $stock_gl_code = get_item($stock_id); - $id = get_next_trans_no(ST_JOURNAL); - $ref = $Refs->get_next(ST_JOURNAL); - - $stock_gl_code = get_stock_gl_code($stock_id); - add_journal(ST_JOURNAL, $id, $costs, $date_, get_company_currency(), $ref); - $memo = "WO Overhead cost settlement JV for zero/negative respository of ".$stock_id; - //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, - -$costs); - //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, - $costs); - - add_audit_trail(ST_JOURNAL, $id, $date_); - add_comments(ST_JOURNAL, $id, $date_, $memo); - $Refs->save(ST_JOURNAL, $id, $ref); - if ($qty != 0) - $overhead_cost = ($qoh * $overhead_cost + $costs) / $qty; - } - } - else - { - if ($qoh + $qty != 0) - $overhead_cost = ($qoh * $overhead_cost + $qty * $costs) / ($qoh + $qty); - } - $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"); -} + $dec = user_price_dec(); + $old_cost = -round2($avg_cost, $dec); + $new_cost = -round2($unit_cost, $dec); -function add_labour_cost($stock_id, $qty, $date_, $costs, $adj_only=false) -{ - if ($qty != 0) - $costs /= $qty; - $sql = "SELECT labour_cost FROM ".TB_PREF."stock_master WHERE stock_id = " - .db_escape($stock_id); - $result = db_query($sql); - $myrow = db_fetch($result); - $labour_cost = $myrow['labour_cost']; - $qoh = get_qoh_on_date($stock_id); - if ($qoh < 0) - $qoh = 0; - if ($adj_only) - { - if ($qty != 0) - $costs = $qty * $costs; - if ($qoh>0) - $labour_cost = ($qoh * $labour_cost + $costs) / $qoh; - else // Journal Entry if QOH is 0/negative - { - global $Refs; + $cart = new items_cart(ST_COSTUPDATE); + $cart->tran_date = $cart->doc_date = $cart->event_date = $date; - $id = get_next_trans_no(ST_JOURNAL); - $ref = $Refs->get_next(ST_JOURNAL); - add_journal(ST_JOURNAL, $id, $costs, $date_, get_company_currency(), $ref); + if (!is_date_in_fiscalyear($cart->tran_date)) + $cart->tran_date = end_fiscalyear(); - $stock_gl_code = get_stock_gl_code($stock_id); - $memo = "WO labour cost settlement JV for zero/negative respository of ".$stock_id; - //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, - -$costs); - //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, - $costs); + $cart->reference = $Refs->get_next(ST_COSTUPDATE, null, $cart->tran_date, $date); - add_audit_trail(ST_JOURNAL, $id, $date_); - add_comments(ST_JOURNAL, $id, $date_, $memo); - $Refs->save(ST_JOURNAL, $id, $ref); - if ($qty != 0) - $labour_cost = ($qoh * $labour_cost + $costs) / $qty; - } + $cart->memo_ = sprintf(_("COGS changed from %s to %s for %d %s of '%s'"), $avg_cost, $unit_cost, $qty_delayed, $item['units'], $stock_id); + + $cart->add_gl_item($item["cogs_account"], $item["dimension_id"], $item["dimension2_id"], -$diff); + $cart->add_gl_item($item["inventory_account"], 0, 0, $diff); + + write_journal_entries($cart); } - else - { - if ($qoh + $qty != 0) - $labour_cost = ($qoh * $labour_cost + $qty * $costs) / ($qoh + $qty); - } - $sql = "UPDATE ".TB_PREF."stock_master SET labour_cost=".db_escape($labour_cost)." - WHERE stock_id=".db_escape($stock_id); + + if ($qty > 0 && ($qoh != -$qty)) + $avg_cost = ($avg_cost*($qoh+$qty_delayed)+$unit_cost*$qty_new)/($qoh+$qty); + + $sql = "UPDATE ".TB_PREF."stock_master SET material_cost=".db_escape($avg_cost)." + WHERE stock_id=".db_escape($stock_id); db_query($sql,"The cost details for the inventory item could not be updated"); } @@ -210,16 +120,14 @@ function add_issue_cost($stock_id, $qty, $date_, $costs, $adj_only=false) $qoh = 0; if ($adj_only) { - if ($qty != 0) - $costs = $qty * $costs; if ($qoh>0) - $material_cost = $costs / $qoh; + $material_cost = ($qoh * $material_cost + $costs) / $qoh; else // Journal Entry if QOH is 0/negative { global $Refs; $id = get_next_trans_no(ST_JOURNAL); - $ref = $Refs->get_next(ST_JOURNAL); + $ref = $Refs->get_next(ST_JOURNAL, null, $date_); add_journal(ST_JOURNAL, $id, $costs, $date_, get_company_currency(), $ref); $stock_gl_code = get_stock_gl_code($stock_id); @@ -231,7 +139,7 @@ function add_issue_cost($stock_id, $qty, $date_, $costs, $adj_only=false) -$costs); //GL Posting to inventory adjustment account add_gl_trans_std_cost(ST_JOURNAL, $id, $date_, - $stock_gl_code["adjustment_account"], + $stock_gl_code["assembly_account"], $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], $memo, $costs); @@ -245,7 +153,7 @@ function add_issue_cost($stock_id, $qty, $date_, $costs, $adj_only=false) else { if ($qoh + $qty != 0) - $material_cost = ($qty * $costs) / ($qoh + $qty); + $material_cost = ($qoh * $material_cost + $qty * $costs) / ($qoh + $qty); } $sql = "UPDATE ".TB_PREF."stock_master SET material_cost=material_cost+" .db_escape($material_cost) @@ -265,7 +173,8 @@ function add_wo_costs_journal($wo_id, $amount, $cost_type, $cr_acc, $db_acc, $da begin_transaction(); $journal_id = get_next_trans_no(ST_JOURNAL); - if (!$ref) $ref = $Refs->get_next(ST_JOURNAL); + + if (!$ref) $ref = $Refs->get_next(ST_JOURNAL, null, $date); add_gl_trans_std_cost(ST_JOURNAL, $journal_id, $date, $cr_acc, 0, 0, $wo_cost_types[$cost_type], -$amount); @@ -275,12 +184,23 @@ function add_wo_costs_journal($wo_id, $amount, $cost_type, $cr_acc, $db_acc, $da add_bank_trans(ST_JOURNAL, $journal_id, $is_bank_to, "", $date, -$amount, PT_WORKORDER, $wo_id, get_company_currency(), "Cannot insert a destination bank transaction"); - } else - add_journal(ST_JOURNAL, $journal_id, $amount, $date, get_company_currency(), $ref); + } + add_journal(ST_JOURNAL, $journal_id, $amount, $date, get_company_currency(), $ref); add_gl_trans_std_cost(ST_JOURNAL, $journal_id, $date, $db_acc, $dim1, $dim2, $wo_cost_types[$cost_type], $amount); + $wip = get_company_pref('wip_act'); + + if ($db_acc != $wip) + { + add_gl_trans_std_cost(ST_JOURNAL, $journal_id, $date, $db_acc, + 0, 0, $wo_cost_types[$cost_type], -$amount); + + add_gl_trans_std_cost(ST_JOURNAL, $journal_id, $date, $wip, + 0, 0, $wo_cost_types[$cost_type], $amount); + } + $Refs->save(ST_JOURNAL, $journal_id, $ref); add_wo_costing($wo_id, $cost_type, ST_JOURNAL, $journal_id); @@ -291,6 +211,39 @@ function add_wo_costs_journal($wo_id, $amount, $cost_type, $cr_acc, $db_acc, $da commit_transaction(); } +/* + Process component usage: generate and post stock move, update average component cost. +*/ +function work_order_production_gl($woid, $stock_id, $quantity, $date_, $rcv_no) +{ + $result = get_wo_requirements($woid); + + // credit all the components + $total_cost = 0; + while ($bom_item = db_fetch($result)) + { + + update_wo_requirement_issued($bom_item['id'], $bom_item["units_req"] * $quantity, $bom_item["ComponentCost"]); + + // insert a -ve stock move for each item + add_stock_move(ST_MANURECEIVE, $bom_item["stock_id"], $rcv_no, + $bom_item["loc_code"], $date_, "", -$bom_item["units_req"] * $quantity, $bom_item["ComponentCost"], 0); + + if (!is_service($bom_item["mb_flag"])) + $ivaccount = $bom_item["inventory_account"]; + else + $ivaccount = $bom_item["assembly_account"]; + + $memo = $date_.": ".$bom_item["units_req"] ." * ".$bom_item["description"]; + + $total_cost += add_gl_trans_std_cost(ST_MANURECEIVE, $rcv_no, $date_, $ivaccount, 0, 0, + $memo, -$bom_item["ComponentCost"] * $bom_item["units_req"] * $quantity); + } + + add_gl_trans_std_cost(ST_MANURECEIVE, $rcv_no, $date_, get_company_pref('wip_act'), + 0, 0, $memo, -$total_cost); +} + function void_wo_costing($wo_id) { $res = get_wo_costing($wo_id);