/modules/report/class.Report.php
PHP | 681 lines | 525 code | 93 blank | 63 comment | 80 complexity | d6410c4489821dcdabf6d52bb309985a MD5 | raw file
- <?php
-
- /**
- * AgileBill - Open Billing Software
- *
- * This body of work is free software; you can redistribute it and/or
- * modify it under the terms of the Open AgileBill License
- * License as published at http://www.agileco.com/agilebill/license1-4.txt
- *
- * For questions, help, comments, discussion, etc., please join the
- * Agileco community forums at http://forum.agileco.com/
- *
- * @link http://www.agileco.com/
- * @copyright 2004-2008 Agileco, LLC.
- * @license http://www.agileco.com/agilebill/license1-4.txt
- * @author Tony Landis <tony@agileco.com> and Thralling Penguin, LLC <http://www.thrallingpenguin.com>
- * @package AgileBill
- * @version 1.4.93
- */
-
- class BASE_ReportFormatter {
- var $output_path;
- var $output;
-
- function setOutputDirectory($d)
- {
- $this->output_path = $d;
- }
-
- function getOutput()
- {
- return $this->output;
- }
- }
- class HTML_ReportFormatter extends BASE_ReportFormatter {
- var $indent = 0;
- var $coldata;
- var $level;
- var $div_count;
-
- function setLevel(&$level)
- {
- $this->level =& $level;
- }
-
- function setIndent($amount)
- {
- if($amount == "") return;
- $this->indent = $amount;
- }
-
- function addRow()
- {
- $this->coldata = array();
- echo " <tr>\n";
- }
-
- function endRow()
- {
- /* output the coldata */
- #if($this->indent) {
- # echo " <td width=\"{$this->indent}\"> </td>\n";
- #}
- $w = 100 / count($this->coldata);
- foreach($this->coldata as $col) {
- $tag = "td";
- if (is_a($col[1],'ReportStyle')) {
- $s = "style=\"".$col[1]->doHTML()."\"";
- if($col[1]->is_heading) $tag = "th scope=\"col\"";
- } else {
- $s = "";
- }
-
- echo " <{$tag} {$s} width=\"{$w}%\">\n";
- echo " {$col[0]}\n";
- echo " </{$tag}>\n";
- }
- echo " </tr>\n";
- }
-
- function addColumn($col, $style = '')
- {
- /* take a column and a style */
- $this->coldata[] = array($col, $style);
- }
-
- function addTable($style, $heading)
- {
- $i = $this->indent / 30; if($i<0) $i = 0;
- ++$i;
- $this->div_count = 0;
-
- if($style != 'report_heading') {
- echo '<div id="level_'.$i.'">';
- $this->div_count += 1;
- }
- if($this->indent == 0) {
- if($style != 'level') {
- echo '<div id="'.$style.'">';
- $this->div_count += 1;
- }
- }
- echo $heading;
- echo '<table width="100%" border="0" cellspacing="0">';
- echo "\n";
- }
-
- function endTable()
- {
- $i = $this->indent / 30; if($i<0) $i = 0;
- ++$i;
- echo "</table>\n";
-
- if($this->div_count == 1)
- echo "</div>\n";
- if($this->indent == 0) {
- if($this->div_count == 2)
- echo "</div>\n";
- }
- }
-
- function startDocument($title = '')
- {
- ob_start();
- echo "<html>\n";
- echo "<head>\n";
- echo "<title>{$title}</title>\n";
- echo "<link rel=\"stylesheet\" href=\"".URL."themes/default_admin/report_style.css\" type=\"text/css\">";
- echo "</head>\n<body>\n";
- }
-
- function endDocument()
- {
- echo "</body>\n</html>\n";
- $content = ob_get_contents();
- ob_end_clean();
- $this->output = $this->output_path."/report.html";
- $fp = fopen($this->output,'w');
- if($fp) {
- fwrite($fp,$content);
- fclose($fp);
- } else {
- echo 'Could not write to output file.';
- }
- }
-
- function addBreak()
- {
- echo "<br /><br /><br />";
- }
- function insertImage($file,$width,$height)
- {
- $file = basename($file);
- echo "<center><img src=\"$file\" width=\"$width\" height=\"$height\" /></center>\n";
- }
-
- function write($s)
- {
- echo $s;
- }
- }
- /**
- * Outputs the report in DOS text format
- */
- class TXT_ReportFormatter extends BASE_ReportFormatter {
- var $indent = 0;
- var $aindent;
- var $coldata;
- var $level;
-
- function setLevel(&$level)
- {
- $this->level =& $level;
- }
-
- function setIndent($amount)
- {
- if($amount == "") return;
- $this->indent = $amount;
- }
-
- function addRow()
- {
- $this->coldata = array();
- }
-
- function endRow()
- {
- /* output the coldata */
- if($this->indent) {
- $n = intval($this->indent) / 30;
- echo str_repeat(" ", $n);
- }
- $w = (100 / count($this->coldata))/100 * 80;
- foreach($this->coldata as $col) {
- echo str_pad($col[0], $w);
- }
- echo "\r\n";
- }
-
- function addColumn($col, $style = '')
- {
- /* take a column and a style */
- $this->coldata[] = array($col, $style);
- }
-
- function addTable($style, $heading=false)
- {
- if($this->indent) {
- echo "\r\n";
- $this->aindent = $this->indent;
- } else {
- echo "\r\n\r\n";
- }
- }
-
- function endTable()
- {
- if($this->indent && $this->indent != $this->aindent) echo "\r\n";
- }
-
- function startDocument($title = '')
- {
- ob_start();
- }
-
- function endDocument()
- {
- $content = ob_get_contents();
- ob_end_clean();
- $this->output = $this->output_path."/report.txt";
- $fp = fopen($this->output,'w');
- if($fp) {
- fwrite($fp,$content);
- fclose($fp);
- } else {
- echo 'Could not write to output file.';
- }
- }
-
- function addBreak()
- {
- echo "\r\n\r\n";
- }
-
- function insertImage($file,$width,$height)
- {
- $file = basename($file);
- echo "\r\nSee file: $file\r\n";
- }
-
- function write($s)
- {
-
- }
- }
- class PDF_ReportFormatter extends BASE_ReportFormatter {
- var $indent = 0;
- var $aindent;
- var $coldata;
- var $pdf;
- var $y;
- var $level;
-
- function write($s)
- {
-
- }
-
- function setIndent($amount)
- {
- if($amount == "") return;
- $this->indent = intval($amount);
- }
-
- function addRow()
- {
- $this->coldata = array();
- }
-
- function endRow()
- {
- $x = 9;
- $n = 0;
- /* output the coldata */
- if($this->indent) {
- $n = $this->indent / 30;
- $x += ($n * 9);
- }
- $w = round((100 / count($this->coldata))/100 * (190 - ($n*9)));
- $tx = $x;
- foreach($this->coldata as $col) {
- if (is_a($col[1],'ReportStyle')) {
- /* set the bounding area */
- $col[1]->setBounds($tx,$this->y,$tx + $w,$this->y + 5);
- $col[1]->doPDF($this->pdf);
- } else {
- $tmp = new ReportStyle;
- $tmp->doPDF($this->pdf);
- }
- #echo "x={$tx} y={$this->y} data={$col[0]} style={$col[1]}<br>";
- $this->pdf->Text($tx, $this->y,$col[0]);
- $tx += $w;
- }
- $this->addY(5, true);
- }
-
- function addY($y, $repeatLabels = false)
- {
- $this->y += $y;
- if ($this->y > 275) {
- $this->pdf->AddPage();
- $this->y = 5;
- if($repeatLabels)
- $this->level->addHeaderLabels();
- }
- }
-
- function setLevel(&$level)
- {
- $this->level =& $level;
- }
-
- function addColumn($col, $style = '')
- {
- /* take a column and a style */
- $this->coldata[] = array($col, $style);
- }
-
- function addTable($style, $heading='')
- {
- if($this->indent) {
- $this->addY(5);
- $this->aindent = $this->indent;
- } else {
- $this->addY(10);
- }
-
- # if we're close to the end, goto next page
- if($this->y > 250) $this->addY(1000);
- }
-
- function endTable()
- {
- if($this->indent && $this->indent != $this->aindent) $this->addY(5);
- }
-
- function startDocument($title = '')
- {
- require_once(PATH_INCLUDES.'pdf/fpdi.php');
- require_once(PATH_INCLUDES.'pdf/fpdf_tpl.php');
- require_once(PATH_INCLUDES.'pdf/fpdf.php');
-
- $this->pdf = new fpdi;
- $this->pdf->addPage();
- $this->y = 5;
- }
-
- function endDocument()
- {
- $file = $this->output_path."/report.pdf";
- $this->output = $file;
- $this->pdf->Output($file,'F');
- }
- function addBreak()
- {
- $this->addY(10);
- }
- function insertImage($file,$width,$height)
- {
- $w = $width / 11.81102 * 2.5;
- $h = $height / 11.81102 * 2.5;
- $y = $this->y + 5;
- $x = 105 - ($w/2);
- #echo 'Place image at 0,'.$y." $w x $h<br>";
- $this->pdf->Image($file, $x, $y, $w, $h);
- $this->y = $y + $h + 5;
- }
- }
- class ReportStyle {
- var $font_weight;
- var $font_family;
- var $font_height;
- var $bg_color;
- var $is_heading;
- var $tx, $ty, $bx, $by;
-
- function ReportStyle()
- {
- $this->font_weight = '';
- $this->font_family = 'times';
- $this->font_height = 10;
- $this->is_heading = false;
- }
-
- function fontFamily($f)
- {
- $this->font_family = $f;
- }
-
- function fontHeight($h)
- {
- $this->font_height = $h;
- }
-
- function bold()
- {
- $this->font_weight = 'bold';
- }
-
- function backgroundColor($r,$g,$b)
- {
- $this->bg_color = array($r,$g,$b);
- }
-
- function setBounds($x1,$y1,$x2,$y2)
- {
- $this->tx = $x1; $this->ty = $y1;
- $this->bx = $x2; $this->by = $y2;
- #echo "BOUNDS: $x1 x $y1 x $x2 x $y2<br>";
- }
-
- /**
- * Generates the PDF style
- */
- function doPDF(&$pdf)
- {
- if(is_array($this->bg_color)) {
- $x1 = $this->tx;
- $y1 = $this->ty - ($this->font_height * 0.352777778);
- $w = $this->bx - $this->tx;
- $h = $this->by - $this->ty;
- $pdf->SetFillColor($this->bg_color[0],$this->bg_color[1],$this->bg_color[2]);
- $pdf->Rect($x1,$y1,$w,$h,'F');
- #echo "BOX: $x1 x $y1 x $w x $h<br>";
- }
-
- $b = ($this->font_weight == 'bold' ? "B" : "");
-
- $pdf->SetFont($this->font_family,$b,$this->font_height);
- }
-
- /**
- * Generates the HTML style
- */
- function doHTML()
- {
- $s = "font-family: {$this->font_family}; font-size: {$this->font_height}pt;";
- if($this->font_weight == 'bold')
- $s .= " font-weight: bold;";
- if(is_array($this->bg_color)) {
- $s .= " background-color: #";
- $s .= str_pad(dechex($this->bg_color[0]), 2, '0', STR_PAD_LEFT);
- $s .= str_pad(dechex($this->bg_color[1]), 2, '0', STR_PAD_LEFT);
- $s .= str_pad(dechex($this->bg_color[2]), 2, '0', STR_PAD_LEFT);
- $s .= ";";
- }
- $s="";
- return $s;
- }
- }
- /**
- * This class is a adaptor pattern that serves to place a break in the formatting of the report.
- */
- class Report_BreakAdaptor {
- function display($grouping, $aggregate, &$formatter)
- {
- $formatter->addBreak();
- }
- }
- require_once PATH_MODULES.'report/class.Level.php';
- class Report_DivAdaptor extends Level_Base {
- var $id;
- var $lev_setting;
- var $lev_fields;
- var $lev_items;
- var $indent_html;
- var $SQL_filtered;
- var $group_level;
- var $grouping_criteria;
- var $has_title;
- var $formatter;
-
- function display($grouping, $aggregate, &$formatter)
- {
- $this->formatter =& $formatter;
- #echo "<div id=\"{$this->id}\">";
- if(isset($this->lev_items) && is_array($this->lev_items)) {
- foreach ($this->lev_items as $item) {
- echo "<div id=\"{$this->id}\">";
- $c = $this->formatter->indent;
- $item->display($grouping, $aggregate, $this->formatter);
- $this->formatter->indent = $c;
- echo "</div>";
- }
- }
- #echo "</div>";
- }
- }
- class Reporting {
- var $has_header;
- var $rep_title;
- var $rep_subtitle_1;
- var $rep_subtitle_2;
- var $rep_date_start;
- var $rep_date_end;
- var $rep_image_src;
- var $rep_image_width;
- var $rep_image_height;
- var $rep_image_alt;
- var $rep_desc;
- var $rep_items;
- var $rep_formatter;
-
- function Reporting (&$formatter, $has_header = false)
- {
- $this->has_header = $has_header;
- /*
-
- TODO: Implement this crap at a later point
-
-
- $this->rep_title = $rep_title;
- $this->rep_subtitle_1 = $rep_subtitle_1;
- $this->rep_subtitle_2 = $rep_subtitle_2;
- $this->rep_date_start = $rep_date_start;
- $this->rep_date_end = $rep_date_end;
- $this->rep_desc = $rep_desc;
- $this->rep_image_src = $rep_image_src;
- $this->rep_image_width = $rep_image_width;
- $this->rep_image_height = $rep_image_height;
- $this->rep_image_alt = $rep_image_alt;
- */
- $this->rep_formatter =& $formatter;
- }
-
- function setTitle($t, $style = '')
- {
- if($style=='') $style = new ReportStyle;
- $style->fontHeight(16);
- $style->fontFamily('arial');
- $this->rep_title = array($t,$style);
- }
-
- function setSubtitle1($t, $style = '')
- {
- if($style=='') $style = new ReportStyle;
- $style->fontHeight(14);
- $style->fontFamily('arial');
- $this->rep_subtitle_1 = array($t,$style);
- }
-
- function setSubtitle2($t, $style = '')
- {
- if($style=='') $style = new ReportStyle;
- $style->fontHeight(12);
- $style->fontFamily('arial');
- $this->rep_subtitle_2 = array($t,$style);
- }
-
- function addBreak ()
- {
- $this->rep_items[] = new Report_BreakAdaptor;
- }
- function addDiv($id)
- {
- $item = new Report_DivAdaptor;
- $item->id = $id;
- $this->rep_items[] = $item;
- }
-
- function append (&$item)
- {
- $this->rep_items[] =& $item;
- }
-
- function display ()
- {
- $this->rep_formatter->startDocument($this->rep_title[0]);
-
- if ($this->has_header) {
- $this->displayHeader();
- }
- if(is_array($this->rep_items)) {
- foreach ($this->rep_items as $item) {
- $cur = $this->rep_formatter->indent;
- $item->display(Null, Null, $this->rep_formatter);
- $this->rep_formatter->indent = $cur;
- }
- }
- $this->rep_formatter->endDocument();
- }
-
- function displayHeader ()
- {
- if(is_a($this->rep_formatter,'HTML_ReportFormatter')) {
- if ($this->rep_title != '') {
- echo '<h1>'.$this->rep_title[0].'</h1>';
- }
-
- if ($this->rep_subtitle_1 != '') {
- echo '<h2>'.$this->rep_subtitle_1[0].'</h2>';
- }
-
- if ($this->rep_subtitle_2 != '') {
- echo '<h3>'.$this->rep_subtitle_2[0].'</h3>';
- }
-
- } else {
- $this->rep_formatter->addTable('report_heading');
-
- if ($this->rep_image_src != '') {
-
- echo "<td class='rc-rep-image-cell'>";
-
- $width_html = '';
- $height_html = '';
- $alt_html = '';
-
- if ($this->rep_image_width != '') {
- $width_html = " width='$this->rep_image_width'";
- }
-
- echo "<td class='rc-rep-image-cell'$width_html>";
-
- if ($this->rep_image_height != '') {
- $height_html = " height='$this->rep_image_height'";
- }
-
- if ($this->rep_image_alt != '') {
- $alt_html = " alt='$this->rep_image_alt'";
- }
-
- echo "<img class='rc-rep-image' src='$this->rep_image_src' $width_html $height_html $alt_html >
- </td>";
- }
-
- $d = "";
- if ($this->rep_title != '') {
- $this->rep_formatter->addRow();
- $this->rep_formatter->addColumn($this->rep_title[0],$this->rep_title[1]);
- $this->rep_formatter->endRow();
- }
-
- if ($this->rep_subtitle_1 != '') {
- $this->rep_formatter->addRow();
- $this->rep_formatter->addColumn($this->rep_subtitle_1[0],$this->rep_subtitle_1[1]);
- $this->rep_formatter->endRow();
- }
-
- if ($this->rep_subtitle_2 != '') {
- $this->rep_formatter->addRow();
- $this->rep_formatter->addColumn($this->rep_subtitle_2[0],$this->rep_subtitle_2[1]);
- $this->rep_formatter->endRow();
- }
-
- # $d .= "<h3>Report generated on " . date("d/m/y") . "</h3>";
-
- if ($this->rep_desc != '') {
- $d .= "<h3>$this->rep_desc</h3>";
- }
-
- $this->rep_formatter->addRow();
- $this->rep_formatter->addColumn(' ');
- $this->rep_formatter->endRow();
- $this->rep_formatter->endTable();
- }
- }
- }
- ?>