dbutils = new DbUtils(); $this->userrights = new Userrights(); $this->admin = new Admin(); } function handleCommand($command) { $fl = null; if (isset($_GET['fl'])) { $fl = $_GET['fl']; } // these command are only allowed for user with waiter rights if ($command == 'getNextReceiptPrintJobs') { if(isset($_GET['printers'])) { $this->getNextReceiptPrintJobs($_POST['pass'],$_GET['language'],$_GET['printers'],$fl); } else { $this->getNextReceiptPrintJobs($_POST['pass'],$_GET['language'],"1,2,3,4,5,6",$fl); } } else if ($command == 'getNextClosingPrintJobs') { $this->getNextClosingPrintJobs($_POST['pass'],$_GET['language'],$fl); } else if ($command == 'getNextFoodWorkPrintJobs') { if (isset($_GET['printer'])) { $this->getNextFoodWorkPrintJobs($_GET['printer'],$_POST['pass'],$fl); } else { $this->getNextFoodWorkPrintJobs(null,$_POST['pass'],$fl); } } else if ($command == 'getNextDrinkWorkPrintJobs') { if (isset($_GET['printer'])) { $this->getNextDrinkWorkPrintJobs($_GET['printer'],$_POST['pass'],$fl); } else { $this->getNextDrinkWorkPrintJobs(null,$_POST['pass'],$fl); } } else if ($command == 'deletePrintJob') { $this->deletePrintJob($_POST['pass'],$_POST['id']); } else if ($command == 'queueReceiptPrintJob') { if (isset($_POST['useaddrecprinter'])) { $this->queueReceiptPrintJob($_POST['billid'],$_POST['useaddrecprinter']); } else { $this->queueReceiptPrintJob($_POST['billid'],0); } } else if ($command == 'queueClosingSummary') { $this->queueClosingSummary($_GET['closingid']); } else if ($command == 'testConnection') { $this->testConnection($_POST['pass']); } else if ($command == 'getReceiptConfig') { $this->getReceiptConfig(); } else if ($command == 'getLogoAsPng') { $this->getLogoAsPng(); } else if ($command == 'getLogoAsWbmp') { $this->getLogoAsWbmp(); } else if ($command == 'getPrintJobOverview') { $pdo = DbUtils::openDbAndReturnPdoStatic(); $this->getPrintJobOverview($pdo); } else if ($command == 'clearprintjobs') { $pdo = DbUtils::openDbAndReturnPdoStatic(); $this->clearprintjobs($pdo); } else if ($command == 'batchReceiptPrintJob') { $this->batchReceiptPrintJob($_POST['start'],$_POST['end']); } else if ($command == 'getLastLog') { $this->getLastLog($_POST['pass']); } else if ($command == 'deleteSpooledPrintJob') { $this->deleteSpooledPrintJob($_POST['id']); } else { echo "Kommando nicht erkannt!"; } } private function saveLastPrintServerAccess($pdo) { date_default_timezone_set(DbUtils::getTimeZone()); $date = new DateTime(); $unixTimeStamp = $date->getTimestamp(); $sql = "SELECT count(id) as countid FROM %work% WHERE item=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array('lastprtserveraccess')); $row = $stmt->fetchObject(); if ($row->countid == 0) { $sql = "INSERT INTO %work% (item,value,signature) VALUES(?,?,?)"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array('lastprtserveraccess',$unixTimeStamp,null)); } else { $sql = "UPDATE %work% SET value=? WHERE item=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($unixTimeStamp,'lastprtserveraccess')); } } function testConnection($md5pass) { header( "Expires: Mon, 20 Dec 1998 01:00:00 GMT" ); header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" ); header( "Cache-Control: no-cache, must-revalidate" ); header( "Pragma: no-cache" ); header( "Content-Type: text/html; charset=utf8" ); $isCorrect = $this->isPasswordCorrect(null,$md5pass,true); if ($isCorrect) { echo "ok"; } else { // Output from isPasswordCorrect method already // echo " - false -"; } } /* * Insert a "work" (food or drink) job into the printjob queue. The POS Print Server will * pick these jobs and delete them after successful printing */ public static function queueWorkPrintJob($pdo,$table,$timestamp,$prods,$kind,$printer,$username) { $table .= " ($username)"; $content = json_encode(array("table" => $table, "time" => $timestamp, "products" => $prods)); $printInsertSql = "INSERT INTO `%printjobs%` (`id` , `content`,`type`,`printer`) VALUES ( NULL,?,?,?)"; $stmt = $pdo->prepare(DbUtils::substTableAlias($printInsertSql)); $stmt->execute(array($content,intval($kind) + 1,$printer)); $idOfWorkJob = $pdo->lastInsertId(); CommonUtils::log($pdo,"QUEUE","Create work job with id=$idOfWorkJob for tableid $table from user $username of kind $kind for printer=$printer"); } function getPrintJobOverview($pdo) { if (!($this->userrights->hasCurrentUserRight('right_manager')) && !($this->userrights->hasCurrentUserRight('is_admin')) ) { echo json_encode(array("status" => "ERROR", "code" => ERROR_DB_PRIVS_MISSING, "msg" => ERROR_DB_PRIVS_MISSING_MSG)); return; } $jobs = array(); for ($printer=1;$printer<7;$printer++) { $sql = "SELECT %printjobs%.id as id,%bill%.id as billid,billdate,brutto,%resttables%.tableno as tablename,type FROM %printjobs%,%bill%,%resttables% WHERE printer=? AND type = '3' AND content=%bill%.id AND %bill%.tableid=%resttables%.id"; $resultBills = CommonUtils::fetchSqlAll($pdo, $sql, array($printer)); $sql = "SELECT %printjobs%.id as id,%closing%.id as closingid,type,closingdate FROM %printjobs%,%closing% WHERE printer=? AND type = '4' AND content=%closing%.id"; $resultClosings = CommonUtils::fetchSqlAll($pdo, $sql, array($printer)); $result = array_merge($resultBills,$resultClosings); $jobs[] = array("printer" => $printer, "count" => count($result),"jobs" => $result); } $sql = "SELECT %printjobs%.id as id,content FROM %printjobs% WHERE type=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array(1)); $result = $stmt->fetchAll(); $works = array(); foreach($result as $r) { $works[] = array("id" => $r['id'],"content" => json_decode($r['content'])); } $jobs[] = array("printer" => 7, "count" => count($result),"jobs" => $works); $stmt->execute(array(2)); $result = $stmt->fetchAll(); $works = array(); foreach($result as $r) { $works[] = array("id" => $r['id'],"content" => json_decode($r['content'])); } $jobs[] = array("printer" => 8, "count" => count($result),"jobs" => $works); echo json_encode(array("status" => "OK", "msg" => $jobs)); } function clearprintjobs($pdo) { if (!($this->userrights->hasCurrentUserRight('right_manager')) && !($this->userrights->hasCurrentUserRight('is_admin')) ) { echo json_encode(array("status" => "ERROR", "code" => ERROR_DB_PRIVS_MISSING, "msg" => ERROR_DB_PRIVS_MISSING_MSG)); return; } $sql = "DELETE FROM %printjobs%"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(); $this->getPrintJobOverview($pdo); } function batchReceiptPrintJob($start,$end) { try { $start = intval($start); $end = intval($end); } catch (Exception $ex) { echo json_encode(array("status" => "ERROR", "code" => NUMBERFORMAT_ERROR, "msg" => NUMBERFORMAT_ERROR_MSG)); return; } if(!($this->userrights->hasCurrentUserRight('right_bill'))) { echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_NOT_AUTHOTRIZED, "msg" => ERROR_BILL_NOT_AUTHOTRIZED_MSG)); } else { if ($start > $end) { $tmp = $end; $end = $start; $start = $tmp; } if(session_id() == '') { session_start(); } $printer = $_SESSION['receiptprinter']; $pdo = DbUtils::openDbAndReturnPdoStatic(); for($jobId=$start;$jobId <= $end;$jobId++) { $sql = "SELECT count(id) as countid FROM %bill% WHERE id=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($jobId)); $row =$stmt->fetchObject(); if ($row->countid == 1) { $printInsertSql = "INSERT INTO `%printjobs%` (`id` , `content`,`type`,`printer`) VALUES ( NULL,?,?,?)"; $stmt = $pdo->prepare(DbUtils::substTableAlias($printInsertSql)); $stmt->execute(array($jobId,'3',$printer)); } } echo json_encode(array("status" => "OK")); } } function deleteSpooledPrintJob($printjobid) { if (!($this->userrights->hasCurrentUserRight('right_manager')) && !($this->userrights->hasCurrentUserRight('is_admin')) ) { echo "Benutzerrechte nicht ausreichend!"; return false; } $pdo = DbUtils::openDbAndReturnPdoStatic(); $sql = "DELETE FROM %printjobs% WHERE id=?"; CommonUtils::execSql($pdo, $sql, array($printjobid)); echo json_encode(array("status" => "OK")); } function queueReceiptPrintJob($billid,$useaddrecprinter) { // waiter, or manager, bill, admin rights required if (!($this->userrights->hasCurrentUserRight('right_paydesk')) && !($this->userrights->hasCurrentUserRight('right_manager')) && !($this->userrights->hasCurrentUserRight('right_bill')) && !($this->userrights->hasCurrentUserRight('right_waiter')) && !($this->userrights->hasCurrentUserRight('is_admin')) ) { echo "Benutzerrechte nicht ausreichend!"; return false; } else { // PAY_PRINT_TYPE = 3 means printing as paydesk print -> choose the printer // (print type is misused also for selection of printer) if(session_id() == '') { session_start(); } $printer = $_SESSION['receiptprinter']; // now get receipt info from bill table $pdo = $this->dbutils->openDbAndReturnPdo(); CommonUtils::log($pdo, "PRINTQUEUE", "Insert bill with id=$billid for printer=$printer into queue."); $sql = "SELECT setting FROM %config% WHERE name=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array("addreceipttoprinter")); $row = $stmt->fetchObject(); $addprinter = $row->setting; $printInsertSql = "INSERT INTO `%printjobs%` (`id` , `content`,`type`,`printer`) VALUES ( NULL,?,?,?)"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($printInsertSql)); $stmt->execute(array((string)($billid),'3',$printer)); if (!is_null($addprinter) && ($addprinter != "") && ($useaddrecprinter == 1)) { $stmt->execute(array((string)($billid),'3',$addprinter)); } echo json_encode("OK"); } } public function queueClosingSummary($closingid) { if (!($this->userrights->hasCurrentUserRight('right_paydesk')) && !($this->userrights->hasCurrentUserRight('right_manager')) && !($this->userrights->hasCurrentUserRight('right_bill')) && !($this->userrights->hasCurrentUserRight('right_closing')) && !($this->userrights->hasCurrentUserRight('right_waiter')) && !($this->userrights->hasCurrentUserRight('is_admin')) ) { echo "Benutzerrechte nicht ausreichend!"; return false; } else { if(session_id() == '') { session_start(); } $printer = $_SESSION['receiptprinter']; $pdo = $this->dbutils->openDbAndReturnPdo(); CommonUtils::log($pdo, "PRINTQUEUE", "Insert closing with id=$closingid for printer=$printer into queue."); $printInsertSql = "INSERT INTO `%printjobs%` (`id` , `content`,`type`,`printer`) VALUES ( NULL,?,?,?)"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($printInsertSql)); $stmt->execute(array((string)($closingid),'4',$printer)); echo json_encode("OK"); } } function getBigFontWorkReceiptSetting($pdo) { $sql = "SELECT setting FROM %config% WHERE name=?"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array("bigfontworkreceipt")); $row =$stmt->fetchObject(); return $row->setting; } function isPasswordCorrect($pdo,$pass,$verbose) { if (is_null($pdo)) { $pdo = DbUtils::openDbAndReturnPdoStatic(); } $sql = "SELECT setting FROM %config% WHERE name=?"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array("printpass")); $row =$stmt->fetchObject(); if ($row != null) { $passInDb = $row->setting; if ($passInDb != null) { // plain comparison if ($pass == $passInDb) { return true; } else { if ($verbose) { echo "Error: Falscher Printpass!"; } } } else { if ($verbose) { echo "Error: kein Printpass in DB gesetzt!"; } } } if ($verbose) { echo "Error: DB konnte nicht abgefragt werden!"; } return false; } function getLogoAsPng() { $pdo = $this->dbutils->openDbAndReturnPdo(); header("Content-Disposition: attachment; filename=logo.png"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); header("Expires: Mon, 20 Dec 1998 01:00:00 GMT" ); header('Content-Type: ' . image_type_to_mime_type(IMAGETYPE_PNG)); $sql = "SELECT setting from %logo% WHERE name=?"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array('logoimg')); $row = $stmt->fetchObject(); if ($stmt->rowCount() > 0) { $img = $row->setting; $php_img = imagecreatefromstring($img); imagepng($php_img, NULL); imagedestroy($php_img); } } function getLogoAsWbmp() { $pdo = $this->dbutils->openDbAndReturnPdo(); $genInfo = $this->admin->getGeneralConfigItems(false,$pdo); header("Content-Disposition: attachment; filename=logo.wbmp"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); header("Expires: Mon, 20 Dec 1998 01:00:00 GMT" ); header('Content-Type: ' . image_type_to_mime_type(IMAGETYPE_WBMP)); $logourl = $genInfo["logourl"]; $img = file_get_contents("../" . $logourl); $php_img = imagecreatefromstring($img); $foreground_color = imagecolorallocate($im, 255, 0, 0); imagewbmp($php_img, NULL, $foreground_color); imagedestroy($php_img); } function getReceiptConfig() { $pdo = $this->dbutils->openDbAndReturnPdo(); $genInfo = $this->admin->getGeneralConfigItems(false,$pdo); $retArray = array("decpoint" => $genInfo["decpoint"], "billlanguage" => $genInfo["billlanguage"], "version" => $genInfo["version"], "currency" => $genInfo["currency"], "companyinfo" => $genInfo["companyinfo"] ); echo json_encode($retArray); } function getNextClosingPrintJobs($md5pass,$language,$fl=0) { $pdo = $this->dbutils->openDbAndReturnPdo(); $isCorrect = $this->isPasswordCorrect($pdo,$md5pass,false); if ($isCorrect) { ob_start(); $this->saveLastPrintServerAccess($pdo); $closing = new Closing(); $sql = "SELECT id,content,type,printer FROM %printjobs% WHERE type=? ORDER BY id"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array(4)); $result = $stmt->fetchAll(); $closingarray = array(); foreach($result as $aClos) { $jobid = $aClos['id']; $closid = $aClos["content"]; $printer = $aClos["printer"]; $theClosing = $closing->getClosingSummaryWoSign($closid, $pdo, false,$fl); $aClosing = array("id" => $jobid,"closing" => $theClosing, "printer" => $printer); $closingarray[] = $aClosing; } echo json_encode($closingarray); ob_end_flush(); } else { echo json_encode(array()); } } function getTemplate($pdo,$templatekey) { $sql = "SELECT setting FROM %config% WHERE name=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($templatekey)); $row =$stmt->fetchObject(); return $row->setting; } function getLastLog ($md5pass) { $pdo = DbUtils::openDbAndReturnPdoStatic(); $isCorrect = $this->isPasswordCorrect($pdo,$md5pass,false); if ($isCorrect || true) { echo json_encode(CommonUtils::getLastLog($pdo)); } else { echo json_encode("Log file from server unavaible due to wrong printcode"); } } function getNextReceiptPrintJobs($md5pass,$language,$printers,$fl) { $pdo = $this->dbutils->openDbAndReturnPdo(); $isCorrect = $this->isPasswordCorrect($pdo,$md5pass,false); if ($isCorrect) { CommonUtils::log($pdo,"PRINTQUEUE", "getReceipts: p=$printers, fl=$fl"); ob_start(); $printersArr = explode ( ',', $printers ); $this->saveLastPrintServerAccess($pdo); $template = $this->getTemplate($pdo, "rectemplate"); if (intval($language) > 2) { $genInfo = $this->admin->getGeneralConfigItems(false,$pdo); $language = $genInfo["billlanguage"]; } $bill = new Bill(); $sql = "SELECT id,content,type,printer FROM %printjobs% WHERE type=? ORDER BY id"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array(3)); $result = $stmt->fetchAll(); CommonUtils::log($pdo,"PRINTQUEUE", "getNextReceiptPrintJobs: retrieve " . count($result) . " jobs"); $billarray = array(); foreach($result as $aBill) { $printJobId = $aBill['id']; $aBillId = $aBill["content"]; $printer = $aBill["printer"]; CommonUtils::log($pdo,"PRINTQUEUE", "getNextReceiptPrintJobs: collect bill with id=$aBillId for printer=$printer"); if (in_array($printer, $printersArr)) { if (is_null($fl)) { $receiptJob = array("id" => $printJobId,"bill" => $bill->getBillWithId($pdo,$aBillId,$language,$printer)); } else if ($fl >= 9) { $hosttext = CommonUtils::getConfigValue($pdo, 'hosttext', ''); $receiptJob = array("id" => $printJobId,"bill" => $bill->getBillWithId($pdo,$aBillId,$language,$printer,true,true), "template" => $template, "hosttext" => $hosttext); } else if ($fl >= 6) { $receiptJob = array("id" => $printJobId,"bill" => $bill->getBillWithId($pdo,$aBillId,$language,$printer,true,true), "template" => $template); } else if ($fl >= 4) { $receiptJob = array("id" => $printJobId,"bill" => $bill->getBillWithId($pdo,$aBillId,$language,$printer,true), "template" => $template); } else if ($fl >= 1) { $receiptJob = array("id" => $printJobId,"bill" => $bill->getBillWithId($pdo,$aBillId,$language,$printer), "template" => $template); } $billarray[] = $receiptJob; } } echo json_encode($billarray); ob_end_flush(); CommonUtils::log($pdo,"PRINTQUEUE", "getNextReceiptPrintJobs: sent data to caller"); } else { CommonUtils::log($pdo,"PRINTQUEUE", "getNextReceiptPrintJobs: Wrong printcode"); echo json_encode(array()); } } function getNextFoodWorkPrintJobs($printer,$md5pass,$fl) { $this->getNextWorkPrintJobs($md5pass,1,$printer,$fl); } function getNextDrinkWorkPrintJobs($printer,$md5pass,$fl) { $this->getNextWorkPrintJobs($md5pass,2,$printer,$fl); } function getNextWorkPrintJobs($md5pass,$theType,$printer,$fl) { $pdo = $this->dbutils->openDbAndReturnPdo(); $isCorrect = $this->isPasswordCorrect($pdo,$md5pass,false); if ($isCorrect) { CommonUtils::log($pdo,"PRINTQUEUE", "getNextWorkPrintJobs: type = $theType, printer = $printer, fl= $fl"); $this->saveLastPrintServerAccess($pdo); $bigFontWorkReceipt = $this->getBigFontWorkReceiptSetting($pdo); $templatekey = "foodtemplate"; if ($theType === 2) { $templatekey = "drinktemplate"; } $template = $this->getTemplate($pdo, $templatekey); if (is_null($printer)) { $sql = "SELECT id,content,type FROM %printjobs% WHERE type=? ORDER BY id"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($theType)); } else { $sql = "SELECT id,content,type FROM %printjobs% WHERE type=? AND printer=? ORDER BY id"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($theType,$printer)); } $result = $stmt->fetchAll(); CommonUtils::log($pdo,"PRINTQUEUE", "getNextWorkPrintJobs: retrieve " . count($result) . " jobs"); $workarray = array(); foreach($result as $aWorkJob) { $aWork = (array) json_decode($aWorkJob["content"]); // is in json format CommonUtils::log($pdo,"PRINTQUEUE", "getNextWorkPrintJobs: collect work receipt with id=" . $aWorkJob["id"] . " for printer=$printer"); if (($fl >= 5) && ($fl <= 6)) { $prods = (array) ($aWork["products"]); $targetProds = array(); foreach ($prods as $aProd) { $theArrProd = (array) $aProd; $newTargetProd = array("id" => $theArrProd["id"], "longname" => $theArrProd["longname"], "option" => $theArrProd["option"], "price" => $theArrProd["price"], "extras" => $theArrProd["extras"], "ordertime" => $theArrProd["ordertime"], "kind" => $theArrProd["kind"], "printer" => $theArrProd["printer"], ); $targetProds[] = $newTargetProd; } $aWork["products"] = $targetProds; } else if ($fl < 5) { $prods = (array) ($aWork["products"]); $targetProds = array(); foreach ($prods as $aProd) { $theArrProd = (array) $aProd; $newTargetProd = array("id" => $theArrProd["id"], "longname" => $theArrProd["longname"], "option" => $theArrProd["option"], "extras" => $theArrProd["extras"], "ordertime" => $theArrProd["ordertime"], "kind" => $theArrProd["kind"], "printer" => $theArrProd["printer"], ); $targetProds[] = $newTargetProd; } $aWork["products"] = $targetProds; } if ($fl >= 2) { $workarray[] = array("id" => $aWorkJob["id"],"content" => $aWork, "bigfontworkreceipt" => intval($bigFontWorkReceipt), "template" => $template); } else { // default without template $workarray[] = array("id" => $aWorkJob["id"],"content" => $aWork, "bigfontworkreceipt" => intval($bigFontWorkReceipt)); } } CommonUtils::log($pdo,"PRINTQUEUE", "getNextWorkPrintJobs: sent data to caller"); echo json_encode($workarray); } else { CommonUtils::log($pdo,"PRINTQUEUE", "getNextWorkPrintJobs: wrong printcode"); echo json_encode(array()); } } function deletePrintJob($pass,$id) { $pdo = $this->dbutils->openDbAndReturnPdo(); $isCorrect = $this->isPasswordCorrect($pdo,$pass,false); if ($isCorrect) { $pdo = $this->dbutils->openDbAndReturnPdo(); $this->saveLastPrintServerAccess($pdo); $sql = "DELETE FROM %printjobs% WHERE id=?"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($id)); echo json_encode(array("status" => "OK", "code" => OK, "msg" => "Druckauftrag erfolgreich gelöscht.")); } else { CommonUtils::log($pdo,"PRINTQUEUE", "deletePrintJob: wrong printcode"); echo json_encode(array("status" => "ERROR", "code" => ERROR_NOT_AUTHOTRIZED, "msg" => ERROR_NOT_AUTHOTRIZED_MSG)); } } } ?>