ordersprinter/webapp/php/reports.php

402 lines
13 KiB
PHP
Raw Normal View History

2020-11-19 22:44:19 +01:00
<?php
// Datenbank-Verbindungsparameter
require_once ('dbutils.php');
require_once ('queuecontent.php');
require_once ('commonutils.php');
require_once ('utilities/userrights.php');
class Reports {
var $dbutils;
var $queue;
var $commonUtils;
var $userrights;
2020-11-19 22:47:44 +01:00
static $sql_service_good = "";
static $sql_service_ok = "";
static $sql_service_bad = "";
static $sql_kitchen_good = "";
static $sql_kitchen_ok = "";
static $sql_kitchen_bad = "";
static $sql_ratings = "";
static $sql_remarks = "";
2020-11-19 22:44:19 +01:00
function __construct() {
$this->dbutils = new DbUtils();
$this->queue = new QueueContent();
$this->commonUtils = new CommonUtils();
$this->userrights = new Userrights();
2020-11-19 22:47:44 +01:00
self::$sql_service_good = "select COUNT(service) as count FROM %ratings% WHERE service='1' AND date between ? AND ?";
self::$sql_service_ok = "select COUNT(service) as count FROM %ratings% WHERE service='2' AND date between ? AND ?";
self::$sql_service_bad = "select COUNT(service) as count FROM %ratings% WHERE service='3' AND date between ? AND ?";
self::$sql_kitchen_good = "select COUNT(kitchen) as count FROM %ratings% WHERE kitchen='1' AND date between ? AND ?";
self::$sql_kitchen_ok = "select COUNT(kitchen) as count FROM %ratings% WHERE kitchen='2' AND date between ? AND ?";
self::$sql_kitchen_bad = "select COUNT(kitchen) as count FROM %ratings% WHERE kitchen='3' AND date between ? AND ?";
self::$sql_ratings = "select COUNT(id) as count FROM %ratings% WHERE date between ? AND ?";
self::$sql_remarks = "SELECT DATE_FORMAT (date, '%e.%m.%Y %H:%i') AS date,remark FROM %ratings% WHERE CHAR_LENGTH(remark) > 2 AND date between ? AND ?";
2020-11-19 22:44:19 +01:00
}
function handleCommand($command) {
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
// canUserCallCommands($currentCmd, $cmdArray,$right)
$cmdArray = array('getStats');
if (in_array($command, $cmdArray)) {
if (!($this->userrights->hasCurrentUserRight('right_statistics'))) {
echo "Benutzerrechte nicht ausreichend!";
return false;
}
}
if($command == 'getStats') {
$this->getStats();
} else {
echo "Command not supported.";
}
}
private function getStats() {
2020-11-19 22:47:44 +01:00
$alldates = self::getDates();
2020-11-19 22:44:19 +01:00
$this->getReports($alldates);
}
2020-11-19 22:47:44 +01:00
public function getStatsCore() {
$alldates = self::getDates();
return($this->getReportsCore($alldates));
}
static private function getDates() {
date_default_timezone_set(DbUtils::getTimeZone());
2020-11-19 22:44:19 +01:00
$currentTimeStr = date('Y-m-d H:i:s');
$curTime = strtotime($currentTimeStr);
$todayDate = date('Y-m-d');
$todayHour = date('H');
$yesterdayDate = date("Y-m-d", strtotime("-1 day", $curTime));
// now for this month
$firstDayOfThisMonth = date("Y-m-01", strtotime($currentTimeStr));
$currentDay = date("d",strtotime($currentTimeStr)); // current day (4 if date is 4 Jan 2014)
$month = date("m",strtotime($currentTimeStr));
2020-11-19 22:47:44 +01:00
$monthName = self::getMonthName($month);
2020-11-19 22:44:19 +01:00
$monthAndYearOfThisMonth = date("Y-m",strtotime($currentTimeStr));
2020-11-19 22:47:44 +01:00
$thisMonthName = self::getMonthName($month);
2020-11-19 22:44:19 +01:00
// last month
2020-11-19 22:47:44 +01:00
$last_month_ini = new DateTime("first day of last month");
$last_month_end = new DateTime("last day of last month");
$firstDayOfLastMonth = $last_month_ini->format('Y-m-d');
$lastDayOfLastMonth = $last_month_end-> format('d');
$iterations = intval($last_month_end->format('d'));
$lastMonth = intval($last_month_ini->format('m'));
$monthAndYearOfLastMonth = $last_month_end->format('Y-m');
$lastMonthComplete = $last_month_ini->format('Y-m-d') . " 00:00:00";
$lastMonthName = self::getMonthName($lastMonth);
// last 30 days
$daysArr = array();
for ($i=29;$i>=0;$i--) {
$daysArr[] = date("Y-m-d", strtotime('-' . $i . ' day') );
}
2020-11-19 22:44:19 +01:00
$retArray = array(
"todayDate" => $todayDate,
"todayHour" => $todayHour,
"currentTimeStr" => $currentTimeStr,
"yesterdayDate" => $yesterdayDate,
"monthAndYearOfLastMonth" => $monthAndYearOfLastMonth,
2020-11-19 22:47:44 +01:00
"lastDayOfLastMonth" => $lastDayOfLastMonth,
2020-11-19 22:44:19 +01:00
"lastMonthComplete" => $lastMonthComplete,
"lastMonthName" => $lastMonthName,
"currentDay" => $currentDay,
"monthAndYearOfThisMonth" => $monthAndYearOfThisMonth,
2020-11-19 22:47:44 +01:00
"thisMonthName" => $thisMonthName,
"last30days" => $daysArr
);
2020-11-19 22:44:19 +01:00
return $retArray;
}
2020-11-19 22:47:44 +01:00
public static function getMonthName($monthNo) {
2020-11-19 22:44:19 +01:00
$mons = array(
1 => "Januar",
2 => "Februar",
3 => "März",
4 => "April",
5 => "Mai",
6 => "Juni",
7 => "Juli",
8 => "August",
9 => "September",
10 => "Oktober",
11 => "November",
12 => "Dezember");
return ($mons[intval($monthNo)]);
}
private function getReports ($allDates) {
2020-11-19 22:47:44 +01:00
$reports = $this->getReportsCore($allDates);
echo json_encode($reports);
}
private function getReportsCore($allDates) {
2020-11-19 22:44:19 +01:00
$pdo = $this->dbutils->openDbAndReturnPdo();
$pdo->beginTransaction();
// bills of today independently of closing
$retArrayToday = $this->iterateForHours($pdo, $allDates['todayDate'], intval($allDates['todayHour'])+1,false);
// closed yesterday bills:
$retArrayYesterday = $this->iterateForHours($pdo, $allDates['yesterdayDate'], 24,true);
$retThisMonth = $this->iterateForDays($pdo, $allDates['monthAndYearOfThisMonth'],intval($allDates['currentDay']),true);
// closed of last month:
2020-11-19 22:47:44 +01:00
$retArrayLastMonth = $this->iterateForDays($pdo, $allDates['monthAndYearOfLastMonth'],intval($allDates['lastDayOfLastMonth']),true);
2020-11-19 22:44:19 +01:00
// products in the last 30 days:
$retArrayProds = $this->sumSortedByProducts($pdo, $allDates['lastMonthComplete'], $allDates['currentTimeStr']);
2020-11-19 22:47:44 +01:00
$retRatings = $this->getRatings($pdo,$allDates['last30days'],$allDates['lastMonthComplete'], $allDates['currentTimeStr']);
2020-11-19 22:51:21 +01:00
$usersums = $this->getUserSums($pdo);
2020-11-19 22:44:19 +01:00
$pdo->commit();
$retArray = array("today" => $retArrayToday,
"yesterday" => $retArrayYesterday,
"thismonth" => $retThisMonth,
"lastmonth" => $retArrayLastMonth,
"prodsums" => $retArrayProds,
"lastmonthname" => $allDates['lastMonthName'],
2020-11-19 22:47:44 +01:00
"thismonthname" => $allDates['thisMonthName'],
2020-11-19 22:51:21 +01:00
"ratings" => $retRatings,
"usersums" => $usersums
2020-11-19 22:47:44 +01:00
);
2020-11-19 22:44:19 +01:00
2020-11-19 22:47:44 +01:00
return $retArray;
2020-11-19 22:44:19 +01:00
}
/*
* returns an array:
* hour, sum
* hour, sum
*/
private function iterateForHours($pdo,$theDateStr,$noOfIterations,$mustBeClosed) {
$retArray = array();
$sumMax = 0.0;
for ($i=0;$i<$noOfIterations;$i++) {
$startDateTime = $theDateStr . " $i:00:00";
$endDateTime = $theDateStr . " $i:59:59";
$sum = $this->sumBetween($pdo,$startDateTime,$endDateTime,$mustBeClosed);
if ($sumMax < $sum) {
$sumMax = $sum;
}
$retArray[] = array("iter" => $i, "sum" => $sum);
}
return array("max" => $sumMax, "content" => $retArray);
}
/*
* returns an array wioth "content"
* day, sum with day 0..31,
* day, sum ...
*/
private function iterateForDays($pdo,$theMonthYearStr,$noOfIterations,$mustBeClosed) {
$retArray = array();
$sumMax = 0.0;
for ($i=1;$i<($noOfIterations+1);$i++) {
$dayInTwoDigists = sprintf('%02d', $i);
$startDateTime = $theMonthYearStr . "-$dayInTwoDigists 00:00:00";
$endDateTime = $theMonthYearStr . "-$dayInTwoDigists 23:59:59";
$sum = $this->sumBetween($pdo,$startDateTime,$endDateTime,$mustBeClosed);
if ($sumMax < $sum) {
$sumMax = $sum;
}
$retArray[] = array("iter" => $i, "sum" => $sum);
}
return array("max" => $sumMax, "content" => $retArray);
}
private function sumBetween($pdo,$startDateTime,$endDateTime,$mustBeClosed) {
$sql = "SELECT sum(brutto) as sumtotal FROM %bill% ";
$sql .= "WHERE status is null "; // no cash insert or take off, no stornos
$sql .= "AND billdate between ? AND ? ";
if ($mustBeClosed) {
$sql .= "AND closingid is not null"; // and must be in a closing
}
$sum = 0.0;
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute(array($startDateTime,$endDateTime));
$row =$stmt->fetchObject();
if ($row != null) {
$theSqlSum = $row->sumtotal;
if ($theSqlSum != null) {
$sum = $theSqlSum;
}
}
return $sum;
}
function cmp($a, $b)
{
$asum = $a['sum'];
$bsum = $b['sum'];
if ($asum == $bsum) {
return 0;
}
return ($asum < $bsum) ? 1 : -1;
}
/*
* returns a sorted by prices list:
* array("prodid" => $aProdId,"prodname" => $aProd['prodname'], "sum" => $sumprice);
* array("prodid" => $aProdId,"prodname" => $aProd['prodname'], "sum" => $sumprice);
* (...)
*/
2020-11-19 22:47:44 +01:00
public function sumSortedByProducts($pdo,$startDateTime,$endDateTime) {
2020-11-19 22:44:19 +01:00
// first get all products and with their id and name
$sql = "SELECT DISTINCT productid,productname from %queue%,%bill%,%products% ";
$sql .= "WHERE %queue%.productid=%products%.id ";
$sql .= "AND billid is not null AND %queue%.billid=%bill%.id ";
$sql .= "AND billdate between ? AND ? ";
2020-11-19 22:47:44 +01:00
$sql .= "AND %bill%.closingid is not null ";
$sql .= "AND %bill%.status is null GROUP BY productid";
2020-11-19 22:44:19 +01:00
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute(array($startDateTime,$endDateTime));
$result = $stmt->fetchAll();
$prods = array();
foreach($result as $row) {
$prods[] = array("prodid" => $row['productid'],"prodname" => $row['productname']);
}
// now iterate over all prods
$sumMax = 0.0;
$prodinfos = array();
foreach ($prods as $aProd) {
$aProdId = $aProd['prodid'];
$sql = "SELECT sum(price) as sumprice from %queue%,%bill%,%products% ";
$sql .= "WHERE %queue%.productid=%products%.id ";
$sql .= "AND billid is not null AND %queue%.billid=%bill%.id ";
$sql .= "AND billdate between ? AND ? ";
$sql .= "AND %bill%.closingid is not null ";
$sql .= " AND productid=?";
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute(array($startDateTime,$endDateTime,$aProdId));
$row =$stmt->fetchObject();
if ($row != null) {
$sumprice = $row->sumprice;
if ($sumMax < $sumprice) {
$sumMax = $sumprice;
}
if ($sumprice != null) {
$prodinfos[] = array("prodid" => $aProdId,"iter" => $aProd['prodname'], "sum" => $sumprice);
}
}
}
uasort($prodinfos, array($this,'cmp'));
// due to a bug somehow the order is not kept when transformed to json - copy...
$prodInfoSorted = array();
foreach($prodinfos as $prodinfo) {
$prodInfoSorted[] = array("iter" => $prodinfo['iter'],"sum" => $prodinfo['sum']);
}
return array("max" => $sumMax, "content" => $prodInfoSorted);
2020-11-19 22:47:44 +01:00
}
static function getRating($pdo,$sql,$start,$end) {
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
$stmt->execute(array($start,$end));
$row =$stmt->fetchObject();
if (!is_null($row)) {
return(intval($row->count));
} else {
return 0;
}
}
static function getRelation($val1,$val2,$val3,$maxPercent) {
$total = $val1 + $val2 + $val3;
if ($total == 0) {
return array (0.0,0.0,0.0,$maxPercent);
} else {
$rel = $maxPercent / ((double)$total);
return array($rel * $val1,$rel * $val2,$rel * $val3,0.0);
}
}
static function getRatingOfDay($pdo,$aDay,$start,$end) {
$serviceGood = self::getRating($pdo,self::$sql_service_good, $start, $end);
$serviceOK = self::getRating($pdo,self::$sql_service_ok, $start, $end);
$serviceBad = self::getRating($pdo,self::$sql_service_bad, $start, $end);
$serviceRel = self::getRelation($serviceGood,$serviceOK,$serviceBad,95);
$kitchenGood = self::getRating($pdo,self::$sql_kitchen_good, $start, $end);
$kitchenOK = self::getRating($pdo,self::$sql_kitchen_ok, $start, $end);
$kitchenBad = self::getRating($pdo,self::$sql_kitchen_bad, $start, $end);
$kitchenRel = self::getRelation($kitchenGood,$kitchenOK,$kitchenBad,95);
$totalRatings = self::getRating($pdo,self::$sql_ratings, $start, $end);
$date = new DateTime($aDay);
return array("day" => $date->format('d.m.Y'), "service" => $serviceRel, "kitchen" => $kitchenRel, "total" => $totalRatings);
}
function getRatings($pdo,$last30days,$startPeriod,$endPeriod){
$reports = array();
foreach($last30days as $aDay) {
$start = $aDay . " 00:00:00";
$end = $aDay . " 23:59:59";
$reports[] = self::getRatingOfDay($pdo,$aDay,$start,$end);
}
$sql = self::$sql_remarks;
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute(array($startPeriod,$endPeriod));
$result = $stmt->fetchAll();
return array("statistics" => $reports,"remarks" =>$result);
}
2020-11-19 22:51:21 +01:00
function getUserSums($pdo) {
$sql = "SELECT userid,username as iter,";
$sql .= "ROUND(sum(brutto),2) as sum,";
$sql .= "ROUND(sum(if(paymentid='1',brutto,'0.00')),2) as sumonlybar,";
$sql .= "ROUND(sum(if(status = 'c',brutto,'0.00')),2) as sumcash ";
$sql .= "FROM %bill%,%user% WHERE userid=%user%.id AND closingid is null GROUP BY userid";
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
$stmt->execute();
$result = $stmt->fetchAll();
$sumMax = 0.0;
foreach ($result as $a) {
if ($a["sum"] > $sumMax) {
$sumMax = $a["sum"];
}
}
return array("max" => $sumMax, "content" => $result);
}
2020-11-19 22:44:19 +01:00
}
?>