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