MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
***********************************************************************/
-function work_order_produce($woid, $ref, $quantity, $date_, $memo_, $close_wo)
+function work_order_produce($woid, $ref, $quantity, $date_, $memo, $close_wo)
{
global $Refs;
- begin_transaction();
+// FIXME: support for WO_UNASSEMBLY case
+ begin_transaction(__FUNCTION__, func_get_args());
- $details = get_work_order($woid);
+ $args = func_get_args();
+ $args = (object)array_combine(array('woid', 'ref', 'quantity', 'date_', 'memo','close_wo'),
+ $args);
+ $args->trans_no = 0;
+ hook_db_prewrite($args, ST_MANURECEIVE);
- if (strlen($details[0]) == 0)
- {
- echo _("The order number sent is not valid.");
- exit;
- }
-
- if (work_order_is_closed($woid))
- {
- display_error("UNEXPECTED : Producing Items for a closed Work Order");
- cancel_transaction();
- exit;
- }
+ $product = get_work_order($woid);
$date = date2sql($date_);
$id = db_insert_id();
// -------------------------------------------------------------------------
+ // insert -ve and update averaged component unit cost for BOM usage (in wo_requirements)
+ work_order_production_gl($woid, $product["stock_id"], $quantity, $date_, $id);
- work_order_quick_costs($woid, $details["stock_id"], $quantity, $date_, $id);
-
- // -------------------------------------------------------------------------
- // 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_, $memo_, $quantity, 0);
- // update wo quantity and close wo if requested
- work_order_update_finished_quantity($woid, $quantity, $close_wo);
+ // update wo quantity and close wo if requested (or finished)
+ $closed = work_order_update_finished_quantity($woid, $quantity, $close_wo);
+ // unit_cost is known when WO is finished, then generate +ve for all items
+ if ($closed)
+ {
+ // 1. calculate sums of material/labour/overhead costs
+
+ // sum collected BOM material & labour costs (no way for separate overhead here for now - needs flag in bom or stock_master)
+ $bom = get_wo_requirements($woid);
+ $m_cost = $l_cost = 0;
+ while ($component = db_fetch($bom))
+ {
+ if (!is_service($component["mb_flag"]))
+ $m_cost += $component['unit_cost']*$component['units_issued'];
+ else
+ $l_cost += $component['unit_cost']*$component['units_issued'];
+ }
+
+ // add additional material issues
+ $issues = get_additional_issues($woid);
+ while ($issue = db_fetch($issues))
+ {
+ if (!is_service($issue["mb_flag"]))
+ $m_cost += $issue['unit_cost']*$issue['qty_issued'];
+ else
+ $l_cost += $issue['unit_cost']*$issue['qty_issued'];
+ }
+
+ // and additional costs
+ $o_cost = get_gl_wo_cost($woid, WO_OVERHEAD);
+ $l_cost += get_gl_wo_cost($woid, WO_LABOUR);
+
+ $total_cost = $o_cost + $m_cost + $l_cost;
+
+ add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $product['wip_account'],
+ 0, 0, $memo, -$total_cost);
+
+ add_gl_trans_std_cost(ST_WORKORDER, $woid, $date_, $product['inventory_account'],
+ 0, 0, $memo, $total_cost);
+
+ $unit_cost = $total_cost/($product['units_issued']+$quantity);
+
+ // first update material cost
+ update_material_cost($product['stock_id'], $product['units_issued']+$quantity, $unit_cost, $date_);
+
+ add_stock_move(ST_WORKORDER, $product["stock_id"], $woid,
+ $product["loc_code"], $date_, $ref, $product['units_issued']+$quantity, $unit_cost);
+ }
- if ($memo_)
- add_comments(ST_MANURECEIVE, $id, $date_, $memo_);
+ if ($memo)
+ add_comments(ST_MANURECEIVE, $id, $date_, $memo);
$Refs->save(ST_MANURECEIVE, $id, $ref);
add_audit_trail(ST_MANURECEIVE, $id, $date_, _("Production."));
+ $args->trans_no = $id;
+ hook_db_postwrite($args, ST_MANURECEIVE);
+
commit_transaction();
}
function get_work_order_produce($id)
{
- $sql = "SELECT ".TB_PREF."wo_manufacture.*,".TB_PREF."workorders.stock_id, "
- .TB_PREF."stock_master.description AS StockDescription
- FROM ".TB_PREF."wo_manufacture, ".TB_PREF."workorders, ".TB_PREF."stock_master
- WHERE ".TB_PREF."wo_manufacture.workorder_id=".TB_PREF."workorders.id
- AND ".TB_PREF."stock_master.stock_id=".TB_PREF."workorders.stock_id
- AND ".TB_PREF."wo_manufacture.id=".db_escape($id);
+ $sql = "SELECT prod.*, wo.stock_id, item.description AS StockDescription, wo.closed
+ FROM ".TB_PREF."wo_manufacture prod,"
+ .TB_PREF."workorders wo,"
+ .TB_PREF."stock_master item
+ WHERE prod.workorder_id=wo.id
+ AND item.stock_id=wo.stock_id
+ AND prod.id=".db_escape($id);
$result = db_query($sql, "The work order production could not be retrieved");
return db_fetch($result);
return (db_num_rows($result) > 0);
}
+//--------------------------------------------------------------------------------------
+
+function check_void_wo_production($prod_no)
+{
+ $prod = get_work_order_produce($prod_no);
+ return $prod['closed'] ? $prod['workorder_id'] : 0;
+}
+
//--------------------------------------------------------------------------------------------
function void_work_order_produce($type_no)
{
- begin_transaction();
+ begin_transaction(__FUNCTION__, func_get_args());
+ hook_db_prevoid(ST_MANURECEIVE, $type_no);
- $row = get_work_order_produce($type_no);
+ // Skip processing already voided entry i.e. explicitly voided
+ $void_entry = get_voided_entry(ST_MANURECEIVE, $type_no);
+ if ($void_entry)
+ return;
- // deduct the quantity of this production from the parent work order
- work_order_update_finished_quantity($row["workorder_id"], -$row["quantity"]);
+ $prod = get_work_order_produce($type_no);
- work_order_quick_costs($row['workorder_id'], $row['stock_id'], -$row['quantity'], sql2date($row['date_']), $type_no);
+ if (work_order_is_closed($prod['workorder_id']))
+ return;
+
+ // deduct the quantity of this production from the parent work order
+ work_order_update_finished_quantity($prod["workorder_id"], -$prod["quantity"], false);
// 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");
- // void all related stock moves
- void_stock_move(ST_MANURECEIVE, $type_no);
+ void_gl_trans(ST_MANURECEIVE, $type_no);
- // void any related gl trans
- void_gl_trans(ST_MANURECEIVE, $type_no, true);
+ void_stock_move(ST_MANURECEIVE, $type_no);
commit_transaction();
}
-?>
\ No newline at end of file