function display()
{
    extract($_REQUEST);
    $fields = array();
    $fields["search"] = "";
    $fields["type_id"] = 0;
    $fields["from_year"] = date("Y");
    $fields["from_month"] = date("m");
    $fields["from_day"] = date("d");
    $fields["to_year"] = date("Y");
    $fields["to_month"] = date("m");
    $fields["to_day"] = date("t");
    extract($fields, EXTR_SKIP);
    if ($type_id) {
        $type_sql = "AND assets.type_id='{$type_id}'";
    } else {
        $type_sql = "";
    }
    $sql = "SELECT qty, des, serial, customers.cusnum, customers.cusname,\r\n\t\t\t\tcustomers.surname, to_date, invnum, hire_invitems.invid,\r\n\t\t\t\thire_invitems.id, done, printed, grpname, name\r\n\t\t\t\tFROM hire.hire_invitems\r\n\t\t\t\t\tLEFT JOIN cubit.assets\r\n\t\t\t\t\t\tON hire_invitems.asset_id = assets.id\r\n\t\t\t\t\tLEFT JOIN hire.hire_invoices\r\n\t\t\t\t\t\tON hire_invitems.invid = hire_invoices.invid\r\n\t\t\t\t\tLEFT JOIN cubit.customers\r\n\t\t\t\t\t\tON hire_invoices.cusnum = customers.cusnum\r\n\t\t\t\t\tLEFT JOIN cubit.assetgrp\r\n\t\t\t\t\t\tON assets.grpid=assetgrp.grpid\r\n\t\t\t\t\tLEFT JOIN cubit.asset_types\r\n\t\t\t\t\t\tON assets.type_id=asset_types.id\r\n\t\t\t\tWHERE done='y' {$type_sql} AND remaction IS NULL AND\r\n\t\t\t\t\tprinted='y' AND (cast(qty as text) ILIKE '%{$search}%' OR\r\n\t\t\t\t\tserial ILIKE '%{$search}%' OR\r\n\t\t\t\t\tcustomers.cusname ILIKE '{$search}%' OR\r\n\t\t\t\t\tcustomers.surname ILIKE '{$search}%' OR\r\n\t\t\t\t\tcast(to_date as text) ILIKE '%{$search}%' OR\r\n\t\t\t\t\tcast(invnum as text) ILIKE '%{$search}%'\r\n\t\t\t\t\tOR grpname ILIKE '%{$search}%' OR name ILIKE '%{$search}%')\r\n\t\t\t\tORDER BY des ASC";
    $asset_rslt = db_exec($sql) or errDie("Unable to retrieve assets.");
    $sql = "SELECT id, name FROM cubit.asset_types";
    $type_rslt = db_exec($sql) or errDie("Unable to retrieve asset types.");
    $type_sel = "<select name='type_id' onchange='javascript:document.form.submit()'\r\n\t\t\t\t  style='width: 100%'>";
    $type_sel .= "<option value='0'>[All]</option>";
    while ($type_data = pg_fetch_array($type_rslt)) {
        if ($type_data["id"] == $type_id) {
            $sel = "selected='t'";
        } else {
            $sel = "";
        }
        $type_sel .= "\r\n\t\t<option value='{$type_data['id']}' {$sel}>\r\n\t\t\t{$type_data['name']}\r\n\t\t</option>";
    }
    $type_sel .= "</select>";
    $hired_out = "";
    while ($asset_data = pg_fetch_array($asset_rslt)) {
        $hired_out .= "<tr class='" . bg_class() . "'>\r\n\t\t\t<td align='center'>\r\n\t\t\t\t<a href='javascript:popupOpen" . "(\"hire-invoice-new.php?invid={$asset_data['invid']}\")'>\r\n\t\t\t\t\tH" . getHirenum($asset_data["invid"], 1) . "\r\n\t\t\t\t</a>\r\n\t\t\t</td>\r\n\t\t\t<td>{$asset_data['grpname']}</td>\r\n\t\t\t<td>{$asset_data['name']}</td>\r\n\t\t\t<td>{$asset_data['des']}</td>\r\n\t\t\t<td>{$asset_data['serial']}</td>\r\n\t\t\t<td align='center'>{$asset_data['qty']}</td>\r\n\t\t\t<td>{$asset_data['cusname']} {$asset_data['surname']}</td>\r\n\t\t\t<td align='center'>" . returnDate($asset_data["id"]) . "</td>\r\n\t\t</tr>";
    }
    // Display something atleast, even though we've got no results.
    if (empty($hired_out)) {
        $hired_out = "<tr class='" . bg_class() . "'>\r\n\t\t\t<td colspan='8'><li>No results found.</li></td>\r\n\t\t</tr>";
    }
    // Available assets -------------------------------------------------------
    $sql = "SELECT grpname, name, des, assets.id, serial2\r\n\t\t\tFROM cubit.assets\r\n\t\t\t\tLEFT JOIN cubit.assetgrp ON assets.grpid=assetgrp.grpid\r\n\t\t\t\tLEFT JOIN cubit.asset_types ON assets.type_id=asset_types.id\r\n\t\t\tWHERE remaction is NULL AND (grpname ILIKE '%{$search}%' OR\r\n\t\t\t\tname ILIKE '%{$search}%' OR des ILIKE '%{$search}%') {$type_sql}\r\n\t\t\tORDER BY des ASC";
    $asset_rslt = db_exec($sql) or errDie("Unable to retrieve assets.");
    $available_out = "";
    while ($asset_data = pg_fetch_array($asset_rslt)) {
        if (isHired($asset_data["id"])) {
            continue;
        }
        $available_out .= "\r\n\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t<td>{$asset_data['grpname']}</td>\r\n\t\t\t<td>{$asset_data['name']}</td>\r\n\t\t\t<td>{$asset_data['des']}</td>\r\n\t\t\t<td>" . getSerial($asset_data["id"]) . "</td>\r\n\t\t\t<td>" . getUnits($asset_data["id"]) . "</td>\r\n\t\t</tr>";
    }
    if (empty($available_out)) {
        $available_out = "<tr class='" . bg_class() . "'>\r\n\t\t\t<td colspan='5'><li>No results found.</li></td>\r\n\t\t</tr>";
    }
    $OUTPUT = "<center>\r\n\t<h3>Asset Report</th>\r\n\t<br /><br />\r\n\t<form method='post' action='" . SELF . "' name='form'>\r\n\t<table " . TMPL_tblDflts . ">\r\n\t\t<tr>\r\n\t\t\t<th colspan='4'>Date Range</th>\r\n\t\t</tr>\r\n\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t<td>" . mkDateSelect("from", $from_year, $from_month, $from_day) . "</td>\r\n\t\t\t<td>&nbsp; <b>To</b> &nbsp;</td>\r\n\t\t\t<td>" . mkDateSelect("to", $to_year, $to_month, $to_day) . "</td>\r\n\t\t\t<td><input type='submit' value='Select' /></td>\r\n\t\t</tr>\r\n\t\t<tr class='" . bg_class() . "'><td colspan='4' align='center'>\r\n\t\t<table " . TMPL_tblDflts . ">\r\n\t\t\t<tr>\r\n\t\t\t\t<th colspan='2'>Search</th>\r\n\t\t\t\t<th>Asset Type</th>\r\n\t\t\t</tr>\r\n\t\t\t<tr>\r\n\t\t\t\t<td><input type='text' name='search' value='{$search}' /></td>\r\n\t\t\t\t<td><input type='submit' value='Search' /></td>\r\n\t\t\t\t<td>{$type_sel}</td>\r\n\t\t\t</tr>\r\n\t\t</table>\r\n\t\t</td></tr>\r\n\t</table>\r\n\t</form>\r\n\t<h3>Hired Out</h3>\r\n\t<table " . TMPL_tblDflts . ">\r\n\t\t<tr>\r\n\t\t\t<th>Hire No</th>\r\n\t\t\t<th>Asset Group</th>\r\n\t\t\t<th>Asset Type</th>\r\n\t\t\t<th>Asset</th>\r\n\t\t\t<th>Serial</th>\r\n\t\t\t<th>Qty</th>\r\n\t\t\t<th>Customer</th>\r\n\t\t\t<th>Expected Return</th>\r\n\t\t</tr>\r\n\t\t{$hired_out}\r\n\t</table>\r\n\t<h3>Available</h3>\r\n\t<table " . TMPL_tblDflts . ">\r\n\t\t<tr>\r\n\t\t\t<th>Asset Group</th>\r\n\t\t\t<th>Asset Type</th>\r\n\t\t\t<th>Asset</th>\r\n\t\t\t<th>Serial</th>\r\n\t\t\t<th>Qty</th>\r\n\t\t</tr>\r\n\t\t{$available_out}\r\n\t</table>";
    return $OUTPUT;
}
function confirm()
{
    extract($_REQUEST);
    require_lib("validate");
    $v = new validate();
    $v->isOk($asset_id, "num", 1, 9, "Invalid asset id.");
    $v->isOk($ex_year, "num", 4, 4, "Invalid expected date (year)");
    $v->isOk($ex_month, "num", 1, 2, "Invalid expected date (month)");
    $v->isOk($ex_day, "num", 1, 2, "Invalid expected date (day)");
    $v->isOk($description, "string", 0, 255, "Invalid description.");
    if (isHired($asset_id, date("Y-m-d"))) {
        $v->addError(0, "Asset is currently hired out.");
    }
    if ($v->isError()) {
        return enter($v->genErrors());
    }
    // Retrieve the name and serial of the asset
    $sql = "SELECT des, serial FROM cubit.assets WHERE id='{$asset_id}'";
    $asset_rslt = db_exec($sql) or errDie("Unable to retrieve assets.");
    $asset_data = pg_fetch_array($asset_rslt);
    $asset_out = "({$asset_data['serial']}) {$asset_data['des']}";
    $ex_date = dateFmt($ex_year, $ex_month, $ex_day);
    $e_from = time();
    $e_to = getDTEpoch("{$ex_date} 23:59:59");
    if (!isSerialized($asset_id)) {
        $qty_out = "<tr class='" . bg_class() . "'>\r\n\t\t\t<td>Qty</td>\r\n\t\t\t<td><input type='text' name='qty' value='{$qty}' /></td>\r\n\t\t</tr>";
    } else {
        $booked = 0;
        for ($i = $e_from; $i < $e_to; $i += DAYS) {
            if (isBooked($asset_id, date("Y-m-d", $i))) {
                $booked = 1;
                break;
            }
        }
        if ($booked) {
            $msg = "<li class='err'><b>WARNING</b>: The asset has been booked</li>";
        }
    }
    $OUTPUT = "<h3>Book Asset to Workshop</h3>\r\n\t<form method='post' action='" . SELF . "'>\r\n\t<input type='hidden' name='key' value='write' />\r\n\t<input type='hidden' name='asset_id' value='{$asset_id}' />\r\n\t<input type='hidden' name='ex_year' value='{$ex_year}' />\r\n\t<input type='hidden' name='ex_month' value='{$ex_month}' />\r\n\t<input type='hidden' name='ex_day' value='{$ex_day}' />\r\n\t<input type='hidden' name='description' value='{$description}' />\r\n\t<input type='hidden' name='notes' value='{$notes}' />\r\n\t<input type='hidden' name='qty' value='{$qty}' />\r\n\t<table " . TMPL_tblDflts . ">\r\n\t\t<tr>\r\n\t\t\t<td colspan='2'>{$msg}</td>\r\n\t\t</tr>\r\n\t\t<tr>\r\n\t\t\t<th colspan='2'>Confirm</th>\r\n\t\t</tr>\r\n\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t<td>Asset</td>\r\n\t\t\t<td>{$asset_out}</td>\r\n\t\t</tr>\r\n\t\t{$qty_out}\r\n\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t<td>Expected Back Date</td>\r\n\t\t\t<td>{$ex_date}</td>\r\n\t\t</tr>\r\n\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t<td>Description</td>\r\n\t\t\t<td>{$description}</td>\r\n\t\t</tr>\r\n\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t<td>Notes</td>\r\n\t\t\t<td>{$notes}</td>\r\n\t\t</tr>\r\n\t\t<tr>\r\n\t\t\t<td colspan='2' align='center'>\r\n\t\t\t\t<input type='submit' name='key' value='&laquo Correction' />\r\n\t\t\t\t<input type='submit' value='Write &raquo' />\r\n\t\t\t</td>\r\n\t\t</tr>\r\n\t</table>\r\n\t</form>";
    return $OUTPUT;
}
function write($_POST)
{
    extract($_POST);
    $deptid += 0;
    db_conn('cubit');
    if (isset($printsales)) {
        $Sl = "SELECT * FROM settings WHERE constant='PSALES'";
        $Ri = db_exec($Sl) or errDie("Unable to get settings.");
        if (pg_num_rows($Ri) < 1) {
            $Sl = "INSERT INTO settings (constant,value,div) VALUES ('PSALES','Yes','" . USER_DIV . "')";
            $Ri = db_exec($Sl);
        } else {
            $Sl = "UPDATE settings SET value='Yes' WHERE constant='PSALES' AND div='" . USER_DIV . "'";
            $Ri = db_exec($Sl);
        }
    } else {
        $Sl = "UPDATE settings SET value='No' WHERE constant='PSALES' AND div='" . USER_DIV . "'";
        $Ri = db_exec($Sl);
    }
    //$it+=0;
    # validate input
    require_lib("validate");
    $v = new validate();
    if (isset($client)) {
        $v->isOk($client, "string", 0, 20, "Invalid Customer.");
    } else {
        $client = "";
    }
    if (isset($vatnum)) {
        $v->isOk($vatnum, "string", 0, 30, "Invalid VAT Number.");
    } else {
        $vatnum = "";
    }
    if (isset($branch_addr)) {
        $v->isOk($branch_addr, "num", 1, 20, "Invalid site address.");
    } else {
        $branch_addr = 0;
    }
    $v->isOk($invid, "num", 1, 20, "Invalid Invoice Number.");
    $v->isOk($telno, "string", 0, 20, "Invalid Customer Telephone Number.");
    $v->isOk($cordno, "string", 0, 20, "Invalid Customer Order Number.");
    //$v->isOk ($comm, "string", 0, 255, "Invalid Comments.");
    $v->isOk($ordno, "string", 0, 20, "Invalid sales order number.");
    // 	$v->isOk ($chrgvat, "string", 1, 4, "Invalid charge vat option.");
    $v->isOk($salespid, "string", 1, 255, "Invalid sales person.");
    $v->isOk($pinv_day, "num", 1, 2, "Invalid Invoice Date day.");
    $v->isOk($pinv_month, "num", 1, 2, "Invalid Invoice Date month.");
    $v->isOk($pinv_year, "num", 1, 5, "Invalid Invoice Date year.");
    $odate = $pinv_year . "-" . $pinv_month . "-" . $pinv_day;
    if (!checkdate($pinv_month, $pinv_day, $pinv_year)) {
        $v->isOk($odate, "num", 1, 1, "Invalid Invoice Date.");
    }
    $v->isOk($traddisc, "float", 0, 20, "Invalid Trade Discount.");
    if ($traddisc > 100) {
        $v->isOk($traddisc, "float", 0, 0, "Error : Trade Discount cannot be more than 100 %.");
    }
    $v->isOk($delchrg, "float", 0, 20, "Invalid Delivery Charge.");
    $v->isOk($subtot, "float", 0, 20, "Invalid subtotal.");
    $odate = $pinv_year . "-" . $pinv_month . "-" . $pinv_day;
    if (!checkdate($pinv_month, $pinv_day, $pinv_year)) {
        $v->isOk($odate, "num", 1, 1, "Invalid Invoice Date.");
    }
    $v->isOk($collection, "string", 0, 40, "Invalid collection method.");
    # used to generate errors
    $error = "asa@";
    # check if duplicate serial number selected, remove blanks
    if (isset($sernos)) {
        if (!ext_isUnique(ext_remBlnk($sernos))) {
            $v->isOk($error, "num", 0, 0, "Error : Serial Numbers must be unique per line item.");
        }
    }
    # check is serial no was selected
    if (isset($stkids)) {
        foreach ($stkids as $keys => $stkid) {
            # check if serial is selected
            if (ext_isSerial("stock", "stkid", $stkid) && !isset($sernos[$keys])) {
                $v->isOk($error, "num", 0, 0, "Error : Missing serial number for product number : <b>" . ($keys + 1) . "</b>");
            } elseif (ext_isSerial("stock", "stkid", $stkid) && !(strlen($sernos[$keys]) > 0)) {
                $v->isOk($error, "num", 0, 0, "Error : Missing serial number for product number : <b>" . ($keys + 1) . "</b>");
            }
        }
    }
    # check quantities
    if (isset($qtys)) {
        foreach ($qtys as $keys => $qty) {
            $discp[$keys] += 0;
            $disc[$keys] += 0;
            $v->isOk($qty, "num", 1, 10, "Invalid Quantity for product number : <b>" . ($keys + 1) . "</b>");
            if ($qty < 1) {
                $v->isOk($qty, "num", 0, 0, "Error : Item Quantity must be at least one. Product number : <b>" . ($keys + 1) . "</b>");
            }
        }
    }
    # check whids
    if (isset($whids)) {
        foreach ($whids as $keys => $whid) {
            $v->isOk($whid, "num", 1, 10, "Invalid Store number, please enter all details.");
        }
    }
    $cusnum += 0;
    # check stkids
    if (isset($stkids)) {
        foreach ($stkids as $keys => $stkid) {
            $v->isOk($stkid, "num", 1, 10, "Invalid Stock number, please enter all details.");
        }
    }
    # check amt
    if (isset($amt)) {
        foreach ($amt as $keys => $amount) {
            $v->isOk($amount, "float", 1, 20, "Invalid Amount, please enter all details.");
        }
    }
    if (isset($des)) {
        $des = remval($des);
    }
    if (isset($asset_id) && is_numeric($asset_id)) {
        foreach ($asset_id as $value) {
            $sql = "SELECT id, des FROM cubit.assets WHERE id='{$asset_id}'";
            $asset_rslt = db_exec($sql) or errDie("Unable to retrieve asset.");
            $asset_data = pg_fetch_array($asset_rslt);
            if (isHired($asset_id)) {
                $v->addError(0, "Asset " . getSerial($asset_id) . " {$asset_data['des']} has already been hired out.");
            }
        }
    }
    # display errors, if any
    $err = "";
    if ($v->isError()) {
        $errors = $v->getErrors();
        foreach ($errors as $e) {
            $err .= "<li class='err'>{$e['msg']}<li>";
        }
        return details($_POST, $err);
    }
    if (strlen($vatnum) < 1) {
        $vatnum = "";
    }
    $_POST['client'] = $client;
    $_POST['vatnum'] = $vatnum;
    $_POST['telno'] = $telno;
    $_POST['cordno'] = $cordno;
    # Get invoice info
    db_connect();
    $sql = "SELECT * FROM hire.hire_invoices WHERE invid = '{$invid}' AND div = '" . USER_DIV . "'";
    $invRslt = db_exec($sql) or errDie("Unable to get invoice information");
    // 	if (pg_numrows ($invRslt) < 1) {
    // 		return "<li>- Invoice Not Found[1]</li>";
    // 	}
    $inv = pg_fetch_array($invRslt);
    $inv['traddisc'] = $traddisc;
    $inv['chrgvat'] = 0;
    # check if invoice has been printed
    // 	if($inv['printed'] == "y"){
    // 		$error = "<li class=err> Error : Invoice number <b>$invid</b> has already been printed.";
    // 		$error .= "<p><input type=button onClick='JavaScript:history.back();' value='&laquo; Correct submission'>";
    // 		return $error;
    // 	}
    # get department
    db_conn("exten");
    $sql = "SELECT * FROM departments WHERE deptid = '{$deptid}' AND div = '" . USER_DIV . "'";
    $deptRslt = db_exec($sql);
    if (pg_numrows($deptRslt) < 1) {
        $dept['deptname'] = "<i class='err'>Not Found[3]</i>";
    } else {
        $dept = pg_fetch_array($deptRslt);
    }
    # fix those nasty zeros
    $traddisc += 0;
    $delchrg += 0;
    $vatamount = 0;
    $showvat = TRUE;
    # insert invoice to DB
    db_connect();
    if (isset($upBtn) || isset($hirenewBtn)) {
        $update_ret = update($_POST);
    } else {
        $update_ret = false;
    }
    # begin updating
    pglib_transaction("BEGIN");
    /* -- Start remove old items -- */
    # get selected stock in this invoice
    $sql = "SELECT * FROM hire.hire_invitems  WHERE invid = '{$invid}'";
    $stktRslt = db_exec($sql);
    $subtot = 0;
    while ($stkt = pg_fetch_array($stktRslt)) {
        # update stock(alloc + qty)
        //$sql = "UPDATE stock SET alloc = (alloc - '$stkt[qty]')  WHERE stkid = '$stkt[stkid]' AND div = '".USER_DIV."'";
        //$rslt = db_exec($sql) or errDie("Unable to update stock to Cubit.",SELF);
        //if(strlen($stkt['serno']) > 0)
        //ext_unresvSer($stkt['serno'], $stkt['stkid']);
        $subtot += $stkt["amt"];
    }
    # remove old items
    /* --- ----------- Clac --------------------- */
    ##----------------------NEW----------------------
    $VATP = TAX_VAT;
    $subtotal = sprint($subtot + $delchrg);
    $traddiscmt = sprint($subtotal * $traddisc / 100);
    $subtotal = sprint($subtotal - $traddiscmt);
    $VAT = $subtotal / 100 * 14;
    $SUBTOT = $subtotal;
    $TOTAL = $subtotal + $VAT;
    $delexvat = sprint($delchrg);
    $Sl = "SELECT * FROM posround";
    $Ri = db_exec($Sl);
    $data = pg_fetch_array($Ri);
    if ($data['setting'] == "5cent") {
        if (sprint(floor(sprint($TOTAL / 0.05))) != sprint($TOTAL / 0.05)) {
            $otot = $TOTAL;
            $nTOTAL = sprint(sprint(floor($TOTAL / 0.05)) * 0.05);
            $rounding = $otot - $nTOTAL;
        } else {
            $rounding = 0;
        }
    } else {
        $rounding = 0;
    }
    //print sprint(floor($TOTAL/0.05));
    #get accno if invoice is on credit
    if ($cusnum != "0") {
        $get_acc = "SELECT * FROM customers WHERE cusnum = '{$cusnum}' LIMIT 1";
        $run_acc = db_exec($get_acc) or errDie("Unable to get customer information");
        if (pg_numrows($run_acc) < 1) {
            $accno = "";
        } else {
            $arr = pg_fetch_array($run_acc);
            $cusacc = $arr['accno'];
            $cusname = "{$arr['cusname']} {$arr['surname']}";
        }
    } else {
        $cusacc = "";
        $cusname = "";
    }
    # insert invoice to DB
    $sql = "\r\n\t\t\tUPDATE hire.hire_invoices \r\n\t\t\tSET cusnum='{$cusnum}', cusname='{$cusname}', rounding='{$rounding}', deptid='{$deptid}', deptname='{$dept['deptname']}', \r\n\t\t\t\tcordno='{$cordno}', ordno='{$ordno}', salespn='{$salespid}', odate='{$odate}', traddisc='{$traddisc}', \r\n\t\t\t\tdelchrg='{$delchrg}', subtot='{$SUBTOT}', vat='{$VAT}',balance='{$TOTAL}', total='{$TOTAL}', discount='{$traddiscmt}', \r\n\t\t\t\tdelivery='{$delexvat}', vatnum='{$vatnum}', cusacc='{$cusacc}', telno='{$telno}', deposit_type='{$deposit_type}', \r\n\t\t\t\tdeposit_amt='{$deposit_amt}', collection='{$collection}', custom_txt='{$custom_txt}', branch_addr='{$branch_addr}' \r\n\t\t\tWHERE invid='{$invid}' AND div = '" . USER_DIV . "'";
    $rslt = db_exec($sql) or errDie("Unable to update invoice in Cubit.", SELF);
    # remove old data
    $sql = "DELETE FROM pinv_data WHERE invid='{$invid}' AND div = '" . USER_DIV . "'";
    $rslt = db_exec($sql) or errDie("Unable to update invoice data in Cubit.", SELF);
    # put in new data
    $sql = "INSERT INTO pinv_data(invid, dept, customer, div) VALUES('{$invid}', '{$dept['deptname']}', '{$client}', '" . USER_DIV . "')";
    $rslt = db_exec($sql) or errDie("Unable to insert invoice data to Cubit.", SELF);
    # commit updating
    pglib_transaction("COMMIT") or errDie("Unable to commit a database transaction.", SELF);
    return details($_POST, $update_ret);
    if (strlen($bar) > 0) {
        $Sl = "SELECT * FROM possets WHERE div = '" . USER_DIV . "'";
        $Rs = db_exec($Sl) or errDie("Unable to add supplier to the system.", SELF);
        if (pg_numrows($Rs) < 1) {
            return details($_POST, "Please go set the point of sale settings under the stock settings");
        }
        $Dets = pg_fetch_array($Rs);
        if ($Dets['opt'] == "No") {
            switch (substr($bar, strlen($bar) - 1, 1)) {
                case "0":
                    $tab = "ss0";
                    break;
                case "1":
                    $tab = "ss1";
                    break;
                case "2":
                    $tab = "ss2";
                    break;
                case "3":
                    $tab = "ss3";
                    break;
                case "4":
                    $tab = "ss4";
                    break;
                case "5":
                    $tab = "ss5";
                    break;
                case "6":
                    $tab = "ss6";
                    break;
                case "7":
                    $tab = "ss7";
                    break;
                case "8":
                    $tab = "ss8";
                    break;
                case "9":
                    $tab = "ss9";
                    break;
                default:
                    return details($_POST, "The code you selected is invalid");
            }
            db_conn('cubit');
            pglib_transaction("BEGIN") or errDie("Unable to start a database transaction.", SELF);
            $stid = barext_dbget($tab, 'code', $bar, 'stock');
            if (!($stid > 0)) {
                return details($_POST, "<li class='err'><b>ERROR</b>: The bar code you selected is not in the system or is not available.</li>");
            }
            $Sl = "SELECT * FROM stock WHERE stkid = '{$stid}' AND div = '" . USER_DIV . "'";
            $Rs = db_exec($Sl);
            $s = pg_fetch_array($Rs);
            # put scanned-in product into invoice db
            $sql = "\r\n\t\t\t\tINSERT INTO hire.hire_invitems (\r\n\t\t\t\t\tinvid, whid, stkid, qty, amt, disc, discp, ss, serno, \r\n\t\t\t\t\tdiv\r\n\t\t\t\t) VALUES (\r\n\t\t\t\t\t'{$invid}', '{$s['whid']}', '{$stid}', '1', '{$s['selamt']}', '{$s['selamt']}', '0', '0', '{$bar}', '{$bar}', \r\n\t\t\t\t\t'" . USER_DIV . "'\r\n\t\t\t\t)";
            $rslt = db_exec($sql) or errDie("Unable to insert invoice items to Cubit.", SELF);
            # update stock(alloc + qty)
            $sql = "UPDATE stock SET alloc = (alloc + '1') WHERE stkid = '{$stid}' AND div = '" . USER_DIV . "'";
            $rslt = db_exec($sql) or errDie("Unable to update stock to Cubit.", SELF);
            $Sl = "UPDATE " . $tab . " SET active = 'no' WHERE code = '{$bar}' AND div = '" . USER_DIV . "'";
            $Rs = db_exec($Sl);
            $stid = ext_dbget('stock', 'bar', $bar, 'stkid');
            if (!($stid > 0)) {
                return details($_POST, "<li class='err'><b>ERROR</b>: The bar code you selected is not in the system or is not available.</li>");
            }
            $Sl = "SELECT * FROM stock WHERE stkid = '{$stid}' AND div = '" . USER_DIV . "'";
            $Rs = db_exec($Sl);
            $s = pg_fetch_array($Rs);
            # put scanned-in product into invoice db
            $sql = "INSERT INTO hire.hire_invitems(invid, whid, stkid, qty, amt, disc, discp,ss, div) VALUES('{$invid}', '{$s['whid']}', '{$stid}', '1', '{$s['selamt']}','0','0','{$bar}', '" . USER_DIV . "')";
            $rslt = db_exec($sql) or errDie("Unable to insert invoice items to Cubit.", SELF);
            # update stock(alloc + qty)
            $sql = "UPDATE stock SET alloc = (alloc + '1') WHERE stkid = '{$stid}' AND div = '" . USER_DIV . "'";
            $rslt = db_exec($sql) or errDie("Unable to update stock to Cubit.", SELF);
            pglib_transaction("COMMIT") or errDie("Unable to commit a database transaction.", SELF);
        }
    }
    /* --- Start button Listeners --- */
    if (isset($doneBtn)) {
        # check if stock was selected(yes = put done button)
        db_connect();
        $sql = "SELECT stkid FROM hire.hire_invitems WHERE invid = '{$inv['invid']}' AND div = '" . USER_DIV . "'";
        $crslt = db_exec($sql);
        if (pg_numrows($crslt) < 1) {
            $error = "<li class='err'> Error : Invoice number has no items.</li>";
            return details($_POST, $error);
        }
        $TOTAL = sprint($TOTAL - $rounding);
        if ($pcash + $pcheque + $pcc + $pcredit < $TOTAL) {
            return details($_POST, "<li class='err'>The total of all the payments is less than the invoice total</li>");
        }
        $change = sprint(sprint($pcash + $pcheque + $pcc + $pcredit) - sprint($TOTAL));
        $pcash = sprint($pcash - $change);
        if ($pcash < 0) {
            $pcash = 0;
        }
        if (sprint($pcash + $pcheque + $pcc + $pcredit) != sprint($TOTAL)) {
            return details($_POST, "<li class='err'>The total of all the payments is not equal to the invoice total.<br>\r\n\t\t\t(You can only overpay with cash)</li>");
        }
        // make plant available
        $sql = "UPDATE hire.hire_invoices SET done = 'y' WHERE invid = '{$invid}' AND div = '" . USER_DIV . "'";
        $rslt = db_exec($sql) or errDie("Unable to update invoice status in Cubit.", SELF);
        # print the invoice
        $OUTPUT = "<script>printer('pos-invoice-print.php?invid={$invid}');move('pos-invoice-new.php');</script>";
        require "template.php";
    } elseif (isset($cancel)) {
        // Final Laytout
        $write = "\r\n\t\t\t<table border='0' cellpadding='" . TMPL_tblCellPadding . "' cellspacing='" . TMPL_tblCellSpacing . "'>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<th>New Point of Sale Invoice Saved</th>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t\t\t<td>Invoice for <b>{$client}</b> has been saved.</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</table>\r\n\t\t\t<p>\r\n\t\t\t<table border=0 cellpadding='" . TMPL_tblCellPadding . "' cellspacing='" . TMPL_tblCellSpacing . "'>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<th>Quick Links</th>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t\t\t<td><a href='pos-invoice-new.php'>New Point of Sale Invoice</a></td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t\t\t<td><a href='pos-invoice-list.php'>View Point of Sale Invoices</a></td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<script>document.write(getQuicklinkSpecial());</script>\r\n\t\t\t</table>";
        return $write;
    } else {
        if (isset($wtd)) {
            $_POST['wtd'] = $wtd;
        }
        return details($_POST);
    }
}
function availability($from_date, $to_date, $asset_id)
{
    $e_from = getDTEpoch("{$from_date} 0:00:00");
    $e_to = getDTEpoch("{$to_date} 23:59:59");
    $row = "";
    for ($i = $e_from; $i < $e_to; $i += SECONDS_IN_DAY) {
        for ($j = 0; $j < 5; $j++) {
            if (inWorkshop($asset_id, date("Y-m-d", $i))) {
                $color = WORKSHOP;
            } elseif (isHired($asset_id, date("Y-m-d", $i))) {
                $color = HIRED_OUT;
            } elseif (isBooked($asset_id, date("Y-m-d", $i))) {
                $color = BOOKED;
            } else {
                $color = AVAILABLE;
            }
            $row .= "<td bgcolor='{$color}'></td>";
        }
    }
    return $row;
}
function confirm()
{
    extract($_REQUEST);
    require_lib("validate");
    $v = new validate();
    $v->isOk($asset_id, "num", 1, 9, "Invalid asset selection.");
    $v->isOk($cust_id, "num", 1, 9, "Invalid customer selection.");
    $v->isOk($from_year, "num", 4, 4, "Invalid from date (year).");
    $v->isOk($from_month, "num", 1, 2, "Invalid from date (month).");
    $v->isOk($from_day, "num", 1, 2, "Invalid from date (day).");
    $v->isOk($to_year, "num", 4, 4, "Invalid to date (year).");
    $v->isOk($to_month, "num", 1, 2, "Invalid to date (month).");
    $v->isOk($to_day, "num", 1, 2, "Invalid to date (day).");
    $e_from = getDTEpoch("{$from_year}-{$from_month}-{$from_day} 0:00:00");
    $e_to = getDTEpoch("{$to_year}-{$to_month}-{$to_day} 23:59:59");
    for ($i = $e_from; $i < $e_to; $i += DAYS) {
        if (isHired($asset_id, date("Y-m-d", $i))) {
            $v->addError(0, "Asset is hired out on " . date("d-m-Y", $i) . ".");
        }
    }
    if (!$asset_id) {
        $v->addError(0, "Please select an asset first.");
    }
    if (!$cust_id) {
        $v->addError(0, "Please select a customer first.");
    }
    if ($v->isError()) {
        return enter($v->genErrors());
    }
    // Booking Date
    $from_date = "{$from_day}-{$from_month}-{$from_year}";
    $from_date_db = dateFmt($from_year, $from_month, $from_day);
    $to_date = "{$to_day}-{$to_month}-{$to_year}";
    $to_date_db = dateFmt($to_year, $to_month, $to_day);
    if (!isset($units)) {
        $units = 1;
    }
    $sql = "SELECT * FROM hire.bookings\r\n\t\t\tWHERE asset_id='{$asset_id}' AND\r\n\t\t\t\t('{$from_date_db}' BETWEEN from_date AND to_date OR\r\n\t\t\t\t '{$to_date_db}' BETWEEN from_date AND to_date)";
    $bk_rslt = db_exec($sql) or errDie("Unable to retrieve bookings.");
    if (pg_num_rows($bk_rslt) && isSerialized($asset_id)) {
        return enter("<li class='err'>Item has already been booked in the\r\n\t\t\tspecified date range</li>");
    }
    // Retrieve the asset description
    $sql = "SELECT * FROM cubit.assets WHERE id='{$asset_id}'";
    $asset_rslt = db_exec($sql) or errDie("Unable to retrieve asset.");
    $asset_data = pg_fetch_array($asset_rslt);
    $asset_name = getSerial($asset_data["id"], 1) . " " . $asset_data["des"];
    // Retrieve the customer name
    $sql = "SELECT surname FROM cubit.customers WHERE cusnum='{$cust_id}'";
    $cust_rslt = db_exec($sql) or errDie("Unable to retrieve customer.");
    $cust_name = pg_fetch_result($cust_rslt, 0);
    if (!isSerialized($asset_id)) {
        $units_input = "<input type='text' name='units' value='{$units}' size='2' />";
    } else {
        $units_input = "1";
    }
    $OUTPUT = "<h3>" . ucfirst($page_option) . " Booking</h3>\r\n\t<form method='post' action='" . SELF . "'>\r\n\t<input type='hidden' name='key' value='write' />\r\n\t<input type='hidden' name='page_option' value='{$page_option}' />\r\n\t<input type='hidden' name='id' value='{$id}' />\r\n\t<input type='hidden' name='asset_id' value='{$asset_id}' />\r\n\t<input type='hidden' name='cust_id' value='{$cust_id}' />\r\n\t<input type='hidden' name='from_year' value='{$from_year}' />\r\n\t<input type='hidden' name='from_month' value='{$from_month}' />\r\n\t<input type='hidden' name='from_day' value='{$from_day}' />\r\n\t<input type='hidden' name='to_year' value='{$to_year}' />\r\n\t<input type='hidden' name='to_month' value='{$to_month}' />\r\n\t<input type='hidden' name='to_day' value='{$to_day}' />\r\n\t<input type='hidden' name='units' value='1' />\r\n\t<table " . TMPL_tblDflts . ">\r\n\t\t<tr>\r\n\t\t\t<th colspan='2'>Confirm</th>\r\n\t\t</tr>\r\n\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t<td>Small Plant</td>\r\n\t\t\t<td>{$asset_name}</td>\r\n\t\t</tr>\r\n\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t<td>Customer</td>\r\n\t\t\t<td>{$cust_name}</td>\r\n\t\t</tr>\r\n\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t<td>Units</td>\r\n\t\t\t<td>{$units_input}</td>\r\n\t\t</tr>\r\n\t\t<tr class='" . bg_class() . "'>\r\n\t\t\t<td>Booking Date</td>\r\n\t\t\t<td>{$from_date} &nbsp; <b>To</b> &nbsp; {$to_date}</td>\r\n\t\t</tr>\r\n\t\t<tr>\r\n\t\t\t<td><input type='submit' name='key' value='&laquo Correction' /></td>\r\n\t\t\t<td align='right'><input type='submit' value='Write &raquo ' /></td>\r\n\t\t</tr>\r\n\t</table>\r\n\t</form>";
    return $OUTPUT;
}