line_items);
unset ($_SESSION['Items']);
}
if(isset($_GET['BatchInvoice'])) {
$_SESSION['ProcessingDelivery'] = $_SESSION['DeliveryBatch'];
unset($_SESSION['DeliveryBatch']);
}
else
$_SESSION['ProcessingDelivery'] = array($_GET['DeliveryNumber']);
$_SESSION['Items'] = new cart('delivery');
$_SESSION['Items']->trans_no = $_SESSION['ProcessingDelivery'];
/*read in all the selected deliveries into the Items cart */
if (read_sales_delivery($_SESSION['ProcessingDelivery'], $_SESSION['Items']))
{
if ($_SESSION['Items']->count_items() == 0)
{
hyperlink_params($path_to_root . "/sales/inquiry/sales_deliveries_view.php", _("Select a different delivery to invoice"), "OutstandingOnly=1");
die ("
" . _("There are no delivered items with a quantity left to invoice. There is nothing left to invoice.") . "");
}
}
else
{
hyperlink_no_params("/sales_deliveries_view.php", _("Select a delivery note to invoice"));
die ("
" . _("This delivery note could not be retrieved. Please select another delivery.") . "");
}
}
else
{
foreach ($_SESSION['Items']->line_items as $line=>$itm)
{
if(isset($_POST['Line'.$line])) {
$line_qty = $_POST['Line'.$line];
if (is_numeric($line_qty) && $_POST['Line'.$line] <= ($itm->quantity - $itm->qty_done))
{
$_SESSION['Items']->line_items[$line]->qty_dispatched = $line_qty;
}
}
if(isset($_POST['Line'.$line.'Desc'])) {
$line_desc = $_POST['Line'.$line.'Desc'];
if (strlen($line_desc) > 0)
{
$_SESSION['Items']->line_items[$line]->item_description = $line_desc;
}
}
}
}
//---------------------------------------------------------------------------------------------------------------
function delivery_changed_error()
{
global $path_to_root;
display_note(_("This delivery note has been changed or invoiced since this invoice was started to be confirmed. Processing halted."), 1, 0);
display_note(_("To enter and confirm this invoice the order must be re-selected and re-read again to update the changes made by the other user."), 1, 0);
hyperlink_no_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select a sales order for invoicing"));
unset($_SESSION['ProcessingDelivery']);
exit;
}
//---------------------------------------------------------------------------------------------------------------
function check_delivery_changed()
{
global $debug;
/*Now need to check that the delivery note details are the same
as they were when they were read into the Items array.
If they've changed then someone else may have invoiced them */
$sql = "SELECT id, stock_id, quantity, qty_done FROM "
.TB_PREF."debtor_trans_details WHERE
debtor_trans_type = 13 AND (";
foreach($_SESSION['Items']->trans_no as $key=>$num) {
if($key!=0) $sql .= ' OR ';
$sql .= 'debtor_trans_no =' . $num;
}
$sql .= ') ORDER BY id';
$result = db_query($sql,"while checking delivery changes");
if (db_num_rows($result) != count($_SESSION['Items']->line_items))
{
/*there should be the same number of items returned from this query as there are lines on the invoice -
if not then someone has already invoiced or credited some lines */
if ($debug == 1)
{
display_note($sql, 1, 0);
display_note("No rows returned by sql:" . db_num_rows($result), 1, 0);
display_note("Count of items in the session " . count($_SESSION['Items']->line_items), 1, 0);
}
return false;
}
$line=0;
while ($myrow = db_fetch($result))
{
$stk_itm = $myrow["stock_id"];
if ($_SESSION['Items']->line_items[$line]->quantity != -$myrow["quantity"] ||
$_SESSION['Items']->line_items[$line]->qty_done != -$myrow["qty_done"])
{
display_note(_("Original delivery for line #") . $line+1 . ' '.
_("has a quantity of") . " " . -$myrow["quantity"] . " " .
_("and an delivered quantity of") . " " . -$myrow["qty_done"] . "." .
_("Now the quantity of") . " " .
$_SESSION['Items']->line_items[$line]->quantity . " " .
_("and invoiced quantity of") . " " .
$_SESSION['Items']->line_items[$line]->qty_done, 1, 0);
return false;
}
$line++;
} /*loop through all line items of the order to ensure none have been invoiced */
return true;
}
//---------------------------------------------------------------------------------------------------------------
function check_data()
{
if (!isset($_POST['InvoiceDate']) || !is_date($_POST['InvoiceDate']))
{
display_error(_("The entered invoice date is invalid."));
return false;
}
if (!is_date_in_fiscalyear($_POST['InvoiceDate']))
{
display_error(_("The entered invoice date is not in fiscal year."));
return false;
}
if (!isset($_POST['due_date']) || !is_date($_POST['due_date']))
{
display_error(_("The entered invoice due date is invalid."));
return false;
}
if (!references::is_valid($_POST['ref']))
{
display_error(_("You must enter a reference."));
return false;
}
if (!is_new_reference($_POST['ref'], 10))
{
display_error(_("The entered reference is already in use."));
return false;
}
if ($_POST['ChargeFreightCost'] == "")
$_POST['ChargeFreightCost'] = 0;
if (!is_numeric($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] < 0)
{
display_error(_("The entered shipping value is not numeric."));
return false;
}
if ($_SESSION['Items']->has_items_dispatch() == 0 && $_POST['ChargeFreightCost'] == 0)
{
display_error(_("There are no item quantities on this invoice."));
return false;
}
return true;
}
//---------------------------------------------------------------------------------------------------------------
function process_invoice($invoicing=false)
{
if ($invoicing)
{
read_sales_delivery($_SESSION['Items']->trans_no, $_SESSION['Items']);
$duedate = get_invoice_duedate($_SESSION['Items']->customer_id, $_SESSION['Items']->delivery_date);
$invoice_no = add_sales_invoice($_SESSION['Items'],
$_SESSION['Items']->delivery_date, $duedate,
$_SESSION['Items']->tax_group_id, $_SESSION['Items']->freight_cost,
$_SESSION['Items']->Location, $_SESSION['Items']->ship_via,
$_SESSION['Items']->default_sales_type, references::get_next(10),
$_SESSION['Items']->memo_);
}
else
{
if (!check_data())
return;
if (!check_delivery_changed())
delivery_changed_error();
$invoice_no = add_sales_invoice($_SESSION['Items'],
$_POST['InvoiceDate'], $_POST['due_date'],
$_SESSION['Items']->tax_group_id,
$_POST['ChargeFreightCost'],
$_SESSION['Items']->Location,
$_POST['ship_via'], $_POST['sales_type_id'], $_POST['ref'],
$_POST['InvoiceText']);
unset($_SESSION['ProcessingDelivery']);
}
meta_forward($_SERVER['PHP_SELF'], "AddedID=$invoice_no");
}
//---------------------------------------------------------------------------------------------------------------
if (isset($_GET['process_invoice']))
process_invoice(true);
elseif (isset($_POST['process_invoice']))
process_invoice();
//-------------------------------------------------------------------------------------------------
start_form(false, true);
start_table("$table_style2 width=80%", 5);
//echo "