Menu hotkeys system implementation.
[fa-stable.git] / reporting / includes / reports_classes.inc
1 <?php
2 class BoxReports
3 {
4         var $ar_classes;
5
6         function ReportClasses()
7         {
8                 $this->ar_classes = array();
9         }
10
11         function addReportClass($class_name)
12         {
13                 $this->ar_classes[$class_name] = array();
14         }
15
16         function addReport($class_name, $id, $rep_name, $params=null)
17         {
18                 $this->ar_classes[$class_name][] = new Report($id,$rep_name,$params);
19         }
20
21         function getDisplay($class=null)
22         {
23                 global $table_style2;
24                 $temp = array_values($this->ar_classes);
25                 $display_class = $class==null ? $temp[0] : $this->ar_classes[$class];
26                 $class_counter = 0;
27                 $rep_counter = 0;
28                 $st_reports = "";
29                 $st_params = "";
30                 $st_classes = "<b>" . _("Report Classes:") . "</b><br>";
31                 foreach($this->ar_classes as $key=>$value)
32                 {
33                         $style = $class_counter==0 ? '' : $style = "style='display:none'";
34                         $acc = access_string($key);
35                         $st_classes .= "<a href='javascript:showClass($class_counter)'$acc[1]>$acc[0]</a> <br>";
36                         $st_reports .= "<table id='TAB_" . $class_counter++ ."' $style cellpadding=0 cellspacing=0 border=0 width='100%'><tr><td><b>" . _("Reports For Class: ") . "&nbsp;$key</b></td></tr>";
37                         foreach($value as $report)
38                         {       $acc = access_string($report->name);
39                                 $st_reports .= "<tr><td><a href='javascript:showReport($rep_counter)'$acc[1]>$acc[0]</a></td></tr>";
40                                 $st_params .= "<table border=0 id='REP_" . $rep_counter++ . "' style='display:none'>";
41                                 $st_params .= "<tr><td>" . $report->getDisplay() . "</td></tr></table>";
42                         }
43                         $st_reports .= "</table>";
44                 }
45
46                 $st =   "<script language='javascript'>
47                                         function showClass(pClass) {
48                                                 for(i=0; i<$class_counter; i++) {
49                                                         eval('document.getElementById(\"TAB_\" + i).style.display=\"none\"')
50                                                 }
51                                                 eval('document.getElementById(\"TAB_\" + pClass).style.display=\"block\"')
52                                                 for (i=0; i<$rep_counter; i++) {
53                                                         eval('document.getElementById(\"REP_\" + i).style.display=\"none\"')
54                                                 }
55                                         }
56                                         function showReport(pId) {
57                                                 var tab;
58                                                 for(i=0; i<$rep_counter; i++) {
59                                                         eval('document.getElementById(\"REP_\" + i).style.display=\"none\"')
60                                                 }
61                                                 eval('document.getElementById(\"REP_\" + pId).style.display=\"block\"')
62                                         }
63                                 </script>
64                                 ";
65                 $st .= "<table align='center' width='80%' $table_style2><tr valign='top'>";
66                 $st .= "<td width='30%'>$st_classes</td>";
67                 $st .= "<td width='35%'>$st_reports</td>";
68                 $st .= "<td width='35%'>$st_params</td>";
69                 $st .= "</tr></table><br>";
70
71                 return $st;
72         }
73 }
74
75 class Report
76 {
77         var $id;
78         var $name;
79         var $ar_params;
80
81         function Report($id, $name, $ar_params)
82         {
83                 $this->id                       = $id;
84                 $this->name             = $name;
85                 $this->ar_params        = $ar_params;
86         }
87         function getDisplay()
88         {
89                 global $comp_path, $path_to_root, $use_date_picker;
90
91                 $rep_file = $comp_path.'/'.user_company().
92                      "/reporting/rep".$this->id.".php";
93                 if (!file_exists($rep_file))
94                     $rep_file = $path_to_root ."/reporting/rep".$this->id.".php";
95
96                 $st = "
97 <script language='javascript'>
98         function displayReport_" . $this->id . "() {
99                 pParamCount = " . count($this->ar_params) . ";
100                 document.forms[0].REP_ID.value = " . $this->id . ";
101                 document.forms[0].PARAM_COUNT.value = pParamCount;
102                 for (i=0; i<pParamCount; i++) {
103                         eval('document.forms[0].PARAM_' + i + '.value=document.forms[0].RP_" . $this->id . "_' + i + '.value');
104                 }
105
106                 window.open('','REP_WINDOW','toolbar=no,scrollbar=no,resizable=yes,menubar=no');
107                 document.forms[0].target='REP_WINDOW';
108                 document.forms[0].action= '$rep_file';
109                 document.forms[0].submit();
110         }
111         function checkDate(pObj) {
112                 var re = /^(3[01]|0[1-9]|[12]\d)\/(0[1-9]|1[012])\/\d{4}/;
113                 if (re.test(pObj.value)==false) {
114                         alert('" . _("Invalid date format") . "')
115                 }
116         }
117 </script>
118                         ";
119                 $st .= "<input type='button' onclick='javascript:displayReport_" . $this->id ."()' value='" . _("Display: ") . $this->name . "'><br><br>";
120                 $dummy = "";
121                 if ($this->ar_params==null)
122                         return "";
123                 foreach($this->ar_params as $index=>$param)
124                 {
125                         $st .= $param->param_name . ':<br>';
126                         switch ($param->param_type)
127                         {
128                                 case 'CURRENCY':
129                                         $sql = "SELECT curr_abrev, concat(curr_abrev,' - ', currency) FROM ".TB_PREF."currencies";
130                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Currency Filter"));
131                                         break;
132                                 case 'DATE':
133                                 case 'DATEBEGIN':
134                                 case 'DATEEND':
135                                 case 'DATEBEGINM':
136                                 case 'DATEENDM':
137                                 case 'DATEBEGINTAX':
138                                 case 'DATEENDTAX':
139                                         if ($param->param_type == 'DATEBEGIN')
140                                                 $date = begin_fiscalyear();
141                                         elseif ($param->param_type == 'DATEEND')
142                                                 $date = end_fiscalyear();
143                                         else
144                                                 $date = Today();
145                                         if ($param->param_type == 'DATEBEGINM')
146                                                 $date = begin_month($date);
147                                         elseif ($param->param_type == 'DATEENDM')
148                                                 $date = end_month($date);
149                                         elseif ($param->param_type == 'DATEBEGINTAX' || $param->param_type == 'DATEENDTAX')
150                                         {
151                                                 $row = get_company_prefs();
152                                                 $edate = add_months($date, -$row['tax_last']);
153                                                 $edate = end_month($edate);
154                                                 if ($param->param_type == 'DATEENDTAX')
155                                                         $date = $edate;
156                                                 else
157                                                 {
158                                                         $bdate = add_months($edate, -$row['tax_prd'] + 1);
159                                                         $date = begin_month($bdate);
160                                                 }
161                                         }
162                                         $name = "RP_" . $this->id . "_$index";
163                                         //$st .= "<input type='text' name='$name' value='$date' onblur='javascript:checkDate(this)'>";
164                                         $st .= "<input type='text' name='$name' value='$date'>";
165                                         if ($use_date_picker)
166                                                 $st .= "<a href=\"javascript:date_picker(document.forms[0].$name);\">"
167                                                 . "     <img src='$path_to_root/themes/default/images/cal.gif' width='16' height='16' border='0' alt='"._('Click Here to Pick up the date')."'></a>\n";
168
169                                         break;
170                                 case 'YES_NO':
171                                         $sel = array(_('No'), _("Yes"));
172                                         $st .= dup_simple_name_list("RP_" . $this->id . "_$index", $sel);
173                                         break;
174                                 case 'PAYMENT_LINK':
175                                         $sel = array(_("No Payment Link"), "PayPal");
176                                         $st .= dup_simple_name_list("RP_" . $this->id . "_$index", $sel);
177                                         break;
178                                 case 'COMPARE':
179                                         $sel = array(_("Accumulated"), _("Period Y-1"), _("Budget"));
180                                         $st .= dup_simple_name_list("RP_" . $this->id . "_$index", $sel);
181                                         break;
182                                 case 'GRAPHIC':
183                                         $sel = array(_("No Graphics"), _("Vertical bars"), _("Horizontal bars"), _("Dots"), _("Lines"), _("Pie"), _("Donut"));
184                                         $st .= dup_simple_name_list("RP_" . $this->id . "_$index", $sel);
185                                         break;
186                                 case 'SYS_TYPES':
187                                         $st .= dup_systypes_list("RP_" . $this->id . "_$index", $dummy, true, _("No Type Filter"), true);
188                                         break;
189                                 case 'TEXT':
190                                         $st .= "<input type='text' name='RP_" . $this->id . "_$index'>";
191                                         break;
192                                 case 'TEXTBOX':
193                                         $st .= "<textarea rows=4 cols=30 name='RP_" . $this->id . "_$index'></textarea>";
194                                         break;
195                                 case 'ACCOUNTS':
196                                         $sql = "SELECT id, name FROM ".TB_PREF."chart_types ORDER BY name";
197                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Account Group Filter"), true);
198                                         break;
199                                 case 'GL_ACCOUNTS':
200                                         $sql = "SELECT account_code, concat(account_code, ' - ', account_name) as account_name FROM ".TB_PREF."chart_master ORDER BY account_code";
201                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
202                                         break;
203                                 case 'BANK_ACCOUNTS':
204                                         $sql = "SELECT ".TB_PREF."bank_accounts.account_code, concat(bank_account_name, if (bank_curr_code=curr_default,'', concat(' - ', bank_curr_code))) FROM ".TB_PREF."bank_accounts, ".TB_PREF."chart_master, ".TB_PREF."company
205                                                 WHERE ".TB_PREF."bank_accounts.account_code=".TB_PREF."chart_master.account_code";
206                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
207                                         break;
208                                 case 'DIMENSION':
209                                         $sql = "SELECT reference, concat(reference, ' - ', name) AS DimName FROM ".TB_PREF."dimensions ORDER BY reference";
210                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
211                                         break;
212                                 case 'DIMENSIONS':
213                                         $sql = "SELECT reference, concat(reference, ' - ', name) as DimName FROM ".TB_PREF."dimensions ORDER BY reference";
214                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Dimension Filter"), true);
215                                         break;
216                                 case 'DIMENSION1':
217                                         $sql = "SELECT reference, concat(reference, ' - ', name) AS DimName FROM ".TB_PREF."dimensions WHERE type_=1 ORDER BY reference";
218                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
219                                         break;
220                                 case 'DIMENSIONS1':
221                                         $sql = "SELECT reference, concat(reference, ' - ', name) as DimName FROM ".TB_PREF."dimensions WHERE type_=1 ORDER BY reference";
222                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Dimension Filter"), true);
223                                         break;
224                                 case 'DIMENSION2':
225                                         $sql = "SELECT reference, concat(reference, ' - ', name) AS DimName FROM ".TB_PREF."dimensions WHERE type_=2 ORDER BY reference";
226                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
227                                         break;
228                                 case 'DIMENSIONS2':
229                                         $sql = "SELECT reference, concat(reference, ' - ', name) as DimName FROM ".TB_PREF."dimensions WHERE type_=2 ORDER BY reference";
230                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Dimension Filter"), true);
231                                         break;
232                                 case 'CUSTOMERS_NO_FILTER':
233                                 case 'CUSTOMERS':
234                                         $sql = "SELECT debtor_no, name FROM ".TB_PREF."debtors_master ORDER BY name";
235                                         if ($param->param_type == 'CUSTOMERS_NO_FILTER')
236                                                 $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Customer Filter"), true);
237                                         else
238                                                 $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
239                                         break;
240                                 case 'SUPPLIERS_NO_FILTER':
241                                 case 'SUPPLIERS':
242                                         $sql = "SELECT supplier_id, supp_name FROM ".TB_PREF."suppliers ORDER BY supp_name";
243                                         if ($param->param_type == 'SUPPLIERS_NO_FILTER')
244                                                 $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Supplier Filter"), true);
245                                         else
246                                                 $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
247                                         break;
248                                 case 'INVOICE':
249                                         $IV = _("IV");
250                                         $CN = _("CN");
251                                         $sql = "SELECT concat(".TB_PREF."debtor_trans.trans_no, '-',
252                                                 ".TB_PREF."debtor_trans.type) AS TNO, concat(".TB_PREF."debtor_trans.trans_no, if (type=10, ' $IV ', ' $CN '), ".TB_PREF."debtors_master.name) as IName
253                                                 FROM ".TB_PREF."debtors_master, ".TB_PREF."debtor_trans WHERE (type=10 OR type=11) AND ".TB_PREF."debtors_master.debtor_no=".TB_PREF."debtor_trans.debtor_no ORDER BY ".TB_PREF."debtor_trans.trans_no DESC";
254                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
255                                         break;
256                                 case 'DELIVERY':
257                                         $DN = _("DN");
258                                         $sql = "SELECT
259                                         concat(".TB_PREF."debtor_trans.trans_no, '-', ".TB_PREF."debtor_trans.type) AS TNO, concat(".TB_PREF."debtor_trans.trans_no, ' $DN ',
260                                          ".TB_PREF."debtors_master.name) as IName
261                                                 FROM ".TB_PREF."debtors_master, ".TB_PREF."debtor_trans
262                                                 WHERE type=13 AND ".TB_PREF."debtors_master.debtor_no=".
263                                                 TB_PREF."debtor_trans.debtor_no ORDER BY ".TB_PREF."debtor_trans.trans_no DESC";
264                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
265                                         break;
266                                 case 'ORDERS':
267                                         $sql = "SELECT ".TB_PREF."sales_orders.order_no, concat(".TB_PREF."sales_orders.order_no, '-',
268                                                 ".TB_PREF."debtors_master.name) as IName
269                                                 FROM ".TB_PREF."debtors_master, ".TB_PREF."sales_orders WHERE ".TB_PREF."debtors_master.debtor_no=".TB_PREF."sales_orders.debtor_no ORDER BY ".TB_PREF."sales_orders.order_no DESC";
270                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
271                                         break;
272                                 case 'PO':
273                                         $sql = "SELECT ".TB_PREF."purch_orders.order_no, concat(".TB_PREF."purch_orders.order_no, '-',
274                                                 ".TB_PREF."suppliers.supp_name) as IName
275                                                 FROM ".TB_PREF."suppliers, ".TB_PREF."purch_orders WHERE ".TB_PREF."suppliers.supplier_id=".TB_PREF."purch_orders.supplier_id ORDER BY ".TB_PREF."purch_orders.order_no DESC";
276                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
277                                         break;
278                                 case 'ITEMS':
279                                         $sql = "SELECT stock_id, concat(stock_id, '-', description) as name FROM ".TB_PREF."stock_master WHERE (mb_flag='A' OR mb_flag='M') ORDER BY stock_id";
280                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
281                                         break;
282                                 case 'LOCATIONS':
283                                         $sql = "SELECT loc_code, location_name FROM ".TB_PREF."locations ORDER BY location_name";
284                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Location Filter"), false);
285                                         break;
286                                 case 'CATEGORIES':
287                                         $sql = "SELECT category_id, description FROM ".TB_PREF."stock_category ORDER BY description";
288                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Category Filter"), true);
289                                         break;
290                                 case 'SALESTYPES':
291                                         $sql = "SELECT id, sales_type FROM ".TB_PREF."sales_types ORDER BY sales_type";
292                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
293                                         break;
294                                 case 'AREAS':
295                                         $sql = "SELECT area_code, description FROM ".TB_PREF."areas ORDER BY description";
296                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Area Filter"), true);
297                                         break;
298                                 case 'SALESMEN':
299                                         $sql = "SELECT salesman_code, salesman_name FROM ".TB_PREF."salesman ORDER BY salesman_name";
300                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Sales Folk Filter"), true);
301                                         break;
302                                 case 'TRANS_YEARS':
303                                         $sql = "SELECT DISTINCT YEAR(tran_date), YEAR(tran_date) FROM ".TB_PREF."gl_trans";
304                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
305                                         break;
306                                 case 'ACCOUNTS_NO_FILTER':
307                                         $sql = "SELECT id, name FROM ".TB_PREF."chart_types ORDER BY name";
308                                         $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy);
309                                         break;
310
311                         }
312                         $st .= "<br><br>";
313                 }
314                 return $st;
315         }
316 }
317
318 class ReportParam
319 {
320         var $param_name;
321         var $param_type;
322
323         function ReportParam($param_name, $param_type)
324         {
325                 $this->param_name = $param_name;
326                 $this->param_type = $param_type;
327         }
328 }
329
330 function dup_simple_codeandname_list($sql, $name, &$selected_id,
331         $all_option=false, $all_option_name=null, $all_option_numeric=false,
332         $submit_on_change=false)
333 {
334         if ($submit_on_change == true)
335                 $st = "<select name='$name' onchange='this.form.submit();'>";
336         else
337                 $st = "<select name='$name'>";
338
339         if ($all_option == true)
340         {
341                 if ($all_option_numeric)
342                         $reserved_word = reserved_words::get_all_numeric();
343                 else
344                         $reserved_word = reserved_words::get_all();
345
346         if ($reserved_word == $selected_id)
347         {
348              $st .= "<option selected value='" . $reserved_word . "'>" . $all_option_name . "</option>\n";
349         }
350         else
351         {
352              $st .= "<option value='" . $reserved_word . "'>" . $all_option_name . "</option>\n";
353         }
354                 if ($selected_id == "")
355                 {
356                         $selected_id =  $reserved_word;
357                 }
358         }
359
360         $result = db_query($sql);
361
362         while ($row = db_fetch_row($result))
363         {
364                 if ($selected_id == $row[0])
365                 {
366                         $st .= "<option selected value='" . $row[0] . "'>";
367                 }
368                 else
369                 {
370                         $st .= "<option value='" . $row[0] . "'>";
371                 }
372                 $st .= $row[1] . "</option>\n";
373
374                 if ($selected_id == "")
375                 {
376                         $selected_id = $row[0];
377                 }
378         }
379
380         $st .= "</select>";
381         db_free_result($result);
382
383         return $st;
384 }
385
386 function dup_simple_name_list($name, $selections)
387 {
388         $st = "<select name='$name'>";
389         for ($i = 0; $i < count($selections); $i++)
390                 $st .= "<option value='" . $i . "'>" . $selections[$i] . "</option>\n";
391         $st .= "</select>";
392         return $st;
393 }
394
395 //------------------------------------------------------------------------------------------------
396
397 function dup_systypes_list($name, &$selected_id, $all_option=false, $all_option_name=null)
398 {
399         global $systypes_array;
400
401         $st = "<select name='$name'>";
402         if ($all_option == true)
403         {
404                 $reserved_word = reserved_words::get_all_numeric();
405         if ($reserved_word == $selected_id)
406              $st .= "<option selected value='" . $reserved_word . "'>" . $all_option_name . "</option>\n";
407         else
408              $st .= "<option value='" . $reserved_word . "'>" . $all_option_name . "</option>\n";
409                 if ($selected_id == "")
410                         $selected_id = $reserved_word;
411         }
412
413         foreach ($systypes_array as $i => $value)
414         {
415                 if ($i == 16 || $i == 18 || $i == 25 || ($i >= 28 && $i <= 30) || $i >= 40)
416                         continue;
417         $st .= "<option" . ($selected_id == $i ? " selected" : "") . " value='$i'>" . $value['name'] . "</option>\n";
418         }
419     $st .= "</select>";
420         return $st;
421 }
422
423
424 ?>