208 lines
5.9 KiB
PHP
208 lines
5.9 KiB
PHP
<?php
|
|
if(!interface_exists('ReportBuilderInterface')){
|
|
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
|
}
|
|
abstract class ReportBuilder{
|
|
|
|
protected function execute($report, $query, $parameters){
|
|
$report->DB()->SetFetchMode(ADODB_FETCH_ASSOC);
|
|
LogManager::getInstance()->debug("Query: ".$query);
|
|
LogManager::getInstance()->debug("Parameters: ".json_encode($parameters));
|
|
$rs = $report->DB()->Execute($query,$parameters);
|
|
if(!$rs){
|
|
LogManager::getInstance()->info($report->DB()->ErrorMsg());
|
|
return array("ERROR","Error generating report");
|
|
}
|
|
|
|
$reportNamesFilled = false;
|
|
$columnNames = array();
|
|
$reportData = array();
|
|
foreach ($rs as $rowId => $row) {
|
|
$reportData[] = array();
|
|
if(!$reportNamesFilled){
|
|
$countIt = 0;
|
|
foreach ($row as $name=> $value){
|
|
$countIt++;
|
|
$columnNames[$countIt] = $name;
|
|
$reportData[count($reportData)-1][] = $value;
|
|
}
|
|
$reportNamesFilled = true;
|
|
}else{
|
|
foreach ($row as $name=> $value){
|
|
$reportData[count($reportData)-1][] = $this->transformData($name, $value);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
array_unshift($reportData,$columnNames);
|
|
|
|
return $reportData;
|
|
}
|
|
|
|
|
|
public function transformData($name, $value){
|
|
return $value;
|
|
}
|
|
|
|
public function createReportFile($report, $data){
|
|
$fileFirstPart = "Report_".str_replace(" ", "_", $report->name)."-".date("Y-m-d_H-i-s");
|
|
$fileName = $fileFirstPart.".csv";
|
|
|
|
$fileFullName = CLIENT_BASE_PATH.'data/'.$fileName;
|
|
$fp = fopen($fileFullName, 'w');
|
|
|
|
foreach ($data as $fields) {
|
|
fputcsv($fp, $fields);
|
|
}
|
|
|
|
fclose($fp);
|
|
return array($fileFirstPart, $fileName, $fileFullName);
|
|
}
|
|
|
|
public function saveFile($fileFirstPart, $file, $fileFullName){
|
|
$uploadedToS3 = false;
|
|
|
|
$uploadFilesToS3 = SettingsManager::getInstance()->getSetting("Files: Upload Files to S3");
|
|
$uploadFilesToS3Key = SettingsManager::getInstance()->getSetting("Files: Amazon S3 Key for File Upload");
|
|
$uploadFilesToS3Secret = SettingsManager::getInstance()->getSetting("Files: Amazone S3 Secret for File Upload");
|
|
$s3Bucket = SettingsManager::getInstance()->getSetting("Files: S3 Bucket");
|
|
$s3WebUrl = SettingsManager::getInstance()->getSetting("Files: S3 Web Url");
|
|
|
|
if($uploadFilesToS3.'' == '1' && !empty($uploadFilesToS3Key)
|
|
&& !empty($uploadFilesToS3Secret) && !empty($s3Bucket) && !empty($s3WebUrl)){
|
|
|
|
$uploadname = CLIENT_NAME."/".$file;
|
|
$s3FileSys = new S3FileSystem($uploadFilesToS3Key, $uploadFilesToS3Secret);
|
|
$res = $s3FileSys->putObject($s3Bucket, $uploadname, $fileFullName, 'authenticated-read');
|
|
|
|
if(empty($res)){
|
|
return array("ERROR",$file);
|
|
}
|
|
|
|
unlink($fileFullName);
|
|
$file_url = $s3WebUrl.$uploadname;
|
|
$file_url = $s3FileSys->generateExpiringURL($file_url);
|
|
$uploadedToS3 = true;
|
|
}
|
|
|
|
|
|
|
|
$fileObj = new File();
|
|
$fileObj->name = $fileFirstPart;
|
|
$fileObj->filename = $file;
|
|
$fileObj->file_group = "Report";
|
|
$ok = $fileObj->Save();
|
|
|
|
if(!$ok){
|
|
LogManager::getInstance()->info($fileObj->ErrorMsg());
|
|
return array("ERROR","Error generating report");
|
|
}
|
|
|
|
$reportFile = new ReportFile();
|
|
$reportFile->name = $fileObj->filename;
|
|
$reportFile->attachment = $fileObj->name;
|
|
$reportFile->created = date("Y-m-d H:i:s");
|
|
$reportFile->employee = BaseService::getInstance()->getCurrentProfileId();
|
|
$ok = $reportFile->Save();
|
|
|
|
if(!$ok){
|
|
LogManager::getInstance()->info($reportFile->ErrorMsg());
|
|
return array("ERROR","Error generating report");
|
|
}
|
|
|
|
|
|
if($uploadedToS3){
|
|
return array("SUCCESS",$file_url);
|
|
}else{
|
|
return array("SUCCESS",$file);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
class CSVReportBuilder extends ReportBuilder{
|
|
public function getData($report,$request){
|
|
$query = $this->getMainQuery();
|
|
$where = $this->getWhereQuery($request);
|
|
if($query == null || $where == null){
|
|
return null;
|
|
}
|
|
$query.=" ".$where[0];
|
|
return $this->execute($report, $query, $where[1]);
|
|
}
|
|
}
|
|
|
|
|
|
class ClassBasedReportBuilder extends ReportBuilder{
|
|
|
|
}
|
|
|
|
class PDFReportBuilder extends ReportBuilder{
|
|
|
|
var $twig;
|
|
|
|
protected function getDefaultData(){
|
|
$defaultData = array();
|
|
$defaultData['BASE_URL'] = BASE_URL;
|
|
$defaultData['LOGO'] = UIManager::getInstance()->getCompanyLogoUrl();
|
|
$defaultData['LOGO'] = str_replace("https:","http:",$defaultData['LOGO']);
|
|
$defaultData['companyName'] = SettingsManager::getInstance()->getSetting("Company: Name");
|
|
LogManager::getInstance()->debug("Logo Url:".$defaultData['LOGO']);
|
|
return $defaultData;
|
|
}
|
|
|
|
protected function initTemplateEngine($report){
|
|
if($report->_table = "UserReports"){
|
|
$path = APP_BASE_PATH."modules/reports/customTemplates/";
|
|
}else{
|
|
$path = APP_BASE_PATH."admin/reports/customTemplates/";
|
|
}
|
|
$loader = new Twig_Loader_Filesystem($path);
|
|
$twigOptions = array();
|
|
//false
|
|
if(defined('CACHE_THEME') && CACHE_THEME){
|
|
$twigOptions = array(
|
|
);
|
|
}else{
|
|
$twigOptions = array(
|
|
"cache"=>false
|
|
);
|
|
}
|
|
$this->twig = new Twig_Environment($loader, $twigOptions);
|
|
}
|
|
|
|
public function createReportFile($report, $data){
|
|
$fileFirstPart = "Report_".str_replace(" ", "_", $report->name)."-".date("Y-m-d_H-i-s");
|
|
$fileName = $fileFirstPart.".html";
|
|
|
|
$fileFullName = CLIENT_BASE_PATH.'data/'.$fileName;
|
|
|
|
$this->initTemplateEngine($report);
|
|
|
|
$template = $this->twig->loadTemplate($this->getTemplate());
|
|
$result = $template->render($data);
|
|
|
|
|
|
$fp = fopen($fileFullName, 'w');
|
|
fwrite($fp,$result);
|
|
fclose($fp);
|
|
|
|
try{
|
|
$fileFullNamePdf = CLIENT_BASE_PATH.'data/'.$fileFirstPart.".pdf";
|
|
//Try generating the pdf
|
|
exec(WK_HTML_PATH." ".$fileFullName." ".$fileFullNamePdf, $output, $ret);
|
|
|
|
LogManager::getInstance()->debug("wkhtmltopdf:".print_r($output,true));
|
|
LogManager::getInstance()->debug("wkhtmltopdf:".print_r($ret,true));
|
|
|
|
if(file_exists($fileFullNamePdf)){
|
|
$fileName = $fileFirstPart.".pdf";
|
|
$fileFullName = $fileFullNamePdf;
|
|
}
|
|
}catch(Exception $exp){
|
|
|
|
}
|
|
return array($fileFirstPart, $fileName, $fileFullName);
|
|
}
|
|
} |