Fixed transaction date check messages.
[fa-stable.git] / sales / sales_order_entry.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 Quotations
15 //      Entry/Modify Sales Order
16 //      Entry Direct Delivery
17 //      Entry Direct Invoice
18 //
19
20 $path_to_root = "..";
21 $page_security = 'SA_SALESORDER';
22
23 include_once($path_to_root . "/sales/includes/cart_class.inc");
24 include_once($path_to_root . "/includes/session.inc");
25 include_once($path_to_root . "/sales/includes/sales_ui.inc");
26 include_once($path_to_root . "/sales/includes/ui/sales_order_ui.inc");
27 include_once($path_to_root . "/sales/includes/sales_db.inc");
28 include_once($path_to_root . "/sales/includes/db/sales_types_db.inc");
29 include_once($path_to_root . "/reporting/includes/reporting.inc");
30
31 set_page_security( @$_SESSION['Items']->trans_type,
32         array(  ST_SALESORDER=>'SA_SALESORDER',
33                         ST_SALESQUOTE => 'SA_SALESQUOTE',
34                         ST_CUSTDELIVERY => 'SA_SALESDELIVERY',
35                         ST_SALESINVOICE => 'SA_SALESINVOICE'),
36         array(  'NewOrder' => 'SA_SALESORDER',
37                         'ModifySalesOrder' => 'SA_SALESORDER',
38                         'NewQuotation' => 'SA_SALESQUOTE',
39                         'ModifyQuotationNumber' => 'SA_SALESQUOTE',
40                         'NewDelivery' => 'SA_SALESDELIVERY',
41                         'NewInvoice' => 'SA_SALESINVOICE')
42 );
43
44 $js = '';
45
46 if ($use_popup_windows) {
47         $js .= get_js_open_window(900, 500);
48 }
49
50 if ($use_date_picker) {
51         $js .= get_js_date_picker();
52 }
53
54 if (isset($_GET['NewDelivery']) && is_numeric($_GET['NewDelivery'])) {
55
56         $_SESSION['page_title'] = _($help_context = "Direct Sales Delivery");
57         create_cart(ST_CUSTDELIVERY, $_GET['NewDelivery']);
58
59 } elseif (isset($_GET['NewInvoice']) && is_numeric($_GET['NewInvoice'])) {
60
61         $_SESSION['page_title'] = _($help_context = "Direct Sales Invoice");
62         create_cart(ST_SALESINVOICE, $_GET['NewInvoice']);
63
64 } elseif (isset($_GET['ModifyOrderNumber']) && is_numeric($_GET['ModifyOrderNumber'])) {
65
66         $help_context = 'Modifying Sales Order';
67         $_SESSION['page_title'] = sprintf( _("Modifying Sales Order # %d"), $_GET['ModifyOrderNumber']);
68         create_cart(ST_SALESORDER, $_GET['ModifyOrderNumber']);
69
70 } elseif (isset($_GET['ModifyQuotationNumber']) && is_numeric($_GET['ModifyQuotationNumber'])) {
71
72         $help_context = 'Modifying Sales Quotation';
73         $_SESSION['page_title'] = sprintf( _("Modifying Sales Quotation # %d"), $_GET['ModifyQuotationNumber']);
74         create_cart(ST_SALESQUOTE, $_GET['ModifyQuotationNumber']);
75
76 } elseif (isset($_GET['NewOrder'])) {
77
78         $_SESSION['page_title'] = _($help_context = "New Sales Order Entry");
79         create_cart(ST_SALESORDER, 0);
80 } elseif (isset($_GET['NewQuotation'])) {
81
82         $_SESSION['page_title'] = _($help_context = "New Sales Quotation Entry");
83         create_cart(ST_SALESQUOTE, 0);
84 } elseif (isset($_GET['NewQuoteToSalesOrder'])) {
85         $_SESSION['page_title'] = _($help_context = "Sales Order Entry");
86         create_cart(ST_SALESQUOTE, $_GET['NewQuoteToSalesOrder']);
87 }
88
89 page($_SESSION['page_title'], false, false, "", $js);
90
91 //-----------------------------------------------------------------------------
92
93 if (list_updated('branch_id')) {
94         // when branch is selected via external editor also customer can change
95         $br = get_branch(get_post('branch_id'));
96         $_POST['customer_id'] = $br['debtor_no'];
97         $Ajax->activate('customer_id');
98 }
99
100 if (isset($_GET['AddedID'])) {
101         $order_no = $_GET['AddedID'];
102         display_notification_centered(sprintf( _("Order # %d has been entered."),$order_no));
103
104         submenu_view(_("&View This Order"), ST_SALESORDER, $order_no);
105
106         submenu_print(_("&Print This Order"), ST_SALESORDER, $order_no, 'prtopt');
107         submenu_print(_("&Email This Order"), ST_SALESORDER, $order_no, null, 1);
108         set_focus('prtopt');
109         
110         submenu_option(_("Make &Delivery Against This Order"),
111                 "/sales/customer_delivery.php?OrderNumber=$order_no");
112
113         submenu_option(_("Work &Order Entry"),  "/manufacturing/work_order_entry.php?");
114
115         submenu_option(_("Enter a &New Order"), "/sales/sales_order_entry.php?NewOrder=0");
116
117         display_footer_exit();
118
119 } elseif (isset($_GET['UpdatedID'])) {
120         $order_no = $_GET['UpdatedID'];
121
122         display_notification_centered(sprintf( _("Order # %d has been updated."),$order_no));
123
124         submenu_view(_("&View This Order"), ST_SALESORDER, $order_no);
125
126         submenu_print(_("&Print This Order"), ST_SALESORDER, $order_no, 'prtopt');
127         submenu_print(_("&Email This Order"), ST_SALESORDER, $order_no, null, 1);
128         set_focus('prtopt');
129
130         submenu_option(_("Confirm Order Quantities and Make &Delivery"),
131                 "/sales/customer_delivery.php?OrderNumber=$order_no");
132
133         submenu_option(_("Select A Different &Order"),
134                 "/sales/inquiry/sales_orders_view.php?OutstandingOnly=1");
135
136         display_footer_exit();
137
138 } elseif (isset($_GET['AddedQU'])) {
139         $order_no = $_GET['AddedQU'];
140         display_notification_centered(sprintf( _("Quotation # %d has been entered."),$order_no));
141
142         submenu_view(_("&View This Quotation"), ST_SALESQUOTE, $order_no);
143
144         submenu_print(_("&Print This Quotation"), ST_SALESQUOTE, $order_no, 'prtopt');
145         submenu_print(_("&Email This Quotation"), ST_SALESQUOTE, $order_no, null, 1);
146         set_focus('prtopt');
147         
148         submenu_option(_("Make &Sales Order Against This Quotation"),
149                 "/sales/sales_order_entry.php?NewQuoteToSalesOrder=$order_no");
150
151         submenu_option(_("Enter a New &Quotation"),     "/sales/sales_order_entry.php?NewQuotation=0");
152
153         display_footer_exit();
154
155 } elseif (isset($_GET['UpdatedQU'])) {
156         $order_no = $_GET['UpdatedQU'];
157
158         display_notification_centered(sprintf( _("Quotation # %d has been updated."),$order_no));
159
160         submenu_view(_("&View This Quotation"), ST_SALESQUOTE, $order_no);
161
162         submenu_print(_("&Print This Quotation"), ST_SALESQUOTE, $order_no, 'prtopt');
163         submenu_print(_("&Email This Quotation"), ST_SALESQUOTE, $order_no, null, 1);
164         set_focus('prtopt');
165
166         submenu_option(_("Make &Sales Order Against This Quotation"),
167                 "/sales/sales_order_entry.php?NewQuoteToSalesOrder=$order_no");
168
169         submenu_option(_("Select A Different &Quotation"),
170                 "/sales/inquiry/sales_orders_view.php?type=".ST_SALESQUOTE);
171
172         display_footer_exit();
173 } elseif (isset($_GET['AddedDN'])) {
174         $delivery = $_GET['AddedDN'];
175
176         display_notification_centered(sprintf(_("Delivery # %d has been entered."),$delivery));
177
178         submenu_view(_("&View This Delivery"), ST_CUSTDELIVERY, $delivery);
179
180         submenu_print(_("&Print Delivery Note"), ST_CUSTDELIVERY, $delivery, 'prtopt');
181         submenu_print(_("&Email Delivery Note"), ST_CUSTDELIVERY, $delivery, null, 1);
182         submenu_print(_("P&rint as Packing Slip"), ST_CUSTDELIVERY, $delivery, 'prtopt', null, 1);
183         submenu_print(_("E&mail as Packing Slip"), ST_CUSTDELIVERY, $delivery, null, 1, 1);
184         set_focus('prtopt');
185
186         display_note(get_gl_view_str(ST_CUSTDELIVERY, $delivery, _("View the GL Journal Entries for this Dispatch")),0, 1);
187
188         submenu_option(_("Make &Invoice Against This Delivery"),
189                 "/sales/customer_invoice.php?DeliveryNumber=$delivery");
190
191         if ((isset($_GET['Type']) && $_GET['Type'] == 1))
192                 submenu_option(_("Enter a New Template &Delivery"),
193                         "/sales/inquiry/sales_orders_view.php?DeliveryTemplates=Yes");
194         else
195                 submenu_option(_("Enter a &New Delivery"), 
196                         "/sales/sales_order_entry.php?NewDelivery=0");
197
198         display_footer_exit();
199
200 } elseif (isset($_GET['AddedDI'])) {
201         $invoice = $_GET['AddedDI'];
202
203         display_notification_centered(sprintf(_("Invoice # %d has been entered."), $invoice));
204
205         submenu_view(_("&View This Invoice"), ST_SALESINVOICE, $invoice);
206
207         submenu_print(_("&Print Sales Invoice"), ST_SALESINVOICE, $invoice."-".ST_SALESINVOICE, 'prtopt');
208         submenu_print(_("&Email Sales Invoice"), ST_SALESINVOICE, $invoice."-".ST_SALESINVOICE, null, 1);
209         set_focus('prtopt');
210         
211         $sql = "SELECT trans_type_from, trans_no_from FROM ".TB_PREF."cust_allocations
212                         WHERE trans_type_to=".ST_SALESINVOICE." AND trans_no_to=".db_escape($invoice);
213         $result = db_query($sql, "could not retrieve customer allocation");
214         $row = db_fetch($result);
215         if ($row !== false)
216                 submenu_print(_("Print &Receipt"), $row['trans_type_from'], $row['trans_no_from']."-".$row['trans_type_from'], 'prtopt');
217
218         display_note(get_gl_view_str(ST_SALESINVOICE, $invoice, _("View the GL &Journal Entries for this Invoice")),0, 1);
219
220         if ((isset($_GET['Type']) && $_GET['Type'] == 1))
221                 submenu_option(_("Enter a &New Template Invoice"), 
222                         "/sales/inquiry/sales_orders_view.php?InvoiceTemplates=Yes");
223         else
224                 submenu_option(_("Enter a &New Direct Invoice"),
225                         "/sales/sales_order_entry.php?NewInvoice=0");
226
227         display_footer_exit();
228 } else
229         check_edit_conflicts();
230 //-----------------------------------------------------------------------------
231
232 function copy_to_cart()
233 {
234         $cart = &$_SESSION['Items'];
235
236         $cart->reference = $_POST['ref'];
237
238         $cart->Comments =  $_POST['Comments'];
239
240         $cart->document_date = $_POST['OrderDate'];
241 //      if ($cart->trans_type == ST_SALESINVOICE) {
242         if (isset($_POST['payment']) && ($cart->payment != $_POST['payment'])) {
243                 $cart->payment = $_POST['payment'];
244                 $cart->payment_terms = get_payment_terms($_POST['payment']);
245         }
246         if ($cart->payment_terms['cash_sale']) {
247                 $cart->due_date = $cart->document_date;
248                 $cart->phone = $cart->cust_ref = $cart->delivery_address = '';
249                 $cart->freight_cost = input_num('freight_cost');
250                 $cart->ship_via = 1;
251                 $cart->deliver_to = '';//$_POST['deliver_to'];
252         } else {
253                 $cart->due_date = $_POST['delivery_date'];
254                 $cart->cust_ref = $_POST['cust_ref'];
255                 $cart->freight_cost = input_num('freight_cost');
256                 $cart->deliver_to = $_POST['deliver_to'];
257                 $cart->delivery_address = $_POST['delivery_address'];
258                 $cart->phone = $_POST['phone'];
259                 $cart->Location = $_POST['Location'];
260                 $cart->ship_via = $_POST['ship_via'];
261         }
262         if (isset($_POST['email']))
263                 $cart->email =$_POST['email'];
264         else
265                 $cart->email = '';
266         $cart->customer_id      = $_POST['customer_id'];
267         $cart->Branch = $_POST['branch_id'];
268         $cart->sales_type = $_POST['sales_type'];
269         // POS
270         if ($cart->trans_type!=ST_SALESORDER && $cart->trans_type!=ST_SALESQUOTE) { // 2008-11-12 Joe Hunt
271                 $cart->dimension_id = $_POST['dimension_id'];
272                 $cart->dimension2_id = $_POST['dimension2_id'];
273         }       
274 }
275
276 //-----------------------------------------------------------------------------
277
278 function copy_from_cart()
279 {
280         $cart = &$_SESSION['Items'];
281         $_POST['ref'] = $cart->reference;
282         $_POST['Comments'] = $cart->Comments;
283
284         $_POST['OrderDate'] = $cart->document_date;
285         $_POST['delivery_date'] = $cart->due_date;
286         $_POST['cust_ref'] = $cart->cust_ref;
287         $_POST['freight_cost'] = price_format($cart->freight_cost);
288
289         $_POST['deliver_to'] = $cart->deliver_to;
290         $_POST['delivery_address'] = $cart->delivery_address;
291         $_POST['phone'] = $cart->phone;
292         $_POST['Location'] = $cart->Location;
293         $_POST['ship_via'] = $cart->ship_via;
294
295         $_POST['customer_id'] = $cart->customer_id;
296
297         $_POST['branch_id'] = $cart->Branch;
298         $_POST['sales_type'] = $cart->sales_type;
299         // POS 
300         $_POST['payment'] = $cart->payment;
301         if ($cart->trans_type!=ST_SALESORDER && $cart->trans_type!=ST_SALESQUOTE) { // 2008-11-12 Joe Hunt
302                 $_POST['dimension_id'] = $cart->dimension_id;
303                 $_POST['dimension2_id'] = $cart->dimension2_id;
304         }       
305         $_POST['cart_id'] = $cart->cart_id;
306                 
307 }
308 //--------------------------------------------------------------------------------
309
310 function line_start_focus() {
311   global        $Ajax;
312
313   $Ajax->activate('items_table');
314   set_focus('_stock_id_edit');
315 }
316
317 //--------------------------------------------------------------------------------
318 function can_process() {
319         global $Refs;
320
321         if (!get_post('customer_id')) 
322         {
323                 display_error(_("There is no customer selected."));
324                 set_focus('customer_id');
325                 return false;
326         } 
327         
328         if (!get_post('branch_id')) 
329         {
330                 display_error(_("This customer has no branch defined."));
331                 set_focus('branch_id');
332                 return false;
333         } 
334         
335         if (!is_date($_POST['OrderDate'])) {
336                 display_error(_("The entered date is invalid."));
337                 set_focus('OrderDate');
338                 return false;
339         }
340         if ($_SESSION['Items']->trans_type!=ST_SALESORDER && $_SESSION['Items']->trans_type!=ST_SALESQUOTE && !is_date_in_fiscalyear($_POST['OrderDate'])) {
341                 display_error(_("The entered date is out of fiscal year or is closed for further data entry."));
342                 set_focus('OrderDate');
343                 return false;
344         }
345         if (count($_SESSION['Items']->line_items) == 0) {
346                 display_error(_("You must enter at least one non empty item line."));
347                 set_focus('AddItem');
348                 return false;
349         }
350         if ($_SESSION['Items']->payment_terms['cash_sale'] == 0) {
351         if (strlen($_POST['deliver_to']) <= 1) {
352                 display_error(_("You must enter the person or company to whom delivery should be made to."));
353                 set_focus('deliver_to');
354                 return false;
355         }
356
357
358                 if (strlen($_POST['delivery_address']) <= 1) {
359                         display_error( _("You should enter the street address in the box provided. Orders cannot be accepted without a valid street address."));
360                         set_focus('delivery_address');
361                         return false;
362                 }
363
364                 if ($_POST['freight_cost'] == "")
365                         $_POST['freight_cost'] = price_format(0);
366
367                 if (!check_num('freight_cost',0)) {
368                         display_error(_("The shipping cost entered is expected to be numeric."));
369                         set_focus('freight_cost');
370                         return false;
371                 }
372                 if (!is_date($_POST['delivery_date'])) {
373                         if ($_SESSION['Items']->trans_type==ST_SALESQUOTE)
374                                 display_error(_("The Valid date is invalid."));
375                         else    
376                                 display_error(_("The delivery date is invalid."));
377                         set_focus('delivery_date');
378                         return false;
379                 }
380                 //if (date1_greater_date2($_SESSION['Items']->document_date, $_POST['delivery_date'])) {
381                 if (date1_greater_date2($_POST['OrderDate'], $_POST['delivery_date'])) {
382                         if ($_SESSION['Items']->trans_type==ST_SALESQUOTE)
383                                 display_error(_("The requested valid date is before the date of the quotation."));
384                         else    
385                                 display_error(_("The requested delivery date is before the date of the order."));
386                         set_focus('delivery_date');
387                         return false;
388                 }
389         }
390         else
391         {
392                 if (!db_has_cash_accounts())
393                 {
394                         display_error(_("You need to define a cash account for your Sales Point."));
395                         return false;
396                 }       
397         }       
398         if (!$Refs->is_valid($_POST['ref'])) {
399                 display_error(_("You must enter a reference."));
400                 set_focus('ref');
401                 return false;
402         }
403         if ($_SESSION['Items']->trans_no==0 && !is_new_reference($_POST['ref'], 
404                 $_SESSION['Items']->trans_type)) {
405                 display_error(_("The entered reference is already in use."));
406                 set_focus('ref');
407                 return false;
408         } elseif ($_SESSION['Items']->get_items_total() < 0) {
409                 display_error("Invoice total amount cannot be less than zero.");
410                 return false;
411         }
412         return true;
413 }
414
415 //-----------------------------------------------------------------------------
416
417 if (isset($_POST['ProcessOrder']) && can_process()) {
418         copy_to_cart();
419         $modified = ($_SESSION['Items']->trans_no != 0);
420         $so_type = $_SESSION['Items']->so_type;
421         $_SESSION['Items']->write(1);
422         if (count($messages)) { // abort on failure or error messages are lost
423                 $Ajax->activate('_page_body');
424                 display_footer_exit();
425         }
426         $trans_no = key($_SESSION['Items']->trans_no);
427         $trans_type = $_SESSION['Items']->trans_type;
428         new_doc_date($_SESSION['Items']->document_date);
429         processing_end();
430         if ($modified) {
431                 if ($trans_type == ST_SALESQUOTE)
432                         meta_forward($_SERVER['PHP_SELF'], "UpdatedQU=$trans_no");
433                 else    
434                         meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$trans_no");
435         } elseif ($trans_type == ST_SALESORDER) {
436                 meta_forward($_SERVER['PHP_SELF'], "AddedID=$trans_no");
437         } elseif ($trans_type == ST_SALESQUOTE) {
438                 meta_forward($_SERVER['PHP_SELF'], "AddedQU=$trans_no");
439         } elseif ($trans_type == ST_SALESINVOICE) {
440                 meta_forward($_SERVER['PHP_SELF'], "AddedDI=$trans_no&Type=$so_type");
441         } else {
442                 meta_forward($_SERVER['PHP_SELF'], "AddedDN=$trans_no&Type=$so_type");
443         }
444 }
445
446 if (isset($_POST['update'])) {
447         $Ajax->activate('items_table');
448 }
449
450 //--------------------------------------------------------------------------------
451
452 function check_item_data()
453 {
454         global $SysPrefs, $allow_negative_prices;
455         
456         $is_inventory_item = is_inventory_item(get_post('stock_id'));
457         if(!get_post('stock_id_text', true)) {
458                 display_error( _("Item description cannot be empty."));
459                 set_focus('stock_id_edit');
460                 return false;
461         }
462         elseif (!check_num('qty', 0) || !check_num('Disc', 0, 100)) {
463                 display_error( _("The item could not be updated because you are attempting to set the quantity ordered to less than 0, or the discount percent to more than 100."));
464                 set_focus('qty');
465                 return false;
466         } elseif (!check_num('price', 0) && (!$allow_negative_prices || $is_inventory_item)) {
467                 display_error( _("Price for inventory item must be entered and can not be less than 0"));
468                 set_focus('price');
469                 return false;
470         } elseif (isset($_POST['LineNo']) && isset($_SESSION['Items']->line_items[$_POST['LineNo']])
471             && !check_num('qty', $_SESSION['Items']->line_items[$_POST['LineNo']]->qty_done)) {
472
473                 set_focus('qty');
474                 display_error(_("You attempting to make the quantity ordered a quantity less than has already been delivered. The quantity delivered cannot be modified retrospectively."));
475                 return false;
476         } // Joe Hunt added 2008-09-22 -------------------------
477         elseif ($is_inventory_item && $_SESSION['Items']->trans_type!=ST_SALESORDER && $_SESSION['Items']->trans_type!=ST_SALESQUOTE 
478                 && !$SysPrefs->allow_negative_stock())
479         {
480                 $qoh = get_qoh_on_date($_POST['stock_id'], $_POST['Location'], $_POST['OrderDate']);
481                 if (input_num('qty') > $qoh)
482                 {
483                         $stock = get_item($_POST['stock_id']);
484                         display_error(_("The delivery cannot be processed because there is an insufficient quantity for item:") .
485                                 " " . $stock['stock_id'] . " - " . $stock['description'] . " - " .
486                                 _("Quantity On Hand") . " = " . number_format2($qoh, get_qty_dec($_POST['stock_id'])));
487                         return false;
488                 }
489                 return true;
490         }
491         return true;
492 }
493
494 //--------------------------------------------------------------------------------
495
496 function handle_update_item()
497 {
498         if ($_POST['UpdateItem'] != '' && check_item_data()) {
499                 $_SESSION['Items']->update_cart_item($_POST['LineNo'],
500                  input_num('qty'), input_num('price'),
501                  input_num('Disc') / 100, $_POST['item_description'] );
502         }
503         page_modified();
504   line_start_focus();
505 }
506
507 //--------------------------------------------------------------------------------
508
509 function handle_delete_item($line_no)
510 {
511     if ($_SESSION['Items']->some_already_delivered($line_no) == 0) {
512             $_SESSION['Items']->remove_from_cart($line_no);
513     } else {
514         display_error(_("This item cannot be deleted because some of it has already been delivered."));
515     }
516     line_start_focus();
517 }
518
519 //--------------------------------------------------------------------------------
520
521 function handle_new_item()
522 {
523
524         if (!check_item_data()) {
525                         return;
526         }
527         add_to_order($_SESSION['Items'], get_post('stock_id'), input_num('qty'),
528                 input_num('price'), input_num('Disc') / 100, get_post('stock_id_text'));
529
530         unset($_POST['_stock_id_edit'], $_POST['stock_id']);
531         page_modified();
532         line_start_focus();
533 }
534
535 //--------------------------------------------------------------------------------
536
537 function  handle_cancel_order()
538 {
539         global $path_to_root, $Ajax;
540
541
542         if ($_SESSION['Items']->trans_type == ST_CUSTDELIVERY) {
543                 display_notification(_("Direct delivery entry has been cancelled as requested."), 1);
544                 submenu_option(_("Enter a New Sales Delivery"), "/sales/sales_order_entry.php?NewDelivery=1");
545
546         } elseif ($_SESSION['Items']->trans_type == ST_SALESINVOICE) {
547                 display_notification(_("Direct invoice entry has been cancelled as requested."), 1);
548                 submenu_option(_("Enter a New Sales Invoice"),  "/sales/sales_order_entry.php?NewInvoice=1");
549         } else {
550                 if ($_SESSION['Items']->trans_no != 0) {
551                         if ($_SESSION['Items']->trans_type == ST_SALESORDER && 
552                                 sales_order_has_deliveries(key($_SESSION['Items']->trans_no)))
553                                 display_error(_("This order cannot be cancelled because some of it has already been invoiced or dispatched. However, the line item quantities may be modified."));
554                         else {
555                                 delete_sales_order(key($_SESSION['Items']->trans_no), $_SESSION['Items']->trans_type);
556                                 if ($_SESSION['Items']->trans_type == ST_SALESQUOTE)
557                                 {
558                                         display_notification(_("This sales quotation has been cancelled as requested."), 1);
559                                         submenu_option(_("Enter a New Sales Quotation"), "/sales/sales_order_entry.php?NewQuotation=Yes");
560                                 }
561                                 else
562                                 {
563                                         display_notification(_("This sales order has been cancelled as requested."), 1);
564                                         submenu_option(_("Enter a New Sales Order"), "/sales/sales_order_entry.php?NewOrder=Yes");
565                                 }
566                         }       
567                 } else {
568                         processing_end();
569                         meta_forward($path_to_root.'/index.php','application=orders');
570                 }
571         }
572         $Ajax->activate('_page_body');
573         processing_end();
574         display_footer_exit();
575 }
576
577 //--------------------------------------------------------------------------------
578
579 function create_cart($type, $trans_no)
580
581         global $Refs;
582
583         if (!$_SESSION['SysPrefs']->db_ok) // create_cart is called before page() where the check is done
584                 return;
585
586         processing_start();
587
588         if (isset($_GET['NewQuoteToSalesOrder']))
589         {
590                 $trans_no = $_GET['NewQuoteToSalesOrder'];
591                 $doc = new Cart(ST_SALESQUOTE, $trans_no);
592                 $doc->trans_no = 0;
593                 $doc->trans_type = ST_SALESORDER;
594                 $doc->reference = $Refs->get_next($doc->trans_type);
595                 $doc->document_date = $doc->due_date = new_doc_date();
596                 $doc->Comments = _("Sales Quotation") . " # " . $trans_no;
597                 $_SESSION['Items'] = $doc;
598         }       
599         elseif($type != ST_SALESORDER && $type != ST_SALESQUOTE && $trans_no != 0) { // this is template
600
601                 $doc = new Cart(ST_SALESORDER, array($trans_no));
602                 $doc->trans_type = $type;
603                 $doc->trans_no = 0;
604                 $doc->document_date = new_doc_date();
605                 if ($type == ST_SALESINVOICE) {
606                         $doc->due_date = get_invoice_duedate($doc->payment, $doc->document_date);
607                         $doc->pos = get_sales_point(user_pos());
608                 } else
609                         $doc->due_date = $doc->document_date;
610                 $doc->reference = $Refs->get_next($doc->trans_type);
611                 //$doc->Comments='';
612                 foreach($doc->line_items as $line_no => $line) {
613                         $doc->line_items[$line_no]->qty_done = 0;
614                 }
615                 $_SESSION['Items'] = $doc;
616         } else {
617                 $_SESSION['Items'] = new Cart($type, array($trans_no));
618         }
619         copy_from_cart();
620 }
621
622 //--------------------------------------------------------------------------------
623
624 if (isset($_POST['CancelOrder']))
625         handle_cancel_order();
626
627 $id = find_submit('Delete');
628 if ($id!=-1)
629         handle_delete_item($id);
630
631 if (isset($_POST['UpdateItem']))
632         handle_update_item();
633
634 if (isset($_POST['AddItem']))
635         handle_new_item();
636
637 if (isset($_POST['CancelItemChanges'])) {
638         line_start_focus();
639 }
640
641 //--------------------------------------------------------------------------------
642 check_db_has_stock_items(_("There are no inventory items defined in the system."));
643
644 check_db_has_customer_branches(_("There are no customers, or there are no customers with branches. Please define customers and customer branches."));
645
646 if ($_SESSION['Items']->trans_type == ST_SALESINVOICE) {
647         $idate = _("Invoice Date:");
648         $orderitems = _("Sales Invoice Items");
649         $deliverydetails = _("Enter Delivery Details and Confirm Invoice");
650         $cancelorder = _("Cancel Invoice");
651         $porder = _("Place Invoice");
652 } elseif ($_SESSION['Items']->trans_type == ST_CUSTDELIVERY) {
653         $idate = _("Delivery Date:");
654         $orderitems = _("Delivery Note Items");
655         $deliverydetails = _("Enter Delivery Details and Confirm Dispatch");
656         $cancelorder = _("Cancel Delivery");
657         $porder = _("Place Delivery");
658 } elseif ($_SESSION['Items']->trans_type == ST_SALESQUOTE) {
659         $idate = _("Quotation Date:");
660         $orderitems = _("Sales Quotation Items");
661         $deliverydetails = _("Enter Delivery Details and Confirm Quotation");
662         $cancelorder = _("Cancel Quotation");
663         $porder = _("Place Quotation");
664         $corder = _("Commit Quotations Changes");
665 } else {
666         $idate = _("Order Date:");
667         $orderitems = _("Sales Order Items");
668         $deliverydetails = _("Enter Delivery Details and Confirm Order");
669         $cancelorder = _("Cancel Order");
670         $porder = _("Place Order");
671         $corder = _("Commit Order Changes");
672 }
673 start_form();
674
675 hidden('cart_id');
676 $customer_error = display_order_header($_SESSION['Items'],
677         ($_SESSION['Items']->any_already_delivered() == 0), $idate);
678
679 if ($customer_error == "") {
680         start_table(TABLESTYLE, "width=80%", 10);
681         echo "<tr><td>";
682         display_order_summary($orderitems, $_SESSION['Items'], true);
683         echo "</td></tr>";
684         echo "<tr><td>";
685         display_delivery_details($_SESSION['Items']);
686         echo "</td></tr>";
687         end_table(1);
688
689         if ($_SESSION['Items']->trans_no == 0) {
690
691                 submit_center_first('ProcessOrder', $porder,
692                     _('Check entered data and save document'), 'default');
693                 submit_js_confirm('CancelOrder', _('You are about to void this Document.\nDo you want to continue?'));
694         } else {
695                 submit_center_first('ProcessOrder', $corder,
696                     _('Validate changes and update document'), 'default');
697         }
698
699         submit_center_last('CancelOrder', $cancelorder,
700            _('Cancels document entry or removes sales order when editing an old document'));
701 } else {
702         display_error($customer_error);
703 }
704 end_form();
705 end_page();
706 ?>