$th = array(_("Item Code"), _("Item Description"), $new ? _("Ordered") : _("Max. delivery"), _("Units"), $new ? _("Delivered") : _("Invoiced"), _("This Delivery"), _("Price"), _("Tax Type"), _("Discount"), _("Total")); table_header($th); $k = 0; $has_marked = false; foreach ($_SESSION['Items']->line_items as $line => $ln_itm) { if ($ln_itm->quantity == $ln_itm->qty_done) { continue; //this line is fully delivered } if (isset($_POST['_Location_update']) || isset($_POST['clear_quantity']) || isset($_POST['reset_quantity'])) { // reset quantity $ln_itm->qty_dispatched = $ln_itm->quantity - $ln_itm->qty_done; } // if it's a non-stock item (eg. service) don't show qoh $row_classes = null; if (has_stock_holding($ln_itm->mb_flag) && $ln_itm->qty_dispatched) { // It's a stock : call get_dispatchable_quantity hook to get which quantity to preset in the // quantity input box. This allows for example a hook to modify the default quantity to what's dispatchable // (if there is not enough in hand), check at other location or other order people etc ... // This hook also returns a 'reason' (css classes) which can be used to theme the row. // // FIXME: hook_get_dispatchable definition does not allow qoh checks on transaction level // (but anyway dispatch is checked again later before transaction is saved) $qty = $ln_itm->qty_dispatched; if ($check = check_negative_stock($ln_itm->stock_id, -$ln_itm->qty_dispatched, $_POST['Location'], $_POST['DispatchDate'])) { $qty = $check['qty']; } $q_class = hook_get_dispatchable_quantity($ln_itm, $_POST['Location'], $_POST['DispatchDate'], $qty); // Skip line if needed if ($q_class === 'skip') { continue;
function can_process() { global $selected_id, $SysPrefs, $Refs; if (!isset($selected_id)) { if (!$Refs->is_valid($_POST['wo_ref'])) { display_error(_("You must enter a reference.")); set_focus('wo_ref'); return false; } if (!is_new_reference($_POST['wo_ref'], ST_WORKORDER)) { display_error(_("The entered reference is already in use.")); set_focus('wo_ref'); return false; } } if (!check_num('quantity', 0)) { display_error(_("The quantity entered is invalid or less than zero.")); set_focus('quantity'); return false; } if (!is_date($_POST['date_'])) { display_error(_("The date entered is in an invalid format.")); set_focus('date_'); return false; } elseif (!is_date_in_fiscalyear($_POST['date_'])) { display_error(_("The entered date is not in fiscal year.")); set_focus('date_'); return false; } // only check bom and quantites if quick assembly if (!($_POST['type'] == WO_ADVANCED)) { if (!has_bom($_POST['stock_id'])) { display_error(_("The selected item to manufacture does not have a bom.")); set_focus('stock_id'); return false; } if ($_POST['Labour'] == "") { $_POST['Labour'] = price_format(0); } if (!check_num('Labour', 0)) { display_error(_("The labour cost entered is invalid or less than zero.")); set_focus('Labour'); return false; } if ($_POST['Costs'] == "") { $_POST['Costs'] = price_format(0); } if (!check_num('Costs', 0)) { display_error(_("The cost entered is invalid or less than zero.")); set_focus('Costs'); return false; } if (!$SysPrefs->allow_negative_stock()) { if ($_POST['type'] == WO_ASSEMBLY) { // check bom if assembling $result = get_bom($_POST['stock_id']); while ($bom_item = db_fetch($result)) { if (has_stock_holding($bom_item["ResourceType"])) { $quantity = $bom_item["quantity"] * input_num('quantity'); if (check_negative_stock($bom_item["component"], -$quantity, $bom_item["loc_code"], $_POST['date_'])) { display_error(_("The work order cannot be processed because there is an insufficient quantity for component:") . " " . $bom_item["component"] . " - " . $bom_item["description"] . ". " . _("Location:") . " " . $bom_item["location_name"]); set_focus('quantity'); return false; } } } } elseif ($_POST['type'] == WO_UNASSEMBLY) { // if unassembling, check item to unassemble if (check_negative_stock($_POST['stock_id'], -input_num('quantity'), $_POST['StockLocation'], $_POST['date_'])) { display_error(_("The selected item cannot be unassembled because there is insufficient stock.")); return false; } } } } else { if (!is_date($_POST['RequDate'])) { set_focus('RequDate'); display_error(_("The date entered is in an invalid format.")); return false; } //elseif (!is_date_in_fiscalyear($_POST['RequDate'])) //{ // display_error(_("The entered date is not in fiscal year.")); // return false; //} if (isset($selected_id)) { $myrow = get_work_order($selected_id, true); if ($_POST['units_issued'] > input_num('quantity')) { set_focus('quantity'); display_error(_("The quantity cannot be changed to be less than the quantity already manufactured for this order.")); return false; } } } return true; }
function print_workorders() { global $path_to_root, $SysPrefs, $dflt_lang; include_once $path_to_root . "/reporting/includes/pdf_report.inc"; $from = $_POST['PARAM_0']; $to = $_POST['PARAM_1']; $email = $_POST['PARAM_2']; $comments = $_POST['PARAM_3']; $orientation = $_POST['PARAM_4']; if (!$from || !$to) { return; } $orientation = $orientation ? 'L' : 'P'; $fno = explode("-", $from); $tno = explode("-", $to); $from = min($fno[0], $tno[0]); $to = max($fno[0], $tno[0]); $cols = array(4, 60, 190, 255, 320, 385, 450, 515); // $headers in doctext.inc $aligns = array('left', 'left', 'left', 'left', 'right', 'right', 'right'); $params = array('comments' => $comments); $cur = get_company_Pref('curr_default'); if ($email == 0) { $rep = new FrontReport(_('WORK ORDER'), "WorkOrderBulk", user_pagesize(), 9, $orientation); } if ($orientation == 'L') { recalculate_cols($cols); } for ($i = $from; $i <= $to; $i++) { $myrow = get_work_order($i); if ($myrow === false) { continue; } $date_ = sql2date($myrow["date_"]); if ($email == 1) { $rep = new FrontReport("", "", user_pagesize(), 9, $orientation); $rep->title = _('WORK ORDER'); $rep->filename = "WorkOrder" . $myrow['wo_ref'] . ".pdf"; } $rep->SetHeaderType('Header2'); $rep->currency = $cur; $rep->Font(); $rep->Info($params, $cols, null, $aligns); $contact = array('email' => $myrow['email'], 'lang' => $dflt_lang, 'name' => $myrow['contact'], 'name2' => '', 'contact'); $rep->SetCommonData($myrow, null, null, '', 26, $contact); $rep->NewPage(); $result = get_wo_requirements($i); $rep->TextCol(0, 5, _("Work Order Requirements"), -2); $rep->NewLine(2); $has_marked = false; while ($myrow2 = db_fetch($result)) { $qoh = 0; $show_qoh = true; // if it's a non-stock item (eg. service) don't show qoh if (!has_stock_holding($myrow2["mb_flag"])) { $show_qoh = false; } if ($show_qoh) { $qoh = get_qoh_on_date($myrow2["stock_id"], $myrow2["loc_code"], $date_); } if ($show_qoh && $myrow2["units_req"] * $myrow["units_issued"] > $qoh && !$SysPrefs->allow_negative_stock()) { // oops, we don't have enough of one of the component items $has_marked = true; } else { $has_marked = false; } if ($has_marked) { $str = $myrow2['stock_id'] . " ***"; } else { $str = $myrow2['stock_id']; } $rep->TextCol(0, 1, $str, -2); $rep->TextCol(1, 2, $myrow2['description'], -2); $rep->TextCol(2, 3, $myrow2['location_name'], -2); $rep->TextCol(3, 4, $myrow2['WorkCentreDescription'], -2); $dec = get_qty_dec($myrow2["stock_id"]); $rep->AmountCol(4, 5, $myrow2['units_req'], $dec, -2); $rep->AmountCol(5, 6, $myrow2['units_req'] * $myrow['units_issued'], $dec, -2); $rep->AmountCol(6, 7, $myrow2['units_issued'], $dec, -2); $rep->NewLine(1); if ($rep->row < $rep->bottomMargin + 15 * $rep->lineHeight) { $rep->NewPage(); } } $rep->NewLine(1); $rep->TextCol(0, 5, " *** = " . _("Insufficient stock"), -2); $memo = get_comments_string(ST_WORKORDER, $i); if ($memo != "") { $rep->NewLine(); $rep->TextColLines(1, 5, $memo, -2); } if ($email == 1) { $myrow['DebtorName'] = $myrow['contact']; $myrow['reference'] = $myrow['wo_ref']; $rep->End($email); } } if ($email == 0) { $rep->End(); } }
function check_qoh() { global $SysPrefs; $dn =& $_SESSION['Items']; $newdelivery = $dn->trans_no == 0; if (!$SysPrefs->allow_negative_stock()) { foreach ($_SESSION['Items']->line_items as $itm) { if ($itm->qty_dispatched && has_stock_holding($itm->mb_flag)) { $qoh_by_date = get_qoh_on_date($itm->stock_id, $_POST['Location'], $_POST['DispatchDate']); $qoh_abs = get_qoh_on_date($itm->stock_id, $_POST['Location'], null); //If editing current delivery delivered qty should be added if (!$newdelivery) { $delivered = get_already_delivered($itm->stock_id, $_POST['Location'], key($dn->trans_no)); $qoh_abs = $qoh_abs - $delivered; $qoh_by_date = $qoh_by_date - $delivered; } $qoh = $qoh_by_date < $qoh_abs ? $qoh_by_date : $qoh_abs; if ($itm->qty_dispatched > $qoh) { display_error(_("The delivery cannot be processed because there is an insufficient quantity for item:") . " " . $itm->stock_id . " - " . $itm->item_description); return false; } } } } return true; }
function check_qoh() { if (!sys_prefs::allow_negative_stock()) { foreach ($_SESSION['Items']->line_items as $itm) { if ($itm->qty_dispatched && has_stock_holding($itm->mb_flag)) { $qoh = get_qoh_on_date($itm->stock_id, $_POST['Location'], $_POST['DispatchDate']); if ($itm->qty_dispatched > $qoh) { display_error(tr("The delivery cannot be processed because there is an insufficient quantity for item:") . " " . $itm->stock_id . " - " . $itm->item_description); return false; } } } } return true; }