ordersprinter/webapp/php/guestsync.php

323 lines
9.5 KiB
PHP

<?php
require_once ('dbutils.php');
require_once ('commonutils.php');
require_once 'queuecontent.php';
class Guestsync {
public static function handleCommand($command) {
$pdo = DbUtils::openDbAndReturnPdoStatic();
if($command == 'sync') {
$ret = self::sync($pdo);
echo json_encode($ret);
}
}
public static function sync($pdo) {
if (!self::shallWeSync($pdo)) {
return array("status" => "OK","msg" => '');
}
$url = CommonUtils::getConfigValue($pdo, 'guesturl', "");
if (is_null($url)) {
return array("status" => "OK","msg" => "");
} else {
$url = trim($url);
if ($url == "") {
return array("status" => "OK","msg" => "");
}
}
$guestcode = trim(CommonUtils::getConfigValue($pdo, 'guestcode', ''));
if ($guestcode == '') {
$ret = array("status" => "ERROR","msg" => "Guest system access code not set - stopping here for security reasons!");
return $ret;
}
$timezone = CommonUtils::getConfigValue($pdo, 'timezone', "Europe/Berlin");
$dailycode = CommonUtils::getConfigValue($pdo, 'dailycode', "dfhdztfghgjzt");
$resttables = json_encode(Roomtables::getTablesForGuestsystem($pdo));
// id,name,code in an array
$prodTypes = self::getMenuForGuests($pdo);
$types = json_encode($prodTypes["types"]);
$products = json_encode($prodTypes["products"]);
$currency = CommonUtils::getConfigValue($pdo, 'currency', 'Euro');
$guesttheme = CommonUtils::getConfigValue($pdo, 'guesttheme', 8);
$decpoint = CommonUtils::getConfigValue($pdo, 'decpoint', '.');
$askdaycode = CommonUtils::getConfigValue($pdo, 'askdaycode', "1");
$asktablecode = CommonUtils::getConfigValue($pdo, 'asktablecode', "1");
$guesttimeout = CommonUtils::getConfigValue($pdo, 'guesttimeout', "5");
$sql = "SELECT setting from %logo% WHERE name=? HAVING setting is not null";
$logoImg = CommonUtils::fetchSqlAll($pdo, $sql, array("logoimg"));
if (count($logoImg) > 0) {
$logo = base64_encode($logoImg[0]["setting"]);
} else {
$logo = '';
}
$prodimages = self::getImagesForGuestProducs($pdo);
$transferdata = array(
"timezone" => $timezone,
"dailycode" => $dailycode,
"resttables" => $resttables,
"guestcode" => $guestcode,
"types" => $types,
"products" => $products,
"currency" => $currency,
"guesttheme" => $guesttheme,
"decpoint" => $decpoint,
"askdaycode" => $askdaycode,
"asktablecode" => $asktablecode,
"guesttimeout" => $guesttimeout,
"logo" => $logo,
"prodimages" => $prodimages
);
$data = json_encode($transferdata);
$transferdataBase64 = base64_encode($data);
$guestorders = self::sendToGuestsystem($pdo,$url, $transferdataBase64);
$i=0;
}
private static function sendToGuestsystem($pdo,$url, $data) {
$url .= "/sync.php";
$query = http_build_query(array("data" => $data));
$opts = array(
'http' => array(
'header' =>
"Content-Type: application/x-www-form-urlencoded\r\n" .
"Content-Length: " . strlen($query) . "\r\n" .
"User-Agent:MyAgent/1.0\r\n",
'method' => 'POST',
'content' => $query
)
);
$context = stream_context_create($opts);
$ret = file_get_contents($url, false, $context);
if (!$ret) {
$ret = array("status" => "ERROR","msg" => "Communication with guest system not successful!");
}
self::insertWorkDataFromGuestSystem($pdo, $ret);
}
private static function insertWorkDataFromGuestSystem($pdo,$dataJson) {
$dataDecoded = json_decode($dataJson,true);
if ($dataDecoded["status"] == "OK") {
try {
$entries = $dataDecoded["msg"];
foreach($entries as $entry) {
$date = $entry["date"];
$tableid = $entry["tableid"];
$prodid = $entry["prodid"];
$dailycode = $entry["dailycode"];
$tablecode = $entry["tablecode"];
$permission = self::checkPermission($pdo, $tableid, $tablecode, $prodid, $dailycode);
if ($permission) {
$success = self::addToQueue($pdo,$date,$prodid,$tableid);
if (!$success) {
return false;
}
}
}
} catch (Exception $ex) {
echo $ex->getMessage();
return false;
}
}
return true;
}
private static function checkPermission($pdo,$tableid,$tablecode,$prodid,$dailycode) {
$askdaycode = CommonUtils::getConfigValue($pdo, 'askdaycode', 1);
if ($askdaycode == 1) {
$dailycodeInDb = trim(CommonUtils::getConfigValue($pdo, 'dailycode', ''));
if ($dailycode != trim($dailycodeInDb)) {
return false;
}
}
$asktablecode = CommonUtils::getConfigValue($pdo, 'asktablecode', 1);
if ($asktablecode == 1) {
$sql = "SELECT COALESCE(code,'') as code from %resttables% WHERE id=? AND allowoutorder=?";
$result = CommonUtils::fetchSqlAll($pdo, $sql, array($tableid,1));
if (count($result) == 0) {
return false;
}
$tablecodeInDb = trim($result[0]["code"]);
if ($tablecodeInDb != $tablecode) {
return false;
}
}
$sql = "SELECT id FROM %products% WHERE id=? AND removed is null AND (display is null OR display='KG' OR display='G')";
$result = CommonUtils::fetchSqlAll($pdo, $sql, array($prodid));
if (count($result) == 0) {
return false;
}
return true;
}
private static function shallWeSync($pdo) {
date_default_timezone_set(DbUtils::getTimeZone());
$date = new DateTime();
$currentTimeStamp = $date->getTimestamp();
$sql = "SELECT value FROM %work% WHERE item=?";
$result = CommonUtils::fetchSqlAll($pdo, $sql, array('lastsyncwithguest'));
if (count($result) == 0) {
$sql = "INSERT INTO %work% (item,value) VALUES(?,?)";
CommonUtils::execSql($pdo, $sql, array("lastsyncwithguest",$currentTimeStamp));
return true;
} else {
$lastaccess = $result[0]["value"];
if (($currentTimeStamp - $lastaccess) > 5) {
$sql = "UPDATE %work% SET value=? WHERE item=?";
CommonUtils::execSql($pdo, $sql, array($currentTimeStamp,"lastsyncwithguest"));
return true;
} else {
return false;
}
}
}
private static $typesWithContent = array();
private static function getImagesForGuestProducs($pdo) {
date_default_timezone_set(DbUtils::getTimeZone());
$dayofweek = date('N');
if ($dayofweek == 7) {
$dayofweek = 0;
}
$sql = "SELECT P.id as prodid,COALESCE(I.imgl,'-') as imagedata ";
$sql .= " FROM %products% P LEFT JOIN %prodimages% I ON P.prodimageid=I.id ";
$sql .= " WHERE P.available='1' AND P.removed is null ";
$sql .= " AND (days is null OR days like ?) AND (display = 'KG' OR display = 'G' OR display is null) ";
$sql .= " AND (unit is null OR unit='0') ";
$allProductImgs = CommonUtils::fetchSqlAll($pdo, $sql, array("%$dayofweek%"));
return $allProductImgs;
}
private static function getMenuForGuests($pdo) {
date_default_timezone_set(DbUtils::getTimeZone());
$dayofweek = date('N');
if ($dayofweek == 7) {
$dayofweek = 0;
}
$pricelevel = CommonUtils::getConfigValue($pdo, "pricelevel", 0);
$priceTxt = "priceA";
if ($pricelevel == 2) {
$priceTxt = "priceB";
} else if ($pricelevel == 3) {
$priceTxt = "priceC";
}
$sql = "select id,longname,category as ref,$priceTxt as price,COALESCE(unit,0) as unit,IF(days is not null, days, '0123456') as days ";
$sql .= " from %products% where available='1' AND removed is null AND (days is null OR days like ?) AND (display = 'KG' OR display = 'G' OR display is null) ";
$sql .= " AND (unit is null OR unit='0') ";
$sql .= " ORDER BY longname";
$allProducts = CommonUtils::fetchSqlAll($pdo, $sql, array("%$dayofweek%"));
$sql = "select id,name,COALESCE(reference,0) as reference,sorting from %prodtype% where removed is null";
$allTypes = CommonUtils::fetchSqlAll($pdo, $sql, null);
$filteredTypes = self::filterUsedTypes($allTypes, $allProducts);
return array("products" => $allProducts,"types" => $filteredTypes);
}
private static function filterUsedTypes($types,$products) {
self::$typesWithContent = array();
foreach ($products as $p) {
$ref = $p["ref"];
$typeOfProd = self::getTypeOfId($types, $ref);
if (!is_null($typeOfProd)) {
self::declareProdTypeAndParentsInUse($types, $typeOfProd);
}
}
$out = array();
$keys = array_keys(self::$typesWithContent);
foreach($keys as $aKey) {
$t = self::$typesWithContent[$aKey];
$out[] = array("id" => $t["id"],"reference" => $t["reference"],"name" => $t["name"],"sorting" => $t["sorting"]);
}
usort($out,"Products::cmptypes");
return $out;
}
private static function getTypeOfId($alltypes,$typeid) {
foreach($alltypes as $t) {
if ($t["id"] == $typeid) {
return $t;
}
}
return null;
}
private static function declareProdTypeAndParentsInUse($alltypes,$aType) {
$typeid = $aType["id"];
$reference = $aType["reference"];
$sorting = $aType["sorting"];
if (!array_key_exists($typeid, self::$typesWithContent)) {
self::$typesWithContent[$typeid] = array("id" => $typeid,"name" => $aType["name"],"reference" => $reference, "sorting" => $sorting);
$parent = null;
foreach($alltypes as $a) {
$typeid = $a["id"];
if ($typeid == $reference) {
$parent = $a;
break;
}
}
if (!is_null($parent)) {
self::declareProdTypeAndParentsInUse($alltypes, $parent);
}
}
}
private static function addToQueue($pdo,$date,$prodid,$tableid) {
$printjob = CommonUtils::getConfigValue($pdo, 'guestjobprint', 1);
if (is_null($printjob)) {
$printjob = 1;
}
$queue = new QueueContent();
$success = $queue->addProductListToQueueForGuest($pdo, $date, $tableid, $prodid, $printjob);
if (!$success) {
return false;
}
if ($printjob == 0) {
QueueContent::setFlagForCooking($pdo,$prodid);
}
return true;
}
}