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 ***********************************************************************/
13 $page_security = 'SA_PURCHASEORDER';
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 . "/purchasing/includes/db/suppliers_db.inc");
18 include_once($path_to_root . "/reporting/includes/reporting.inc");
20 set_page_security( @$_SESSION['PO']->trans_type,
21 array( ST_PURCHORDER => 'SA_PURCHASEORDER',
22 ST_SUPPRECEIVE => 'SA_GRN',
23 ST_SUPPINVOICE => 'SA_SUPPLIERINVOICE'),
24 array( 'NewOrder' => 'SA_PURCHASEORDER',
25 'ModifyOrderNumber' => 'SA_PURCHASEORDER',
26 'AddedID' => 'SA_PURCHASEORDER',
28 'AddedGRN' => 'SA_GRN',
29 'NewInvoice' => 'SA_SUPPLIERINVOICE',
30 'AddedPI' => 'SA_SUPPLIERINVOICE')
34 if ($SysPrefs->use_popup_windows)
35 $js .= get_js_open_window(900, 500);
36 if (user_use_date_picker())
37 $js .= get_js_date_picker();
39 if (isset($_GET['ModifyOrderNumber']) && is_numeric($_GET['ModifyOrderNumber'])) {
41 $_SESSION['page_title'] = _($help_context = "Modify Purchase Order #") . $_GET['ModifyOrderNumber'];
42 create_new_po(ST_PURCHORDER, $_GET['ModifyOrderNumber']);
44 } elseif (isset($_GET['NewOrder'])) {
46 $_SESSION['page_title'] = _($help_context = "Purchase Order Entry");
47 create_new_po(ST_PURCHORDER, 0);
49 } elseif (isset($_GET['NewGRN'])) {
51 $_SESSION['page_title'] = _($help_context = "Direct GRN Entry");
52 create_new_po(ST_SUPPRECEIVE, 0);
54 } elseif (isset($_GET['NewInvoice'])) {
56 create_new_po(ST_SUPPINVOICE, 0);
59 if (isset($_GET['FixedAsset'])) {
60 $_SESSION['page_title'] = _($help_context = "Fixed Asset Purchase Invoice Entry");
61 $_SESSION['PO']->fixed_asset = true;
63 $_SESSION['page_title'] = _($help_context = "Direct Purchase Invoice Entry");
66 page($_SESSION['page_title'], false, false, "", $js);
68 if (isset($_GET['ModifyOrderNumber']))
69 check_is_editable(ST_PURCHORDER, $_GET['ModifyOrderNumber']);
71 //---------------------------------------------------------------------------------------------------
73 check_db_has_suppliers(_("There are no suppliers defined in the system."));
75 //---------------------------------------------------------------------------------------------------------------
77 if (isset($_GET['AddedID']))
79 $order_no = $_GET['AddedID'];
80 $trans_type = ST_PURCHORDER;
82 if (!isset($_GET['Updated']))
83 display_notification_centered(_("Purchase Order has been entered"));
85 display_notification_centered(_("Purchase Order has been updated") . " #$order_no");
86 display_note(get_trans_view_str($trans_type, $order_no, _("&View this order")), 0, 1);
88 display_note(print_document_link($order_no, _("&Print This Order"), true, $trans_type), 0, 1);
90 display_note(print_document_link($order_no, _("&Email This Order"), true, $trans_type, false, "printlink", "", 1));
92 hyperlink_params($path_to_root . "/purchasing/po_receive_items.php", _("&Receive Items on this Purchase Order"), "PONumber=$order_no");
94 // TODO, for fixed asset
95 hyperlink_params($_SERVER['PHP_SELF'], _("Enter &Another Purchase Order"), "NewOrder=yes");
97 hyperlink_no_params($path_to_root."/purchasing/inquiry/po_search.php", _("Select An &Outstanding Purchase Order"));
99 hyperlink_params("$path_to_root/admin/attachments.php", _("Add an Attachment"),
100 "filterType=$trans_type&trans_no=$order_no");
102 display_footer_exit();
104 } elseif (isset($_GET['AddedGRN'])) {
106 $trans_no = $_GET['AddedGRN'];
107 $trans_type = ST_SUPPRECEIVE;
109 display_notification_centered(_("Direct GRN has been entered"));
111 display_note(get_trans_view_str($trans_type, $trans_no, _("&View this GRN")), 0);
113 $clearing_act = get_company_pref('grn_clearing_act');
115 display_note(get_gl_view_str($trans_type, $trans_no, _("View the GL Journal Entries for this Delivery")), 1);
117 hyperlink_params("$path_to_root/purchasing/supplier_invoice.php",
118 _("Entry purchase &invoice for this receival"), "New=1");
120 hyperlink_params($_SERVER['PHP_SELF'], _("Enter &Another GRN"), "NewGRN=Yes");
122 hyperlink_params("$path_to_root/admin/attachments.php", _("Add an Attachment"),
123 "filterType=$trans_type&trans_no=$trans_no");
125 display_footer_exit();
127 } elseif (isset($_GET['AddedPI'])) {
129 $trans_no = $_GET['AddedPI'];
130 $trans_type = ST_SUPPINVOICE;
132 display_notification_centered(_("Direct Purchase Invoice has been entered"));
134 display_note(get_trans_view_str($trans_type, $trans_no, _("&View this Invoice")), 0);
136 display_note(get_gl_view_str($trans_type, $trans_no, _("View the GL Journal Entries for this Invoice")), 1);
138 hyperlink_params("$path_to_root/purchasing/supplier_payment.php", _("Entry supplier &payment for this invoice"),
139 "trans_type=$trans_type&PInvoice=".$trans_no);
141 hyperlink_params($_SERVER['PHP_SELF'], _("Enter &Another Direct Invoice"), "NewInvoice=Yes");
143 hyperlink_params("$path_to_root/admin/attachments.php", _("Add an Attachment"),
144 "filterType=$trans_type&trans_no=$trans_no");
146 display_footer_exit();
149 if ($_SESSION['PO']->fixed_asset)
150 check_db_has_purchasable_fixed_assets(_("There are no purchasable fixed assets defined in the system."));
152 check_db_has_purchasable_items(_("There are no purchasable inventory items defined in the system."));
153 //--------------------------------------------------------------------------------------------------
155 function line_start_focus() {
158 $Ajax->activate('items_table');
159 set_focus('_stock_id_edit');
161 //--------------------------------------------------------------------------------------------------
163 function unset_form_variables() {
164 unset($_POST['stock_id']);
165 unset($_POST['qty']);
166 unset($_POST['price']);
167 unset($_POST['req_del_date']);
170 //---------------------------------------------------------------------------------------------------
172 function handle_delete_item($line_no)
174 if($_SESSION['PO']->some_already_received($line_no) == 0)
176 $_SESSION['PO']->remove_from_order($line_no);
177 unset_form_variables();
181 display_error(_("This item cannot be deleted because some of it has already been received."));
186 //---------------------------------------------------------------------------------------------------
188 function handle_cancel_po()
190 global $path_to_root;
192 //need to check that not already dispatched or invoiced by the supplier
193 if(($_SESSION['PO']->order_no != 0) &&
194 $_SESSION['PO']->any_already_received() == 1)
196 display_error(_("This order cannot be cancelled because some of it has already been received.")
197 . "<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."));
201 $fixed_asset = $_SESSION['PO']->fixed_asset;
203 if($_SESSION['PO']->order_no != 0)
204 delete_po($_SESSION['PO']->order_no);
206 unset($_SESSION['PO']);
209 meta_forward($path_to_root.'/index.php','application=assets');
211 meta_forward($path_to_root.'/index.php','application=AP');
214 $_SESSION['PO']->clear_items();
215 $_SESSION['PO'] = new purch_order;
217 display_notification(_("This purchase order has been cancelled."));
219 hyperlink_params($path_to_root . "/purchasing/po_entry_items.php", _("Enter a new purchase order"), "NewOrder=Yes");
226 //---------------------------------------------------------------------------------------------------
228 function check_data()
230 if(!get_post('stock_id_text', true)) {
231 display_error( _("Item description cannot be empty."));
232 set_focus('stock_id_edit');
236 $dec = get_qty_dec($_POST['stock_id']);
237 $min = 1 / pow(10, $dec);
238 if (!check_num('qty',$min))
240 $min = number_format2($min, $dec);
241 display_error(_("The quantity of the order item must be numeric and not less than ").$min);
246 if (!check_num('price', 0))
248 display_error(_("The price entered must be numeric and not less than zero."));
252 if ($_SESSION['PO']->trans_type == ST_PURCHORDER && !is_date($_POST['req_del_date'])){
253 display_error(_("The date entered is in an invalid format."));
254 set_focus('req_del_date');
261 //---------------------------------------------------------------------------------------------------
263 function handle_update_item()
265 $allow_update = check_data();
269 if ($_SESSION['PO']->line_items[$_POST['line_no']]->qty_inv > input_num('qty') ||
270 $_SESSION['PO']->line_items[$_POST['line_no']]->qty_received > input_num('qty'))
272 display_error(_("You are attempting to make the quantity ordered a quantity less than has already been invoiced or received. This is prohibited.") .
273 "<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."));
278 $_SESSION['PO']->update_order_item($_POST['line_no'], input_num('qty'), input_num('price'),
279 @$_POST['req_del_date'], $_POST['item_description'] );
280 unset_form_variables();
285 //---------------------------------------------------------------------------------------------------
287 function handle_add_new_item()
289 $allow_update = check_data();
291 if ($allow_update == true)
293 if (count($_SESSION['PO']->line_items) > 0)
295 foreach ($_SESSION['PO']->line_items as $order_item)
297 /* do a loop round the items on the order to see that the item
298 is not already on this order */
299 if (($order_item->stock_id == $_POST['stock_id']))
301 display_warning(_("The selected item is already on this order."));
303 } /* end of the foreach loop to look for pre-existing items of the same code */
306 if ($allow_update == true)
308 $result = get_short_info($_POST['stock_id']);
310 if (db_num_rows($result) == 0)
312 $allow_update = false;
317 $_SESSION['PO']->add_to_order (count($_SESSION['PO']->line_items), $_POST['stock_id'], input_num('qty'),
318 get_post('stock_id_text'), //$myrow["description"],
319 input_num('price'), '', // $myrow["units"], (retrived in cart)
320 $_SESSION['PO']->trans_type == ST_PURCHORDER ? $_POST['req_del_date'] : '', 0, 0);
322 unset_form_variables();
323 $_POST['stock_id'] = "";
327 display_error(_("The selected item does not exist or it is a kit part and therefore cannot be purchased."));
330 } /* end of if not already on the order and allow input was true*/
335 //---------------------------------------------------------------------------------------------------
337 function can_commit()
339 if (!get_post('supplier_id'))
341 display_error(_("There is no supplier selected."));
342 set_focus('supplier_id');
346 if (!is_date($_POST['OrderDate']))
348 display_error(_("The entered order date is invalid."));
349 set_focus('OrderDate');
352 if (($_SESSION['PO']->trans_type == ST_SUPPRECEIVE || $_SESSION['PO']->trans_type == ST_SUPPINVOICE)
353 && !is_date_in_fiscalyear($_POST['OrderDate'])) {
354 display_error(_("The entered date is out of fiscal year or is closed for further data entry."));
355 set_focus('OrderDate');
359 if (($_SESSION['PO']->trans_type==ST_SUPPINVOICE) && !is_date($_POST['due_date']))
361 display_error(_("The entered due date is invalid."));
362 set_focus('due_date');
366 if (!$_SESSION['PO']->order_no)
368 if (!check_reference(get_post('ref'), $_SESSION['PO']->trans_type))
375 if ($_SESSION['PO']->trans_type == ST_SUPPINVOICE && trim(get_post('supp_ref')) == false)
377 display_error(_("You must enter a supplier's invoice reference."));
378 set_focus('supp_ref');
381 if ($_SESSION['PO']->trans_type==ST_SUPPINVOICE
382 && is_reference_already_there($_SESSION['PO']->supplier_id, get_post('supp_ref'), $_SESSION['PO']->order_no))
384 display_error(_("This invoice number has already been entered. It cannot be entered again.") . " (" . get_post('supp_ref') . ")");
385 set_focus('supp_ref');
388 if ($_SESSION['PO']->trans_type == ST_PURCHORDER && get_post('delivery_address') == '')
390 display_error(_("There is no delivery address specified."));
391 set_focus('delivery_address');
394 if (get_post('StkLocation') == '')
396 display_error(_("There is no location specified to move any items into."));
397 set_focus('StkLocation');
400 if (!db_has_currency_rates($_SESSION['PO']->curr_code, $_POST['OrderDate'], true))
402 if ($_SESSION['PO']->order_has_items() == false)
404 display_error (_("The order cannot be placed because there are no lines entered on this order."));
407 if (floatcmp(input_num('prep_amount'), $_SESSION['PO']->get_trans_total()) > 0)
409 display_error(_("Required prepayment is greater than total invoice value."));
410 set_focus('prep_amount');
417 function handle_commit_order()
419 $cart = &$_SESSION['PO'];
424 new_doc_date($cart->orig_order_date);
425 if ($cart->order_no == 0) { // new po/grn/invoice
426 $trans_no = add_direct_supp_trans($cart);
428 unset($_SESSION['PO']);
429 if ($cart->trans_type == ST_PURCHORDER)
430 meta_forward($_SERVER['PHP_SELF'], "AddedID=$trans_no");
431 elseif ($cart->trans_type == ST_SUPPRECEIVE)
432 meta_forward($_SERVER['PHP_SELF'], "AddedGRN=$trans_no");
434 meta_forward($_SERVER['PHP_SELF'], "AddedPI=$trans_no");
436 } else { // order modification
437 $order_no = update_po($cart);
438 unset($_SESSION['PO']);
439 meta_forward($_SERVER['PHP_SELF'], "AddedID=$order_no&Updated=1");
443 //---------------------------------------------------------------------------------------------------
444 if (isset($_POST['update'])) {
446 $Ajax->activate('items_table');
449 $id = find_submit('Delete');
451 handle_delete_item($id);
453 if (isset($_POST['Commit']))
455 handle_commit_order();
457 if (isset($_POST['UpdateLine']))
458 handle_update_item();
460 if (isset($_POST['EnterLine']))
461 handle_add_new_item();
463 if (isset($_POST['CancelOrder']))
466 if (isset($_POST['CancelUpdate']))
467 unset_form_variables();
469 if (isset($_POST['CancelUpdate']) || isset($_POST['UpdateLine'])) {
473 //---------------------------------------------------------------------------------------------------
477 display_po_header($_SESSION['PO']);
480 display_po_items($_SESSION['PO']);
482 start_table(TABLESTYLE2);
485 if ($_SESSION['PO']->trans_type == ST_SUPPINVOICE) {
486 cash_accounts_list_row(_("Payment:"), 'cash_account', null, false, _('Delayed'));
489 textarea_row(_("Memo:"), 'Comments', null, 70, 4);
493 div_start('controls', 'items_table');
494 $process_txt = _("Place Order");
495 $update_txt = _("Update Order");
496 $cancel_txt = _("Cancel Order");
497 if ($_SESSION['PO']->trans_type == ST_SUPPRECEIVE) {
498 $process_txt = _("Process GRN");
499 $update_txt = _("Update GRN");
500 $cancel_txt = _("Cancel GRN");
502 elseif ($_SESSION['PO']->trans_type == ST_SUPPINVOICE) {
503 $process_txt = _("Process Invoice");
504 $update_txt = _("Update Invoice");
505 $cancel_txt = _("Cancel Invoice");
507 if ($_SESSION['PO']->order_has_items())
509 if ($_SESSION['PO']->order_no)
510 submit_center_first('Commit', $update_txt, '', 'default');
512 submit_center_first('Commit', $process_txt, '', 'default');
513 submit_center_last('CancelOrder', $cancel_txt);
516 submit_center('CancelOrder', $cancel_txt, true, false, 'cancel');
518 //---------------------------------------------------------------------------------------------------