2 /**********************************************************************
3 Copyright (C) FrontAccounting, LLC.
4 Released under the terms of the GNU General Public License, GPL,
5 as published by the Free Software Foundation, either version 3
6 of the License, or (at your option) any later version.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
12 //--------------------------------------------------------------------------------------
14 function add_work_order($wo_ref, $loc_code, $units_reqd, $stock_id,
15 $type, $date_, $required_by, $memo_, $costs, $cr_acc, $labour, $cr_lab_acc)
19 if (!($type == WO_ADVANCED))
20 return add_work_order_quick($wo_ref, $loc_code, $units_reqd, $stock_id, $type, $date_, $memo_, $costs, $cr_acc, $labour, $cr_lab_acc);
23 $args = func_get_args();
24 $args = (object)array_combine(array('wo_ref', 'loc_code', 'units_reqd', 'stock_id',
25 'type', 'date_', 'required_by', 'memo_', 'costs', 'cr_acc', 'labour', 'cr_lab_acc'), $args);
27 hook_db_prewrite($args, ST_WORKORDER);
29 add_material_cost($stock_id, $units_reqd, $date_);
31 $date = date2sql($date_);
32 $required = date2sql($required_by);
34 $sql = "INSERT INTO ".TB_PREF."workorders (wo_ref, loc_code, units_reqd, stock_id,
35 type, date_, required_by)
36 VALUES (".db_escape($wo_ref).", ".db_escape($loc_code).", "
37 .db_escape($units_reqd).", ".db_escape($stock_id).",
38 ".db_escape($type).", '$date', ".db_escape($required).")";
39 db_query($sql, "could not add work order");
41 $woid = db_insert_id();
43 add_comments(ST_WORKORDER, $woid, $required_by, $memo_);
45 $Refs->save(ST_WORKORDER, $woid, $wo_ref);
46 add_audit_trail(ST_WORKORDER, $woid, $date_);
49 hook_db_postwrite($args, ST_WORKORDER);
55 //--------------------------------------------------------------------------------------
57 function update_work_order($woid, $loc_code, $units_reqd, $stock_id,
58 $date_, $required_by, $memo_, $old_stock_id, $old_qty)
61 $args = func_get_args();
62 $args = (object)array_combine(array('woid', 'loc_code', 'units_reqd', 'stock_id',
63 'date_', 'required_by', 'memo_'), $args);
64 hook_db_prewrite($args, ST_WORKORDER);
66 add_material_cost($old_stock_id, -$old_qty, $date_);
67 add_material_cost($stock_id, $units_reqd, $date_);
69 $date = date2sql($date_);
70 $required = date2sql($required_by);
72 $sql = "UPDATE ".TB_PREF."workorders SET loc_code=".db_escape($loc_code).",
73 units_reqd=".db_escape($units_reqd).", stock_id=".db_escape($stock_id).",
74 required_by=".db_escape($required).",
76 WHERE id = ".db_escape($woid);
78 db_query($sql, "could not update work order");
80 update_comments(ST_WORKORDER, $woid, null, $memo_);
81 add_audit_trail(ST_WORKORDER, $woid, $date_, _("Updated."));
83 hook_db_postwrite($args, ST_WORKORDER);
87 function delete_work_order($woid, $stock_id, $qty, $date)
90 hook_db_prevoid(ST_WORKORDER, $woid);
92 add_material_cost($stock_id, -$qty, $date);
94 // delete the work order requirements
95 delete_wo_requirements($woid);
97 // delete the actual work order
98 $sql = "DELETE FROM ".TB_PREF."workorders WHERE id=".db_escape($woid);
99 db_query($sql,"The work order could not be deleted");
101 delete_comments(ST_WORKORDER, $woid);
102 add_audit_trail(ST_WORKORDER, $woid, $date, _("Canceled."));
104 commit_transaction();
107 //--------------------------------------------------------------------------------------
109 function get_work_order($woid, $allow_null=false)
111 $sql = "SELECT wo.*,st.description As StockItemName,l.location_name,
112 l.delivery_address,l.email, l.contact
113 FROM ".TB_PREF."workorders wo, ".TB_PREF."stock_master st, ".TB_PREF."locations l
114 WHERE st.stock_id=wo.stock_id
115 AND l.loc_code=wo.loc_code
116 AND wo.id=".db_escape($woid)."
119 $result = db_query($sql, "The work order issues could not be retrieved");
121 if (!$allow_null && db_num_rows($result) == 0)
122 display_db_error("Could not find work order $woid", $sql);
124 return db_fetch($result);
127 //--------------------------------------------------------------------------------------
129 function work_order_has_productions($woid)
131 $sql = "SELECT COUNT(*) FROM ".TB_PREF."wo_manufacture WHERE workorder_id=".db_escape($woid);
132 $result = db_query($sql, "query work order for productions");
134 $myrow = db_fetch_row($result);
135 return ($myrow[0] > 0);
139 //--------------------------------------------------------------------------------------
141 function work_order_has_issues($woid)
143 $sql = "SELECT COUNT(*) FROM ".TB_PREF."wo_issues WHERE workorder_id=".db_escape($woid);
144 $result = db_query($sql, "query work order for issues");
146 $myrow = db_fetch_row($result);
147 return ($myrow[0] > 0);
150 //--------------------------------------------------------------------------------------
152 function work_order_has_payments($woid)
154 $result = get_gl_wo_cost_trans($woid);
156 return (db_num_rows($result) != 0);
159 //--------------------------------------------------------------------------------------
161 function release_work_order($woid, $releaseDate, $memo_)
165 $myrow = get_work_order($woid);
166 $stock_id = $myrow["stock_id"];
168 $date = date2sql($releaseDate);
170 $sql = "UPDATE ".TB_PREF."workorders SET released_date='$date',
171 released=1 WHERE id = ".db_escape($woid);
172 db_query($sql, "could not release work order");
174 // create Work Order Requirements based on the bom
175 create_wo_requirements($woid, $stock_id);
177 add_comments(ST_WORKORDER, $woid, $releaseDate, $memo_);
178 add_audit_trail(ST_WORKORDER, $woid, sql2date($myrow['date_']), _("Released."));
180 commit_transaction();
183 //--------------------------------------------------------------------------------------
185 function close_work_order($woid)
187 $sql = "UPDATE ".TB_PREF."workorders SET closed=1 WHERE id = ".db_escape($woid);
188 db_query($sql, "could not close work order");
191 //--------------------------------------------------------------------------------------
193 function work_order_is_closed($woid)
195 $sql = "SELECT closed FROM ".TB_PREF."workorders WHERE id = ".db_escape($woid);
196 $result = db_query($sql, "could not query work order");
197 $row = db_fetch_row($result);
198 return ($row[0] > 0);
201 //--------------------------------------------------------------------------------------
203 function work_order_update_finished_quantity($woid, $quantity, $force_close=0)
205 $sql = "UPDATE ".TB_PREF."workorders SET units_issued = units_issued + ".db_escape($quantity).",
206 closed = ((units_issued >= units_reqd) OR ".db_escape($force_close).")
207 WHERE id = ".db_escape($woid);
209 db_query($sql, "The work order issued quantity couldn't be updated");
212 //--------------------------------------------------------------------------------------
214 function void_work_order($woid)
217 hook_db_prevoid(ST_WORKORDER, $woid);
219 $work_order = get_work_order($woid);
220 if (!($work_order["type"] == WO_ADVANCED))
222 $sql = "UPDATE ".TB_PREF."workorders SET closed=1,units_reqd=0,units_issued=0 WHERE id = "
224 db_query($sql, "The work order couldn't be voided");
226 // void all related stock moves
227 void_stock_move(ST_WORKORDER, $woid);
229 // void any related bank/gl trans
230 void_bank_trans(ST_WORKORDER, $woid, true);
232 // clear the requirements units received
233 void_wo_requirements($woid);
237 // void everything inside the work order : issues, productions, payments
238 $date = sql2date($work_order['date_']);
240 $result = get_work_order_productions($woid); // check the produced quantity
241 while ($row = db_fetch($result))
243 void_work_order_produce($row['id']);
245 //Post voided entry if not prevoided explicitly
246 $void_entry = get_voided_entry(ST_MANURECEIVE, $row['id']);
249 $memo_ = _("Voiding Work Order Trans # ").$woid;
250 add_audit_trail(ST_MANURECEIVE, $row['id'], today(), _("Voided.")."\n".$memo_);
251 add_voided_entry(ST_MANURECEIVE, $row['id'], today(), $memo_);
254 $result = get_work_order_issues($woid);
256 while ($row = db_fetch($result))
258 void_work_order_issue($row['issue_no']);
260 //Post voided entry if not prevoided explicitly
261 $void_entry = get_voided_entry(ST_MANUISSUE, $row['issue_no']);
264 $memo_ = _("Voiding Work Order Trans # ").$woid;
265 add_audit_trail(ST_MANUISSUE, $row['issue_no'], today(), _("Voided.")."\n".$memo_);
266 add_voided_entry(ST_MANUISSUE, $row['issue_no'], today(), $memo_);
269 //Adust avg labour cost
270 $cost = get_gl_wo_cost($woid, WO_LABOUR);
272 add_labour_cost($work_order['stock_id'], 1, $date, -$cost, true);
274 //Adust avg overhead cost
275 $cost = get_gl_wo_cost($woid, WO_OVERHEAD);
277 add_overhead_cost($work_order['stock_id'], 1, $date, -$cost, true);
279 $sql = "UPDATE ".TB_PREF."workorders SET closed=1,units_reqd=0,units_issued=0 WHERE id = "
281 db_query($sql, "The work order couldn't be voided");
283 // void all related stock moves
284 void_stock_move(ST_WORKORDER, $woid);
286 // void any related bank/gl trans
287 void_bank_trans(ST_WORKORDER, $woid, true);
289 // clear the requirements units received
290 void_wo_requirements($woid);
292 commit_transaction();
295 function get_sql_for_work_orders($outstanding_only, $stock_id, $location = ALL_TEXT, $order_no='', $order_ref = '', $overdue = false)
301 location.location_name,
303 workorder.units_reqd,
304 workorder.units_issued,
306 workorder.required_by,
307 workorder.released_date,
312 FROM ".TB_PREF."workorders as workorder,"
313 .TB_PREF."stock_master as item,"
314 .TB_PREF."item_units as unit,"
315 .TB_PREF."locations as location
316 WHERE workorder.stock_id=item.stock_id
317 AND workorder.loc_code=location.loc_code
318 AND item.units=unit.abbr";
320 if (check_value('OpenOnly') || $outstanding_only != 0)
322 $sql .= " AND workorder.closed=0";
325 if ($location != ALL_TEXT)
327 $sql .= " AND workorder.loc_code=".db_escape($location);
332 $sql .= " AND workorder.id LIKE ".db_escape('%'.$order_no.'%');
335 if ($order_ref != '')
337 $sql .= " AND workorder.wo_ref LIKE ".db_escape('%'.$order_ref.'%');
340 if ($stock_id != ALL_TEXT)
342 $sql .= " AND workorder.stock_id=".db_escape($stock_id);
347 $Today = date2sql(Today());
349 $sql .= " AND workorder.required_by < '$Today' ";
354 function get_sql_for_where_used($stock_id)
358 workcentre.name As WorkCentreName,
359 location.location_name,
362 FROM ".TB_PREF."bom as bom, "
363 .TB_PREF."stock_master as parent, "
364 .TB_PREF."workcentres as workcentre, "
365 .TB_PREF."locations as location
366 WHERE bom.parent = parent.stock_id
367 AND bom.workcentre_added = workcentre.id
368 AND bom.loc_code = location.loc_code
369 AND bom.component=".db_escape($stock_id);
372 //--------------------------------------------------------------------------------------
373 function get_gl_wo_cost($woid, $cost_type)
376 $result = get_gl_wo_cost_trans($woid, $cost_type);
377 while ($row = db_fetch($result))
378 $cost += -$row['amount'];