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 include_once($path_to_root . "/reporting/includes/Workbook.php");
13 include_once($path_to_root . "/admin/db/company_db.inc");
14 include_once($path_to_root . "/admin/db/fiscalyears_db.inc");
15 include_once($path_to_root . "/config.php");
17 class FrontReport extends Spreadsheet_Excel_Writer_Workbook
29 var $bottomMargin = 0;
50 var $formatHeaderLeft;
51 var $formatHeaderRight;
53 var $formatAmount = array();
57 function FrontReport($title, $filename, $size = 'A4', $fontsize = 9)
59 global $comp_path, $dateseps, $page_security;
60 if (!$_SESSION["wa_current_user"]->can_access_page($page_security))
62 display_error(_("The security settings on your account do not permit you to print this report"));
67 $this->title = $title;
68 $this->lineHeight = 12;
69 $this->fontSize = $fontsize;
70 $this->oldFontSize = 0;
73 $rtl = ($_SESSION['language']->dir == 'rtl');
74 $this->code = strtolower($_SESSION['language']->encoding);
75 $this->filename = $filename.".xls";
76 $this->unique_name = uniqid('').".xls";
77 $this->path = $comp_path.'/'.user_company(). '/pdf_files';
78 $this->Spreadsheet_Excel_Writer_Workbook($this->path."/".$this->unique_name);
79 //$this->setCountry(48);
80 if ($this->code != "iso-8859-1")
81 $this->setVersion(8); // set biff version to 8 (0x0006 internal)
82 $this->sheet =& $this->addWorksheet($this->title);
83 if ($this->code != "iso-8859-1")
84 $this->sheet->setInputEncoding($this->code); // set sheet encoding
86 $this->sheet->setRTL();
87 $this->formatTitle =& $this->addFormat();
88 $this->formatTitle->setSize(16);
89 $this->formatTitle->setBold();
90 $this->formatTitle->setAlign($rtl ? 'right' : 'left');
91 $this->formatTitle->setTop(2);
92 $this->formatTitle->setTopColor('gray');
94 $how = user_date_format();
95 $sep = $dateseps[user_date_sep()];
100 $dateformat_long = "mm{$sep}dd{$sep}yyyy\ \ hh:mm\ am/pm";
101 $dateformat = "mm{$sep}dd{$sep}yyyy";
105 $dateformat_long = "dd{$sep}mm{$sep}yyyy\ \ hh:mm";
106 $dateformat = "dd{$sep}mm{$sep}yyyy";
110 $dateformat_long = "yyyy{$sep}mm{$sep}dd\ \ hh:mm";
111 $dateformat = "yyyy{$sep}mm{$sep}dd";
113 $this->formatDateTime =& $this->addFormat();
114 $this->formatDateTime->setNumFormat($dateformat_long);
115 $this->formatDateTime->setAlign($rtl ? 'right' : 'left');
116 $this->formatDate =& $this->addFormat();
117 $this->formatDate->setNumFormat($dateformat);
118 $this->formatDate->setAlign($rtl ? 'right' : 'left');
119 $this->formatRight =& $this->addFormat();
120 $this->formatRight->setAlign($rtl ? 'left' : 'right');
121 $this->formatLeft =& $this->addFormat();
122 $this->formatLeft->setAlign($rtl ? 'right' : 'left');
124 $this->formatHeaderLeft =& $this->addFormat();
125 $this->formatHeaderLeft->setItalic();
126 $this->formatHeaderLeft->setTop(2);
127 $this->formatHeaderLeft->setTopColor('gray');
128 $this->formatHeaderLeft->setBottom(2);
129 $this->formatHeaderLeft->setBottomColor('gray');
130 $this->formatHeaderLeft->setAlign('vcenter');
131 $this->formatDate->setAlign($rtl ? 'right' : 'left');
132 $this->formatHeaderRight =& $this->addFormat();
133 $this->formatHeaderRight->setItalic();
134 $this->formatHeaderRight->setTop(2);
135 $this->formatHeaderRight->setTopColor('gray');
136 $this->formatHeaderRight->setBottom(2);
137 $this->formatHeaderRight->setBottomColor('gray');
138 $this->formatHeaderRight->setAlign('vcenter');
139 $this->formatHeaderRight->setAlign('right');
140 $this->formatFooter =& $this->addFormat();
141 $this->formatFooter->setTop(2);
142 $this->formatFooter->setTopColor('gray');
145 function NumFormat($dec)
147 if (!isset($this->formatAmount[$dec]))
149 //global $thoseps,$decseps;
151 //$tsep = $thoseps[user_tho_sep()];
152 //$dsep = $decseps[user_dec_sep()];
155 $format = "###{$tsep}###{$tsep}###{$tsep}##0";
157 $format .= "{$dsep}".str_repeat('0',$dec);
158 $this->formatAmount[$dec] =& $this->addFormat();
159 $this->formatAmount[$dec]->setNumFormat($format);
160 $this->formatAmount[$dec]->setAlign('right');
162 return $this->formatAmount[$dec];
165 function Font($style = 'normal')
169 function Info($params, $cols, $headers, $aligns,
170 $cols2 = null, $headers2 = null, $aligns2 = null)
172 global $app_title, $version, $power_by, $power_url;
173 $this->company = get_company_prefs();
174 $year = get_current_fiscalyear();
175 if ($year['closed'] == 0)
179 $this->fiscal_year = sql2date($year['begin']) . " - " . sql2date($year['end']) . " " . "(" . $how . ")";
180 $this->user = $_SESSION["wa_current_user"]->name;
181 $this->host = $_SERVER['SERVER_NAME'];
182 $this->params = $params;
184 $this->headers = $headers;
185 $this->aligns = $aligns;
186 $this->cols2 = $cols2;
187 $this->headers2 = $headers2;
188 $this->aligns2 = $aligns2;
189 $this->numcols = count($this->headers);
190 $tcols = count($this->headers2);
191 if ($tcols > $this->numcols)
192 $this->numcols = $tcols;
193 for ($i = 0; $i < $this->numcols; $i++)
194 $this->sheet->setColumn($i, $i, $this->px2units($this->cols[$i + 1] - $this->cols[$i]));
200 $tcol = $this->numcols - 1;
201 $this->sheet->setRow($this->y, 20);
202 for ($i = 0; $i < $this->numcols; $i++)
203 $this->sheet->writeBlank($this->y, $i, $this->formatTitle);
204 $this->sheet->writeString($this->y, 0, $this->title, $this->formatTitle);
205 $this->sheet->mergeCells($this->y, 0, $this->y, $tcol);
207 $str = _("Print Out Date") . ':';
208 $this->sheet->writeString($this->y, 0, $str, $this->formatLeft);
209 $this->sheet->writeString($this->y, 1, Today() . " ".Now(), $this->formatLeft);
210 $this->sheet->writeString($this->y, $tcol-1, $this->company['coy_name'], $this->formatLeft);
211 $this->sheet->mergeCells($this->y, $tcol-1, $this->y, $tcol);
213 $str = _("Fiscal Year") . ':';
214 $this->sheet->writeString($this->y, 0, $str, $this->formatLeft);
215 $str = $this->fiscal_year;
216 $this->sheet->writeString($this->y, 1, $str, $this->formatLeft);
217 $this->sheet->writeString($this->y, $tcol-1, $this->host, $this->formatLeft);
218 $this->sheet->mergeCells($this->y, $tcol-1, $this->y, $tcol);
219 for ($i = 1; $i < count($this->params); $i++)
221 if ($this->params[$i]['from'] != '')
224 $str = $this->params[$i]['text'] . ':';
225 $this->sheet->writeString($this->y, 0, $str);
226 $str = $this->params[$i]['from'];
227 if ($this->params[$i]['to'] != '')
228 $str .= " - " . $this->params[$i]['to'];
229 $this->sheet->writeString($this->y, 1, $str, $this->formatLeft);
232 $this->sheet->writeString($this->y, $tcol-1, $this->user, $this->formatLeft);
233 $this->sheet->mergeCells($this->y, $tcol-1, $this->y, $tcol);
237 if ($this->params[0] != '') // Comments
240 $str = _("Comments") . ':';
241 $this->sheet->writeString($this->y, 0, $str, $this->formatLeft);
242 $this->sheet->writeString($this->y, 1, $this->params[0], $this->formatLeft);
245 if ($this->headers2 != null)
247 for ($i = 0, $j = 0; $i < $this->numcols; $i++)
249 if ($this->cols2[$j] >= $this->cols[$i] && $this->cols2[$j] <= $this->cols[$i + 1])
251 if ($this->aligns2[$j] == "right")
252 $this->sheet->writeString($this->y, $i, $this->headers2[$j], $this->formatHeaderRight);
254 $this->sheet->writeString($this->y, $i, $this->headers2[$j], $this->formatHeaderLeft);
258 $this->sheet->writeString($this->y, $i, "", $this->formatHeaderLeft);
263 for ($i = 0; $i < $this->numcols; $i++)
265 if (!isset($this->headers[$i]))
268 $header = $this->headers[$i];
269 if ($this->aligns[$i] == "right")
270 $this->sheet->writeString($this->y, $i, $header, $this->formatHeaderRight);
272 $this->sheet->writeString($this->y, $i, $header, $this->formatHeaderLeft);
277 function Header2($myrow, $branch, $sales_order, $bankaccount, $doctype)
282 function AddImage($logo, $x, $y, $w, $h)
287 function SetDrawColor($r, $g, $b)
292 function SetTextColor($r, $g, $b)
297 function Text($c, $txt, $n=0, $corr=0, $r=0)
302 function TextWrap($xpos, $ypos, $len, $str, $align = 'left')
307 function TextCol($c, $n, $txt, $corr=0, $r=0)
309 if ($this->aligns[$c] == 'right')
310 $this->sheet->writeString($this->y, $c, $txt, $this->formatRight);
312 $this->sheet->writeString($this->y, $c, $txt, $this->formatLeft);
314 $this->sheet->mergeCells($this->y, $c, $this->y, $n - 1);
317 function AmountCol($c, $n, $txt, $dec=0, $corr=0, $r=0)
319 if (!is_numeric($txt))
321 $this->sheet->writeNumber($this->y, $c, $txt, $this->NumFormat($dec));
324 function DateCol($c, $n, $txt, $conv=false, $corr=0, $r=0)
327 $txt = date2sql($txt);
328 list($year, $mo, $day) = explode("-", $txt);
329 $date = $this->ymd2date((int)$year, (int)$mo, (int)$day);
330 $this->sheet->writeNumber($this->y, $c, $date, $this->formatDate);
333 function TextCol2($c, $n, $txt, $corr=0, $r=0)
335 $this->sheet->writeString($this->y, $c, $txt, $this->formatLeft);
337 $this->sheet->mergeCells($this->y, $c, $this->y, $n - 1);
340 function TextColLines($c, $n, $txt, $corr=0, $r=0)
345 function TextWrapLines($c, $width, $txt, $align='left')
350 function LineTo($from, $row, $to, $row2)
355 function Line($row, $height = 0)
360 function NewLine($l=1, $np=0)
365 function ymd2Date($year, $mon, $day) // XLS internal date representation is a number between 1900-01-01 and 2078-12-31
366 { // if we need the time part too, we have to add this value after a decimalpoint.
367 $mo = array(0,31,28,31,30,31,30,31,31,30,31,30,31);
370 if (($year % 4) == 0)
378 elseif ($day > $mo[$mon])
382 elseif ($year > $MAXYEAR)
385 for ($n = 1; $n < $mon; $n++)
389 for ($n = $BASE; $n < $year; $n++)
398 function px2units($px) // XLS app conversion. Not bulletproof.
400 $excel_column_width_factor = 256;
401 $unit_offset_length = 6.5;
402 return ($px / $unit_offset_length);
405 function End($email=0, $subject=null, $myrow=null, $doctype = 0)
407 for ($i = 0; $i < $this->numcols; $i++)
408 $this->sheet->writeBlank($this->y, $i, $this->formatFooter);
409 $this->sheet->mergeCells($this->y, 0, $this->y, $this->numcols - 1);
411 // first have a look through the directory,
412 // and remove old temporary pdfs
413 if ($d = @opendir($this->path)) {
414 while (($file = readdir($d)) !== false) {
415 if (!is_file($this->path.'/'.$file) || $file == 'index.php') continue;
416 // then check to see if this one is too old
417 $ftime = filemtime($this->path.'/'.$file);
418 // seems 3 min is enough for any report download, isn't it?
419 if (time()-$ftime > 180){
420 unlink($this->path.'/'.$file);
425 meta_forward($_SERVER['PHP_SELF'], "xls=1&filename=$this->filename&unique=$this->unique_name");