682 lines
14 KiB
PHP
682 lines
14 KiB
PHP
|
<?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();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
?>
|