'; display_note(print_document_link($invoice_no, _("Print This Invoice"), true, 10)); hyperlink_no_params($path_to_root . "/sales/inquiry/customer_inquiry.php", _("Select A Different Invoice to Modify")); display_footer_exit(); } elseif (isset($_GET['RemoveDN'])) { for($line_no = 0; $line_no < count($_SESSION['Items']->line_items); $line_no++) { $line = &$_SESSION['Items']->line_items[$line_no]; if ($line->src_no == $_GET['RemoveDN']) { $line->quantity = $line->qty_done; $line->qty_dispatched=0; } } unset($line); } //----------------------------------------------------------------------------- if ( (isset($_GET['DeliveryNumber']) && ($_GET['DeliveryNumber'] > 0) ) || isset($_GET['BatchInvoice'])) { processing_start(); if (isset($_GET['BatchInvoice'])) { $src = $_SESSION['DeliveryBatch']; unset($_SESSION['DeliveryBatch']); } else { $src = array($_GET['DeliveryNumber']); } /*read in all the selected deliveries into the Items cart */ $dn = new Cart(13, $src, true); if ($dn->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.") . ""); } $dn->trans_type = 10; $dn->src_docs = $dn->trans_no; $dn->trans_no = 0; $dn->reference = references::get_next(10); $dn->due_date = get_invoice_duedate($dn->customer_id, $dn->document_date); $_SESSION['Items'] = $dn; copy_from_cart(); } elseif (isset($_GET['ModifyInvoice']) && $_GET['ModifyInvoice'] > 0) { processing_start(); $_SESSION['Items'] = new Cart(10, $_GET['ModifyInvoice']); if ($_SESSION['Items']->count_items() == 0) { echo"

" . _("All quantities on this invoice has been credited. There is nothing to modify on this invoice") . "
"; display_footer_exit(); } copy_from_cart(); } elseif (!processing_active()) { /* This page can only be called with a delivery for invoicing or invoice no for edit */ 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_deliveries_view.php", _("Select Delivery to Invoice")); end_page(); exit; } else { foreach ($_SESSION['Items']->line_items as $line_no=>$itm) { if (isset($_POST['Line'.$line_no])) { $line_qty = $_POST['Line'.$line_no]; if (is_numeric($line_qty) && $_POST['Line'.$line_no] <= ($itm->quantity - $itm->qty_done)) { $_SESSION['Items']->line_items[$line_no]->qty_dispatched = $line_qty; } } if (isset($_POST['Line'.$line_no.'Desc'])) { $line_desc = $_POST['Line'.$line_no.'Desc']; if (strlen($line_desc) > 0) { $_SESSION['Items']->line_items[$line_no]->item_description = $line_desc; } } } } //----------------------------------------------------------------------------- function copy_to_cart() { $cart = &$_SESSION['Items']; $cart->ship_via = $_POST['ship_via']; $cart->freight_cost = $_POST['ChargeFreightCost']; $cart->document_date = $_POST['InvoiceDate']; $cart->due_date = $_POST['due_date']; $cart->Comments = $_POST['Comments']; } //----------------------------------------------------------------------------- function copy_from_cart() { $cart = &$_SESSION['Items']; $_POST['ship_via'] = $cart->ship_via; $_POST['ChargeFreightCost'] = $cart->freight_cost; $_POST['InvoiceDate']= $cart->document_date; $_POST['due_date'] = $cart->due_date; $_POST['Comments']= $cart->Comments; } //----------------------------------------------------------------------------- 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 ($_SESSION['Items']->trans_no == 0) { 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; } //----------------------------------------------------------------------------- if (isset($_POST['process_invoice']) && check_data()) { $newinvoice= $_SESSION['Items']->trans_no == 0; copy_to_cart(); $invoice_no = $_SESSION['Items']->write(); processing_end(); if ($newinvoice) { meta_forward($_SERVER['PHP_SELF'], "AddedID=$invoice_no"); } else { meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$invoice_no"); } } // find delivery spans for batch invoice display $dspans = array(); $lastdn = ''; $spanlen=1; for ($line_no = 0; $line_no < count($_SESSION['Items']->line_items); $line_no++) { $line = $_SESSION['Items']->line_items[$line_no]; if ($line->quantity == $line->qty_done) { continue; } if ($line->src_no == $lastdn) { $spanlen++; } else { if ($lastdn != '') { $dspans[] = $spanlen; $spanlen = 1; } } $lastdn = $line->src_no; } $dspans[] = $spanlen; //----------------------------------------------------------------------------- $is_batch_invoice = count($_SESSION['Items']->src_docs) > 1; $is_edition = $_SESSION['Items']->trans_type == 10 && $_SESSION['Items']->trans_no != 0; start_form(false, true); start_table("$table_style2 width=80%", 5); start_row(); label_cells(_("Customer"), $_SESSION['Items']->customer_name, "class='tableheader2'"); label_cells(_("Branch"), get_branch_name($_SESSION['Items']->Branch), "class='tableheader2'"); label_cells(_("Currency"), $_SESSION['Items']->customer_currency, "class='tableheader2'"); end_row(); start_row(); if ($_SESSION['Items']->trans_no == 0) { ref_cells(_("Reference"), 'ref', $_SESSION['Items']->reference, "class='tableheader2'"); } else { label_cells(_("Reference"), $_SESSION['Items']->reference, "class='tableheader2'"); } label_cells(_("Delivery Notes:"), get_customer_trans_view_str(systypes::cust_dispatch(), array_keys($_SESSION['Items']->src_docs)), "class='tableheader2'"); label_cells(_("Sales Type"), $_SESSION['Items']->sales_type_name, "class='tableheader2'"); end_row(); start_row(); if (!isset($_POST['ship_via'])) { $_POST['ship_via'] = $_SESSION['Items']->ship_via; } label_cell(_("Shipping Company"), "class='tableheader2'"); shippers_list_cells(null, 'ship_via', $_POST['ship_via']); if (!isset($_POST['InvoiceDate']) || !is_date($_POST['InvoiceDate'])) { $_POST['InvoiceDate'] = Today(); if (!is_date_in_fiscalyear($_POST['InvoiceDate'])) { $_POST['InvoiceDate'] = end_fiscalyear(); } } date_cells(_("Date"), 'InvoiceDate', $_POST['InvoiceDate'], 0, 0, 0, "class='tableheader'"); if (!isset($_POST['due_date']) || !is_date($_POST['due_date'])) { $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->customer_id, $_POST['InvoiceDate']); } date_cells(_("Due Date"), 'due_date', $_POST['due_date'], 0, 0, 0, "class='tableheader'"); end_row(); end_table(); display_heading(_("Invoice Items")); start_table("$table_style width=80%"); $th = array(_("Item Code"), _("Item Description"), _("Delivered"), _("Units"), _("Invoiced"), _("This Invoice"), _("Price"), _("Tax Type"), _("Discount"), _("Total")); if ($is_batch_invoice) { $th[] = _("DN"); $th[] = ""; } if ($is_edition) { $th[4] = _("Credited"); } table_header($th); $k = 0; $has_marked = false; $show_qoh = true; $dn_line_cnt = 0; foreach ($_SESSION['Items']->line_items as $line=>$ln_itm) { if ($ln_itm->quantity == $ln_itm->qty_done) { continue; // this line was fully invoiced } alt_table_row_color($k); view_stock_status_cell($ln_itm->stock_id); 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_done); if ($is_batch_invoice) { // for batch invoices we can only remove whole deliveries echo ''; hidden('Line' . $line, $ln_itm->qty_dispatched ); echo number_format2($ln_itm->qty_dispatched, user_qty_dec()).''; } 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()) . "%"; $line_total = ($ln_itm->qty_dispatched * $ln_itm->price * (1 - $ln_itm->discount_percent)); amount_cell($ln_itm->price); label_cell($ln_itm->tax_type_name); label_cell($display_discount_percent, "nowrap align=right"); amount_cell($line_total); if ($is_batch_invoice) { if ($dn_line_cnt == 0) { $dn_line_cnt = $dspans[0]; $dspans = array_slice($dspans, 1); label_cell($ln_itm->src_no, "rowspan=$dn_line_cnt class=oddrow"); label_cell("" . _("Remove") . "", "rowspan=$dn_line_cnt class=oddrow"); } $dn_line_cnt--; } end_row(); } /*Don't re-calculate freight if some of the order has already been delivered - depending on the business logic required this condition may not be required. 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 ($_SESSION['Items']->any_already_delivered() == 1) { $_POST['ChargeFreightCost'] = 0; } else { $_POST['ChargeFreightCost'] = $_SESSION['Items']->freight_cost; } if (!is_numeric($_POST['ChargeFreightCost'])) { $_POST['ChargeFreightCost'] = 0; } } start_row(); small_amount_cells(_("Shipping Cost"), 'ChargeFreightCost', null, "colspan=9 align=right"); if ($is_batch_invoice) { label_cell('', 'colspan=2'); } end_row(); $inv_items_total = $_SESSION['Items']->get_items_total_dispatch(); $display_sub_total = number_format2($inv_items_total + $_POST['ChargeFreightCost'],user_price_dec()); label_row(_("Sub-total"), $display_sub_total, "colspan=9 align=right","align=right", $is_batch_invoice ? 2 : 0); $taxes = $_SESSION['Items']->get_taxes($_POST['ChargeFreightCost']); $tax_total = display_edit_tax_items($taxes, 9, $_SESSION['Items']->tax_included, $is_batch_invoice ? 2:0); $display_total = number_format2(($inv_items_total + $_POST['ChargeFreightCost'] + $tax_total), user_price_dec()); label_row(_("Invoice Total"), $display_total, "colspan=9 align=right","align=right", $is_batch_invoice ? 2 : 0); end_table(1); start_table($table_style2); textarea_row(_("Memo"), 'Comments', null, 50, 4); end_table(1); submit_center_first('Update', _("Update")); submit_center_last('process_invoice', _("Process Invoice")); end_form(); end_page(); ?>