$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;
Example #2
0
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;
}
Example #3
0
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;
}
Example #5
0
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;
}