You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.4 KiB
PHP

<?php
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// Detect if loaded by the user or by PHP
if (count(get_included_files()) == 1) {
define("LOADED", true);
} else {
define("LOADED", false);
}
require_once __DIR__ . "/../required.php";
// Allow access with a download code, for mobile app and stuff
$date = date("Y-m-d H:i:s");
if (isset($VARS['code']) && LOADED) {
if (!$database->has('report_access_codes', ["AND" => ['code' => $VARS['code'], 'expires[>]' => $date]])) {
dieifnotloggedin();
}
} else {
dieifnotloggedin();
}
// Delete old DB entries
$database->delete('report_access_codes', ['expires[<=]' => $date]);
if (LOADED) {
if (isset($VARS['type']) && isset($VARS['format'])) {
generateReport($VARS['type'], $VARS['format'], $VARS['register'], $VARS['startdate'], $VARS['enddate']);
die();
} else {
$Strings->get("invalid parameters");
die();
}
}
function getCashFlowReport($register = null, $start = null, $end = null) {
global $database, $Strings;
$where = [];
if (!is_null($register) && $database->has('registers', ['registerid' => $register])) {
$where["registers.registerid"] = $register;
}
if ((bool) strtotime($start) == TRUE) {
$where["OR #open"] = [
"open[>=]" => date("Y-m-d", strtotime($start)),
"close[>=]" => date("Y-m-d", strtotime($start))
];
}
if ((bool) strtotime($end) == TRUE) {
// Make the date be the end of the day, not the start
$where["close[<=]"] = date("Y-m-d", strtotime($end)) . " 23:59:59";
}
if (count($where) > 1) {
$where = ["AND" => $where];
}
$cash = $database->select(
"cash_drawer", [
'[>]registers' => ['cash_drawer.registerid' => 'registerid'],
'[>]transactions' => ['cash_drawer.cashid' => 'cashid'],
'[>]payments' => ['transactions.txid' => 'txid'],
'[>]payment_types' => ['payments.type' => 'typeid']
], [
"cash_drawer.cashid",
"registers.registername",
"cash_drawer.registerid",
"open",
"close",
"payments.type",
"payments.amount",
"payment_types.typename"
], $where
);
$report = new Report($Strings->get("cashflow", false));
$report->setHeader([$Strings->get("register", false), $Strings->get("open", false), $Strings->get("close", false), $Strings->get("cash", false), $Strings->get("card", false), $Strings->get("check", false), $Strings->get("crypto", false), $Strings->get("gift card", false), $Strings->get("free", false)]);
$registers = [];
foreach ($cash as $c) {
$registers[$c['registerid']]['name'] = $c['registername'];
$registers[$c['registerid']]['id'] = $c['registerid'];
$registers[$c['registerid']]['open'] = date(DATETIME_FORMAT, strtotime($c['open']));
if (is_null($c['close'])) {
$registers[$c['registerid']]['close'] = date(DATETIME_FORMAT);
} else {
$registers[$c['registerid']]['close'] = date(DATETIME_FORMAT, strtotime($c['close']));
}
if (!isset($registers[$c['registerid']][$c['typename']])) {
$registers[$c['registerid']][$c['typename']] = 0.0;
}
$registers[$c['registerid']][$c['typename']] += $c['amount'];
}
foreach ($registers as $r) {
$types = $database->select('payment_types', 'typename');
foreach ($types as $t) {
if (!isset($r[$t])) {
$r[$t] = 0.0;
}
}
$report->addDataRow([
$r['name'],
$r['open'],
$r['close'],
$r['cash'] . "",
$r['card'] . "",
$r['check'] . "",
$r['crypto'] . "",
$r['giftcard'] . "",
$r['free'] . ""
]);
}
return $report;
}
function getReport(string $type, $register = null, $start = null, $end = null): Report {
switch ($type) {
case "cashflow":
return getCashFlowReport($register, $start, $end);
default:
return new Report("error", ["ERROR"], ["Invalid report type."]);
}
}
function generateReport($type, $format, $register = null, $start = null, $end = null) {
$report = getReport($type, $register, $start, $end);
$report->output($format);
}