0003667: supplier payment link after entering supplier invoice result. Fixed.
[fa-stable.git] / purchasing / supplier_invoice.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 = 'SA_SUPPLIERINVOICE';
13 $path_to_root = "..";
14
15 include_once($path_to_root . "/purchasing/includes/purchasing_db.inc");
16
17 include_once($path_to_root . "/includes/session.inc");
18
19 include_once($path_to_root . "/includes/banking.inc");
20 include_once($path_to_root . "/includes/data_checks.inc");
21
22 include_once($path_to_root . "/purchasing/includes/purchasing_ui.inc");
23 $js = "";
24 if ($use_popup_windows)
25         $js .= get_js_open_window(900, 500);
26 if ($use_date_picker)
27         $js .= get_js_date_picker();
28 page(_($help_context = "Enter Supplier Invoice"), false, false, "", $js);
29
30 //----------------------------------------------------------------------------------------
31
32 check_db_has_suppliers(_("There are no suppliers defined in the system."));
33
34 //---------------------------------------------------------------------------------------------------------------
35
36 if (isset($_GET['AddedID'])) 
37 {
38         $invoice_no = $_GET['AddedID'];
39         $trans_type = ST_SUPPINVOICE;
40
41
42     echo "<center>";
43     display_notification_centered(_("Supplier invoice has been processed."));
44     display_note(get_trans_view_str($trans_type, $invoice_no, _("View this Invoice")));
45
46         display_note(get_gl_view_str($trans_type, $invoice_no, _("View the GL Journal Entries for this Invoice")), 1);
47
48         hyperlink_params("$path_to_root/purchasing/supplier_payment.php", _("Entry supplier &payment for this invoice"),
49                 "PInvoice=".$invoice_no."&trans_type=".$trans_type);
50
51         hyperlink_params($_SERVER['PHP_SELF'], _("Enter Another Invoice"), "New=1");
52
53         hyperlink_params("$path_to_root/admin/attachments.php", _("Add an Attachment"), "filterType=$trans_type&trans_no=$invoice_no");
54         
55         display_footer_exit();
56 }
57
58 //--------------------------------------------------------------------------------------------------
59
60 if (isset($_GET['New']))
61 {
62         if (isset( $_SESSION['supp_trans']))
63         {
64                 unset ($_SESSION['supp_trans']->grn_items);
65                 unset ($_SESSION['supp_trans']->gl_codes);
66                 unset ($_SESSION['supp_trans']);
67         }
68
69         $_SESSION['supp_trans'] = new supp_trans(ST_SUPPINVOICE);
70 }
71
72 //--------------------------------------------------------------------------------------------------
73 function clear_fields()
74 {
75         global $Ajax;
76         
77         unset($_POST['gl_code']);
78         unset($_POST['dimension_id']);
79         unset($_POST['dimension2_id']);
80         unset($_POST['amount']);
81         unset($_POST['memo_']);
82         unset($_POST['AddGLCodeToTrans']);
83         $Ajax->activate('gl_items');
84         set_focus('gl_code');
85 }
86
87 function reset_tax_input()
88 {
89         global $Ajax;
90
91         unset($_POST['mantax']);
92         $Ajax->activate('inv_tot');
93 }
94
95 //------------------------------------------------------------------------------------------------
96 //      GL postings are often entered in the same form to two accounts
97 //  so fileds are cleared only on user demand.
98 //
99 if (isset($_POST['ClearFields']))
100 {
101         clear_fields();
102 }
103
104 if (isset($_POST['AddGLCodeToTrans'])){
105
106         $Ajax->activate('gl_items');
107         $input_error = false;
108
109         $result = get_gl_account_info($_POST['gl_code']);
110         if (db_num_rows($result) == 0)
111         {
112                 display_error(_("The account code entered is not a valid code, this line cannot be added to the transaction."));
113                 set_focus('gl_code');
114                 $input_error = true;
115         }
116         else
117         {
118                 $myrow = db_fetch_row($result);
119                 $gl_act_name = $myrow[1];
120                 if (!check_num('amount'))
121                 {
122                         display_error(_("The amount entered is not numeric. This line cannot be added to the transaction."));
123                         set_focus('amount');
124                         $input_error = true;
125                 }
126         }
127
128         if (!is_tax_gl_unique(get_post('gl_code'))) {
129                 display_error(_("Cannot post to GL account used by more than one tax type."));
130                 set_focus('gl_code');
131                 $input_error = true;
132         }
133
134         if ($input_error == false)
135         {
136                 $_SESSION['supp_trans']->add_gl_codes_to_trans($_POST['gl_code'], $gl_act_name,
137                         $_POST['dimension_id'], $_POST['dimension2_id'], 
138                         input_num('amount'), $_POST['memo_']);
139                 reset_tax_input();
140                 set_focus('gl_code');
141         }
142 }
143
144 //------------------------------------------------------------------------------------------------
145
146 function check_data()
147 {
148         global $Refs;
149
150         if (!$_SESSION['supp_trans']->is_valid_trans_to_post())
151         {
152                 display_error(_("The invoice cannot be processed because the there are no items or values on the invoice.  Invoices are expected to have a charge."));
153                 return false;
154         }
155
156         if (!$Refs->is_valid($_SESSION['supp_trans']->reference)) 
157         {
158                 display_error(_("You must enter an invoice reference."));
159                 set_focus('reference');
160                 return false;
161         }
162
163         if (!is_new_reference($_SESSION['supp_trans']->reference, ST_SUPPINVOICE)) 
164         {
165                 display_error(_("The entered reference is already in use."));
166                 set_focus('reference');
167                 return false;
168         }
169
170         if (!$Refs->is_valid($_SESSION['supp_trans']->supp_reference)) 
171         {
172                 display_error(_("You must enter a supplier's invoice reference."));
173                 set_focus('supp_reference');
174                 return false;
175         }
176
177         if (!is_date( $_SESSION['supp_trans']->tran_date))
178         {
179                 display_error(_("The invoice as entered cannot be processed because the invoice date is in an incorrect format."));
180                 set_focus('trans_date');
181                 return false;
182         } 
183         elseif (!is_date_in_fiscalyear($_SESSION['supp_trans']->tran_date)) 
184         {
185                 display_error(_("The entered date is not in fiscal year."));
186                 set_focus('trans_date');
187                 return false;
188         }
189         if (!is_date( $_SESSION['supp_trans']->due_date))
190         {
191                 display_error(_("The invoice as entered cannot be processed because the due date is in an incorrect format."));
192                 set_focus('due_date');
193                 return false;
194         }
195
196         if (is_reference_already_there($_SESSION['supp_trans']->supplier_id, $_POST['supp_reference']))
197         {       /*Transaction reference already entered */
198                 display_error(_("This invoice number has already been entered. It cannot be entered again.") . " (" . $_POST['supp_reference'] . ")");
199                 return false;
200         }
201
202         return true;
203 }
204
205 //--------------------------------------------------------------------------------------------------
206
207 function handle_commit_invoice()
208 {
209         copy_to_trans($_SESSION['supp_trans']);
210
211         if (!check_data())
212                 return;
213
214         $invoice_no = add_supp_invoice($_SESSION['supp_trans']);
215
216     $_SESSION['supp_trans']->clear_items();
217     unset($_SESSION['supp_trans']);
218
219         meta_forward($_SERVER['PHP_SELF'], "AddedID=$invoice_no");
220 }
221
222 //--------------------------------------------------------------------------------------------------
223
224 if (isset($_POST['PostInvoice']))
225 {
226         handle_commit_invoice();
227 }
228
229 function check_item_data($n)
230 {
231         global $check_price_charged_vs_order_price,
232                 $check_qty_charged_vs_del_qty, $SysPrefs;
233         if (!check_num('this_quantity_inv'.$n, 0) || input_num('this_quantity_inv'.$n)==0)
234         {
235                 display_error( _("The quantity to invoice must be numeric and greater than zero."));
236                 set_focus('this_quantity_inv'.$n);
237                 return false;
238         }
239
240         if (!check_num('ChgPrice'.$n))
241         {
242                 display_error( _("The price is not numeric."));
243                 set_focus('ChgPrice'.$n);
244                 return false;
245         }
246
247         $margin = $SysPrefs->over_charge_allowance();
248         if ($check_price_charged_vs_order_price == True)
249         {
250                 if ($_POST['order_price'.$n]!=input_num('ChgPrice'.$n)) {
251                      if ($_POST['order_price'.$n]==0 ||
252                                 input_num('ChgPrice'.$n)/$_POST['order_price'.$n] >
253                             (1 + ($margin/ 100)))
254                     {
255                         display_error(_("The price being invoiced is more than the purchase order price by more than the allowed over-charge percentage. The system is set up to prohibit this. See the system administrator to modify the set up parameters if necessary.") .
256                         _("The over-charge percentage allowance is :") . $margin . "%");
257                         set_focus('ChgPrice'.$n);
258                         return false;
259                     }
260                 }
261         }
262
263         if ($check_qty_charged_vs_del_qty == true && ($_POST['qty_recd'.$n] != $_POST['prev_quantity_inv'.$n]))
264         {
265                 if (input_num('this_quantity_inv'.$n) / ($_POST['qty_recd'.$n] - $_POST['prev_quantity_inv'.$n]) >
266                         (1+ ($margin / 100)))
267                 {
268                         display_error( _("The quantity being invoiced is more than the outstanding quantity by more than the allowed over-charge percentage. The system is set up to prohibit this. See the system administrator to modify the set up parameters if necessary.")
269                         . _("The over-charge percentage allowance is :") . $margin . "%");
270                         set_focus('this_quantity_inv'.$n);
271                         return false;
272                 }
273         }
274
275         return true;
276 }
277
278 function commit_item_data($n)
279 {
280         if (check_item_data($n))
281         {
282                 $_SESSION['supp_trans']->add_grn_to_trans($n, $_POST['po_detail_item'.$n],
283                         $_POST['item_code'.$n], $_POST['item_description'.$n], $_POST['qty_recd'.$n],
284                         $_POST['prev_quantity_inv'.$n], input_num('this_quantity_inv'.$n),
285                         $_POST['order_price'.$n], input_num('ChgPrice'.$n),
286                         $_POST['std_cost_unit'.$n], "");
287                 reset_tax_input();
288         }
289 }
290
291 //-----------------------------------------------------------------------------------------
292
293 $id = find_submit('grn_item_id');
294 if ($id != -1)
295 {
296         commit_item_data($id);
297 }
298
299 if (isset($_POST['InvGRNAll']))
300 {
301         foreach($_POST as $postkey=>$postval )
302     {
303                 if (strpos($postkey, "qty_recd") === 0)
304                 {
305                         $id = substr($postkey, strlen("qty_recd"));
306                         $id = (int)$id;
307                         commit_item_data($id);
308                 }
309     }
310 }       
311
312 //--------------------------------------------------------------------------------------------------
313 $id3 = find_submit('Delete');
314 if ($id3 != -1)
315 {
316         $_SESSION['supp_trans']->remove_grn_from_trans($id3);
317         $Ajax->activate('grn_items');
318         reset_tax_input();
319 }
320
321 $id4 = find_submit('Delete2');
322 if ($id4 != -1)
323 {
324         $_SESSION['supp_trans']->remove_gl_codes_from_trans($id4);
325         clear_fields();
326         reset_tax_input();
327         $Ajax->activate('gl_items');
328 }
329
330 $id2 = -1;
331 if ($_SESSION["wa_current_user"]->can_access('SA_GRNDELETE'))
332 {
333         $id2 = find_submit('void_item_id');
334         if ($id2 != -1) 
335         {
336                 remove_not_invoice_item($id2);
337                 display_notification(sprintf(_('All yet non-invoiced items on delivery line # %d has been removed.'), $id2));
338
339         }
340 }
341
342 if (isset($_POST['go']))
343 {
344         $Ajax->activate('gl_items');
345         display_quick_entries($_SESSION['supp_trans'], $_POST['qid'], input_num('totamount'), QE_SUPPINV);
346         $_POST['totamount'] = price_format(0); $Ajax->activate('totamount');
347         reset_tax_input();
348 }
349
350 start_form();
351
352 invoice_header($_SESSION['supp_trans']);
353
354 if ($_POST['supplier_id']=='') 
355                 display_error(_("There is no supplier selected."));
356 else {
357         display_grn_items($_SESSION['supp_trans'], 1);
358
359         display_gl_items($_SESSION['supp_trans'], 1);
360
361         div_start('inv_tot');
362         invoice_totals($_SESSION['supp_trans']);
363         div_end();
364
365 }
366
367 //-----------------------------------------------------------------------------------------
368
369 if ($id != -1 || $id2 != -1)
370 {
371         $Ajax->activate('grn_items');
372         $Ajax->activate('inv_tot');
373 }
374
375 if (get_post('AddGLCodeToTrans'))
376         $Ajax->activate('inv_tot');
377
378 br();
379 submit_center('PostInvoice', _("Enter Invoice"), true, '', 'default');
380 br();
381
382 end_form();
383
384 //--------------------------------------------------------------------------------------------------
385
386 end_page();
387 ?>