0000593,0001093: Prepayments made against orders implemented.
[fa-stable.git] / sales / customer_invoice.php
1 <?php
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 //---------------------------------------------------------------------------
13 //
14 //      Entry/Modify Sales Invoice against single delivery
15 //      Entry/Modify Batch Sales Invoice against batch of deliveries
16 //
17 $page_security = 'SA_SALESINVOICE';
18 $path_to_root = "..";
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");
28
29 $js = "";
30 if ($use_popup_windows) {
31         $js .= get_js_open_window(900, 500);
32 }
33 if ($use_date_picker) {
34         $js .= get_js_date_picker();
35 }
36
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");
46 }
47 page($_SESSION['page_title'], false, false, "", $js);
48
49 //-----------------------------------------------------------------------------
50 check_edit_conflicts();
51
52 if (isset($_GET['AddedID'])) {
53
54         $invoice_no = $_GET['AddedID'];
55         $trans_type = ST_SALESINVOICE;
56
57         display_notification(_("Selected deliveries has been processed"), true);
58
59         display_note(get_customer_trans_view_str($trans_type, $invoice_no, _("&View This Invoice")), 0, 1);
60
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);
63
64         display_note(get_gl_view_str($trans_type, $invoice_no, _("View the GL &Journal Entries for this Invoice")),1);
65
66         hyperlink_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select Another &Delivery For Invoicing"), "OutstandingOnly=1");
67
68         hyperlink_params("$path_to_root/admin/attachments.php", _("Add an Attachment"), "filterType=$trans_type&trans_no=$invoice_no");
69
70         display_footer_exit();
71
72 } elseif (isset($_GET['UpdatedID']))  {
73
74         $invoice_no = $_GET['UpdatedID'];
75         $trans_type = ST_SALESINVOICE;
76
77         display_notification_centered(sprintf(_('Sales Invoice # %d has been updated.'),$invoice_no));
78
79         display_note(get_trans_view_str(ST_SALESINVOICE, $invoice_no, _("&View This Invoice")));
80         echo '<br>';
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);
83
84         hyperlink_no_params($path_to_root . "/sales/inquiry/customer_inquiry.php", _("Select Another &Invoice to Modify"));
85
86         display_footer_exit();
87
88 } elseif (isset($_GET['RemoveDN'])) {
89
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;
95                 }
96         }
97         unset($line);
98
99     // Remove also src_doc delivery note
100     $sources = &$_SESSION['Items']->src_docs;
101     unset($sources[$_GET['RemoveDN']]);
102 }
103
104 //-----------------------------------------------------------------------------
105
106 if ( (isset($_GET['DeliveryNumber']) && ($_GET['DeliveryNumber'] > 0) )
107 || isset($_GET['BatchInvoice'])) {
108
109         processing_start();
110
111         if (isset($_GET['BatchInvoice'])) {
112                 $src = $_SESSION['DeliveryBatch'];
113                 unset($_SESSION['DeliveryBatch']);
114         } else {
115                 $src = array($_GET['DeliveryNumber']);
116         }
117
118         /*read in all the selected deliveries into the Items cart  */
119         $dn = new Cart(ST_CUSTDELIVERY, $src, true);
120
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>");
125         }
126
127         $_SESSION['Items'] = $dn;
128         copy_from_cart();
129
130 } elseif (isset($_GET['ModifyInvoice']) && $_GET['ModifyInvoice'] > 0) {
131
132         check_is_closed(ST_SALESINVOICE, $_GET['ModifyInvoice']);
133 /*
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();
139         }
140 */
141         check_is_closed(ST_SALESINVOICE, $_GET['ModifyInvoice']);
142         processing_start();
143         $_SESSION['Items'] = new Cart(ST_SALESINVOICE, $_GET['ModifyInvoice']);
144
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();
148         }
149         copy_from_cart();
150 } elseif (isset($_GET['AllocationNumber']) || isset($_GET['InvoicePrepayments'])) {
151
152                 check_deferred_income_act(_("You have to set Deferred Income Account in GL Setup to entry prepayment invoices."));
153
154                 if (isset($_GET['AllocationNumber']))
155                 {
156                         $payments = array(get_cust_allocation($_GET['AllocationNumber']));
157
158                         if (!$payments || ($payments[0]['trans_type_to'] != ST_SALESORDER))
159                         {
160                                 display_error(_("Please select correct Sales Order Prepayment to be invoiced and try again."));
161                                 display_footer_exit();
162                         }
163                         $order_no = $payments[0]['trans_no_to'];
164                 }
165                 else {
166                         $order_no = $_GET['InvoicePrepayments'];
167                         $payments =  get_payments_for($_GET['InvoicePrepayments'], ST_SALESORDER);
168                 }
169                 processing_start();
170
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)
179 //              {
180 //                      $line->src_id = $line_id;
181 //                      $line->qty_dispatched = $line->quantity;
182 //              }
183 //              unset($line);
184                 $_SESSION['Items']->update_payments();
185
186 //              $_SESSION['Items']->alloc = $this_amount;
187                 copy_from_cart();
188 }
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."));
192
193         hyperlink_no_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select Delivery to Invoice"));
194
195         end_page();
196         exit;
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."));
199 }
200
201 if (isset($_POST['Update'])) {
202         $Ajax->activate('Items');
203 }
204 if (isset($_POST['_InvoiceDate_changed'])) {
205         $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->payment, $_POST['InvoiceDate']);
206         $Ajax->activate('due_date');
207 }
208
209 //-----------------------------------------------------------------------------
210 function check_quantities()
211 {
212         $ok =1;
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;
218                         } else {
219                                 $min = 0;
220                                 $max = $itm->quantity - $itm->qty_done;
221                         }
222                         if (check_num('Line'.$line_no, $min, $max)) {
223                                 $_SESSION['Items']->line_items[$line_no]->qty_dispatched =
224                                     input_num('Line'.$line_no);
225                         }
226                         else {
227                                 $ok = 0;
228                         }
229                                 
230                 }
231
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;
236                         }
237                 }
238         }
239  return $ok;
240 }
241
242 function set_delivery_shipping_sum($delivery_notes) 
243 {
244     
245     $shipping = 0;
246     
247     foreach($delivery_notes as $delivery_num) 
248     {
249         $myrow = get_customer_trans($delivery_num, 13);
250         //$branch = get_branch($myrow["branch_code"]);
251         //$sales_order = get_sales_order_header($myrow["order_"]);
252         
253         //$shipping += $sales_order['freight_cost'];
254         $shipping += $myrow['ov_freight'];
255     }
256     $_POST['ChargeFreightCost'] = price_format($shipping);
257 }
258
259
260 function copy_to_cart()
261 {
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']);
269         }
270         if ($_SESSION['Items']->trans_no == 0)
271                 $cart->reference = $_POST['ref'];
272         if (!$cart->is_prepaid())
273         {
274                 $cart->ship_via = $_POST['ship_via'];
275                 $cart->freight_cost = input_num('ChargeFreightCost');
276         }
277
278         $cart->update_payments();
279
280         $cart->dimension_id =  $_POST['dimension_id'];
281         $cart->dimension2_id =  $_POST['dimension2_id'];
282 }
283 //-----------------------------------------------------------------------------
284
285 function copy_from_cart()
286 {
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())
295         {
296                 $_POST['ship_via'] = $cart->ship_via;
297                 $_POST['ChargeFreightCost'] = price_format($cart->freight_cost);
298         }
299         $_POST['dimension_id'] = $cart->dimension_id;
300         $_POST['dimension2_id'] = $cart->dimension2_id;
301 }
302
303 //-----------------------------------------------------------------------------
304
305 function check_data()
306 {
307         global $Refs;
308
309         $prepaid = $_SESSION['Items']->is_prepaid();
310
311         if (!isset($_POST['InvoiceDate']) || !is_date($_POST['InvoiceDate'])) {
312                 display_error(_("The entered invoice date is invalid."));
313                 set_focus('InvoiceDate');
314                 return false;
315         }
316
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');
320                 return false;
321         }
322
323
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');
327                 return false;
328         }
329
330         if ($_SESSION['Items']->trans_no == 0) {
331                 if (!$Refs->is_valid($_POST['ref'])) {
332                         display_error(_("You must enter a reference."));
333                         set_focus('ref');
334                         return false;
335                 }
336
337                 if (!is_new_reference($_POST['ref'], 10)) {
338                         display_error(_("The entered reference is already in use."));
339                         set_focus('ref');
340                         return false;
341                 }
342         }
343
344         if(!$prepaid) 
345         {
346                 if ($_POST['ChargeFreightCost'] == "") {
347                         $_POST['ChargeFreightCost'] = price_format(0);
348                 }
349
350                 if (!check_num('ChargeFreightCost', 0)) {
351                         display_error(_("The entered shipping value is not numeric."));
352                         set_focus('ChargeFreightCost');
353                         return false;
354                 }
355
356                 if ($_SESSION['Items']->has_items_dispatch() == 0 && input_num('ChargeFreightCost') == 0) {
357                         display_error(_("There are no item quantities on this invoice."));
358                         return false;
359                 }
360
361                 if (!check_quantities()) {
362                         display_error(_("Selected quantity cannot be less than quantity credited nor more than quantity not invoiced yet."));
363                         return false;
364                 }
365         } else {
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."));
368                         return false;
369                 }
370         }
371
372         return true;
373 }
374
375 //-----------------------------------------------------------------------------
376 if (isset($_POST['process_invoice']) && check_data()) {
377
378         $newinvoice=  $_SESSION['Items']->trans_no == 0;
379         copy_to_cart();
380         if ($newinvoice) new_doc_date($_SESSION['Items']->document_date);
381
382         $invoice_no = $_SESSION['Items']->write();
383         processing_end();
384
385         if ($newinvoice) {
386                 meta_forward($_SERVER['PHP_SELF'], "AddedID=$invoice_no");
387         } else {
388                 meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$invoice_no");
389         }
390 }
391
392 if(list_updated('payment')) {
393         $order = &$_SESSION['Items']; 
394         copy_to_cart();
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'];
404         }
405 }
406
407 // find delivery spans for batch invoice display
408 $dspans = array();
409 $lastdn = ''; $spanlen=1;
410
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) {
414                 continue;
415         }
416         if ($line->src_no == $lastdn) {
417                 $spanlen++;
418         } else {
419                 if ($lastdn != '') {
420                         $dspans[] = $spanlen;
421                         $spanlen = 1;
422                 }
423         }
424         $lastdn = $line->src_no;
425 }
426 $dspans[] = $spanlen;
427
428 //-----------------------------------------------------------------------------
429
430 $is_batch_invoice = count($_SESSION['Items']->src_docs) > 1;
431 $prepaid = $_SESSION['Items']->is_prepaid();
432
433 $is_edition = $_SESSION['Items']->trans_type == ST_SALESINVOICE && $_SESSION['Items']->trans_no != 0;
434 start_form();
435 hidden('cart_id');
436
437 start_table(TABLESTYLE2, "width=80%", 5);
438
439 start_row();
440 $colspan = 1;
441 $dim = get_company_pref('use_dimension');
442 if ($dim > 0) 
443         $colspan = 3;
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");
451 } else
452         label_cells(_('Payment:'), $_SESSION['Items']->payment_terms['terms'], "class='tableheader2'", "colspan=$colspan");
453
454 end_row();
455 start_row();
456
457 if ($_SESSION['Items']->trans_no == 0) {
458         ref_cells(_("Reference"), 'ref', '', null, "class='tableheader2'");
459 } else {
460         label_cells(_("Reference"), $_SESSION['Items']->reference, "class='tableheader2'");
461 }
462
463 //label_cells(_("Delivery Notes:"),
464 //get_customer_trans_view_str(ST_CUSTDELIVERY, array_keys($_SESSION['Items']->src_docs)), "class='tableheader2'");
465
466 label_cells(_("Sales Type"), $_SESSION['Items']->sales_type_name, "class='tableheader2'");
467
468 label_cells(_("Currency"), $_SESSION['Items']->customer_currency, "class='tableheader2'");
469 // 2010-09-03 Joe Hunt
470 //if ($dim > 0) 
471 //      label_cells(_("Dimension"), get_dimension_string($_SESSION['Items']->dimension_id), "class='tableheader2'");
472 if ($dim > 0) {
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);
476 }               
477 else
478         hidden('dimension_id', 0);
479
480 end_row();
481 start_row();
482
483 if (!isset($_POST['ship_via'])) {
484         $_POST['ship_via'] = $_SESSION['Items']->ship_via;
485 }
486 label_cell(_("Shipping Company"), "class='tableheader2'");
487 if ($prepaid)
488 {
489         $shipper = get_shipper($_SESSION['Items']->ship_via);
490         label_cells(null, $shipper['shipper_name']);
491 } else
492         shippers_list_cells(null, 'ship_via', $_POST['ship_via']);
493
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();
498         }
499 }
500
501 date_cells(_("Date"), 'InvoiceDate', '', $_SESSION['Items']->trans_no == 0, 
502         0, 0, 0, "class='tableheader2'", true);
503
504 if (!isset($_POST['due_date']) || !is_date($_POST['due_date'])) {
505         $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->payment, $_POST['InvoiceDate']);
506 }
507
508 date_cells(_("Due Date"), 'due_date', '', null, 0, 0, 0, "class='tableheader2'");
509 /*
510 if ($dim > 1) 
511         label_cells(_("Dimension"). " 2", get_dimension_string($_SESSION['Items']->dimension2_id), "class='tableheader2'");
512 else if ($dim > 0)
513         label_cell("&nbsp;", "colspan=2");
514 */
515 if ($dim > 1) {
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);
519 }               
520 else
521         hidden('dimension2_id', 0);
522 end_row();
523 end_table();
524
525 $row = get_customer_to_order($_SESSION['Items']->customer_id);
526 if ($row['dissallow_invoices'] == 1)
527 {
528         display_error(_("The selected customer account is currently on hold. Please contact the credit control personnel to discuss."));
529         end_form();
530         end_page();
531         exit();
532 }       
533
534 display_heading($prepaid ? _("Sales Order Items") : _("Invoice Items"));
535
536 div_start('Items');
537 start_table(TABLESTYLE, "width=80%");
538 if ($prepaid)
539         $th = array(_("Item Code"), _("Item Description"), _("Units"), _("Quantity"),
540                 _("Price"), _("Tax Type"), _("Discount"), _("Total"));
541 else
542         $th = array(_("Item Code"), _("Item Description"), _("Delivered"), _("Units"), _("Invoiced"),
543                 _("This Invoice"), _("Price"), _("Tax Type"), _("Discount"), _("Total"));
544 if ($is_batch_invoice) {
545     $th[] = _("DN");
546     $th[] = "";
547 }
548
549 if ($is_edition) {
550     $th[4] = _("Credited");
551 }
552
553 table_header($th);
554 $k = 0;
555 $has_marked = false;
556 $show_qoh = true;
557
558 $dn_line_cnt = 0;
559
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
563         }
564         alt_table_row_color($k);
565         view_stock_status_cell($ln_itm->stock_id);
566
567         if ($prepaid)
568                 label_cell($ln_itm->item_description);
569         else
570                 text_cells(null, 'Line'.$line.'Desc', $ln_itm->item_description, 30, 50);
571         $dec = get_qty_dec($ln_itm->stock_id);
572         if (!$prepaid)
573                 qty_cell($ln_itm->quantity, false, $dec);
574         label_cell($ln_itm->units);
575         if (!$prepaid)
576                 qty_cell($ln_itm->qty_done, false, $dec);
577
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>';
583         } else {
584                 small_qty_cells(null, 'Line'.$line, qty_format($ln_itm->qty_dispatched, $ln_itm->stock_id, $dec), null, null, $dec);
585         }
586         $display_discount_percent = percent_format($ln_itm->discount_percent*100) . " %";
587
588         $line_total = ($ln_itm->qty_dispatched * $ln_itm->price * (1 - $ln_itm->discount_percent));
589
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);
594
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");
602                 }
603                 $dn_line_cnt--;
604         }
605         end_row();
606 }
607
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 ?? */
612
613 if (!isset($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] == "") {
614         if ($_SESSION['Items']->any_already_delivered() == 1) {
615                 $_POST['ChargeFreightCost'] = price_format(0);
616         } else {
617                 $_POST['ChargeFreightCost'] = price_format($_SESSION['Items']->freight_cost);
618         }
619
620         if (!check_num('ChargeFreightCost')) {
621                 $_POST['ChargeFreightCost'] = price_format(0);
622         }
623 }
624
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));
628
629 $colspan = $prepaid ? 7:9;
630 start_row();
631 label_cell(_("Shipping Cost"), "colspan=$colspan align=right");
632 if ($prepaid)
633         label_cell($_POST['ChargeFreightCost'], 'align=right');
634 else
635         small_amount_cells(null, 'ChargeFreightCost', null);
636 if ($is_batch_invoice) {
637 label_cell('', 'colspan=2');
638 }
639
640 end_row();
641 $inv_items_total = $_SESSION['Items']->get_items_total_dispatch();
642
643 $display_sub_total = price_format($inv_items_total + input_num('ChargeFreightCost'));
644
645 label_row(_("Sub-total"), $display_sub_total, "colspan=$colspan align=right","align=right", $is_batch_invoice ? 2 : 0);
646
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);
649
650 $display_total = price_format(($inv_items_total + input_num('ChargeFreightCost') + $tax_total));
651
652 label_row(_("Invoice Total"), $display_total, "colspan=$colspan align=right","align=right", $is_batch_invoice ? 2 : 0);
653
654 end_table(1);
655 div_end();
656 div_start('options');
657 start_table(TABLESTYLE2);
658 if ($prepaid)
659 {
660
661         label_row(_("Sales order:"), get_trans_view_str(ST_SALESORDER, $_SESSION['Items']->order_no, get_reference(ST_SALESORDER, $_SESSION['Items']->order_no)));
662
663         $list = array(); $allocs = 0;
664         if (count($_SESSION['Items']->prepayments))
665         {
666                 foreach($_SESSION['Items']->prepayments as $pmt)
667                 {
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'];
670                 }
671         }
672
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');
676 }
677
678 textarea_row(_("Memo:"), 'Comments', null, 50, 4);
679
680 end_table(1);
681 div_end();
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');
686
687 end_form();
688
689 end_page();
690
691 ?>