2 /**********************************************************************
3 Copyright (C) FrontAccounting, LLC.
4 Released under the terms of the GNU General Public License, GPL,
5 as published by the Free Software Foundation, either version 3
6 of the License, or (at your option) any later version.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
12 //---------------------------------------------------------------------------
14 // Entry/Modify Sales Invoice against single delivery
15 // Entry/Modify Batch Sales Invoice against batch of deliveries
17 $page_security = 'SA_SALESINVOICE';
19 include_once($path_to_root . "/sales/includes/cart_class.inc");
20 include_once($path_to_root . "/includes/session.inc");
21 include_once($path_to_root . "/includes/data_checks.inc");
22 include_once($path_to_root . "/includes/manufacturing.inc");
23 include_once($path_to_root . "/sales/includes/sales_db.inc");
24 include_once($path_to_root . "/sales/includes/sales_ui.inc");
25 include_once($path_to_root . "/reporting/includes/reporting.inc");
26 include_once($path_to_root . "/taxes/tax_calc.inc");
27 include_once($path_to_root . "/admin/db/shipping_db.inc");
30 if ($use_popup_windows) {
31 $js .= get_js_open_window(900, 500);
33 if ($use_date_picker) {
34 $js .= get_js_date_picker();
37 if (isset($_GET['ModifyInvoice'])) {
38 $_SESSION['page_title'] = sprintf(_("Modifying Sales Invoice # %d.") ,$_GET['ModifyInvoice']);
39 $help_context = "Modifying Sales Invoice";
40 } elseif (isset($_GET['DeliveryNumber'])) {
41 $_SESSION['page_title'] = _($help_context = "Issue an Invoice for Delivery Note");
42 } elseif (isset($_GET['BatchInvoice'])) {
43 $_SESSION['page_title'] = _($help_context = "Issue Batch Invoice for Delivery Notes");
44 } elseif (isset($_GET['AllocationNumber']) || isset($_GET['InvoicePrepayments'])) {
45 $_SESSION['page_title'] = _($help_context = "Prepayment or Final Invoice Entry");
47 page($_SESSION['page_title'], false, false, "", $js);
49 //-----------------------------------------------------------------------------
50 check_edit_conflicts();
52 if (isset($_GET['AddedID'])) {
54 $invoice_no = $_GET['AddedID'];
55 $trans_type = ST_SALESINVOICE;
57 display_notification(_("Selected deliveries has been processed"), true);
59 display_note(get_customer_trans_view_str($trans_type, $invoice_no, _("&View This Invoice")), 0, 1);
61 display_note(print_document_link($invoice_no."-".$trans_type, _("&Print This Invoice"), true, ST_SALESINVOICE));
62 display_note(print_document_link($invoice_no."-".$trans_type, _("&Email This Invoice"), true, ST_SALESINVOICE, false, "printlink", "", 1),1);
64 display_note(get_gl_view_str($trans_type, $invoice_no, _("View the GL &Journal Entries for this Invoice")),1);
66 hyperlink_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select Another &Delivery For Invoicing"), "OutstandingOnly=1");
68 hyperlink_params("$path_to_root/admin/attachments.php", _("Add an Attachment"), "filterType=$trans_type&trans_no=$invoice_no");
70 display_footer_exit();
72 } elseif (isset($_GET['UpdatedID'])) {
74 $invoice_no = $_GET['UpdatedID'];
75 $trans_type = ST_SALESINVOICE;
77 display_notification_centered(sprintf(_('Sales Invoice # %d has been updated.'),$invoice_no));
79 display_note(get_trans_view_str(ST_SALESINVOICE, $invoice_no, _("&View This Invoice")));
81 display_note(print_document_link($invoice_no."-".$trans_type, _("&Print This Invoice"), true, ST_SALESINVOICE));
82 display_note(print_document_link($invoice_no."-".$trans_type, _("&Email This Invoice"), true, ST_SALESINVOICE, false, "printlink", "", 1),1);
84 hyperlink_no_params($path_to_root . "/sales/inquiry/customer_inquiry.php", _("Select Another &Invoice to Modify"));
86 display_footer_exit();
88 } elseif (isset($_GET['RemoveDN'])) {
90 for($line_no = 0; $line_no < count($_SESSION['Items']->line_items); $line_no++) {
91 $line = &$_SESSION['Items']->line_items[$line_no];
92 if ($line->src_no == $_GET['RemoveDN']) {
93 $line->quantity = $line->qty_done;
94 $line->qty_dispatched=0;
99 // Remove also src_doc delivery note
100 $sources = &$_SESSION['Items']->src_docs;
101 unset($sources[$_GET['RemoveDN']]);
104 //-----------------------------------------------------------------------------
106 if ( (isset($_GET['DeliveryNumber']) && ($_GET['DeliveryNumber'] > 0) )
107 || isset($_GET['BatchInvoice'])) {
111 if (isset($_GET['BatchInvoice'])) {
112 $src = $_SESSION['DeliveryBatch'];
113 unset($_SESSION['DeliveryBatch']);
115 $src = array($_GET['DeliveryNumber']);
118 /*read in all the selected deliveries into the Items cart */
119 $dn = new Cart(ST_CUSTDELIVERY, $src, true);
121 if ($dn->count_items() == 0) {
122 hyperlink_params($path_to_root . "/sales/inquiry/sales_deliveries_view.php",
123 _("Select a different delivery to invoice"), "OutstandingOnly=1");
124 die ("<br><b>" . _("There are no delivered items with a quantity left to invoice. There is nothing left to invoice.") . "</b>");
127 $_SESSION['Items'] = $dn;
130 } elseif (isset($_GET['ModifyInvoice']) && $_GET['ModifyInvoice'] > 0) {
132 check_is_closed(ST_SALESINVOICE, $_GET['ModifyInvoice']);
134 if ( get_sales_parent_numbers(ST_SALESINVOICE, $_GET['ModifyInvoice']) == 0) { // 1.xx compatibility hack
135 echo"<center><br><b>" . _("There are no delivery notes for this invoice.<br>
136 Most likely this invoice was created in Front Accounting version prior to 2.0
137 and therefore can not be modified.") . "</b></center>";
138 display_footer_exit();
141 check_is_closed(ST_SALESINVOICE, $_GET['ModifyInvoice']);
143 $_SESSION['Items'] = new Cart(ST_SALESINVOICE, $_GET['ModifyInvoice']);
145 if ($_SESSION['Items']->count_items() == 0) {
146 echo"<center><br><b>" . _("All quantities on this invoice has been credited. There is nothing to modify on this invoice") . "</b></center>";
147 display_footer_exit();
150 } elseif (isset($_GET['AllocationNumber']) || isset($_GET['InvoicePrepayments'])) {
152 check_deferred_income_act(_("You have to set Deferred Income Account in GL Setup to entry prepayment invoices."));
154 if (isset($_GET['AllocationNumber']))
156 $payments = array(get_cust_allocation($_GET['AllocationNumber']));
158 if (!$payments || ($payments[0]['trans_type_to'] != ST_SALESORDER))
160 display_error(_("Please select correct Sales Order Prepayment to be invoiced and try again."));
161 display_footer_exit();
163 $order_no = $payments[0]['trans_no_to'];
166 $order_no = $_GET['InvoicePrepayments'];
167 $payments = get_payments_for($_GET['InvoicePrepayments'], ST_SALESORDER);
171 $_SESSION['Items'] = new Cart(ST_SALESORDER, $order_no, ST_SALESINVOICE);
172 $_SESSION['Items']->order_no = $order_no;
173 $_SESSION['Items']->src_docs = array($order_no);
174 $_SESSION['Items']->trans_no = 0;
175 $_SESSION['Items']->trans_type = ST_SALESINVOICE;
176 $_SESSION['Items']->prepayments = $payments;
177 // prepayment invoice has all line quantities as stated on order.
178 // foreach($_SESSION['Items']->line_items as &$line)
180 // $line->src_id = $line_id;
181 // $line->qty_dispatched = $line->quantity;
184 $_SESSION['Items']->update_payments();
186 // $_SESSION['Items']->alloc = $this_amount;
189 elseif (!processing_active()) {
190 /* This page can only be called with a delivery for invoicing or invoice no for edit */
191 display_error(_("This page can only be opened after delivery selection. Please select delivery to invoicing first."));
193 hyperlink_no_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select Delivery to Invoice"));
197 } elseif (!isset($_POST['process_invoice']) && (!$_SESSION['Items']->is_prepaid() && !check_quantities())) {
198 display_error(_("Selected quantity cannot be less than quantity credited nor more than quantity not invoiced yet."));
201 if (isset($_POST['Update'])) {
202 $Ajax->activate('Items');
204 if (isset($_POST['_InvoiceDate_changed'])) {
205 $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->payment, $_POST['InvoiceDate']);
206 $Ajax->activate('due_date');
209 //-----------------------------------------------------------------------------
210 function check_quantities()
213 foreach ($_SESSION['Items']->line_items as $line_no=>$itm) {
214 if (isset($_POST['Line'.$line_no])) {
215 if($_SESSION['Items']->trans_no) {
216 $min = $itm->qty_done;
217 $max = $itm->quantity;
220 $max = $itm->quantity - $itm->qty_done;
222 if (check_num('Line'.$line_no, $min, $max)) {
223 $_SESSION['Items']->line_items[$line_no]->qty_dispatched =
224 input_num('Line'.$line_no);
232 if (isset($_POST['Line'.$line_no.'Desc'])) {
233 $line_desc = $_POST['Line'.$line_no.'Desc'];
234 if (strlen($line_desc) > 0) {
235 $_SESSION['Items']->line_items[$line_no]->item_description = $line_desc;
242 function set_delivery_shipping_sum($delivery_notes)
247 foreach($delivery_notes as $delivery_num)
249 $myrow = get_customer_trans($delivery_num, 13);
250 //$branch = get_branch($myrow["branch_code"]);
251 //$sales_order = get_sales_order_header($myrow["order_"]);
253 //$shipping += $sales_order['freight_cost'];
254 $shipping += $myrow['ov_freight'];
256 $_POST['ChargeFreightCost'] = price_format($shipping);
260 function copy_to_cart()
262 $cart = &$_SESSION['Items'];
263 $cart->due_date = $cart->document_date = $_POST['InvoiceDate'];
264 $cart->Comments = $_POST['Comments'];
265 $cart->due_date = $_POST['due_date'];
266 if (($cart->pos['cash_sale'] || $cart->pos['credit_sale']) && isset($_POST['payment'])) {
267 $cart->payment = $_POST['payment'];
268 $cart->payment_terms = get_payment_terms($_POST['payment']);
270 if ($_SESSION['Items']->trans_no == 0)
271 $cart->reference = $_POST['ref'];
272 if (!$cart->is_prepaid())
274 $cart->ship_via = $_POST['ship_via'];
275 $cart->freight_cost = input_num('ChargeFreightCost');
278 $cart->update_payments();
280 $cart->dimension_id = $_POST['dimension_id'];
281 $cart->dimension2_id = $_POST['dimension2_id'];
283 //-----------------------------------------------------------------------------
285 function copy_from_cart()
287 $cart = &$_SESSION['Items'];
288 $_POST['Comments']= $cart->Comments;
289 $_POST['InvoiceDate']= $cart->document_date;
290 $_POST['ref'] = $cart->reference;
291 $_POST['cart_id'] = $cart->cart_id;
292 $_POST['due_date'] = $cart->due_date;
293 $_POST['payment'] = $cart->payment;
294 if (!$_SESSION['Items']->is_prepaid())
296 $_POST['ship_via'] = $cart->ship_via;
297 $_POST['ChargeFreightCost'] = price_format($cart->freight_cost);
299 $_POST['dimension_id'] = $cart->dimension_id;
300 $_POST['dimension2_id'] = $cart->dimension2_id;
303 //-----------------------------------------------------------------------------
305 function check_data()
309 $prepaid = $_SESSION['Items']->is_prepaid();
311 if (!isset($_POST['InvoiceDate']) || !is_date($_POST['InvoiceDate'])) {
312 display_error(_("The entered invoice date is invalid."));
313 set_focus('InvoiceDate');
317 if (!is_date_in_fiscalyear($_POST['InvoiceDate'])) {
318 display_error(_("The entered date is out of fiscal year or is closed for further data entry."));
319 set_focus('InvoiceDate');
324 if (!$prepaid &&(!isset($_POST['due_date']) || !is_date($_POST['due_date']))) {
325 display_error(_("The entered invoice due date is invalid."));
326 set_focus('due_date');
330 if ($_SESSION['Items']->trans_no == 0) {
331 if (!$Refs->is_valid($_POST['ref'])) {
332 display_error(_("You must enter a reference."));
337 if (!is_new_reference($_POST['ref'], 10)) {
338 display_error(_("The entered reference is already in use."));
346 if ($_POST['ChargeFreightCost'] == "") {
347 $_POST['ChargeFreightCost'] = price_format(0);
350 if (!check_num('ChargeFreightCost', 0)) {
351 display_error(_("The entered shipping value is not numeric."));
352 set_focus('ChargeFreightCost');
356 if ($_SESSION['Items']->has_items_dispatch() == 0 && input_num('ChargeFreightCost') == 0) {
357 display_error(_("There are no item quantities on this invoice."));
361 if (!check_quantities()) {
362 display_error(_("Selected quantity cannot be less than quantity credited nor more than quantity not invoiced yet."));
366 if (($_SESSION['Items']->payment_terms['days_before_due'] < 0) && !count($_SESSION['Items']->prepayments)) {
367 display_error(_("There is no non-invoiced payments for this order. If you want to issue final invoice, select delayed or cash payment terms."));
375 //-----------------------------------------------------------------------------
376 if (isset($_POST['process_invoice']) && check_data()) {
378 $newinvoice= $_SESSION['Items']->trans_no == 0;
380 if ($newinvoice) new_doc_date($_SESSION['Items']->document_date);
382 $invoice_no = $_SESSION['Items']->write();
386 meta_forward($_SERVER['PHP_SELF'], "AddedID=$invoice_no");
388 meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$invoice_no");
392 if(list_updated('payment')) {
393 $order = &$_SESSION['Items'];
395 $order->payment = get_post('payment');
396 $order->payment_terms = get_payment_terms($order->payment);
397 $_POST['due_date'] = $order->due_date = get_invoice_duedate($order->payment, $order->document_date);
398 $_POST['Comments'] = '';
399 $Ajax->activate('due_date');
400 $Ajax->activate('options');
401 if ($order->payment_terms['cash_sale']) {
402 $_POST['Location'] = $order->Location = $order->pos['pos_location'];
403 $order->location_name = $order->pos['location_name'];
407 // find delivery spans for batch invoice display
409 $lastdn = ''; $spanlen=1;
411 for ($line_no = 0; $line_no < count($_SESSION['Items']->line_items); $line_no++) {
412 $line = $_SESSION['Items']->line_items[$line_no];
413 if ($line->quantity == $line->qty_done) {
416 if ($line->src_no == $lastdn) {
420 $dspans[] = $spanlen;
424 $lastdn = $line->src_no;
426 $dspans[] = $spanlen;
428 //-----------------------------------------------------------------------------
430 $is_batch_invoice = count($_SESSION['Items']->src_docs) > 1;
431 $prepaid = $_SESSION['Items']->is_prepaid();
433 $is_edition = $_SESSION['Items']->trans_type == ST_SALESINVOICE && $_SESSION['Items']->trans_no != 0;
437 start_table(TABLESTYLE2, "width=80%", 5);
441 $dim = get_company_pref('use_dimension');
444 label_cells(_("Customer"), $_SESSION['Items']->customer_name, "class='tableheader2'");
445 label_cells(_("Branch"), get_branch_name($_SESSION['Items']->Branch), "class='tableheader2'");
446 if (($_SESSION['Items']->pos['credit_sale'] || $_SESSION['Items']->pos['cash_sale'])) {
447 $paymcat = !$_SESSION['Items']->pos['cash_sale'] ? PM_CREDIT :
448 (!$_SESSION['Items']->pos['credit_sale'] ? PM_CASH : PM_ANY);
449 label_cells(_("Payment terms:"), sale_payment_list('payment', $paymcat),
450 "class='tableheader2'", "colspan=$colspan");
452 label_cells(_('Payment:'), $_SESSION['Items']->payment_terms['terms'], "class='tableheader2'", "colspan=$colspan");
457 if ($_SESSION['Items']->trans_no == 0) {
458 ref_cells(_("Reference"), 'ref', '', null, "class='tableheader2'");
460 label_cells(_("Reference"), $_SESSION['Items']->reference, "class='tableheader2'");
463 //label_cells(_("Delivery Notes:"),
464 //get_customer_trans_view_str(ST_CUSTDELIVERY, array_keys($_SESSION['Items']->src_docs)), "class='tableheader2'");
466 label_cells(_("Sales Type"), $_SESSION['Items']->sales_type_name, "class='tableheader2'");
468 label_cells(_("Currency"), $_SESSION['Items']->customer_currency, "class='tableheader2'");
469 // 2010-09-03 Joe Hunt
471 // label_cells(_("Dimension"), get_dimension_string($_SESSION['Items']->dimension_id), "class='tableheader2'");
473 label_cell(_("Dimension").":", "class='tableheader2'");
474 $_POST['dimension_id'] = $_SESSION['Items']->dimension_id;
475 dimensions_list_cells(null, 'dimension_id', null, true, ' ', false, 1, false);
478 hidden('dimension_id', 0);
483 if (!isset($_POST['ship_via'])) {
484 $_POST['ship_via'] = $_SESSION['Items']->ship_via;
486 label_cell(_("Shipping Company"), "class='tableheader2'");
489 $shipper = get_shipper($_SESSION['Items']->ship_via);
490 label_cells(null, $shipper['shipper_name']);
492 shippers_list_cells(null, 'ship_via', $_POST['ship_via']);
494 if (!isset($_POST['InvoiceDate']) || !is_date($_POST['InvoiceDate'])) {
495 $_POST['InvoiceDate'] = new_doc_date();
496 if (!is_date_in_fiscalyear($_POST['InvoiceDate'])) {
497 $_POST['InvoiceDate'] = end_fiscalyear();
501 date_cells(_("Date"), 'InvoiceDate', '', $_SESSION['Items']->trans_no == 0,
502 0, 0, 0, "class='tableheader2'", true);
504 if (!isset($_POST['due_date']) || !is_date($_POST['due_date'])) {
505 $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->payment, $_POST['InvoiceDate']);
508 date_cells(_("Due Date"), 'due_date', '', null, 0, 0, 0, "class='tableheader2'");
511 label_cells(_("Dimension"). " 2", get_dimension_string($_SESSION['Items']->dimension2_id), "class='tableheader2'");
513 label_cell(" ", "colspan=2");
516 label_cell(_("Dimension")." 2:", "class='tableheader2'");
517 $_POST['dimension2_id'] = $_SESSION['Items']->dimension2_id;
518 dimensions_list_cells(null, 'dimension2_id', null, true, ' ', false, 2, false);
521 hidden('dimension2_id', 0);
525 $row = get_customer_to_order($_SESSION['Items']->customer_id);
526 if ($row['dissallow_invoices'] == 1)
528 display_error(_("The selected customer account is currently on hold. Please contact the credit control personnel to discuss."));
534 display_heading($prepaid ? _("Sales Order Items") : _("Invoice Items"));
537 start_table(TABLESTYLE, "width=80%");
539 $th = array(_("Item Code"), _("Item Description"), _("Units"), _("Quantity"),
540 _("Price"), _("Tax Type"), _("Discount"), _("Total"));
542 $th = array(_("Item Code"), _("Item Description"), _("Delivered"), _("Units"), _("Invoiced"),
543 _("This Invoice"), _("Price"), _("Tax Type"), _("Discount"), _("Total"));
544 if ($is_batch_invoice) {
550 $th[4] = _("Credited");
560 foreach ($_SESSION['Items']->line_items as $line=>$ln_itm) {
561 if (!$prepaid && ($ln_itm->quantity == $ln_itm->qty_done)) {
562 continue; // this line was fully invoiced
564 alt_table_row_color($k);
565 view_stock_status_cell($ln_itm->stock_id);
568 label_cell($ln_itm->item_description);
570 text_cells(null, 'Line'.$line.'Desc', $ln_itm->item_description, 30, 50);
571 $dec = get_qty_dec($ln_itm->stock_id);
573 qty_cell($ln_itm->quantity, false, $dec);
574 label_cell($ln_itm->units);
576 qty_cell($ln_itm->qty_done, false, $dec);
578 if ($is_batch_invoice || $prepaid) {
579 // for batch invoices we can only remove whole deliveries
580 echo '<td nowrap align=right>';
581 hidden('Line' . $line, $ln_itm->qty_dispatched );
582 echo number_format2($ln_itm->qty_dispatched, $dec).'</td>';
584 small_qty_cells(null, 'Line'.$line, qty_format($ln_itm->qty_dispatched, $ln_itm->stock_id, $dec), null, null, $dec);
586 $display_discount_percent = percent_format($ln_itm->discount_percent*100) . " %";
588 $line_total = ($ln_itm->qty_dispatched * $ln_itm->price * (1 - $ln_itm->discount_percent));
590 amount_cell($ln_itm->price);
591 label_cell($ln_itm->tax_type_name);
592 label_cell($display_discount_percent, "nowrap align=right");
593 amount_cell($line_total);
595 if ($is_batch_invoice) {
596 if ($dn_line_cnt == 0) {
597 $dn_line_cnt = $dspans[0];
598 $dspans = array_slice($dspans, 1);
599 label_cell($ln_itm->src_no, "rowspan=$dn_line_cnt class=oddrow");
600 label_cell("<a href='" . $_SERVER['PHP_SELF'] . "?RemoveDN=".
601 $ln_itm->src_no."'>" . _("Remove") . "</a>", "rowspan=$dn_line_cnt class=oddrow");
608 /*Don't re-calculate freight if some of the order has already been delivered -
609 depending on the business logic required this condition may not be required.
610 It seems unfair to charge the customer twice for freight if the order
611 was not fully delivered the first time ?? */
613 if (!isset($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] == "") {
614 if ($_SESSION['Items']->any_already_delivered() == 1) {
615 $_POST['ChargeFreightCost'] = price_format(0);
617 $_POST['ChargeFreightCost'] = price_format($_SESSION['Items']->freight_cost);
620 if (!check_num('ChargeFreightCost')) {
621 $_POST['ChargeFreightCost'] = price_format(0);
625 $accumulate_shipping = get_company_pref('accumulate_shipping');
626 if ($is_batch_invoice && $accumulate_shipping)
627 set_delivery_shipping_sum(array_keys($_SESSION['Items']->src_docs));
629 $colspan = $prepaid ? 7:9;
631 label_cell(_("Shipping Cost"), "colspan=$colspan align=right");
633 label_cell($_POST['ChargeFreightCost'], 'align=right');
635 small_amount_cells(null, 'ChargeFreightCost', null);
636 if ($is_batch_invoice) {
637 label_cell('', 'colspan=2');
641 $inv_items_total = $_SESSION['Items']->get_items_total_dispatch();
643 $display_sub_total = price_format($inv_items_total + input_num('ChargeFreightCost'));
645 label_row(_("Sub-total"), $display_sub_total, "colspan=$colspan align=right","align=right", $is_batch_invoice ? 2 : 0);
647 $taxes = $_SESSION['Items']->get_taxes(input_num('ChargeFreightCost'));
648 $tax_total = display_edit_tax_items($taxes, $colspan, $_SESSION['Items']->tax_included, $is_batch_invoice ? 2 : 0);
650 $display_total = price_format(($inv_items_total + input_num('ChargeFreightCost') + $tax_total));
652 label_row(_("Invoice Total"), $display_total, "colspan=$colspan align=right","align=right", $is_batch_invoice ? 2 : 0);
656 div_start('options');
657 start_table(TABLESTYLE2);
661 label_row(_("Sales order:"), get_trans_view_str(ST_SALESORDER, $_SESSION['Items']->order_no, get_reference(ST_SALESORDER, $_SESSION['Items']->order_no)));
663 $list = array(); $allocs = 0;
664 if (count($_SESSION['Items']->prepayments))
666 foreach($_SESSION['Items']->prepayments as $pmt)
668 $list[] = get_trans_view_str($pmt['trans_type_from'], $pmt['trans_no_from'], get_reference($pmt['trans_type_from'], $pmt['trans_no_from']));
669 $allocs += $pmt['amt'];
673 label_row(_("Payments received:"), implode(',', $list));
674 label_row(_("Invoiced here:"), price_format($_SESSION['Items']->prep_amount), 'class=label');
675 label_row(_("Left to be invoiced:"), price_format($_SESSION['Items']->get_trans_total()-max($_SESSION['Items']->prep_amount, $allocs)), 'class=label');
678 textarea_row(_("Memo:"), 'Comments', null, 50, 4);
682 submit_center_first('Update', _("Update"),
683 _('Refresh document page'), true);
684 submit_center_last('process_invoice', _("Process Invoice"),
685 _('Check entered data and save document'), 'default');