Recurring invoices result in no dimensions on gl_trans. Fixed by company flag option.
[fa-stable.git] / sales / create_recurrent_invoices.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_SALESINVOICE';
13 $path_to_root = "..";
14 include_once($path_to_root . "/sales/includes/cart_class.inc");
15 include_once($path_to_root . "/includes/session.inc");
16 include_once($path_to_root . "/sales/includes/ui/sales_order_ui.inc");
17 include_once($path_to_root . "/includes/ui.inc");
18 include_once($path_to_root . "/reporting/includes/reporting.inc");
19
20 $js = "";
21 if ($SysPrefs->use_popup_windows)
22         $js .= get_js_open_window(900, 600);
23 if (user_use_date_picker())
24         $js .= get_js_date_picker();
25
26 page(_($help_context = "Create and Print Recurrent Invoices"), false, false, "", $js);
27
28 function create_recurrent_invoices($customer_id, $branch_id, $order_no, $tmpl_no, $date, $from, $to, $memo)
29 {
30         global $Refs, $SysPrefs;
31
32         update_last_sent_recurrent_invoice($tmpl_no, $to);
33
34         $doc = new Cart(ST_SALESORDER, array($order_no));
35         
36         if (!empty($SysPrefs->prefs['dim_on_recurrent_invoice']))
37                 $doc->trans_type = ST_SALESINVOICE;
38         
39         get_customer_details_to_order($doc, $customer_id, $branch_id);
40
41         $doc->trans_type = ST_SALESORDER;
42         $doc->trans_no = 0;
43         $doc->document_date = $date;
44
45         $doc->due_date = get_invoice_duedate($doc->payment, $doc->document_date);
46
47         $doc->reference = $Refs->get_next($doc->trans_type, null, array('customer' => $customer_id, 'branch' => $branch_id,
48                 'date' => $date));
49         $doc->Comments = $memo;
50
51         foreach ($doc->line_items as $line_no=>$item) {
52                 $line = &$doc->line_items[$line_no];
53                 $new_price = get_price($line->stock_id, $doc->customer_currency,
54                         $doc->sales_type, $doc->price_factor, $doc->document_date);
55                 if ($new_price != 0)    // use template price if no price is currently set for the item.
56                         $line->price = $new_price;
57         }       
58         $cart = $doc;
59         $cart->trans_type = ST_SALESINVOICE;
60         $cart->reference = $Refs->get_next($cart->trans_type);
61         $cart->payment_terms['cash_sale'] = false; // no way to register cash payment with recurrent invoice at once
62         $invno = $cart->write(1);
63
64         return $invno;
65 }
66
67 function calculate_from($myrow)
68 {
69         if ($myrow["last_sent"] == '0000-00-00')
70                 $from = sql2date($myrow["begin"]);
71         else
72                 $from = sql2date($myrow["last_sent"]);
73         return $from;
74 }
75
76 function calculate_next($myrow)
77 {
78         if ($myrow["last_sent"] == '0000-00-00')
79                 $next = sql2date($myrow["begin"]);
80         else
81                 $next = sql2date($myrow["last_sent"]);
82         $next = add_months($next, $myrow['monthly']);
83         $next = add_days($next, $myrow['days']);
84         return add_days($next,-1);
85 }
86
87 $id = find_submit("confirmed");
88 if ($id != -1 && is_date_closed($_POST['trans_date']))
89 {
90         display_error(_("The entered date is out of fiscal year or is closed for further data entry."));
91         set_focus('trans_date');
92         $_POST['create'.$id] = 1;       //re-display current page
93         $id = -1;
94 }
95
96 if ($id != -1)
97 {
98         /*
99                 whole invoiced time is <begin, end>
100                 invoices are issued _after_ invoiced period is gone, eg:
101                 begin 1.1
102                 end       31.3
103                 period:    invoice ready for issue since:
104                 1.1-31.1 -      1.2
105                 1.2-28.2 -      1.3
106                 1.3-31.3 -      1.4
107                 In example above, when end is set to 1.4 will generate additional invoice on 1.5 !
108         */
109
110         $Ajax->activate('_page_body');
111         $from = get_post('from');
112         $to = get_post('to');
113         $memo = get_post('memo');
114         $date = $_POST['trans_date'];
115         $myrow = get_recurrent_invoice($id);
116
117         $invs = array();
118         if (recurrent_invoice_ready($id, $date))
119         {
120                         begin_transaction();
121
122                         if ($myrow['debtor_no'] == 0)
123                         {
124                                 $cust = get_cust_branches_from_group($myrow['group_no']);
125                                 while ($row = db_fetch($cust))
126                                 {
127                                         $invs[] = create_recurrent_invoices($row['debtor_no'], $row['branch_code'], $myrow['order_no'], $myrow['id'],
128                                                 $date, $from, $to, $memo);
129                                 }
130                         }
131                         else
132                         {
133                                 $invs[] = create_recurrent_invoices($myrow['debtor_no'], $myrow['group_no'], $myrow['order_no'], $myrow['id'],
134                                         $date, $from, $to, $memo);
135                         }
136                         commit_transaction();
137         }
138         if (count($invs) > 0)
139         {
140                 $min = min($invs);
141                 $max = max($invs);
142         }
143         else 
144                 $min = $max = 0;
145         display_notification(sprintf(_("%s recurrent invoice(s) created, # %s - # %s."), count($invs), $min, $max));
146         if (count($invs) > 0)
147         {
148                 $ar = array('PARAM_0' => $min."-".ST_SALESINVOICE,      'PARAM_1' => $max."-".ST_SALESINVOICE, 'PARAM_2' => "",
149                         'PARAM_3' => 0, 'PARAM_4' => 0, 'PARAM_5' => "", 'PARAM_6' => "", 'PARAM_7' => user_def_print_orientation());
150                 display_note(print_link(sprintf(_("&Print Recurrent Invoices # %s - # %s"), $min, $max), 107, $ar), 0, 1);
151                 $ar['PARAM_3'] = 1; // email
152                 display_note(print_link(sprintf(_("&Email Recurrent Invoices # %s - # %s"), $min, $max), 107, $ar), 0, 1);
153         }
154 }
155
156
157 $id = find_submit('create');
158 if ($id != -1)
159 {
160         $Ajax->activate('_page_body');
161         $date = Today();
162         $myrow = get_recurrent_invoice($id);
163         $from = calculate_from($myrow);
164         $to = add_months($from, $myrow['monthly']);
165         $to = add_days($to, $myrow['days']);
166
167         if (!is_date_in_fiscalyear($date))
168                 display_error(_("The entered date is out of fiscal year or is closed for further data entry."));
169         elseif (!date1_greater_date2(add_days(Today(), 1), $to))
170                 display_error(_("Recurrent invoice cannot be generated before last day of covered period."));
171         elseif (check_recurrent_invoice_prices($id))
172                 display_error(_("Recurrent invoices cannot be generated because some items have no price defined in customer currency."));
173         elseif (!check_sales_order_type($myrow['order_no']))
174                 display_error(_("Recurrent invoices cannot be generated because selected sales order template uses prepayment sales terms. Change payment terms and try again."));
175         else {
176                 $count = recurrent_invoice_count($id);
177
178                 $_POST['trans_date'] = $to;
179                 start_form();
180                 start_table(TABLESTYLE, "width=50%");
181                 label_row(_('Description:'), $myrow["description"]);
182                 label_row(_('Template:'), get_customer_trans_view_str(ST_SALESORDER, $myrow["order_no"]));
183                 label_row(_('Number of invoices:'), $count);
184                 date_row(_('Invoice date:'), 'trans_date');
185                 $newto = add_months($to, $myrow['monthly']);
186                 $newto = add_days($newto, $myrow['days']);
187                 text_row(_('Invoice notice:'), 'memo', sprintf(_("Recurrent Invoice covers period %s - %s."), $to,       add_days($newto, -1)), 100, 100);
188                 //text_row(_('Invoice notice:'), 'memo', sprintf(_("Recurrent Invoice covers period %s - %s."), //$from, add_days($to, -1)), 100, 100);
189                 end_table();
190                 hidden('from', $from, true);
191                 hidden('to', $to, true);
192                 br();
193                 submit_center_first('confirmed'.$id, _('Create'), _('Create recurrent invoices'), false, ICON_OK);
194                 submit_center_last('cancel', _('Cancel'), _('Return to recurrent invoices'), false, ICON_ESCAPE);
195                 submit_js_confirm("do_create".$id, sprintf(_("You are about to issue %s invoices.\n Do you want to continue?"), $count));
196                 end_form();
197
198                 display_footer_exit();
199         }
200 }
201 else
202 {
203 $result = get_recurrent_invoices(Today());
204
205 start_form();
206 start_table(TABLESTYLE, "width=70%");
207 $th = array(_("Description"), _("Template No"),_("Customer"),_("Branch")."/"._("Group"),_("Days"),_("Monthly"),_("Begin"),_("End"),_("Next invoice"),"");
208 table_header($th);
209 $k = 0;
210 $due = false;
211 while ($myrow = db_fetch($result)) 
212 {
213         if ($myrow['overdue'])
214         {
215                 start_row("class='overduebg'");
216                 $due = true;
217         }
218         else
219                 alt_table_row_color($k);
220
221         label_cell($myrow["description"]);
222         label_cell(get_customer_trans_view_str(ST_SALESORDER, $myrow["order_no"]), "nowrap align='right'");
223         if ($myrow["debtor_no"] == 0)
224         {
225                 label_cell("");
226
227                 label_cell(get_sales_group_name($myrow["group_no"]));
228         }
229         else
230         {
231                 label_cell(get_customer_name($myrow["debtor_no"]));
232                 label_cell(get_branch_name($myrow['group_no']));
233         }
234         label_cell($myrow["days"]);
235         label_cell($myrow['monthly']);
236         label_cell(sql2date($myrow['begin']),  "align='center'");
237         label_cell(sql2date($myrow['end']),      "align='center'");
238         label_cell(calculate_next($myrow),      "align='center'");
239         if ($myrow['overdue'])
240         {
241                 $count = recurrent_invoice_count($myrow['id']);
242                 if ($count)
243                 {
244                         button_cell("create".$myrow["id"], sprintf(_("Create %s Invoice(s)"), $count), "", ICON_DOC, 'process');
245                 } else {
246                         label_cell('');
247                 }
248         }
249         else
250                 label_cell("");
251         end_row();
252 }
253 end_table();
254 end_form();
255 if ($due)
256         display_note(_("Marked items are due."), 1, 0, "class='overduefg'");
257 else
258         display_note(_("No recurrent invoices are due."), 1, 0);
259
260 br();
261 }
262 end_page();