$js .= get_js_open_window(900, 500);
if ($use_date_picker)
$js .= get_js_date_picker();
-if ($_SESSION['Items']->direct_invoice)
- page(_("Issue an Invoice"), false, false, "", $js);
-else
- page(_("Issue an Invoice and Deliver Items for a Sales Order"), false, false, "", $js);
+page(_("Issue an Invoice for Delivery Note(s)"), false, false, "", $js);
//---------------------------------------------------------------------------------------------------------------
-if (isset($_GET['AddedID']))
+if (isset($_GET['AddedID']))
{
$invoice_no = $_GET['AddedID'];
$trans_type = 10;
- display_notification(_("Invoice processed"), true);
+ display_notification(_("Selected deliveries has been processed"), true);
+
display_note(get_customer_trans_view_str($trans_type, $invoice_no, _("View this invoice")), 0, 1);
- display_note(get_gl_view_str($trans_type, $invoice_no, _("View the GL Journal Entries for this Invoice")));
+ display_note(get_gl_view_str($trans_type, $invoice_no, _("View the GL Journal Entries for this Invoice")));
- if ($_SESSION['Items']->direct_invoice)
- hyperlink_params("$path_to_root/sales/sales_order_entry.php", _("Issue Another Invoice"), "NewInvoice=Yes");
- else
- hyperlink_params("$path_to_root/sales/inquiry/sales_orders_view.php", _("Select Another Order For Invoicing"), "OutstandingOnly=1");
+ hyperlink_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select Another Delivery For Invoicing"), "OutstandingOnly=1");
- unset($_SESSION['Items']->line_items);
- unset($_SESSION['Items']);
display_footer_exit();
}
//---------------------------------------------------------------------------------------------------------------
-if (!isset($_GET['OrderNumber']) && !isset($_SESSION['ProcessingOrder']) &&
- !isset($_GET['process_invoice']))
+if (!isset($_GET['DeliveryNumber']) && !isset($_SESSION['ProcessingDelivery']) &&
+ !isset($_GET['BatchInvoice']) && !isset($_GET['process_invoice']))
{
- /* This page can only be called with an order number for invoicing*/
- display_error(_("This page can only be opened if an order has been selected. Please select an order first."));
+ /* This page can only be called with a delivery for invoicing*/
+ display_error(_("This page can only be opened after delivery selection. Please select delivery to invoicing first."));
- hyperlink_no_params("$path_to_root/sales/inquiry/sales_orders_view.php", _("Select a sales order to invoice"));
+ hyperlink_no_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select Delivery to Invoice"));
end_page();
exit;
-
-}
-elseif (isset($_GET['OrderNumber']) && $_GET['OrderNumber'] > 0)
+}
+elseif (isset($_GET['DeliveryNumber'])|| isset($_GET['BatchInvoice']))
{
+
if (isset($_SESSION['Items']))
{
unset($_SESSION['Items']->line_items);
unset ($_SESSION['Items']);
}
- session_register("Items");
- session_register("ProcessingOrder");
-
- $_SESSION['ProcessingOrder'] = $_GET['OrderNumber'];
- $_SESSION['Items'] = new cart;
+ if(isset($_GET['BatchInvoice'])) {
+ $_SESSION['ProcessingDelivery'] = $_SESSION['DeliveryBatch'];
+ unset($_SESSION['DeliveryBatch']);
+ }
+ else
+ $_SESSION['ProcessingDelivery'] = array($_GET['DeliveryNumber']);
- /*read in all the selected order into the Items cart */
+ $_SESSION['Items'] = new cart('delivery');
+ $_SESSION['Items']->trans_no = $_SESSION['ProcessingDelivery'];
- if (read_sales_order($_SESSION['ProcessingOrder'], $_SESSION['Items'], true))
+ /*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_orders_view.php", _("Select a different sales order to invoice"), "OutstandingOnly=1");
- die ("<br><b>" . _("There are no ordered items with a quantity left to deliver. There is nothing left to invoice.") . "</b>");
- }
- }
- else
+ 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 ("<br><b>" . _("There are no delivered items with a quantity left to invoice. There is nothing left to invoice.") . "</b>");
+ }
+ }
+ else
{
- hyperlink_no_params("/sales_orders_view.php", _("Select a sales order to invoice"));
- die ("<br><b>" . _("This order item could not be retrieved. Please select another order.") . "</b>");
+ hyperlink_no_params("/sales_deliveries_view.php", _("Select a delivery note to invoice"));
+ die ("<br><b>" . _("This delivery note could not be retrieved. Please select another delivery.") . "</b>");
}
-
-}
-else
+}
+else
{
- /* if processing, a dispatch page has been called and ${$StkItm->stock_id} would have been set from the post */
- foreach ($_SESSION['Items']->line_items as $itm)
+ foreach ($_SESSION['Items']->line_items as $line=>$itm)
{
-
- if (isset($_POST[$itm->stock_id]) && is_numeric($_POST[$itm->stock_id]) &&
- $_POST[$itm->stock_id] <= ($_SESSION['Items']->line_items[$itm->line_no]->quantity -
- $_SESSION['Items']->line_items[$itm->line_no]->qty_inv))
+ 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[$itm->line_no]->qty_dispatched = $_POST[$itm->stock_id];
+ $_SESSION['Items']->line_items[$line]->qty_dispatched = $line_qty;
}
-
- if (isset($_POST[$itm->stock_id . "Desc"]) && strlen($_POST[$itm->stock_id . "Desc"]) > 0)
+ }
+
+ if(isset($_POST['Line'.$line.'Desc'])) {
+ $line_desc = $_POST['Line'.$line.'Desc'];
+ if (strlen($line_desc) > 0)
{
- $_SESSION['Items']->line_items[$itm->line_no]->item_description = $_POST[$itm->stock_id . "Desc"];
+ $_SESSION['Items']->line_items[$line]->item_description = $line_desc;
}
+ }
}
}
//---------------------------------------------------------------------------------------------------------------
-function order_changed_error()
+function delivery_changed_error()
{
global $path_to_root;
- display_note(_("This order has been changed or invoiced since this delivery was started to be confirmed. Processing halted."), 1, 0);
- display_note(_("To enter and confirm this dispatch/invoice the order must be re-selected and re-read again to update the changes made by the other user."), 1, 0);
+ 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_orders_view.php", _("Select a sales order for confirming deliveries and invoicing"));
+ hyperlink_no_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select a sales order for invoicing"));
- unset($_SESSION['Items']->line_items);
- unset($_SESSION['Items']);
- unset($_SESSION['ProcessingOrder']);
+ unset($_SESSION['ProcessingDelivery']);
exit;
}
//---------------------------------------------------------------------------------------------------------------
-function check_order_changed()
+function check_delivery_changed()
{
global $debug;
- /*Now need to check that the order 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 -
- as modified for bug pointed out by Sherif 1-7-03*/
+ /*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 stk_code, quantity, qty_invoiced FROM ".TB_PREF."sales_order_details WHERE
- quantity - qty_invoiced > 0
- AND order_no = " . $_SESSION['ProcessingOrder'];
+ $sql = "SELECT id, stock_id, quantity, qty_done FROM "
+ .TB_PREF."debtor_trans_details WHERE
+ debtor_trans_type = 13 AND (";
- $result = db_query($sql,"retreive sales order details");
+ 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 not then someone has already invoiced or credited some lines */
if ($debug == 1)
{
display_note($sql, 1, 0);
return false;
}
-
- while ($myrow = db_fetch($result))
+ $line=0;
+ while ($myrow = db_fetch($result))
{
- foreach($_SESSION['Items']->line_items as $line)
+ $stk_itm = $myrow["stock_id"];
+
+ if ($_SESSION['Items']->line_items[$line]->quantity != -$myrow["quantity"] ||
+ $_SESSION['Items']->line_items[$line]->qty_done != -$myrow["qty_done"])
{
- if ($line->stock_id == $myrow["stk_code"])
- {
- if ($line->quantity != $myrow["quantity"] ||
- $line->qty_inv != $myrow["qty_invoiced"])
- {
- display_note(_("Original order for") . " " . $myrow["stk_code"] . " " .
- _("has a quantity of") . " " . $myrow["quantity"] . " " .
- _("and an invoiced quantity of") . " " . $myrow["qty_invoiced"] . " " .
- _("the session shows quantity of") . " " .
- $line->quantity . " " .
- _("and quantity invoice of") . " " .
- $line->qty_inv, 1, 0);
-
- return false;
- }
- }
+ 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['DispatchDate']) || !is_date($_POST['DispatchDate']))
+ if (!isset($_POST['InvoiceDate']) || !is_date($_POST['InvoiceDate']))
{
display_error(_("The entered invoice date is invalid."));
return false;
}
- if (!is_date_in_fiscalyear($_POST['DispatchDate']))
+ 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']))
+ 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']))
+ if (!references::is_valid($_POST['ref']))
{
display_error(_("You must enter a reference."));
return false;
}
- if (!is_new_reference($_POST['ref'], 10))
+ 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)
+ 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)
+ if ($_SESSION['Items']->has_items_dispatch() == 0 && $_POST['ChargeFreightCost'] == 0)
{
display_error(_("There are no item quantities on this invoice."));
return false;
//---------------------------------------------------------------------------------------------------------------
-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(_("The invoice cannot be processed because there is an insufficient quantity for component:") .
- " " . $itm->stock_id . " - " . $itm->item_description);
- return false;
- }
- }
- }
- }
-
- return true;
-}
-
-//---------------------------------------------------------------------------------------------------------------
-
function process_invoice($invoicing=false)
{
- if ($invoicing)
+ if ($invoicing)
{
-
- read_sales_order($_SESSION['Items']->order_no, $_SESSION['Items'], true);
+ 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']->order_no,
+ $_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_, 0);
- }
- else
+ $_SESSION['Items']->memo_);
+ }
+ else
{
-
+
if (!check_data())
return;
- if (!check_order_changed())
- order_changed_error();
-
- if (!check_qoh())
- return;
-
- if ($_POST['bo_policy'])
- $bo_policy = 0;
- else
- $bo_policy = 1;
+ if (!check_delivery_changed())
+ delivery_changed_error();
$invoice_no = add_sales_invoice($_SESSION['Items'],
- $_POST['DispatchDate'], $_POST['due_date'], $_SESSION['ProcessingOrder'],
- $_POST['tax_group_id'], $_POST['ChargeFreightCost'], $_POST['Location'],
+ $_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'], $bo_policy);
- unset($_SESSION['ProcessingOrder']);
+ $_POST['InvoiceText']);
+ unset($_SESSION['ProcessingDelivery']);
}
-
meta_forward($_SERVER['PHP_SELF'], "AddedID=$invoice_no");
}
start_form(false, true);
start_table("$table_style2 width=80%", 5);
-echo "<tr><td>"; // outer table
+//echo "<tr><td>"; // outer table
-start_table("$table_style width=100%");
+//start_table("$table_style width=100%");
start_row();
label_cells(_("Customer"), $_SESSION['Items']->customer_name, "class='tableheader2'");
label_cells(_("Branch"), get_branch_name($_SESSION['Items']->Branch), "class='tableheader2'");
ref_cells(_("Reference"), 'ref', null, "class='tableheader2'");
-if (!isset($_POST['tax_group_id']))
- $_POST['tax_group_id'] = $_SESSION['Items']->tax_group_id;
-label_cell(_("Tax Group"), "class='tableheader2'");
-tax_groups_list_cells(null, 'tax_group_id', $_POST['tax_group_id'], false, null, true);
+label_cells(_("Delivery Notes:"), get_customer_trans_view_str(systypes::cust_dispatch(), $_SESSION['ProcessingDelivery']), "class='tableheader2'");
-label_cells(_("For Sales Order"), get_customer_trans_view_str(systypes::sales_order(), $_SESSION['ProcessingOrder']), "class='tableheader2'");
-
-end_row();
-start_row();
if (!isset($_POST['sales_type_id']))
$_POST['sales_type_id'] = $_SESSION['Items']->default_sales_type;
-label_cell(_("Sales Type"), "class='tableheader2'");
+label_cell(_("Sales Type"), "class='tableheader2'");
sales_types_list_cells(null, 'sales_type_id', $_POST['sales_type_id']);
-if (!isset($_POST['Location']))
- $_POST['Location'] = $_SESSION['Items']->Location;
-label_cell(_("Delivery From"), "class='tableheader2'");
-locations_list_cells(null, 'Location', $_POST['Location'], false, true);
+end_row();
+start_row();
if (!isset($_POST['ship_via']))
$_POST['ship_via'] = $_SESSION['Items']->ship_via;
-label_cell(_("Shipping Company"), "class='tableheader2'");
+label_cell(_("Shipping Company"), "class='tableheader2'");
shippers_list_cells(null, 'ship_via', $_POST['ship_via']);
-end_row();
-end_table();
+if (!isset($_POST['InvoiceDate']) || !is_date($_POST['InvoiceDate']))
+{
+ $_POST['InvoiceDate'] = Today();
+ if (!is_date_in_fiscalyear($_POST['InvoiceDate']))
+ $_POST['InvoiceDate'] = end_fiscalyear();
+}
-echo "</td><td>";// outer table
+date_cells(_("Date"), 'InvoiceDate', $_POST['InvoiceDate'], 0, 0, 0, "class='tableheader'");
+//end_table();
-start_table("$table_style width=90%");
+//echo "</td><td>";// outer table
-// set this up here cuz it's used to calc qoh
-if (!isset($_POST['DispatchDate']) || !is_date($_POST['DispatchDate']))
-{
- $_POST['DispatchDate'] = Today();
- if (!is_date_in_fiscalyear($_POST['DispatchDate']))
- $_POST['DispatchDate'] = end_fiscalyear();
-}
-date_row(_("Date"), 'DispatchDate', $_POST['DispatchDate'], 0, 0, 0, "class='tableheader'");
+//start_table("$table_style width=90%");
if (!isset($_POST['due_date']) || !is_date($_POST['due_date']))
- //$_POST['due_date'] = $_POST['DispatchDate'];
- $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->customer_id, $_POST['DispatchDate']);
-date_row(_("Due Date"), 'due_date', $_POST['due_date'], 0, 0, 0, "class='tableheader'");
-end_table();
+ $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->customer_id, $_POST['InvoiceDate']);
-echo "</td></tr>";
-end_table(1); // outer table
+date_cells(_("Due Date"), 'due_date', $_POST['due_date'], 0, 0, 0, "class='tableheader'");
+//end_table();
+
+//echo "</td></tr>";
+end_row();
+end_table(); // outer table
display_heading(_("Invoice Items"));
start_table("$table_style width=80%");
-$th = array(_("Item Code"), _("Item Description"), _("Ordered"), _("Units"), _("Delivered"),
- _("This Delivery"), _("Price"), _("Tax Type"), _("Discount"), _("Total"));
+$th = array(_("Item Code"), _("Item Description"), _("Delivered"), _("Units"), _("Invoiced"),
+ _("This Invoice"), _("Price"), _("Tax Type"), _("Discount"), _("Total"));
table_header($th);
$k = 0;
$has_marked = false;
$show_qoh = true;
-foreach ($_SESSION['Items']->line_items as $ln_itm)
+foreach ($_SESSION['Items']->line_items as $line=>$ln_itm)
{
+ if($ln_itm->quantity==$ln_itm->qty_done) continue; //this line is fully delivered
+ alt_table_row_color($k);
- // if it's a non-stock item (eg. service) don't show qoh
- if (sys_prefs::allow_negative_stock() || !has_stock_holding($ln_itm->mb_flag) ||
- $ln_itm->qty_dispatched == 0)
- $show_qoh = false;
-
- if ($show_qoh)
- $qoh = get_qoh_on_date($ln_itm->stock_id, $_POST['Location'], $_POST['DispatchDate']);
-
- if ($show_qoh && ($ln_itm->qty_dispatched > $qoh))
- {
- // oops, we don't have enough of one of the component items
- start_row("class='stockmankobg'");
- $has_marked = true;
- }
- else
- alt_table_row_color($k);
+ view_stock_status_cell($ln_itm->stock_id); // ?
- view_stock_status_cell($ln_itm->stock_id);
-
- text_cells(null, $ln_itm->stock_id . "Desc", $ln_itm->item_description, 30, 50);
+ text_cells(null, 'Line'.$line.'Desc', $ln_itm->item_description, 30, 50);
qty_cell($ln_itm->quantity);
label_cell($ln_itm->units);
- qty_cell($ln_itm->qty_inv);
+ qty_cell($ln_itm->qty_done);
- text_cells(null, $ln_itm->stock_id, $ln_itm->qty_dispatched, 10, 10);
+ if(count($_SESSION['Items']->trans_no)>1) {
+ // for batch invoices we can process only whole deliveries
+ qty_cell($ln_itm->qty_dispatched);
+ hidden('Line'.$line,$ln_itm->qty_dispatched );
+ } else
+ text_cells(null, 'Line'.$line, $ln_itm->qty_dispatched, 10, 10);
$display_discount_percent = number_format2($ln_itm->discount_percent*100,user_percent_dec()) . "%";
label_cell($display_discount_percent, "nowrap align=right");
amount_cell($line_total);
- //label_cell(get_tax_free_price_for_item($ln_itm->stock_id, $line_total, $_POST['tax_group_id']));
-
end_row();
}
It seems unfair to charge the customer twice for freight if the order
was not fully delivered the first time ?? */
-if (!isset($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] == "")
+if (!isset($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] == "")
{
- if ($_SESSION['Items']->any_already_delivered() == 1)
+ if ($_SESSION['Items']->any_already_delivered() == 1)
{
$_POST['ChargeFreightCost'] = 0;
- }
- else
+ }
+ else
{
$_POST['ChargeFreightCost'] = $_SESSION['Items']->freight_cost;
}
label_row(_("Sub-total"), $display_sub_total, "colspan=9 align=right","align=right");
-$taxes = $_SESSION['Items']->get_taxes($_POST['tax_group_id'], $_POST['ChargeFreightCost']);
+$taxes = $_SESSION['Items']->get_taxes($_SESSION['Items']->tax_group_id, $_POST['ChargeFreightCost']);
$tax_total = display_edit_tax_items($taxes, 9);
$display_total = number_format2(($inv_items_total + $_POST['ChargeFreightCost'] + $tax_total), user_price_dec());
end_table(1);
-if ($has_marked)
- display_note(_("Marked items have insufficient quantities in stock."), 0, 1, "class='red'");
+//if ($has_marked)
+// display_note(_("Marked items have insufficient quantities in stock."), 0, 1, "class='red'");
start_table($table_style2);
-policy_list_row(_("Action For Balance"), "bo_policy", null);
-
textarea_row(_("Memo"), 'InvoiceText', null, 50, 4);
end_table(1);