From 5283f146091393dbe6b79bf69e48e966aea46e8a Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Fri, 21 Sep 2018 17:36:16 -0600 Subject: [PATCH] Refactor report generation --- lib/Report.lib.php | 137 ++++++++++++++++++++++++++++++++++++++++++ lib/reports.php | 145 ++++++++------------------------------------- 2 files changed, 162 insertions(+), 120 deletions(-) create mode 100644 lib/Report.lib.php diff --git a/lib/Report.lib.php b/lib/Report.lib.php new file mode 100644 index 0000000..73f1305 --- /dev/null +++ b/lib/Report.lib.php @@ -0,0 +1,137 @@ +title = $title; + $this->header = $header; + $this->data = $data; + } + + public function setHeader(array $header) { + $this->header = $header; + } + + public function addDataRow(array $columns) { + $this->data[] = $columns; + } + + public function getHeader(): array { + return $this->header; + } + + public function getData(): array { + return $this->data; + } + + public function output(string $format) { + switch ($format) { + case "ods": + $this->toODS(); + break; + case "html": + $this->toHTML(); + break; + case "csv": + default: + $this->toCSV(); + break; + } + } + + private function toODS() { + $ods = new ods(); + $styleColumn = new odsStyleTableColumn(); + $styleColumn->setUseOptimalColumnWidth(true); + $headerstyle = new odsStyleTableCell(); + $headerstyle->setFontWeight("bold"); + $table = new odsTable($this->title); + + for ($i = 0; $i < count($this->header); $i++) { + $table->addTableColumn(new odsTableColumn($styleColumn)); + } + + $row = new odsTableRow(); + foreach ($this->header as $cell) { + $row->addCell(new odsTableCellString($cell, $headerstyle)); + } + $table->addRow($row); + + foreach ($this->data as $cols) { + $row = new odsTableRow(); + foreach ($cols as $cell) { + $row->addCell(new odsTableCellString($cell)); + } + $table->addRow($row); + } + $ods->addTable($table); + // The @ is a workaround to silence the tempnam notice, + // which breaks the file. This is apparently the intended behavior: + // https://bugs.php.net/bug.php?id=69489 + @$ods->downloadOdsFile($this->title . "_" . date("Y-m-d_Hi") . ".ods"); + } + + private function toHTML() { + global $SECURE_NONCE; + $data = array_merge([$this->header], $this->data); + // HTML exporter doesn't like null values + for ($i = 0; $i < count($data); $i++) { + for ($j = 0; $j < count($data[$i]); $j++) { + if (is_null($data[$i][$j])) { + $data[$i][$j] = ''; + } + } + } + header('Content-type: text/html'); + $converter = new HTMLConverter(); + $out = "\n" + . "\n" + . "\n" + . "" . $this->title . "_" . date("Y-m-d_Hi") . "\n" + . << +STYLE + . $converter->convert($data); + echo $out; + } + + private function toCSV() { + $csv = Writer::createFromString(''); + $data = array_merge([$this->header], $this->data); + $csv->insertAll($data); + header('Content-type: text/csv'); + header('Content-Disposition: attachment; filename="' . $this->title . "_" . date("Y-m-d_Hi") . ".csv" . '"'); + echo $csv; + } + +} diff --git a/lib/reports.php b/lib/reports.php index 3af2f19..182272d 100644 --- a/lib/reports.php +++ b/lib/reports.php @@ -14,16 +14,6 @@ if (count(get_included_files()) == 1) { require_once __DIR__ . "/../required.php"; -use League\Csv\Writer; -use League\Csv\HTMLConverter; -use odsPhpGenerator\ods; -use odsPhpGenerator\odsTable; -use odsPhpGenerator\odsTableRow; -use odsPhpGenerator\odsTableColumn; -use odsPhpGenerator\odsTableCellString; -use odsPhpGenerator\odsStyleTableColumn; -use odsPhpGenerator\odsStyleTableCell; - // Allow access with a download code, for mobile app and stuff $date = date("Y-m-d H:i:s"); if (isset($VARS['code']) && LOADED) { @@ -53,7 +43,7 @@ if (LOADED) { * @param array $filter Medoo WHERE clause. * @return string */ -function getItemReport($filter = []) { +function getItemReport($filter = []): Report { global $database, $Strings; $items = $database->select( "items", [ @@ -76,7 +66,8 @@ function getItemReport($filter = []) { "price" ], $filter ); - $header = [ + $report = new Report($Strings->get("Items", false)); + $report->setHeader([ $Strings->get("itemid", false), $Strings->get("name", false), $Strings->get("category", false), @@ -91,15 +82,14 @@ function getItemReport($filter = []) { $Strings->get("Description", false), $Strings->get("Notes", false), $Strings->get("Comments", false) - ]; - $out = [$header]; + ]); for ($i = 0; $i < count($items); $i++) { $user = ""; if (!is_null($items[$i]["userid"])) { $u = new User($items[$i]["userid"]); $user = $u->getName() . " (" . $u->getUsername() . ')'; } - $out[] = [ + $report->addDataRow([ $items[$i]["itemid"], $items[$i]["name"], $items[$i]["catname"], @@ -114,31 +104,31 @@ function getItemReport($filter = []) { $items[$i]["text1"], $items[$i]["text2"], $items[$i]["text3"] - ]; + ]); } - return $out; + return $report; } -function getCategoryReport() { +function getCategoryReport(): Report { global $database, $Strings; $cats = $database->select('categories', [ 'catid', 'catname' ]); - $header = [$Strings->get("id", false), $Strings->get("category", false), $Strings->get("item count", false)]; - $out = [$header]; + $report = new Report($Strings->get("Categories", false)); + $report->setHeader([$Strings->get("id", false), $Strings->get("category", false), $Strings->get("item count", false)]); for ($i = 0; $i < count($cats); $i++) { $itemcount = $database->count('items', ['catid' => $cats[$i]['catid']]); - $out[] = [ + $report->addDataRow([ $cats[$i]["catid"], $cats[$i]["catname"], $itemcount . "" - ]; + ]); } - return $out; + return $report; } -function getLocationReport() { +function getLocationReport(): Report { global $database, $Strings; $locs = $database->select('locations', [ 'locid', @@ -146,23 +136,23 @@ function getLocationReport() { 'loccode', 'locinfo' ]); - $header = [$Strings->get("id", false), $Strings->get("location", false), $Strings->get("code", false), $Strings->get("item count", false), $Strings->get("Description", false)]; - $out = [$header]; + $report = new Report($Strings->get("Locations", false)); + $report->setHeader([$Strings->get("id", false), $Strings->get("location", false), $Strings->get("code", false), $Strings->get("item count", false), $Strings->get("Description", false)]); for ($i = 0; $i < count($locs); $i++) { $itemcount = $database->count('items', ['locid' => $locs[$i]['locid']]); - $out[] = [ + $report->addDataRow([ $locs[$i]["locid"], $locs[$i]["locname"], $locs[$i]["loccode"], $itemcount . "", $locs[$i]["locinfo"] - ]; + ]); } - return $out; + return $report; } -function getReportData($type) { - switch ($type) { +function getReport($type): Report { + switch ($type) { case "item": return getItemReport(); break; @@ -176,96 +166,11 @@ function getReportData($type) { return getItemReport(["AND" => ["qty[<]want", "want[>]" => 0]]); break; default: - return [["error"]]; - } -} - -function dataToCSV($data, $name = "report") { - $csv = Writer::createFromString(''); - $csv->insertAll($data); - header('Content-type: text/csv'); - header('Content-Disposition: attachment; filename="' . $name . "_" . date("Y-m-d_Hi") . ".csv" . '"'); - echo $csv; - die(); -} - -function dataToODS($data, $name = "report") { - $ods = new ods(); - $styleColumn = new odsStyleTableColumn(); - $styleColumn->setUseOptimalColumnWidth(true); - $headerstyle = new odsStyleTableCell(); - $headerstyle->setFontWeight("bold"); - $table = new odsTable($name); - - for ($i = 0; $i < count($data[0]); $i++) { - $table->addTableColumn(new odsTableColumn($styleColumn)); - } - - $rowid = 0; - foreach ($data as $datarow) { - $row = new odsTableRow(); - foreach ($datarow as $cell) { - if ($rowid == 0) { - $row->addCell(new odsTableCellString($cell, $headerstyle)); - } else { - $row->addCell(new odsTableCellString($cell)); - } - } - $table->addRow($row); - $rowid++; - } - $ods->addTable($table); - // The @ is a workaround to silence the tempnam notice, - // which breaks the file. This is apparently the intended behavior: - // https://bugs.php.net/bug.php?id=69489 - @$ods->downloadOdsFile($name . "_" . date("Y-m-d_Hi") . ".ods"); -} - -function dataToHTML($data, $name = "report") { - global $SECURE_NONCE; - // HTML exporter doesn't like null values - for ($i = 0; $i < count($data); $i++) { - for ($j = 0; $j < count($data[$i]); $j++) { - if (is_null($data[$i][$j])) { - $data[$i][$j] = ''; - } - } - } - header('Content-type: text/html'); - $converter = new HTMLConverter(); - $out = "\n" - . "\n" - . "\n" - . "" . $name . "_" . date("Y-m-d_Hi") . "\n" - . << -STYLE - . $converter->convert($data); - echo $out; } function generateReport($type, $format) { - $data = getReportData($type); - switch ($format) { - case "ods": - dataToODS($data, $type); - break; - case "html": - dataToHTML($data, $type); - break; - case "csv": - default: - echo dataToCSV($data, $type); - break; - } -} + $report = getReport($type); + $report->output($format); +} \ No newline at end of file