Form submit/escape hotkeys added.
[fa-stable.git] / purchasing / po_entry_items.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 $page_security = 4;
13 $path_to_root="..";
14 include_once($path_to_root . "/purchasing/includes/po_class.inc");
15 include_once($path_to_root . "/includes/session.inc");
16 include_once($path_to_root . "/purchasing/includes/purchasing_ui.inc");
17 include_once($path_to_root . "/reporting/includes/reporting.inc");
18
19 $js = '';
20 if ($use_popup_windows)
21         $js .= get_js_open_window(900, 500);
22 if ($use_date_picker)
23         $js .= get_js_date_picker();
24
25 if (isset($_GET['ModifyOrderNumber'])) 
26 {
27         page(_("Modify Purchase Order #") . $_GET['ModifyOrderNumber'], false, false, "", $js);
28
29 else 
30 {
31         page(_("Purchase Order Entry"), false, false, "", $js);
32 }
33
34 //---------------------------------------------------------------------------------------------------
35
36 check_db_has_suppliers(_("There are no suppliers defined in the system."));
37
38 check_db_has_purchasable_items(_("There are no purchasable inventory items defined in the system."));
39
40 //---------------------------------------------------------------------------------------------------------------
41 if ($ret = context_restore()) {
42  // return from supplier/items editors
43         copy_from_cart();
44         if(isset($ret['supplier_id']))
45                 $_POST['supplier_id'] = $ret['supplier_id'];
46         if(isset($ret['stock_id'])) {
47                 $_POST['stock_id'] = $_POST['_stock_id_edit'] = $ret['stock_id'];
48                 set_focus('qty');
49         }
50 }
51 if (isset($_POST['_supplier_id_editor'])) {
52         copy_to_cart();
53         context_call($path_to_root.'/purchasing/manage/suppliers.php?supplier_id='.$_POST['supplier_id'], 'PO');
54 }
55
56 if (isset($_POST['_stock_id_editor'])) {
57         copy_to_cart();
58         context_call($path_to_root.'/inventory/manage/items.php?stock_id='.$_POST['stock_id'], 'PO');
59 }
60 //------------------------------------------------------------------------------
61
62 if (isset($_GET['AddedID'])) 
63 {
64         $order_no = $_GET['AddedID'];
65         $trans_type = systypes::po();   
66
67         if (!isset($_GET['Updated']))
68                 display_notification_centered(_("Purchase Order has been entered"));
69         else
70                 display_notification_centered(_("Purchase Order has been updated") . " #$order_no");
71         display_note(get_trans_view_str($trans_type, $order_no, _("&View this order")));
72         echo '<br>';
73         display_note(print_document_link($order_no, _("&Print This Order"), true, $trans_type));
74
75         hyperlink_params($path_to_root . "/purchasing/po_receive_items.php", _("&Receive Items on this Purchase Order"), "PONumber=$order_no");
76
77         hyperlink_params($_SERVER['PHP_SELF'], _("Enter &Another Purchase Order"), "NewOrder=yes");
78         
79         hyperlink_no_params($path_to_root."/purchasing/inquiry/po_search.php", _("Select An &Outstanding Purchase Order"));
80         
81         display_footer_exit();  
82 }
83 //--------------------------------------------------------------------------------------------------
84
85 function copy_from_cart()
86 {
87         $_POST['supplier_id'] = $_SESSION['PO']->supplier_id;   
88         $_POST['OrderDate'] = $_SESSION['PO']->orig_order_date; 
89     $_POST['Requisition'] = $_SESSION['PO']->requisition_no;
90     $_POST['ref'] = $_SESSION['PO']->reference;
91         $_POST['Comments'] = $_SESSION['PO']->Comments;
92     $_POST['StkLocation'] = $_SESSION['PO']->Location;
93     $_POST['delivery_address'] = $_SESSION['PO']->delivery_address;     
94 }
95
96 function copy_to_cart()
97 {
98         $_SESSION['PO']->supplier_id = $_POST['supplier_id'];   
99         $_SESSION['PO']->orig_order_date = $_POST['OrderDate'];
100         $_SESSION['PO']->reference = $_POST['ref'];
101         $_SESSION['PO']->requisition_no = $_POST['Requisition'];
102         $_SESSION['PO']->Comments = $_POST['Comments']; 
103         $_SESSION['PO']->Location = $_POST['StkLocation'];
104         $_SESSION['PO']->delivery_address = $_POST['delivery_address'];
105 }
106 //--------------------------------------------------------------------------------------------------
107
108 function line_start_focus() {
109   global        $Ajax;
110
111   $Ajax->activate('items_table');
112   set_focus('_stock_id_edit');
113 }
114 //--------------------------------------------------------------------------------------------------
115
116 function unset_form_variables() {
117         unset($_POST['stock_id']);
118     unset($_POST['qty']);
119     unset($_POST['price']);
120     unset($_POST['req_del_date']);
121 }
122
123 //---------------------------------------------------------------------------------------------------
124
125 function handle_delete_item($line_no)
126 {
127         if($_SESSION['PO']->some_already_received($line_no) == 0)
128         {
129                 $_SESSION['PO']->remove_from_order($line_no);
130                 unset_form_variables();
131         } 
132         else 
133         {
134                 display_error(_("This item cannot be deleted because some of it has already been received."));
135         }       
136     line_start_focus();
137 }
138
139 //---------------------------------------------------------------------------------------------------
140
141 function handle_cancel_po()
142 {
143         global $path_to_root;
144         
145         //need to check that not already dispatched or invoiced by the supplier
146         if(($_SESSION['PO']->order_no != 0) && 
147                 $_SESSION['PO']->any_already_received() == 1)
148         {
149                 display_error(_("This order cannot be cancelled because some of it has already been received.") 
150                         . "<br>" . _("The line item quantities may be modified to quantities more than already received. prices cannot be altered for lines that have already been received and quantities cannot be reduced below the quantity already received."));
151                 return;
152         }
153         
154         if($_SESSION['PO']->order_no != 0)
155         {
156                 delete_po($_SESSION['PO']->order_no);
157         } else {
158                 unset($_SESSION['PO']);
159                 meta_forward($path_to_root.'/index.php','application=AP');
160         }
161
162         $_SESSION['PO']->clear_items();
163         $_SESSION['PO'] = new purch_order;
164
165         display_notification(_("This purchase order has been cancelled."));
166
167         hyperlink_params($path_to_root . "/purchasing/po_entry_items.php", _("Enter a new purchase order"), "NewOrder=Yes");
168         echo "<br>";
169
170         end_page();
171         exit;
172 }
173
174 //---------------------------------------------------------------------------------------------------
175
176 function check_data()
177 {
178     if (!check_num('qty',0))
179     {
180                 display_error(_("The quantity of the order item must be numeric and not less than zero."));
181                 set_focus('qty');
182                 return false;
183     }
184
185     if (!check_num('price', 0))
186     {
187                 display_error(_("The price entered must be numeric and not less than zero."));
188                 set_focus('price');
189                 return false;      
190     }
191     if (!is_date($_POST['req_del_date'])){
192                 display_error(_("The date entered is in an invalid format."));
193                 set_focus('req_del_date');
194                 return false;            
195     }
196      
197     return true;        
198 }
199
200 //---------------------------------------------------------------------------------------------------
201
202 function handle_update_item()
203 {
204         $allow_update = check_data(); 
205
206         if ($allow_update && 
207                 ($_SESSION['PO']->line_items[$_POST['line_no']]->qty_inv > input_num('qty') ||
208                 $_SESSION['PO']->line_items[$_POST['line_no']]->qty_received > input_num('qty')))
209         {
210                 display_error(_("You are attempting to make the quantity ordered a quantity less than has already been invoiced or received.  This is prohibited.") .
211                         "<br>" . _("The quantity received can only be modified by entering a negative receipt and the quantity invoiced can only be reduced by entering a credit note against this item."));
212                 set_focus('qty');
213                 return;
214         }
215         
216         $_SESSION['PO']->update_order_item($_POST['line_no'], input_num('qty'), input_num('price'),
217                 $_POST['req_del_date']);
218         unset_form_variables();
219     line_start_focus();
220 }
221
222 //---------------------------------------------------------------------------------------------------
223
224 function handle_add_new_item()
225 {
226         $allow_update = check_data();
227         
228         if ($allow_update == true)
229         { 
230                 if (count($_SESSION['PO']->line_items) > 0)
231                 {
232                     foreach ($_SESSION['PO']->line_items as $order_item) 
233                     {
234
235                         /* do a loop round the items on the order to see that the item
236                         is not already on this order */
237                             if (($order_item->stock_id == $_POST['stock_id']) && 
238                                 ($order_item->Deleted == false)) 
239                             {
240                                         $allow_update = false;
241                                         display_error(_("The selected item is already on this order."));
242                             }
243                     } /* end of the foreach loop to look for pre-existing items of the same code */
244                 }
245
246                 if ($allow_update == true)
247                 {
248                         $sql = "SELECT description, units, mb_flag
249                                 FROM ".TB_PREF."stock_master WHERE stock_id = '". $_POST['stock_id'] . "'";
250
251                     $result = db_query($sql,"The stock details for " . $_POST['stock_id'] . " could not be retrieved");
252
253                     if (db_num_rows($result) == 0)
254                     {
255                                 $allow_update = false;
256                     }               
257
258                         if ($allow_update)
259                         {
260                                 $myrow = db_fetch($result);
261                                 $_SESSION['PO']->add_to_order ($_POST['line_no'], $_POST['stock_id'], input_num('qty'), 
262                                         $myrow["description"], input_num('price'), $myrow["units"],
263                                         $_POST['req_del_date'], 0, 0);
264
265                                 unset_form_variables();
266                                 $_POST['stock_id']      = "";
267                         } 
268                         else 
269                         {
270                              display_error(_("The selected item does not exist or it is a kit part and therefore cannot be purchased."));
271                         }
272
273                 } /* end of if not already on the order and allow input was true*/
274     }
275         line_start_focus();
276 }
277
278 //---------------------------------------------------------------------------------------------------
279
280 function can_commit()
281 {
282         if (!is_date($_POST['OrderDate'])) 
283         {
284                 display_error(_("The entered order date is invalid."));
285                 set_focus('OrderDate');
286                 return false;
287         } 
288         
289         if (!$_SESSION['PO']->order_no) 
290         {
291         if (!references::is_valid(get_post('ref'))) 
292         {
293                 display_error(_("There is no reference entered for this purchase order."));
294                         set_focus('ref');
295                 return false;
296         } 
297         
298         if (!is_new_reference(get_post('ref'), systypes::po())) 
299         {
300                 display_error(_("The entered reference is already in use."));
301                         set_focus('ref');
302                 return false;
303         }
304         }
305         
306         if (get_post('delivery_address') == '')
307         {
308                 display_error(_("There is no delivery address specified."));
309                 set_focus('delivery_address');
310                 return false;
311         } 
312         
313         if (get_post('StkLocation') == '')
314         {
315                 display_error(_("There is no location specified to move any items into."));
316                 set_focus('StkLocation');
317                 return false;
318         } 
319         
320         if ($_SESSION['PO']->order_has_items() == false)
321         {
322         display_error (_("The order cannot be placed because there are no lines entered on this order."));
323         return false;
324         }
325                 
326         return true;
327 }
328
329 //---------------------------------------------------------------------------------------------------
330
331 function handle_commit_order()
332 {
333
334         if (can_commit())
335         {
336                 copy_to_cart();
337
338                 if ($_SESSION['PO']->order_no == 0)
339                 { 
340                         
341                         /*its a new order to be inserted */
342                         $order_no = add_po($_SESSION['PO']);
343                          
344                         unset($_SESSION['PO']);
345                          
346                 meta_forward($_SERVER['PHP_SELF'], "AddedID=$order_no");        
347
348                 } 
349                 else 
350                 { 
351
352                         /*its an existing order need to update the old order info */
353                         $order_no = update_po($_SESSION['PO']);
354                         
355                         unset($_SESSION['PO']);
356                         
357                 meta_forward($_SERVER['PHP_SELF'], "AddedID=$order_no&Updated=1");      
358                 }
359         }       
360 }
361 //---------------------------------------------------------------------------------------------------
362 $id = find_submit('Delete');
363 if ($id != -1)
364         handle_delete_item($id);
365
366 if (isset($_POST['Commit']))
367 {
368         handle_commit_order();
369 }
370 if (isset($_POST['UpdateLine']))
371         handle_update_item();
372
373 if (isset($_POST['EnterLine']))
374         handle_add_new_item();
375
376 if (isset($_POST['CancelOrder'])) 
377         handle_cancel_po();
378
379 if (isset($_POST['CancelUpdate']))
380         unset_form_variables();
381
382 if (isset($_GET['ModifyOrderNumber']) && $_GET['ModifyOrderNumber'] != "")
383 {
384         create_new_po();
385         
386         $_SESSION['PO']->order_no = $_GET['ModifyOrderNumber']; 
387
388         /*read in all the selected order into the Items cart  */
389         read_po($_SESSION['PO']->order_no, $_SESSION['PO']);
390
391         copy_from_cart();
392 }
393
394 if (isset($_POST['CancelUpdate']) || isset($_POST['UpdateLine'])) {
395         line_start_focus();
396 }
397
398 if (isset($_GET['NewOrder']))
399         create_new_po();
400
401 //---------------------------------------------------------------------------------------------------
402
403 start_form();
404
405 display_po_header($_SESSION['PO']);
406 echo "<br>";
407
408 display_po_items($_SESSION['PO']);
409
410 start_table($table_style2);
411 textarea_row(_("Memo:"), 'Comments', null, 70, 4);
412
413 end_table(1);
414
415 div_start('controls', 'items_table');
416 if ($_SESSION['PO']->order_has_items()) 
417 {
418         if ($_SESSION['PO']->order_no)
419                 submit_center_first('Commit', _("Update Order"), '', 'default');
420         else
421                 submit_center_first('Commit', _("Place Order"), '', 'default');
422         submit_center_last('CancelOrder', _("Cancel Order"));   
423 }
424 else
425         submit_center('CancelOrder', _("Cancel Order"), true, false, 'cancel');
426 div_end();
427 //---------------------------------------------------------------------------------------------------
428
429 end_form();
430 end_page();
431 ?>