ordersprinter/webapp/php/roomtables.php

385 lines
13 KiB
PHP

<?php
// Datenbank-Verbindungsparameter
require_once ('dbutils.php');
require_once ('commonutils.php');
require_once ('queuecontent.php');
// require_once ('content.php');
class Roomtables {
var $dbutils;
function __construct() {
$this->dbutils = new DbUtils();
}
function handleCommand($command) {
if(session_id() == '') {
session_start();
if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {
// no user logged in
echo json_encode(array("status" => "ERROR", "code" => ERROR_NOT_AUTHOTRIZED, "msg" => ERROR_NOT_AUTHOTRIZED_MSG));
}
}
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");
if($command == 'showAllRooms') {
$this->showAllRooms();
} else if ($command == 'getRooms') {
$this->getRooms(); // only rooms!
} else if ($command == 'showAllRoomsAndTablesWithUnpaidItems') {
$this->showAllRoomsAndTablesWithUnpaidItems();
} else if ($command == 'getUnpaidTables') {
$this->getUnpaidTables($_GET['roomid']);
} else if ($command == 'showAllTablesOfRoom') {
$this->showAllTablesOfRoom();
} else if ($command == 'getRoomfield') {
$this->getRoomfield();
} else if ($command == 'setRoomInfo') {
if ($this->hasCurrentUserAdminRights()) {
$this->setRoomInfo($_POST['rooms']);
}
}
}
private function hasCurrentUserAdminRights() {
if(session_id() == '') {
session_start();
}
if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {
// no user logged in
return false;
} else {
return ($_SESSION['is_admin']);
}
}
function showAllRooms() {
$pdo = $this->dbutils->openDbAndReturnPdo();
$roomtables = $this->getAllTablesAndRooms($pdo);
echo json_encode($roomtables);
}
public static function getUnpaidTablesCore($pdo,$roomid) {
// first get all tables of that rooms
$tablesSql = "SELECT id,tableno FROM %resttables% WHERE %resttables%.roomid =? AND removed is null";
$stmt = $pdo->prepare(DbUtils::substTableAlias($tablesSql));
$stmt->execute(array($roomid));
$result = $stmt->fetchAll();
$tablesArr = array();
foreach($result as $row) {
$entry = array("id" => $row['id'], "name" => $row['tableno']);
$tablesArr[] = $entry;
}
$tableresult = array();
foreach($tablesArr as $aTable) {
$tableid = $aTable['id'];
$sql = "SELECT sum(%queue%.price) as sumprice,count(%queue%.price) as prodcount
FROM %queue%
INNER JOIN %products% ON %queue%.productid = %products%.id
INNER JOIN %pricelevel% ON %queue%.pricelevel = %pricelevel%.id
WHERE tablenr = ? AND paidtime is null AND toremove <> '1'
AND ordertime is not null AND isclosed is null";
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
$stmt->execute(array($tableid));
$row = $stmt->fetchObject();
if ($row != null) {
$prodcount = $row->prodcount;
$sumprice = $row->sumprice;
if ($prodcount > 0) {
$aTableEntry = array("id" => $tableid,"name" => $aTable["name"], "pricesum" => $sumprice);
$tableresult[] = $aTableEntry;
}
}
}
return($tableresult);
}
function getUnpaidTables($roomid) {
$pdo = $this->dbutils->openDbAndReturnPdo();
$priceTakeAway = $this->getUnpaidSumOfTakeAway($pdo);
echo json_encode(array("tables" => self::getUnpaidTablesCore($pdo,$roomid), "takeawayprice" => $priceTakeAway));
}
function showAllRoomsAndTablesWithUnpaidItems() {
$pdo = $this->dbutils->openDbAndReturnPdo($pdo);
$roomtables = $this->getAllTablesAndRooms($pdo);
for ($i=0;$i<count($roomtables);$i++) {
$tablesArr = $roomtables[$i]["tables"];
$newtablesArr = array();
for ($j=0;$j<count($tablesArr);$j++) {
$tableentry = $tablesArr[$j];
$tableid = $tableentry["id"];
if ($this->hasTableUnpaidItems($tableid)) {
$newtablesArr[] = $tableentry;
}
}
$roomtables[$i]["tables"] = $newtablesArr;
}
echo json_encode($roomtables);
}
function hasTableUnpaidItems($tableid) {
// sql copied from getJsonProductsOfTableToPay
$sql = "SELECT %queue%.id as id,longname,%queue%.price as price,%pricelevel%.name as pricelevelname,%products%.id as prodid
FROM %queue%
INNER JOIN %products% ON %queue%.productid = %products%.id
INNER JOIN %pricelevel% ON %queue%.pricelevel = %pricelevel%.id
WHERE tablenr = $tableid AND paidtime is null AND toremove <> '1'
AND ordertime is not null
ORDER BY ordertime;";
$pdo = $this->dbutils->openDbAndReturnPdo();
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute();
$count = $stmt->rowCount();
if ($count > 0) {
return true;
} else {
return false;
}
}
/*
* get only the rooms (for paydesk, because tables are dynamic due to their pay status)
*/
function getRooms() {
$sql = "SELECT id,roomname FROM %room% WHERE removed is null";
$pdo = $this->dbutils->openDbAndReturnPdo();
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute();
$result = $stmt->fetchAll();
$roomArr = array();
foreach($result as $row) {
$roomEntry = array("id" => $row['id'], "name" => $row['roomname']);
$roomArr[] = $roomEntry;
}
$priceTakeAway = $this->getUnpaidSumOfTakeAway($pdo);
echo json_encode(array("roomstables" => $roomArr, "takeawayprice" => $priceTakeAway));
}
private function getUnpaidSumOfTakeAway($pdo) {
$sql = "SELECT IFNULL(SUM(IF(%queue%.ordertime is not null AND %queue%.paidtime is null,%queue%.price,0.00)),0.00) as pricesum FROM %queue% ";
$sql .= " WHERE %queue%.tablenr is null";
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
$stmt->execute();
$row = $stmt->fetchObject();
return $row->pricesum;
}
// Part of chain to choose a product , here we start with chosing a room
private function getAllTablesAndRooms($pdo)
{
$queue = new QueueContent();
$sql = "SELECT id,roomname FROM %room% WHERE removed is null ORDER BY id";
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
$stmt->execute();
$dbresult = $stmt->fetchAll(PDO::FETCH_ASSOC);
$arrayOfRooms = array();
foreach($dbresult as $zeile) {
$roomid = $zeile['id'];
// now find the tables that are in that room
$tablesArray = array();
$sql = "SELECT %resttables%.id as id,%resttables%.tableno as name,IFNULL(SUM(IF(%queue%.ordertime is not null AND %queue%.paidtime is null AND %queue%.isclosed is null,%queue%.price,0.00)),0.00) as pricesum FROM %resttables% ";
$sql .= " LEFT OUTER JOIN %queue% ON %queue%.tablenr=%resttables%.id WHERE %resttables%.removed is null AND ";
$sql .= " %resttables%.roomid=? GROUP BY %resttables%.id";
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
$stmt->execute(array($roomid));
$tablesArray = $stmt->fetchAll(PDO::FETCH_OBJ);
foreach ($tablesArray as $tableEntry) {
$arrayOfProdsAndIdsOfATable = $queue->getAllPreparedProductsForTableidAsArray($pdo,$tableEntry->id);
$arrayOfProdsOfATable = $arrayOfProdsAndIdsOfATable['prods'];
$numberOfProductsTotalToServe = $queue->numberOfProductsForTableNotDelivered($pdo,$tableEntry->id);
$numberOfReadyProducts = count($arrayOfProdsOfATable);
$queueids = $this->getIdsFromProdList($arrayOfProdsOfATable);
$tableEntry->prodcount = $numberOfProductsTotalToServe;
$tableEntry->prodready = $numberOfReadyProducts;
$tableEntry->readyQueueIds = $queueids;
}
$aRoomEntry = array ("id" => $roomid, "name" => $zeile['roomname'], "tables" => $tablesArray);
$arrayOfRooms[] = $aRoomEntry;
}
$priceTakeAway = $this->getUnpaidSumOfTakeAway($pdo);
$arrayOfProdsAndIdsOfATable = $queue->getAllPreparedProductsForTableidAsArray($pdo,null);
$arrayOfProdsOfATable = $arrayOfProdsAndIdsOfATable['prods'];
$numberOfProductsTotalToServe = $queue->numberOfProductsForTableNotDelivered($pdo,null);
$numberOfReadyProducts = count($arrayOfProdsOfATable);
$queueids = $this->getIdsFromProdList($arrayOfProdsOfATable);
return array("roomstables" => $arrayOfRooms, "takeawayprice" => $priceTakeAway,
"takeawayprodcount" => $numberOfProductsTotalToServe,
"takeawayprodready" => $numberOfReadyProducts,
"takeawayReadyQueueIds" => $queueids
);
}
function getIdsFromProdList($arrayOfProdsOfATable) {
$idArr = array();
if (!is_null($arrayOfProdsOfATable) && (count($arrayOfProdsOfATable) > 0)) {
foreach($arrayOfProdsOfATable as $queueEntry) {
$idArr[] = $queueEntry["id"];
}
return $idArr;
} else {
return array();
}
}
// Part of chain to choose a product, here we know the room and show all tables there
function showAllTablesOfRoom()
{
// Parameter for this method
$roomid = $_GET['roomid'];
// Find name of room to display in table header
$sql = "SELECT id,roomname FROM %room% WHERE id='$roomid' AND removed is null";
$dbresult = $this->dbutils->performSqlCommand($sql);
$zeile = mysqli_fetch_array( $dbresult, MYSQL_ASSOC);
$roomid = $zeile['id'];
$roomname = $zeile['roomname'];
mysqli_free_result( $dbresult );
// Navigation table - home - back
echo '<table class=navitable>';
echo '<tr>';
echo '<td><input type="image" src="img/home.png" onclick="showAllRooms();" />';
echo '<td>' . $roomname;
echo '</tr></table>';
$nextFunction = $_GET['nextfunction'];
$sql = "SELECT id,tableno FROM " . DB_RESTTABLES_TABLE . " WHERE roomid=" . $roomid;
$dbresult = $this->dbutils->performSqlCommand($sql);
// create a table that is optimal (sqrt-like size)
$numberOfIcons = mysqli_num_rows($dbresult);
$arrayOfButtons = array();
while ($zeile = mysqli_fetch_array( $dbresult, MYSQL_ASSOC)) {
$roomid = $zeile['id'];
$onClickMethod = $nextFunction . '(' . $zeile['id'] . ',' . $roomid . ');';
$aButtonEntry = array ("textOfButton" => $zeile['tableno'],
"onClickMethod" => $onClickMethod);
$arrayOfButtons[] = $aButtonEntry;
}
mysqli_free_result( $dbresult );
$commonUtils = new CommonUtils();
$commonUtils->createGridTableWithSqrtSizeOfButtons($arrayOfButtons);
}
function setRoomInfo($rooms) {
$pdo = $this->dbutils->openDbAndReturnPdo();
$pdo->beginTransaction();
// clear room table
$sql = "UPDATE %room% SET removed=?";
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute(array('1'));
// clear resttables table
$sql = "UPDATE %resttables% SET removed=?";
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute(array('1'));
// clear table positions and maps
$sql = "DELETE FROM %tablepos%";
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
$stmt->execute();
$sql = "DELETE FROM %tablemaps%";
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
$stmt->execute();
$noOfRooms = count($rooms);
for ($roomindex = 0;$roomindex < $noOfRooms; $roomindex++) {
$aRoom = $rooms[$roomindex];
$aRoomName = $aRoom[0];
$roomPrinter = $aRoom[1];
if ($roomPrinter == 0) {
$roomPrinter = null;
}
$sql = "INSERT INTO `%room%` (`id`, `roomname`, `printer`) VALUES (NULL,?,?)";
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute(array($aRoomName,$roomPrinter));
$roomId = $pdo->lastInsertId();
$tablesArr = $aRoom[2];
$noOfTables = count($tablesArr);
for ($tableindex = 0; $tableindex < $noOfTables; $tableindex++) {
$aTableName = $tablesArr[$tableindex];
$sql = "INSERT INTO `%resttables%` (`id` , `tableno`, `roomid`) VALUES (NULL ,?,?)";
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute(array($aTableName,$roomId));
}
}
$pdo->commit();
echo json_encode("OK");
}
function getRoomfield() {
$pdo = $this->dbutils->openDbAndReturnPdo();
$sql = "SELECT id,roomname,IFNULL(printer,0) as printer FROM %room% WHERE removed is null ORDER BY 'sorting'";
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute();
$result = $stmt->fetchAll();
$numberOfRooms = $stmt->rowCount();
$roomIdNameArray = array();
$maxTables = 0;
$roomArr = array();
foreach($result as $row) {
$roomid = $row['id'];
$roomname = $row['roomname'];
$printer = $row['printer'];
// now get the tables of this room
$sql = "SELECT id,tableno FROM %resttables% WHERE roomid=? AND removed is null ORDER BY 'sorting'";
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
$stmt->execute(array($row['id']));
$numberOfTables = $stmt->rowCount();
$maxTables = ($maxTables < $numberOfTables ? $numberOfTables : $maxTables);
$tableresult = $stmt->fetchAll();
$tableArr = array();
foreach($tableresult as $aTable) {
$tableArr[] = array("id" => $aTable['id'], "tablename" => $aTable['tableno']);
}
$roomArr[] = array("roomid" => $roomid, "roomname" => $roomname, "printer" => $printer, "tables" => $tableArr, "noOfTables" => $numberOfTables);
}
echo json_encode(array("status" => "OK", "noOfRooms" => $numberOfRooms, "maxTables" => $maxTables, "roomfield" => $roomArr));
}
}
?>