Changed context help organization to enable use of central, multilanguage wiki.
[fa-stable.git] / admin / fiscalyears.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_FISCALYEARS';
13 $path_to_root = "..";
14 include_once($path_to_root . "/includes/session.inc");
15
16 include_once($path_to_root . "/includes/date_functions.inc");
17 include_once($path_to_root . "/admin/db/company_db.inc");
18 include_once($path_to_root . "/includes/ui.inc");
19 include_once($path_to_root . "/sales/includes/db/cust_trans_db.inc");
20 include_once($path_to_root . "/admin/db/maintenance_db.inc");
21 $js = "";
22 if ($use_date_picker)
23         $js .= get_js_date_picker();
24 page(_($help_context = "Fiscal Years"), false, false, "", $js);
25
26 simple_page_mode(true);
27 //---------------------------------------------------------------------------------------------
28
29 function is_date_in_fiscalyears($date)
30 {
31         $date = date2sql($date);
32         $sql = "SELECT * FROM ".TB_PREF."fiscal_year WHERE '$date' >= begin AND '$date' <= end";
33
34         $result = db_query($sql, "could not get all fiscal years");
35         return db_fetch($result) !== false;
36 }
37
38 function is_bad_begin_date($date)
39 {
40         $bdate = date2sql($date);
41         $sql = "SELECT MAX(end) FROM ".TB_PREF."fiscal_year WHERE begin < '$bdate'";
42
43         $result = db_query($sql, "could not retrieve last fiscal years");
44         $row = db_fetch_row($result);
45         if ($row[0] === null)
46                 return false;
47         $max = add_days(sql2date($row[0]), 1);
48         return ($max !== $date);
49 }
50
51 function check_years_before($date, $closed=false)
52 {
53         $date = date2sql($date);
54         $sql = "SELECT COUNT(*) FROM ".TB_PREF."fiscal_year WHERE begin < '$date'";
55         if (!$closed)
56                 $sql .= " AND closed=0";
57
58         $result = db_query($sql, "could not check fiscal years before");
59         $row = db_fetch_row($result);
60         return ($row[0] > 0);
61 }
62
63 function check_data()
64 {
65         if (!is_date($_POST['from_date']) || is_date_in_fiscalyears($_POST['from_date']) || is_bad_begin_date($_POST['from_date']))
66         {
67                 display_error( _("Invalid BEGIN date in fiscal year."));
68                 set_focus('from_date');
69                 return false;
70         }
71         if (!is_date($_POST['to_date']) || is_date_in_fiscalyears($_POST['to_date']))
72         {
73                 display_error( _("Invalid END date in fiscal year."));
74                 set_focus('to_date');
75                 return false;
76         }
77         if (date1_greater_date2($_POST['from_date'], $_POST['to_date']))
78         {
79                 display_error( _("BEGIN date bigger than END date."));
80                 set_focus('from_date');
81                 return false;
82         }
83         return true;
84 }
85 //---------------------------------------------------------------------------------------------
86 function close_year($year)
87 {
88         $co = get_company_prefs();
89         if (get_gl_account($co['retained_earnings_act']) == false || get_gl_account($co['profit_loss_year_act']) == false)
90         {
91                 display_error(_("The Retained Earnings Account or the Profit and Loss Year Account has not been set in System and General GL Setup"));
92                 return false;
93         }
94         begin_transaction();
95
96         $myrow = get_fiscalyear($year);
97         $to = $myrow['end'];
98         // retrieve total balances from balance sheet accounts
99     $sql = "SELECT SUM(amount) FROM ".TB_PREF."gl_trans INNER JOIN ".TB_PREF."chart_master ON account=account_code
100         INNER JOIN ".TB_PREF."chart_types ON account_type=id INNER JOIN ".TB_PREF."chart_class ON class_id=cid 
101                 WHERE ctype>=".CL_ASSETS." AND ctype <=".CL_EQUITY." AND tran_date <= '$to'";
102         $result = db_query($sql, "The total balance could not be calculated");
103
104         $row = db_fetch_row($result);
105         $balance = round2($row[0], user_price_dec());
106
107         $to = sql2date($to);
108
109         if ($balance != 0.0)
110         {
111                 $trans_type = ST_JOURNAL;
112                 $trans_id = get_next_trans_no($trans_type);
113
114                 add_gl_trans($trans_type, $trans_id, $to, $co['retained_earnings_act'],
115                         0, 0, _("Closing Year"), -$balance);
116                 add_gl_trans($trans_type, $trans_id, $to, $co['profit_loss_year_act'],
117                         0, 0, _("Closing Year"), $balance);
118
119         }       
120         close_transactions($to);
121
122         commit_transaction();
123         return true;
124 }
125
126 function open_year($year)
127 {
128         $myrow = get_fiscalyear($year);
129         $from = sql2date($myrow['begin']);
130
131         begin_transaction();
132         open_transactions($from);
133         commit_transaction();
134 }
135
136 function handle_submit()
137 {
138         global $selected_id, $Mode;
139
140         $ok = true;
141         if ($selected_id != -1)
142         {
143                 if ($_POST['closed'] == 1)
144                 {
145                         if (check_years_before($_POST['from_date'], false))
146                         {
147                                 display_error( _("Cannot CLOSE this year because there are open fiscal years before"));
148                                 set_focus('closed');
149                                 return false;
150                         }       
151                         $ok = close_year($selected_id);
152                 }       
153                 else
154                         open_year($selected_id);
155                 if ($ok)
156                 {
157                         update_fiscalyear($selected_id, $_POST['closed']);
158                         display_notification(_('Selected fiscal year has been updated'));
159                 }       
160         }
161         else
162         {
163                 if (!check_data())
164                         return false;
165                 add_fiscalyear($_POST['from_date'], $_POST['to_date'], $_POST['closed']);
166                 display_notification(_('New fiscal year has been added'));
167         }
168         $Mode = 'RESET';
169 }
170
171 //---------------------------------------------------------------------------------------------
172
173 function check_can_delete($selected_id)
174 {
175         $myrow = get_fiscalyear($selected_id);
176         // PREVENT DELETES IF DEPENDENT RECORDS IN gl_trans
177         if (check_years_before(sql2date($myrow['begin']), true))
178         {
179                 display_error(_("Cannot delete this fiscal year because thera are fiscal years before."));
180                 return false;
181         }
182         if ($myrow['closed'] == 0)
183         {
184                 display_error(_("Cannot delete this fiscal year because the fiscal year is not closed."));
185                 return false;
186         }
187         return true;
188 }
189
190 //---------------------------------------------------------------------------------------------
191 function delete_attachments_and_comments($type_no, $trans_no)
192 {
193         global $comp_path;
194         
195         $sql = "SELECT * FROM ".TB_PREF."attachments WHERE type_no = $type_no AND trans_no = $trans_no";
196         $result = db_query($sql, "Could not retrieve attachments");
197         while ($row = db_fetch($result))
198         {
199                 $dir =  $comp_path."/".user_company(). "/attachments";
200                 if (file_exists($dir."/".$row['unique_name']))
201                         unlink($dir."/".$row['unique_name']);
202                 $sql = "DELETE FROM ".TB_PREF."attachments WHERE  type_no = $type_no AND trans_no = $trans_no";
203                 db_query($sql, "Could not delete attachment");
204         }       
205         $sql = "DELETE FROM ".TB_PREF."comments WHERE  type = $type_no AND id = $trans_no";
206         db_query($sql, "Could not delete comments");
207 }       
208
209 function delete_this_fiscalyear($selected_id)
210 {
211         global $db_connections;
212         
213         db_backup($db_connections[$_SESSION["wa_current_user"]->company], 'Security backup before Fiscal Year Removal');
214         begin_transaction();
215         $ref = _("Open Balance");
216         $myrow = get_fiscalyear($selected_id);
217         $to = $myrow['end'];
218         $sql = "SELECT order_no, trans_type FROM ".TB_PREF."sales_orders WHERE ord_date <= '$to' AND type <> 1"; // don't take the templates
219         $result = db_query($sql, "Could not retrieve sales orders");
220         while ($row = db_fetch($result))
221         {
222                 $sql = "SELECT SUM(qty_sent), SUM(quantity) FROM ".TB_PREF."sales_order_details WHERE order_no = {$row['order_no']} AND trans_type = {$row['trans_type']}";
223                 $res = db_query($sql, "Could not retrieve sales order details");
224                 $row2 = db_fetch_row($res);
225                 if ($row2[0] == $row2[1])
226                 {
227                         $sql = "DELETE FROM ".TB_PREF."sales_order_details WHERE order_no = {$row['order_no']} AND trans_type = {$row['trans_type']}";
228                         db_query($sql, "Could not delete sales order details");
229                         $sql = "DELETE FROM ".TB_PREF."sales_orders WHERE order_no = {$row['order_no']} AND trans_type = {$row['trans_type']}";
230                         db_query($sql, "Could not delete sales order");
231                         delete_attachments_and_comments($row['trans_type'], $row['order_no']);
232                 }
233         }
234         $sql = "SELECT order_no FROM ".TB_PREF."purch_orders WHERE ord_date <= '$to'";
235         $result = db_query($sql, "Could not retrieve purchase orders");
236         while ($row = db_fetch($result))
237         {
238                 $sql = "SELECT SUM(quantity_ordered), SUM(quantity_received) FROM ".TB_PREF."purch_order_details WHERE order_no = {$row['order_no']}";
239                 $res = db_query($sql, "Could not retrieve purchase order details");
240                 $row2 = db_fetch_row($res);
241                 if ($row2[0] == $row2[1])
242                 {
243                         $sql = "DELETE FROM ".TB_PREF."purch_order_details WHERE order_no = {$row['order_no']}";
244                         db_query($sql, "Could not delete purchase order details");
245                         $sql = "DELETE FROM ".TB_PREF."purch_orders WHERE order_no = {$row['order_no']}";
246                         db_query($sql, "Could not delete purchase order");
247                         delete_attachments_and_comments(ST_PURCHORDER, $row['order_no']);
248                 }
249         }
250         $sql = "SELECT id FROM ".TB_PREF."grn_batch WHERE delivery_date <= '$to'";
251         $result = db_query($sql, "Could not retrieve grn batch");
252         while ($row = db_fetch($result))
253         {
254                 $sql = "DELETE FROM ".TB_PREF."grn_items WHERE grn_batch_id = {$row['id']}";
255                 db_query($sql, "Could not delete grn items");
256                 $sql = "DELETE FROM ".TB_PREF."grn_batch WHERE id = {$row['id']}";
257                 db_query($sql, "Could not delete grn batch");
258                 delete_attachments_and_comments(25, $row['id']);
259         }
260         $sql = "SELECT trans_no, type FROM ".TB_PREF."debtor_trans WHERE tran_date <= '$to' AND 
261                 (ov_amount + ov_gst + ov_freight + ov_freight_tax + ov_discount) = alloc";
262         $result = db_query($sql, "Could not retrieve debtor trans");
263         while ($row = db_fetch($result))
264         {
265                 if ($row['type'] == ST_SALESINVOICE)
266                 {
267                         $deliveries = get_parent_trans(ST_SALESINVOICE,$row['trans_no']);
268                         foreach ($deliveries as $delivery)
269                         {
270                                 $sql = "DELETE FROM ".TB_PREF."debtor_trans_details WHERE debtor_trans_no = $delivery AND debtor_trans_type = ".ST_CUSTDELIVERY;
271                                 db_query($sql, "Could not delete debtor trans details");
272                                 $sql = "DELETE FROM ".TB_PREF."debtor_trans WHERE trans_no = $delivery AND type = ".ST_CUSTDELIVERY;
273                                 db_query($sql, "Could not delete debtor trans");
274                         }               
275                 }       
276                 $sql = "DELETE FROM ".TB_PREF."cust_allocations WHERE trans_no_from = {$row['trans_no']} AND type_no_from = {$row['type']}";
277                 db_query($sql, "Could not delete cust allocations");
278                 $sql = "DELETE FROM ".TB_PREF."debtor_trans_details WHERE debtor_trans_no = {$row['trans_no']} AND debtor_trans_type = {$row['type']}";
279                 db_query($sql, "Could not delete debtor trans details");
280                 $sql = "DELETE FROM ".TB_PREF."debtor_trans WHERE trans_no = {$row['trans_no']} AND type = {$row['type']}";
281                 db_query($sql, "Could not delete debtor trans");
282                 delete_attachments_and_comments($row['type'], $row['trans_no']);
283         }
284         $sql = "SELECT trans_no, type FROM ".TB_PREF."supp_trans WHERE tran_date <= '$to' AND 
285                 ABS(ov_amount + ov_gst + ov_discount) = alloc";
286         $result = db_query($sql, "Could not retrieve supp trans");
287         while ($row = db_fetch($result))
288         {
289                 $sql = "DELETE FROM ".TB_PREF."supp_allocations WHERE trans_no_from = {$row['trans_no']} AND type_no_from = {$row['type']}";
290                 db_query($sql, "Could not delete supp allocations");
291                 $sql = "DELETE FROM ".TB_PREF."supp_invoice_items WHERE supp_trans_no = {$row['trans_no']} AND supp_trans_type = {$row['type']}";
292                 db_query($sql, "Could not delete supp invoice items");
293                 $sql = "DELETE FROM ".TB_PREF."supp_trans WHERE trans_no = {$row['trans_no']} AND type = {$row['type']}";
294                 db_query($sql, "Could not delete supp trans");
295                 delete_attachments_and_comments($row['type'], $row['trans_no']);
296         }
297         $sql = "SELECT id FROM ".TB_PREF."workorders WHERE released_date <= '$to' AND closed=1";
298         $result = db_query($sql, "Could not retrieve supp trans");
299         while ($row = db_fetch($result))
300         {
301                 $sql = "SELECT issue_no FROM ".TB_PREF."wo_issues WHERE workorder_id = {$row['id']}"; 
302                 $res = db_query($sql, "Could not retrieve wo issues");
303                 while ($row2 = db_fetch_row($res))
304                 {
305                         $sql = "DELETE FROM ".TB_PREF."wo_issue_items WHERE issue_id = {$row2[0]}";
306                         db_query($sql, "Could not delete wo issue items");
307                 }       
308                 delete_attachments_and_comments(28, $row['id']);
309                 $sql = "DELETE FROM ".TB_PREF."wo_issues WHERE workorder_id = {$row['id']}";
310                 db_query($sql, "Could not delete wo issues");
311                 $sql = "DELETE FROM ".TB_PREF."wo_manufacture WHERE workorder_id = {$row['id']}";
312                 db_query($sql, "Could not delete wo manufacture");
313                 $sql = "DELETE FROM ".TB_PREF."wo_requirements WHERE workorder_id = {$row['id']}";
314                 db_query($sql, "Could not delete wo requirements");
315                 $sql = "DELETE FROM ".TB_PREF."workorders WHERE id = {$row['id']}";
316                 db_query($sql, "Could not delete workorders");
317                 delete_attachments_and_comments(26, $row['id']);
318         }
319         $sql = "SELECT loc_code, stock_id, SUM(qty) AS qty, SUM(qty*standard_cost) AS std_cost FROM ".TB_PREF."stock_moves WHERE tran_date <= '$to' GROUP by 
320                 loc_code, stock_id";
321         $result = db_query($sql, "Could not retrieve supp trans");
322         while ($row = db_fetch($result))
323         {
324                 $sql = "DELETE FROM ".TB_PREF."stock_moves WHERE tran_date <= '$to' AND loc_code = '{$row['loc_code']}' AND stock_id = '{$row['stock_id']}'";
325                 db_query($sql, "Could not delete stock moves");
326                 $qty = $row['qty'];
327                 $std_cost = ($qty == 0 ? 0 : round2($row['std_cost'] / $qty, user_price_dec()));
328                 $sql = "INSERT INTO ".TB_PREF."stock_moves (stock_id, loc_code, tran_date, reference, qty, standard_cost) VALUES
329                         ('{$row['stock_id']}', '{$row['loc_code']}', '$to', '$ref', $qty, $std_cost)";   
330                 db_query($sql, "Could not insert stock move");
331         }               
332         $sql = "DELETE FROM ".TB_PREF."voided WHERE date_ <= '$to'";
333         db_query($sql, "Could not delete voided items");
334         $sql = "DELETE FROM ".TB_PREF."trans_tax_details WHERE tran_date <= '$to'";
335         db_query($sql, "Could not delete trans tax details");
336         $sql = "DELETE FROM ".TB_PREF."exchange_rates WHERE date_ <= '$to'";
337         db_query($sql, "Could not delete exchange rates");
338         $sql = "DELETE FROM ".TB_PREF."budget_trans WHERE tran_date <= '$to'";
339         db_query($sql, "Could not delete exchange rates");
340         $sql = "SELECT account, SUM(amount) AS amount FROM ".TB_PREF."gl_trans WHERE tran_date <= '$to' GROUP by account";
341         $result = db_query($sql, "Could not retrieve gl trans");
342         while ($row = db_fetch($result))
343         {
344                 $sql = "DELETE FROM ".TB_PREF."gl_trans WHERE tran_date <= '$to' AND account = '{$row['account']}'";
345                 db_query($sql, "Could not delete gl trans");
346                 if (is_account_balancesheet($row['account']))
347                 {
348                         $trans_no = get_next_trans_no(0);
349                         if (is_bank_account($row['account']))
350                         {
351                                 $sql = "SELECT SUM(amount) FROM ".TB_PREF."bank_trans WHERE trans_date <= '$to' AND bank_act = '{$row['account']}'";
352                                 $res = db_query($sql, "Could not retrieve bank trans");
353                                 $row2 = db_fetch_row($res);
354                                 $sql = "DELETE FROM ".TB_PREF."bank_trans WHERE trans_date <= '$to' AND bank_act = '{$row['account']}'";
355                                 db_query($sql, "Could not delete bank trans");
356                                 $sql = "INSERT INTO ".TB_PREF."bank_trans (type, trans_no, trans_date, bank_act, ref, amount) VALUES
357                                         (0, $trans_no, '$to', '{$row['account']}', '$ref', {$row2[0]})";
358                                 db_query($sql, "Could not insert bank trans");
359                         }       
360                         $sql = "INSERT INTO ".TB_PREF."gl_trans (type, type_no, tran_date, account, memo_, amount) VALUES
361                                 (0, $trans_no, '$to', '{$row['account']}', '$ref', {$row['amount']})";
362                         db_query($sql, "Could not insert gl trans");
363                 }
364         }
365         delete_fiscalyear($selected_id);
366         commit_transaction();   
367 }
368
369 function handle_delete()
370 {
371         global $selected_id, $Mode;
372
373         if (check_can_delete($selected_id)) {
374         //only delete if used in neither customer or supplier, comp prefs, bank trans accounts
375                 delete_this_fiscalyear($selected_id);
376                 display_notification(_('Selected fiscal year has been deleted'));
377         }
378         $Mode = 'RESET';
379 }
380
381 //---------------------------------------------------------------------------------------------
382
383 function display_fiscalyears()
384 {
385         global $table_style;
386
387         $company_year = get_company_pref('f_year');
388
389         $result = get_all_fiscalyears();
390         start_form();
391         display_note(_("Warning: During fiscal year removal all transactions 
392                 are removed and converted into relevant balances. This process is irreversible!"), 
393                 0, 0, "class='currentfg'");
394         start_table($table_style);
395
396         $th = array(_("Fiscal Year Begin"), _("Fiscal Year End"), _("Closed"), "", "");
397         table_header($th);
398
399         $k=0;
400         while ($myrow=db_fetch($result))
401         {
402         if ($myrow['id'] == $company_year)
403         {
404                 start_row("class='stockmankobg'");
405         }
406         else
407                 alt_table_row_color($k);
408
409                 $from = sql2date($myrow["begin"]);
410                 $to = sql2date($myrow["end"]);
411                 if ($myrow["closed"] == 0)
412                 {
413                         $closed_text = _("No");
414                 }
415                 else
416                 {
417                         $closed_text = _("Yes");
418                 }
419                 label_cell($from);
420                 label_cell($to);
421                 label_cell($closed_text);
422                 edit_button_cell("Edit".$myrow['id'], _("Edit"));
423                 if ($myrow["id"] != $company_year) {
424                         delete_button_cell("Delete".$myrow['id'], _("Delete"));
425                         submit_js_confirm("Delete".$myrow['id'],
426                                 sprintf(_("Are you sure you want to remove fiscal year %s - %s? All transactions are removed and converted into relevant balances. Do you want to continue ?"), $from, $to));
427                 } else
428                         label_cell('');
429                 end_row();
430         }
431
432         end_table();
433         end_form();
434         display_note(_("The marked fiscal year is the current fiscal year which cannot be deleted."), 0, 0, "class='currentfg'");
435 }
436
437 //---------------------------------------------------------------------------------------------
438
439 function display_fiscalyear_edit($selected_id)
440 {
441         global $table_style2, $Mode;
442
443         start_form();
444         start_table($table_style2);
445
446         if ($selected_id != -1)
447         {
448                 if($Mode =='Edit')
449                 {
450                         $myrow = get_fiscalyear($selected_id);
451
452                         $_POST['from_date'] = sql2date($myrow["begin"]);
453                         $_POST['to_date']  = sql2date($myrow["end"]);
454                         $_POST['closed']  = $myrow["closed"];
455                 }
456                 hidden('from_date');
457                 hidden('to_date');
458                 label_row(_("Fiscal Year Begin:"), $_POST['from_date']);
459                 label_row(_("Fiscal Year End:"), $_POST['to_date']);
460         }
461         else
462         {
463                 date_row(_("Fiscal Year Begin:"), 'from_date', '', null, 0, 0, 1001);
464                 date_row(_("Fiscal Year End:"), 'to_date', '', null, 0, 0, 1001);
465         }
466         hidden('selected_id', $selected_id);
467
468         yesno_list_row(_("Is Closed:"), 'closed', null, "", "", false);
469
470         end_table(1);
471
472         submit_add_or_update_center($selected_id == -1, '', 'both');
473
474         end_form();
475 }
476
477 //---------------------------------------------------------------------------------------------
478
479 if ($Mode=='ADD_ITEM' || $Mode=='UPDATE_ITEM')
480 {
481         handle_submit();
482 }
483
484 //---------------------------------------------------------------------------------------------
485
486 if ($Mode == 'Delete')
487 {
488         global $selected_id;
489         handle_delete($selected_id);
490 }
491
492 if ($Mode == 'RESET')
493 {
494         $selected_id = -1;
495 }
496 //---------------------------------------------------------------------------------------------
497
498 display_fiscalyears();
499
500 echo '<br>';
501
502 display_fiscalyear_edit($selected_id);
503
504 //---------------------------------------------------------------------------------------------
505
506 end_page();
507
508 ?>