Added ajax functionality and ui hints
[fa-stable.git] / sales / sales_order_entry.php
1 <?php
2 //-----------------------------------------------------------------------------
3 //
4 //      Entry/Modify Sales Order
5 //      Entry Direct Delivery
6 //      Entry Direct Invoice
7 //
8
9 $page_security = 1;
10 $path_to_root="..";
11
12 include_once($path_to_root . "/sales/includes/cart_class.inc");
13 include_once($path_to_root . "/includes/session.inc");
14 include_once($path_to_root . "/sales/includes/sales_ui.inc");
15 include_once($path_to_root . "/sales/includes/ui/sales_order_ui.inc");
16 include_once($path_to_root . "/sales/includes/sales_db.inc");
17 include_once($path_to_root . "/sales/includes/db/sales_types_db.inc");
18 include_once($path_to_root . "/reporting/includes/reporting.inc");
19
20 $js = '';
21
22 if ($use_popup_windows) {
23         $js .= get_js_open_window(900, 500);
24 }
25
26 if ($use_date_picker) {
27         $js .= get_js_date_picker();
28 }
29
30 if (isset($_GET['NewDelivery']) && is_numeric($_GET['NewDelivery'])) {
31
32         $_SESSION['page_title'] = _("Direct Sales Delivery");
33         create_cart(13, $_GET['NewDelivery']);
34
35 } elseif (isset($_GET['NewInvoice']) && is_numeric($_GET['NewInvoice'])) {
36
37         $_SESSION['page_title'] = _("Direct Sales Invoice");
38         create_cart(10, $_GET['NewInvoice']);
39
40 } elseif (isset($_GET['ModifyOrderNumber']) && is_numeric($_GET['ModifyOrderNumber'])) {
41
42         $help_page_title = _('Modifying Sales Order');
43         $_SESSION['page_title'] = sprintf( _("Modifying Sales Order # %d"), $_GET['ModifyOrderNumber']);
44         create_cart(30, $_GET['ModifyOrderNumber']);
45
46 } elseif (isset($_GET['NewOrder'])) {
47
48         $_SESSION['page_title'] = _("New Sales Order Entry");
49         create_cart(30, 0);
50 }
51
52 page($_SESSION['page_title'], false, false, "", $js);
53 //-----------------------------------------------------------------------------
54
55 if (isset($_GET['AddedID'])) {
56         $order_no = $_GET['AddedID'];
57         print_hidden_script(30);
58
59         display_notification_centered(sprintf( _("Order # %d has been entered."),$order_no));
60
61         display_note(get_trans_view_str(30, $order_no, _("View This Order")));
62         echo '<br>';
63         display_note(print_document_link($order_no, _("Print This Order"), true, 30));
64
65         hyperlink_params($path_to_root . "/sales/customer_delivery.php",
66                 _("Make Delivery Against This Order"), "OrderNumber=$order_no");
67
68         hyperlink_params($_SERVER['PHP_SELF'], _("Enter a New Order"), "NewOrder=0");
69
70         display_footer_exit();
71
72 } elseif (isset($_GET['UpdatedID'])) {
73         $order_no = $_GET['UpdatedID'];
74         print_hidden_script(30);
75
76         display_notification_centered(sprintf( _("Order # %d has been updated."),$order_no));
77
78         display_note(get_trans_view_str(30, $order_no, _("View This Order")));
79         echo '<br>';
80         display_note(print_document_link($order_no, _("Print This Order"), true, 30));
81
82         hyperlink_params($path_to_root . "/sales/customer_delivery.php",
83                 _("Confirm Order Quantities and Make Delivery"), "OrderNumber=$order_no");
84
85         hyperlink_params($path_to_root . "/sales/inquiry/sales_orders_view.php",
86                 _("Select A Different Order"), "OutstandingOnly=1");
87
88         display_footer_exit();
89
90 } elseif (isset($_GET['AddedDN'])) {
91         $delivery = $_GET['AddedDN'];
92         print_hidden_script(13);
93
94         display_notification_centered(sprintf(_("Delivery # %d has been entered."),$delivery));
95
96         display_note(get_trans_view_str(13, $delivery, _("View This Delivery")));
97         echo '<br>';
98         display_note(print_document_link($delivery, _("Print Delivery Note"), true, 13));
99
100         hyperlink_params($path_to_root . "/sales/customer_invoice.php",
101         _("Make Invoice Against This Delivery"), "DeliveryNumber=$delivery");
102
103         if ((isset($_GET['Type']) && $_GET['Type'] == 1))
104         hyperlink_params("inquiry/sales_orders_view.php",
105                 _("Enter a New Template Delivery"), "DeliveryTemplates=Yes");
106         else
107         hyperlink_params($_SERVER['PHP_SELF'], _("Enter a New Delivery"), "NewDelivery=0");
108
109         display_footer_exit();
110
111 } elseif (isset($_GET['AddedDI'])) {
112         $invoice = $_GET['AddedDI'];
113         print_hidden_script(10);
114
115         display_notification_centered(sprintf(_("Invoice # %d has been entered."),$invoice));
116
117         display_note(get_trans_view_str(10, $invoice, _("View This Invoice")));
118         echo '<br>';
119         display_note(print_document_link($invoice, _("Print Sales Invoice"), true, 10));
120
121         if ((isset($_GET['Type']) && $_GET['Type'] == 1))
122         hyperlink_params("inquiry/sales_orders_view.php",
123                 _("Enter a New Template Invoice"), "InvoiceTemplates=Yes");
124         else
125         hyperlink_params($_SERVER['PHP_SELF'], _("Enter a New Direct Invoice"), "NewInvoice=0");
126
127         display_footer_exit();
128 }
129
130 //-----------------------------------------------------------------------------
131
132 function copy_to_cart()
133 {
134         $cart = &$_SESSION['Items'];
135
136         if ($cart->trans_type!=30) {
137                 $cart->reference = $_POST['ref'];
138         }
139         $cart->Comments =  $_POST['Comments'];
140
141         $cart->document_date = $_POST['OrderDate'];
142         $cart->due_date = $_POST['delivery_date'];
143         $cart->cust_ref = $_POST['cust_ref'];
144         $cart->freight_cost = input_num('freight_cost');
145         $cart->deliver_to = $_POST['deliver_to'];
146         $cart->delivery_address = $_POST['delivery_address'];
147         $cart->phone = $_POST['phone'];
148         $cart->Location = $_POST['Location'];
149         $cart->ship_via = $_POST['ship_via'];
150
151         if (isset($_POST['email']))
152                 $cart->email =$_POST['email'];
153         else
154                 $cart->email = '';
155         $cart->customer_id      = $_POST['customer_id'];
156         $cart->Branch = $_POST['branch_id'];
157         $cart->sales_type = $_POST['sales_type'];
158 }
159
160 //-----------------------------------------------------------------------------
161
162 function copy_from_cart()
163 {
164         $cart = &$_SESSION['Items'];
165         if ($cart->trans_type!=30) {
166                 $_POST['ref'] = $cart->reference;
167         }
168         $_POST['Comments'] = $cart->Comments;
169
170         $_POST['OrderDate'] = $cart->document_date;
171         $_POST['delivery_date'] = $cart->due_date;
172         $_POST['cust_ref'] = $cart->cust_ref;
173         $_POST['freight_cost'] = price_format($cart->freight_cost);
174
175         $_POST['deliver_to'] = $cart->deliver_to;
176         $_POST['delivery_address'] = $cart->delivery_address;
177         $_POST['phone'] = $cart->phone;
178         $_POST['Location'] = $cart->Location;
179         $_POST['ship_via'] = $cart->ship_via;
180
181         $_POST['customer_id'] = $cart->customer_id;
182
183         $_POST['branch_id'] = $cart->Branch;
184         $_POST['sales_type'] = $cart->sales_type;
185 }
186 //--------------------------------------------------------------------------------
187
188 function line_start_focus() {
189   global        $Ajax;
190   
191   $Ajax->activate('items_table');
192   $Ajax->addFocus(true, '_stock_id_edit');
193   set_focus('_stock_id_edit');
194 }
195 //--------------------------------------------------------------------------------
196
197 function can_process() {
198         if (!is_date($_POST['OrderDate'])) {
199                 display_error(_("The entered date is invalid."));
200                 set_focus('OrderDate');
201                 return false;
202         }
203         if ($_SESSION['Items']->trans_type!=30 && !is_date_in_fiscalyear($_POST['OrderDate'])) {
204                 display_error(_("The entered date is not in fiscal year"));
205                 set_focus('OrderDate');
206                 return false;
207         }
208         if (count($_SESSION['Items']->line_items) == 0) {
209                 display_error(_("You must enter at least one non empty item line."));
210                 set_focus('AddItem');
211                 return false;
212         }
213         if (strlen($_POST['deliver_to']) <= 1) {
214                 display_error(_("You must enter the person or company to whom delivery should be made to."));
215                 set_focus('deliver_to');
216                 return false;
217         }
218         if (strlen($_POST['delivery_address']) <= 1) {
219                 display_error( _("You should enter the street address in the box provided. Orders cannot be accepted without a valid street address."));
220                 set_focus('delivery_address');
221                 return false;
222         }
223
224         if ($_POST['freight_cost'] == "")
225                 $_POST['freight_cost'] = price_format(0);
226
227         if (!check_num('freight_cost',0)) {
228                 display_error(_("The shipping cost entered is expected to be numeric."));
229                 set_focus('freight_cost');
230                 return false;
231         }
232         if (!is_date($_POST['delivery_date'])) {
233                 display_error(_("The delivery date is invalid."));
234                 set_focus('delivery_date');
235                 return false;
236         }
237         if (date1_greater_date2($_SESSION['Items']->document_date, $_POST['delivery_date'])) {
238                 display_error(_("The requested delivery date is before the date of the order."));
239                 set_focus('delivery_date');
240                 return false;
241         }
242         if ($_SESSION['Items']->trans_type != 30 && !references::is_valid($_POST['ref'])) {
243                 display_error(_("You must enter a reference."));
244                 set_focus('ref');
245                 return false;
246         }
247         return true;
248 }
249
250 //-----------------------------------------------------------------------------
251
252 if (isset($_POST['ProcessOrder']) && can_process()) {
253         copy_to_cart();
254
255         $modified = ($_SESSION['Items']->trans_no != 0);
256         $so_type = $_SESSION['Items']->so_type;
257
258         $_SESSION['Items']->write(1);
259
260         $trans_no = key($_SESSION['Items']->trans_no);
261         $trans_type = $_SESSION['Items']->trans_type;
262
263         processing_end();
264         if ($modified) {
265                 meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$trans_no");
266         } elseif ($trans_type == 30) {
267                 meta_forward($_SERVER['PHP_SELF'], "AddedID=$trans_no");
268         } elseif ($trans_type == 10) {
269                 meta_forward($_SERVER['PHP_SELF'], "AddedDI=$trans_no&Type=$so_type");
270         } else {
271                 meta_forward($_SERVER['PHP_SELF'], "AddedDN=$trans_no&Type=$so_type");
272         }
273 }
274
275 //--------------------------------------------------------------------------------
276
277 function check_item_data()
278 {
279
280         if (!check_num('qty', 0) || !check_num('Disc', 0, 100)) {
281                 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."));
282                 set_focus('qty');
283                 return false;
284         } elseif (!check_num('price', 0)) {
285                 display_error( _("Price for item must be entered and can not be less than 0"));
286                 set_focus('price');
287                 return false;
288         } elseif (isset($_POST['LineNo']) && isset($_SESSION['Items']->line_items[$_POST['LineNo']])
289             && !check_num('qty', $_SESSION['Items']->line_items[$_POST['LineNo']]->qty_done)) {
290
291                 set_focus('qty');
292                 display_error(_("You attempting to make the quantity ordered a quantity less than has already been delivered. The quantity delivered cannot be modified retrospectively."));
293                 return false;
294         }
295         return true;
296 }
297
298 //--------------------------------------------------------------------------------
299
300 function handle_update_item()
301 {
302         if ($_POST['UpdateItem'] != '' && check_item_data()) {
303                 $_SESSION['Items']->update_cart_item($_POST['LineNo'],
304                  input_num('qty'), input_num('price'), 
305                  input_num('Disc') / 100 );
306         }
307   copy_from_cart();
308   line_start_focus();
309 }
310
311 //--------------------------------------------------------------------------------
312
313 function handle_delete_item($line_no)
314 {
315     if ($_SESSION['Items']->some_already_delivered($line_no) == 0) {
316             $_SESSION['Items']->remove_from_cart($line_no);
317     } else {
318         display_error(_("This item cannot be deleted because some of it has already been delivered."));
319     }
320     line_start_focus();
321 }
322
323 //--------------------------------------------------------------------------------
324
325 function handle_new_item()
326 {
327   
328         if (!check_item_data()) {
329                         return;
330         }
331         add_to_order($_SESSION['Items'], $_POST['stock_id'], input_num('qty'),
332                 input_num('price'), input_num('Disc') / 100);
333         $_POST['_stock_id_edit'] = $_POST['stock_id']   = "";
334         line_start_focus();
335 }
336
337 //--------------------------------------------------------------------------------
338
339 function  handle_cancel_order()
340 {
341         global $path_to_root;
342
343         if ($_POST['CancelOrder'] != "") {
344
345         if ($_SESSION['Items']->trans_type == 13) {
346                         display_note(_("Direct delivery entry has been cancelled as requested."), 1);
347                         hyperlink_params($path_to_root . "/sales/sales_order_entry.php",
348                                         _("Enter a New Sales Delivery"), SID . "&NewDelivery=0");
349         } elseif ($_SESSION['Items']->trans_type == 10) {
350                         display_note(_("Direct invoice entry has been cancelled as requested."), 1);
351                         hyperlink_params($path_to_root . "/sales/sales_order_entry.php",
352                                         _("Enter a New Sales Delivery"), SID . "&NewDelivery=0");
353         } else {
354                 if ($_SESSION['Items']->trans_no != 0) {
355                         if (sales_order_has_deliveries(key($_SESSION['Items']->trans_no)))
356                                 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."));
357                         else
358                                 delete_sales_order(key($_SESSION['Items']->trans_no));
359                 }
360
361                         display_note(_("This sales order has been cancelled as requested."), 1);
362                                 hyperlink_params($path_to_root . "/sales/sales_order_entry.php",
363                                 _("Enter a New Sales Order"), SID . "&NewOrder=Yes");
364                 }
365                 processing_end();
366                 br(1);
367                 end_page();
368                 exit;
369         }
370 }
371
372 //--------------------------------------------------------------------------------
373
374 function create_cart($type, $trans_no)
375 {
376         processing_start();
377         $doc_type = $type;
378
379         if($type != 30 && $trans_no != 0) { // this is template
380                 $doc_type = 30;
381
382                 $doc = new Cart(30, array($trans_no));
383                 $doc->trans_type = $type;
384                 $doc->trans_no = 0;
385                 if ($type == 10)
386                         $doc->due_date = get_invoice_duedate($doc->customer_id, $doc->document_date);
387                 else
388                         $doc->due_date = $doc->document_date = Today();
389                 $doc->reference = references::get_next($doc->trans_type);
390                 $doc->Comments='';
391                 foreach($doc->line_items as $line_no => $line) {
392                         $doc->line_items[$line_no]->qty_done = 0;
393                 }
394                 $_SESSION['Items'] = $doc;
395         } else 
396                 $_SESSION['Items'] = new Cart($type,array($trans_no));
397         copy_from_cart();
398 }
399
400 //--------------------------------------------------------------------------------
401
402 if (isset($_POST['CancelOrder']))
403         handle_cancel_order();
404
405 $id = find_submit('Delete');
406 if ($id!=-1)
407         handle_delete_item($id);
408
409 if (isset($_POST['UpdateItem']))
410         handle_update_item();
411
412 if (isset($_POST['AddItem']))
413         handle_new_item();
414
415 if (isset($_POST['CancelItemChanges']) || isset($_POST['UpdateItem'])) {
416         line_start_focus();
417 }
418
419 if (isset($_POST['_customer_id_update']))
420     set_focus('branch_id');
421 //--------------------------------------------------------------------------------
422 check_db_has_stock_items(_("There are no inventory items defined in the system."));
423
424 check_db_has_customer_branches(_("There are no customers, or there are no customers with branches. Please define customers and customer branches."));
425
426 if ($_SESSION['Items']->trans_type == 10) {
427         $idate = _("Invoice Date:");
428         $orderitems = _("Sales Invoice Items");
429         $deliverydetails = _("Enter Delivery Details and Confirm Invoice");
430         $cancelorder = _("Cancel Invoice");
431         $porder = _("Place Invoice");
432 } elseif ($_SESSION['Items']->trans_type == 13) {
433         $idate = _("Delivery Date:");
434         $orderitems = _("Delivery Note Items");
435         $deliverydetails = _("Enter Delivery Details and Confirm Dispatch");
436         $cancelorder = _("Cancel Delivery");
437         $porder = _("Place Delivery");
438 } else {
439         $idate = _("Order Date:");
440         $orderitems = _("Sales Order Items");
441         $deliverydetails = _("Enter Delivery Details and Confirm Order");
442         $cancelorder = _("Cancel Order");
443         $porder = _("Place Order");
444         $corder = _("Commit Order Changes");
445 }
446 start_form(false, true);
447
448 $customer_error = display_order_header($_SESSION['Items'],
449         ($_SESSION['Items']->any_already_delivered() == 0), $idate);
450
451 if ($customer_error == "") {
452         start_table("$table_style width=80%", 10);
453         echo "<tr><td>";
454         display_order_summary($orderitems, $_SESSION['Items'], true);
455         echo "</td></tr>";
456         echo "<tr><td>";
457         display_delivery_details($_SESSION['Items']);
458         echo "</td></tr>";
459         end_table(1);
460
461         if ($_SESSION['Items']->trans_no == 0) {
462
463                 submit_center_first('ProcessOrder', $porder,
464                     _('Check entered data and save document'), true);
465         } else {
466                 submit_center_first('ProcessOrder', $corder,
467                     _('Validate changes and update document'), true);
468         }
469
470         submit_center_last('CancelOrder', $cancelorder, 
471            _('Cancels document entry or removes sales order when editing an old document'));
472 } else {
473         display_error($customer_error);
474 }
475 end_form();
476 end_page();
477
478 ?>