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