310 lines
7.8 KiB
PHP
310 lines
7.8 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>
|
||
|
* @package AgileBill
|
||
|
* @version 1.4.93
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Agileco Report Module
|
||
|
*/
|
||
|
class report
|
||
|
{
|
||
|
/**
|
||
|
* Get the list of available modules
|
||
|
*/
|
||
|
function module_menu($VAR)
|
||
|
{
|
||
|
global $C_translate;
|
||
|
|
||
|
if(!empty($VAR['report_module']))
|
||
|
$default = $VAR['report_module'];
|
||
|
else
|
||
|
$default = false;
|
||
|
|
||
|
$return = '';
|
||
|
|
||
|
$path = PATH_AGILE . 'reports/';
|
||
|
chdir($path);
|
||
|
$dir = opendir($path);
|
||
|
$count = 0;
|
||
|
while ($file_name = readdir($dir))
|
||
|
{
|
||
|
if( $file_name != '..' && $file_name != '.' && !ereg(".xml", $file_name) && !ereg(".php", $file_name))
|
||
|
{
|
||
|
$name = $C_translate->translate('menu', $file_name, '');
|
||
|
if(empty($name) && eregi("^[a-zA-Z0-9\-\_]{1,}", $file_name)) $name = strtoupper($file_name);
|
||
|
if(!empty($name))
|
||
|
{
|
||
|
$return .= "<option value=\"{$file_name}\"";
|
||
|
if($default == $file_name) $return .= " selected";
|
||
|
$return .= ">{$name}</option>\n";
|
||
|
|
||
|
$count++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if($count > 10) $count = 10;
|
||
|
|
||
|
echo '<select id="report_module" name="report_module" size="'.$count.'" onChange="submit()" multiple>';
|
||
|
if($count==0)
|
||
|
echo '<option value="">No Reports Available</option>';
|
||
|
echo $return;
|
||
|
echo '</select>';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the list of available reports
|
||
|
*/
|
||
|
function report_menu($VAR)
|
||
|
{
|
||
|
global$C_translate;
|
||
|
$C_xml = new CORE_xml;
|
||
|
|
||
|
if(empty($VAR['report_module'])) {
|
||
|
echo $C_translate->translate('no_reports','report','');
|
||
|
return;
|
||
|
} else {
|
||
|
$module = $VAR['report_module'];
|
||
|
}
|
||
|
|
||
|
|
||
|
if(!empty($VAR['report_template']))
|
||
|
$default = $VAR['report_template'];
|
||
|
else
|
||
|
$default = false;
|
||
|
|
||
|
$return = '<select id="report_template" name="report_template" width="150" size="5" onChange="submit()" multiple>';
|
||
|
|
||
|
$path = PATH_AGILE . 'reports/'.$module.'/';
|
||
|
chdir($path);
|
||
|
$dir = opendir($path);
|
||
|
$count = 0;
|
||
|
while ($file_name = readdir($dir))
|
||
|
{
|
||
|
if($file_name != '..' && $file_name != '.' && ereg(".xml$", $file_name)) {
|
||
|
$template = $C_xml->xml_to_array($path.$file_name);
|
||
|
$name = $template['report']['title'];
|
||
|
|
||
|
|
||
|
$return .= "<option value=\"{$file_name}\"";
|
||
|
if($default == $file_name) $return .= " selected";
|
||
|
$return .= ">{$name}</option>\n";
|
||
|
|
||
|
$count++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if($count==0)
|
||
|
$return .= '<option value="">'. $C_translate->translate('no_reports','report','').'</option>';
|
||
|
$return .= '</select>';
|
||
|
echo $return;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Get user criteria
|
||
|
*/
|
||
|
function get_user_criteria($VAR)
|
||
|
{
|
||
|
# validation
|
||
|
if(empty($VAR['report_module']) || empty($VAR['report_template'])) return false;
|
||
|
$module = $VAR['report_module'];
|
||
|
$report = $VAR['report_template'];
|
||
|
|
||
|
# include reporting classess
|
||
|
require_once PATH_MODULES . 'report/class.Report.php';
|
||
|
require_once PATH_MODULES . 'report/class.Level.php';
|
||
|
require_once PATH_MODULES . 'report/class.ReportParser.php';
|
||
|
$f = new HTML_ReportFormatter;
|
||
|
$r = new Reporting($f, true);
|
||
|
$p = new ReportParser($r);
|
||
|
$result = $p->setInputFile(PATH_AGILE.'reports/'.$module.'/'.$report);
|
||
|
$result = $p->parse();
|
||
|
|
||
|
# pre-process the user criteria array
|
||
|
$arr = $p->getUserCriteria();
|
||
|
if(is_array($arr)) {
|
||
|
foreach($arr as $cond) {
|
||
|
if($cond['type']=='menu') {
|
||
|
//print_r($cond);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
global $smarty;
|
||
|
$smarty->assign('userCriteria', $arr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set user criteria and display report
|
||
|
*/
|
||
|
function view($VAR)
|
||
|
{
|
||
|
# validation
|
||
|
if(empty($VAR['report_module']) || empty($VAR['report_template'])) return false;
|
||
|
$module = $VAR['report_module'];
|
||
|
$report = $VAR['report_template'];
|
||
|
$format = $VAR['report_format'];
|
||
|
|
||
|
# include reporting classess
|
||
|
require_once PATH_MODULES . 'report/class.Report.php';
|
||
|
require_once PATH_MODULES . 'report/class.Level.php';
|
||
|
require_once PATH_MODULES . 'report/class.ReportParser.php';
|
||
|
|
||
|
set_time_limit(0);
|
||
|
|
||
|
if($format=='text')
|
||
|
$f = new TXT_ReportFormatter;
|
||
|
elseif($format=='html')
|
||
|
$f = new HTML_ReportFormatter;
|
||
|
elseif($format=='pdf')
|
||
|
$f = new PDF_ReportFormatter;
|
||
|
|
||
|
# Tell the formatter where to save the output
|
||
|
$dir = md5(tempnam(PATH_FILES, "s"));
|
||
|
$path = PATH_FILES.'reports/'.$dir;
|
||
|
@unlink($path);
|
||
|
mkdir($path, 0775);
|
||
|
$f->setOutputDirectory($path);
|
||
|
|
||
|
# set report construct file to use
|
||
|
$r = new Reporting($f, true);
|
||
|
$p = new ReportParser($r);
|
||
|
$result = $p->setInputFile(PATH_AGILE.'reports/'.$module.'/'.$report);
|
||
|
|
||
|
# Get user criteria
|
||
|
$arr = $p->getUserCriteria();
|
||
|
|
||
|
# Set the user criteria
|
||
|
if(!empty($VAR['report']['conditions']) && is_array($VAR['report']['conditions'])) {
|
||
|
foreach($VAR['report']['conditions'] as $arr) {
|
||
|
$exp = $arr['exp'];
|
||
|
$col = $arr['col'];
|
||
|
$val = $arr['value'];
|
||
|
$type= $arr['type'];
|
||
|
foreach($col as $i=>$name) {
|
||
|
if($type[$i] == 'date_year_month') {
|
||
|
$val[$i] = array('month'=> $val['month'][$i], 'year'=> $val['year'][$i]);
|
||
|
}
|
||
|
$this->setSQLCondition($p, $col[$i], $exp[$i], $val[$i], $type[$i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#echo '<pre>'.print_r($p,true).'</pre>'; exit;
|
||
|
$result = $p->parse();
|
||
|
#echo '<pre>'.print_r($p,true).'</pre>'; exit;
|
||
|
$r->display();
|
||
|
|
||
|
if($format=='text') {
|
||
|
header('Content-type: text/txt');
|
||
|
header('Content-Disposition: inline; filename="report.txt"');
|
||
|
echo file_get_contents($f->getOutput());
|
||
|
@unlink($f->getOutput());
|
||
|
|
||
|
} elseif($format=='html') {
|
||
|
$f->getOutput();
|
||
|
$url=URL.'includes/files/reports/'.$dir.'/report.html';
|
||
|
echo "<script>document.location='$url';</script>";
|
||
|
|
||
|
} elseif ($format=='pdf') {
|
||
|
header('Content-type: application/pdf');
|
||
|
header('Content-Disposition: inline; filename="report.pdf"');
|
||
|
readfile($f->getOutput());
|
||
|
@unlink($f->getOutput());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get actual SQL contition from user input and add to userCondtions
|
||
|
*/
|
||
|
function setSQLCondition(&$reportObj, $column, $condition, $value=false, $type=false)
|
||
|
{
|
||
|
$o["EQ"] = '=';
|
||
|
$o["NOT"] = '<>';
|
||
|
|
||
|
$o["GT"] = '>';
|
||
|
$o["LT"] = '<';
|
||
|
$o["GTEQ"] = '>=';
|
||
|
$o["LTEQ"] = '<=';
|
||
|
|
||
|
$o["LIKE"] = 'LIKE';
|
||
|
$o["NLIKE"] = 'IS NOT LIKE';
|
||
|
|
||
|
$o["NULL"] = 'IS NULL';
|
||
|
$o["NNULL"] = 'IS NOT NULL';
|
||
|
|
||
|
// actual SQL condition
|
||
|
$c = $o["$condition"];
|
||
|
|
||
|
// determine value
|
||
|
if( $condition=="NULL" || $condition=="NNULL" )
|
||
|
$v=false;
|
||
|
elseif ($value=='')
|
||
|
return false;
|
||
|
else
|
||
|
$v=$value;
|
||
|
|
||
|
if($type=='date') {
|
||
|
$v=$this->convert_date_time($value);
|
||
|
$reportObj->setUserCriteria($column, $c, $v);
|
||
|
} elseif ($type=='date_year') {
|
||
|
$v=mktime(0,0,0,1,1,$value);
|
||
|
$reportObj->setUserCriteria($column, $c, $v);
|
||
|
} elseif ($type=='date_year_month') {
|
||
|
if(!empty($value['year'])) {
|
||
|
if(empty($value['month'])) $month=1; else $month=$value['month'];
|
||
|
$v=mktime(0,0,0,$month,1,$value['year']);
|
||
|
$reportObj->setUserCriteria($column, $c, $v);
|
||
|
}
|
||
|
} else {
|
||
|
$reportObj->setUserCriteria($column, $c, $v);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* convert DEFAULT_DATE_TIME_FORMT to unix time stamp
|
||
|
*/
|
||
|
function convert_date_time ($date, $constraint=false)
|
||
|
{
|
||
|
if($date == '0' || $date == '')
|
||
|
return '';
|
||
|
|
||
|
$Arr_format = split(DEFAULT_DATE_DIVIDER, UNIX_DATE_FORMAT);
|
||
|
$Arr_date = split(DEFAULT_DATE_DIVIDER, $date);
|
||
|
|
||
|
for($i=0; $i<3; $i++)
|
||
|
{
|
||
|
if($Arr_format[$i] == 'd')
|
||
|
$day = $Arr_date[$i];
|
||
|
|
||
|
if($Arr_format[$i] == 'm')
|
||
|
$month = $Arr_date[$i];
|
||
|
|
||
|
if($Arr_format[$i] == 'Y')
|
||
|
$year = $Arr_date[$i];
|
||
|
}
|
||
|
|
||
|
$timestamp = mktime(23, 59, 59, $month, $day, $year);
|
||
|
|
||
|
return $timestamp;
|
||
|
}
|
||
|
}
|
||
|
?>
|