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