2269 lines
82 KiB
PHP
2269 lines
82 KiB
PHP
<?php
|
|
// Datenbank-Verbindungsparameter
|
|
require_once ('dbutils.php');
|
|
require_once ('commonutils.php');
|
|
require_once ('admin.php');
|
|
require_once ('reports.php');
|
|
require_once ('utilities/pdfexport.php');
|
|
require_once ('3rdparty/phpexcel/classes/PHPExcel.php');
|
|
require_once ('3rdparty/phpqrcode.php');
|
|
|
|
define('FPDF_FONTPATH','3rdparty/fpdf/font/');
|
|
|
|
define ('DO_EXCEL',1);
|
|
define ('DO_CSV',2);
|
|
|
|
class Bill {
|
|
var $dbutils;
|
|
var $t;
|
|
|
|
private $P_SUM = array("Summe:","Sum:","Todo:");
|
|
private $P_TOTAL = array("Total","Total","Total");
|
|
private $P_MWST = array("MwSt","Tax","IVA");
|
|
private $P_NETTO = array("Netto","Net","Neto");
|
|
private $P_BRUTTO = array("Brutto","Gross","Bruto");
|
|
private $P_ID = array("Id:","Id:","Id:");
|
|
private $P_TABLE = array("Tisch:","Table:","Mesa:");
|
|
private $P_WAITER = array("Es bediente Sie:", "Waiter:", "Camarero:");
|
|
private $P_NO = array("Anz.", "No.", "Nú.");
|
|
private $P_DESCR = array("Beschreibung","Description","Descripción");
|
|
private $P_PRICE = array("Preis","Price","Precio");
|
|
|
|
private static $daynamesStartSunday = array(
|
|
array("Sonntag","Sunday","Domingo"),
|
|
array("Montag","Monday","Lunes"),
|
|
array("Dienstag","Tuesday","Martes"),
|
|
array("Mittwoch","Wednesday","Miércoles"),
|
|
array("Donnerstag","Thursday","Jueves"),
|
|
array("Freitag","Friday","Viernes"),
|
|
array("Samstag","Saturday","Sábado")
|
|
);
|
|
|
|
private static $CASHTYPE_Privatentnahme = array("value" => 1,"name" => "Privatentnahme");
|
|
private static $CASHTYPE_Privateinlage = array("value" => 2,"name" => "Privateinlage");
|
|
private static $CASHTYPE_Geldtransit = array("value" => 3,"name" => "Geldtransit");
|
|
private static $CASHTYPE_Lohnzahlung = array("value" => 4,"name" => "Lohnzahlung");
|
|
private static $CASHTYPE_Einzahlung = array("value" => 5,"name" => "Einzahlung");
|
|
private static $CASHTYPE_Auszahlung = array("value" => 6,"name" => "Auszahlung");
|
|
private static $CASHTYPE_TrinkgeldAN = array("value" => 7,"name" => "Trinkgeld an Arb.nehmer");
|
|
private static $CASHTYPE_TrinkgeldAG = array("value" => 8,"name" => "Trinkgeld an Arb.geber");
|
|
|
|
private static $TSE_FORMAT_QR_TEXT = 1;
|
|
private static $TSE_FORMAT_ASSOC_ARRAY = 2;
|
|
|
|
function __construct() {
|
|
$this->dbutils = new DbUtils();
|
|
require_once 'translations.php';
|
|
}
|
|
|
|
function handleCommand($command) {
|
|
$cmdsThatNeedAdminOrManagerRights = array('exportCsv','exportAllCsv','exportAllExcel','exportXlsx','exportPdfReport','exportPdfReportClosPeriod',
|
|
'exportPdfSummary','exportPdfSummaryClosPeriod','exportPdfSummaryClosPeriod');
|
|
if (in_array($command, $cmdsThatNeedAdminOrManagerRights)) {
|
|
if (!$this->hasCurrentUserAdminOrManagerRights()) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_NOT_AUTHOTRIZED, "msg" => ERROR_BILL_NOT_AUTHOTRIZED_MSG));
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ($command == 'billqrcode') {
|
|
return self::outputBillQrCode($_GET["billid"]);
|
|
}
|
|
if ($command == 'exportCsv') {
|
|
$this->exportCsv($_GET['startMonth'],$_GET['startYear'],$_GET['endMonth'],$_GET['endYear'],DO_CSV);
|
|
return;
|
|
}
|
|
if ($command == 'exportAllCsv') {
|
|
$this->exportAllCsvOrExcel($_GET['startMonth'],$_GET['startYear'],$_GET['endMonth'],$_GET['endYear'],DO_CSV);
|
|
return;
|
|
}
|
|
if ($command == 'exportAllExcel') {
|
|
$this->exportAllCsvOrExcel($_GET['startMonth'],$_GET['startYear'],$_GET['endMonth'],$_GET['endYear'],DO_EXCEL);
|
|
return;
|
|
}
|
|
if ($command == 'exportXlsx') {
|
|
$this->exportCsv($_GET['startMonth'],$_GET['startYear'],$_GET['endMonth'],$_GET['endYear'],DO_EXCEL);
|
|
return;
|
|
}
|
|
if ($command == 'exportPdfReport') {
|
|
$this->exportPdfReport($_GET['startMonth'],$_GET['startYear'],$_GET['endMonth'],$_GET['endYear'],null,null);
|
|
return;
|
|
}
|
|
if ($command == 'exportPdfReportClosPeriod') {
|
|
$this->exportPdfReport(0,0,0,0,$_GET['closidstart'],$_GET['closidend']);
|
|
return;
|
|
}
|
|
if ($command == 'exportPdfSummary') {
|
|
$this->exportPdfSummary($_GET['startMonth'],$_GET['startYear'],$_GET['endMonth'],$_GET['endYear']);
|
|
return;
|
|
}
|
|
|
|
if ($command == 'exportPdfSummaryClosPeriod') {
|
|
$this->exportPdfSummaryClosPeriod($_GET['closidstart'],$_GET['closidend']);
|
|
return;
|
|
}
|
|
if ($command == 'exportCsvSummaryClosPeriod') {
|
|
$this->exportCsvSummaryClosPeriod($_GET['closidstart'],$_GET['closidend']);
|
|
return;
|
|
}
|
|
if ($command == 'autoBackupPdfSummary') {
|
|
$this->autoBackupPdfSummary($_POST['remoteaccesscode']);
|
|
return;
|
|
}
|
|
|
|
if ($command == 'exportCsvOfClosing') {
|
|
if ($this->hasCurrentUserAdminOrManagerRights()) {
|
|
$this->exportCsvOfClosing($_GET['closingid'],DO_CSV);
|
|
} else {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_MANAGER_NOT_AUTHOTRIZED, "msg" => ERROR_MANAGER_NOT_AUTHOTRIZED_MSG));
|
|
}
|
|
return;
|
|
}
|
|
if ($command == 'exportXlsxOfClosing') {
|
|
if ($this->hasCurrentUserAdminOrManagerRights()) {
|
|
$this->exportCsvOfClosing($_GET['closingid'],DO_EXCEL);
|
|
} else {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_MANAGER_NOT_AUTHOTRIZED, "msg" => ERROR_MANAGER_NOT_AUTHOTRIZED_MSG));
|
|
}
|
|
return;
|
|
}
|
|
if ($command == 'doCashAction') {
|
|
if ($this->hasCurrentUserPaydeskRights()) {
|
|
$remark = "";
|
|
$cashtype = 1;
|
|
if(isset($_POST["remark"])) {
|
|
$remark = $_POST['remark'];
|
|
}
|
|
if(isset($_POST["cashtype"])) {
|
|
$cashtype = $_POST['cashtype'];
|
|
}
|
|
self::doCashAction($_POST['money'],$remark,$cashtype);
|
|
} else {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_PAYDESK_NOT_AUTHOTRIZED, "msg" => ERROR_PAYDESK_NOT_AUTHOTRIZED_MSG));
|
|
}
|
|
return;
|
|
} else if ($command == 'getCashOverviewOfUser') {
|
|
if ($this->hasCurrentUserPaydeskRights()) {
|
|
$this->getCashOverviewOfUser();
|
|
} else {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_PAYDESK_NOT_AUTHOTRIZED, "msg" => ERROR_PAYDESK_NOT_AUTHOTRIZED_MSG));
|
|
}
|
|
return;
|
|
}
|
|
|
|
if ($command == 'changeBillHost') {
|
|
if ($this->hasCurrentUserPaydeskRights()) {
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
$this->changeBillHost($pdo,$_POST['billid'],$_POST['isNowHost']);
|
|
} else {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_PAYDESK_NOT_AUTHOTRIZED, "msg" => ERROR_PAYDESK_NOT_AUTHOTRIZED_MSG));
|
|
}
|
|
return;
|
|
}
|
|
if ($command == 'initaustriareceipt') {
|
|
if ($this->hasCurrentUserAdminOrManagerRights()) {
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
$status = $this->initaustriareceipt($pdo);
|
|
echo json_encode($status);
|
|
return;
|
|
} else {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_MANAGER_NOT_AUTHOTRIZED, "msg" => ERROR_MANAGER_NOT_AUTHOTRIZED_MSG));
|
|
}
|
|
return;
|
|
}
|
|
|
|
if ($command == 'initCardPayment') {
|
|
if ($this->hasCurrentUserPaydeskRights()) {
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
$retVal = $this->initCardPayment($pdo,$_POST['billid']);
|
|
echo json_encode($retVal);
|
|
return;
|
|
} else {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_PAYDESK_NOT_AUTHOTRIZED, "msg" => ERROR_PAYDESK_NOT_AUTHOTRIZED_MSG));
|
|
return false;
|
|
}
|
|
return;
|
|
}
|
|
|
|
if ($command == 'cancelCardPayment') {
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
$retVal = $this->cancelCardPayment($pdo,$_POST['billid'],$_POST['randvalue']);
|
|
echo json_encode($retVal);
|
|
return;
|
|
}
|
|
|
|
if ($this->hasCurrentUserBillRights()) {
|
|
if ($command == 'getLastBillsWithContent') {
|
|
$this->getLastBillsWithContent($_GET['day'],$_GET['month'],$_GET['year']);
|
|
return;
|
|
} else if ($command == 'cancelBill') {
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
$guestAssignedAndPaid = self::isBillAssignedToGuestAndPaid($pdo, $_POST['billid']);
|
|
if (!is_null($guestAssignedAndPaid)) {
|
|
$msg = "Rechnung ist dem Gast '$guestAssignedAndPaid' zugewiesen und als bezahlt deklariert. Bezahlstatus muss vor einem Bonstorno in der Gastansicht geändert werden.";
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_GUEST_ASSIGNED_AND_PAID, "msg" => $msg, "customer" => $guestAssignedAndPaid));
|
|
return;
|
|
}
|
|
$this->cancelBill($pdo,$_POST['billid'],$_POST['stornocode'],$_POST['reason'],true,true,true,$_POST['removeproducts']);
|
|
return;
|
|
}
|
|
} else {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_NOT_AUTHOTRIZED, "msg" => ERROR_BILL_NOT_AUTHOTRIZED_MSG));
|
|
}
|
|
}
|
|
|
|
private function hasCurrentUserBillRights() {
|
|
session_start();
|
|
if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {
|
|
return false;
|
|
} else {
|
|
return ($_SESSION['right_bill']);
|
|
}
|
|
}
|
|
|
|
private function hasCurrentUserPaydeskRights() {
|
|
session_start();
|
|
if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {
|
|
return false;
|
|
} else {
|
|
return ($_SESSION['right_paydesk']);
|
|
}
|
|
}
|
|
|
|
private function hasCurrentUserAdminOrManagerRights() {
|
|
session_start();
|
|
if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {
|
|
return false;
|
|
} else {
|
|
return ($_SESSION['right_manager'] || $_SESSION['is_admin']);
|
|
}
|
|
}
|
|
|
|
// This method is for bills which are not from type CASH! -> do the rest also in other method
|
|
public static function signOrdersBill($pdo,$billid,$isCancellation) {
|
|
$sign = "";
|
|
if ($isCancellation) {
|
|
$sign = "0-";
|
|
}
|
|
|
|
$sqlNormTax = "SELECT FORMAT($sign COALESCE(SUM(price),'0.00'),2) as sumpriceforcertaintax FROM %queue% Q,%billproducts% BP WHERE BP.billid=? AND Q.id=BP.queueid and Q.taxkey in ('1','11','21')";
|
|
$resultNormTax = CommonUtils::fetchSqlAll($pdo, $sqlNormTax, array($billid));
|
|
$normTaxSum = $resultNormTax[0]['sumpriceforcertaintax'];
|
|
$sqlErmTax = "SELECT FORMAT($sign COALESCE(SUM(price),'0.00'),2) as sumpriceforcertaintax FROM %queue% Q,%billproducts% BP WHERE BP.billid=? AND Q.id=BP.queueid and Q.taxkey in ('2','12','22')";
|
|
$resultErmTax = CommonUtils::fetchSqlAll($pdo, $sqlErmTax, array($billid));
|
|
$ermTaxSum = $resultErmTax[0]['sumpriceforcertaintax'];
|
|
$sqlNullTax = "SELECT FORMAT($sign COALESCE(SUM(price),'0.00'),2) as sumpriceforcertaintax FROM %queue% Q,%billproducts% BP WHERE BP.billid=? AND Q.id=BP.queueid and Q.taxkey in ('5')";
|
|
$resultNullTax = CommonUtils::fetchSqlAll($pdo, $sqlNullTax, array($billid));
|
|
$nullTaxSum = $resultNullTax[0]['sumpriceforcertaintax'];
|
|
|
|
$signStr = "Beleg^" . implode('_',array($normTaxSum,$ermTaxSum,'0.00','0.00',$nullTaxSum)) . "^";
|
|
|
|
$sql = "SELECT brutto,paymentid FROM %bill% WHERE id=?";
|
|
$result = CommonUtils::fetchSqlAll($pdo, $sql, array($billid))[0];
|
|
$brutto = $result["brutto"];
|
|
$paymentid = $result["paymentid"];
|
|
$paymentSign = "Bar";
|
|
if ($paymentid != 1) {
|
|
$paymentSign = "Unbar";
|
|
}
|
|
$currency = CommonUtils::getConfigValue($pdo, 'currency', 'EUR');
|
|
$curSign = "";
|
|
if (!in_array(strtoupper($currency), array("EURO","EUR","E","€"))) {
|
|
$curSign = ":" . $currency;
|
|
}
|
|
|
|
$signStr .= $brutto . ":" . $paymentSign . $curSign;
|
|
return self::signValueByTseAndUpdateBill($pdo, $billid, $signStr);
|
|
}
|
|
|
|
private static function signValueByTseAndUpdateBill($pdo,$billid,$valueToSign) {
|
|
$tseAnswer = TSE::sendNormalBillToTSE($pdo, $valueToSign);
|
|
if ($tseAnswer["status"] != "OK") {
|
|
return(array("status" => "ERROR","msg" => "TSE-Signierung fehlgeschlagen. Vorgang konnte nicht ausgeführt werden."));
|
|
} else {
|
|
$logtime = 0;
|
|
$trans = 0;
|
|
$tseSignature = '';
|
|
$pubkeyRef = null;
|
|
$sigalgRef = null;
|
|
$sigcounter = 0;
|
|
$serialNoRef = null;
|
|
$certificateRef = null;
|
|
|
|
if ($tseAnswer["usetse"] == DbUtils::$TSE_OK) {
|
|
$logtime = $tseAnswer["logtime"];
|
|
$trans = $tseAnswer["trans"];
|
|
$sigcounter = $tseAnswer["sigcounter"];
|
|
$tseSignature = $tseAnswer["signature"];
|
|
$sigalgRef = CommonUtils::referenceValueInTseValuesTable($pdo, $tseAnswer["sigalg"]);
|
|
$pubkeyRef = CommonUtils::referenceValueInTseValuesTable($pdo, $tseAnswer["publickey"]);
|
|
$serialNoRef = CommonUtils::referenceValueInTseValuesTable($pdo, $tseAnswer["serialno"]);
|
|
$certificateRef = CommonUtils::referenceValueInTseValuesTable($pdo, $tseAnswer["certificate"]);
|
|
}
|
|
|
|
$opid = Operations::createOperation(
|
|
$pdo,
|
|
DbUtils::$PROCESSTYPE_BELEG,
|
|
DbUtils::$OPERATION_IN_BILL_TABLE,
|
|
$logtime,
|
|
$trans,
|
|
$valueToSign,
|
|
$tseSignature,
|
|
$pubkeyRef,
|
|
$sigalgRef,
|
|
$serialNoRef,
|
|
$certificateRef,
|
|
$sigcounter,
|
|
$tseAnswer["usetse"]);
|
|
|
|
$sql = "UPDATE %bill% SET opid=?,logtime=? WHERE id=?";
|
|
CommonUtils::execSql($pdo, $sql, array($opid,$logtime, $billid));
|
|
|
|
return array("status" => "OK");
|
|
}
|
|
}
|
|
|
|
public static function isBillPaidByCard($pdo,$billid) {
|
|
$sql = "SELECT paymentid FROM %bill% WHERE id=?";
|
|
$result = CommonUtils::fetchSqlAll($pdo, $sql, array($billid));
|
|
if (count($result) > 0) {
|
|
$paymentid = $result[0]["paymentid"];
|
|
if (($paymentid == 2) || ($paymentid == 3)) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public function initCardPayment($pdo,$billid) {
|
|
$randval = md5(rand(0, getrandmax()));
|
|
$sql = "INSERT INTO %work% (item,value,signature) VALUES(?,?,?)";
|
|
CommonUtils::execSql($pdo, $sql, array("sumuphash",$billid,$randval));
|
|
return array("status" => "OK","msg" => $randval);
|
|
}
|
|
|
|
public function cancelCardPayment($pdo,$billid,$randVal) {
|
|
$sql = "SELECT count(id) as countid FROM %work% WHERE item=? AND value=? AND signature=?";
|
|
$result = CommonUtils::fetchSqlAll($pdo, $sql, array("sumuphash",$billid,$randVal));
|
|
$countid = $result[0]["countid"];
|
|
if ($countid != 1) {
|
|
return array("status" => "ERROR","msg" => "Keine Authorisierung zum Stornieren der Rechnung");
|
|
} else {
|
|
|
|
$failuretext = CommonUtils::getConfigValue($pdo, "sumupfailuretext", "");
|
|
$ok = $this->cancelBill($pdo, $billid, '', $failuretext, true, false, false, 0);
|
|
|
|
if ($ok) {
|
|
$sql = "DELETE FROM %work% WHERE item=? AND value=? AND signature=?";
|
|
CommonUtils::execSql($pdo, $sql, array("sumuphash",$billid,$randVal));
|
|
return array("status" => "OK");
|
|
} else {
|
|
return array("status" => "ERROR","msg" => "Stornierung fehlgeschlagen");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function billIsCancelled($pdo,$billid) {
|
|
$sql = "SELECT status FROM %bill% WHERE id=?";
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
|
|
$stmt->execute(array($billid));
|
|
$row = $stmt->fetchObject();
|
|
$status = $row->status;
|
|
$ret = false;
|
|
if (($status == "x") || ($status == "s")) {
|
|
$ret = true;
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
private function createBillOverallInfo($billid,$billuid,$thetimedate,$tablename,$brutto,$netto,$username,$userid,$printer,$host,$masterData,$tseInfo) {
|
|
$thetimedate_arr = explode ( ' ', $thetimedate );
|
|
$thedate = $thetimedate_arr[0];
|
|
$datearr = explode ( '-', $thedate );
|
|
$day = sprintf("%02s", $datearr[2]);
|
|
$month = sprintf("%02s", $datearr[1]);
|
|
$year = sprintf("%04s", $datearr[0]);
|
|
$thetime = $thetimedate_arr[1];
|
|
$thetimearr = explode ( ':', $thetime );
|
|
$hour = $thetimearr[0];
|
|
$min = $thetimearr[1];
|
|
$thetimedate = "$day.$month.$year $hour:$min";
|
|
|
|
$hosttext = "";
|
|
if ($host == 1) {
|
|
$hosttext = $masterData["hosttext"];
|
|
}
|
|
|
|
$billoverallinfo = array(
|
|
"id" => $billid,
|
|
"billuid" => $billuid,
|
|
"billdate" => $thetimedate,
|
|
"billday" => $day,
|
|
"billmonth" => $month,
|
|
"billyear" => $year,
|
|
"billhour" => $hour,
|
|
"billmin" => $min,
|
|
"brutto" => $brutto,
|
|
"netto" => $netto,
|
|
"table" => $tablename,
|
|
"username" => $username,
|
|
"userid" => $userid,
|
|
"printer" => $printer,
|
|
"host" => $host,
|
|
"sn" => $masterData["sn"],
|
|
"uid" => $masterData["uid"],
|
|
"version" => $masterData["version"],
|
|
"companyinfo" => $masterData["companyinfo"],
|
|
"systemid" => $masterData["systemid"],
|
|
|
|
"dsfinvk_name" => $masterData["dsfinvk_name"],
|
|
"dsfinvk_street" => $masterData["dsfinvk_street"],
|
|
"dsfinvk_postalcode" => $masterData["dsfinvk_postalcode"],
|
|
"dsfinvk_city" => $masterData["dsfinvk_city"],
|
|
"dsfinvk_country" => $masterData["dsfinvk_country"],
|
|
"dsfinvk_stnr" => $masterData["dsfinvk_stnr"],
|
|
"dsfinvk_ustid" => $masterData["dsfinvk_ustid"],
|
|
|
|
"template" => $masterData["template"],
|
|
"hospitality" => $hosttext
|
|
);
|
|
|
|
if (is_null($tseInfo)) {
|
|
$billoverallinfo["tsestatus"] = 0;
|
|
} else {
|
|
$billoverallinfo["tsestatus"] = 1;
|
|
$billoverallinfo["tseserialno"] = $tseInfo["tseserialno"];
|
|
$billoverallinfo["transnumber"] = $tseInfo["transnumber"];
|
|
$billoverallinfo["sigcounter"] = $tseInfo["sigcounter"];
|
|
$billoverallinfo["startlogtime"] = $tseInfo["startlogtime"];
|
|
$billoverallinfo["logtime"] = $tseInfo["logtime"];
|
|
$billoverallinfo["sigalg"] = $tseInfo["sigalg"];
|
|
$billoverallinfo["logtimeformat"] = $tseInfo["logtimeformat"];
|
|
$billoverallinfo["tsesignature"] = $tseInfo["tsesignature"];
|
|
$billoverallinfo["pubkey"] = $tseInfo["pubkey"];
|
|
}
|
|
|
|
return $billoverallinfo;
|
|
}
|
|
|
|
private function createBillTranslations($language) {
|
|
$billtranslations = array(
|
|
"sum" => $this->P_SUM[$language],
|
|
"total" => $this->P_TOTAL[$language],
|
|
"mwst" => $this->P_MWST[$language],
|
|
"netto" => $this->P_NETTO[$language],
|
|
"brutto" => $this->P_BRUTTO[$language],
|
|
"id" => $this->P_ID[$language],
|
|
"table" => $this->P_TABLE[$language],
|
|
"waiter" => $this->P_WAITER[$language],
|
|
"no" => $this->P_NO[$language],
|
|
"descr" => $this->P_DESCR[$language],
|
|
"price" => $this->P_PRICE[$language]
|
|
);
|
|
return $billtranslations;
|
|
}
|
|
|
|
public function getCashBillTicket($pdo,$billid) {
|
|
$readableCashType = self::getTranslateSqlCashTypeToReadable();
|
|
$sql = "SELECT CONCAT('V-',billuid) as billuid,username,U.id as userid,billdate,REPLACE(brutto,'.',(SELECT setting from %config% where name='decpoint')) as brutto,reason,$readableCashType FROM %user% U,%bill% B WHERE B.userid=U.id and B.id=?";
|
|
$result = CommonUtils::fetchSqlAll($pdo, $sql, array($billid));
|
|
$billuid = $result[0]['billuid'];
|
|
$username = $result[0]['username'];
|
|
$userid = $result[0]['userid'];
|
|
$thetimedate = $result[0]['billdate'];
|
|
$brutto = $result[0]['brutto'];
|
|
$netto = $brutto;
|
|
$masterData = self::getBillMasterDataAtBillTime($pdo,$billid,'cashtemplate');
|
|
$tseInfo = self::getTseInfoOfBill($pdo, $billid, self::$TSE_FORMAT_ASSOC_ARRAY);
|
|
$ticket = $this->createBillOverallInfo($billid,$billuid,$thetimedate,'',$brutto,$netto,$username,$userid,'',0,$masterData,$tseInfo);
|
|
$ticket['reason'] = $result[0]['reason'];
|
|
$ticket['cashtype'] = $result[0]['cashtype'];
|
|
|
|
return $ticket;
|
|
}
|
|
|
|
public function getBillWithIdAsTicket($pdo,$billid) {
|
|
set_time_limit(120);
|
|
|
|
$commonUtils = new CommonUtils();
|
|
$correct = $commonUtils->verifyBill($pdo, $billid);
|
|
if (!$correct) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_INCONSISTENT_DB, "msg" => ERROR_INCONSISTENT_DB_MSG));
|
|
return;
|
|
}
|
|
|
|
$decpoint = CommonUtils::getConfigValue($pdo, 'decpoint', ".");
|
|
|
|
|
|
$sql = "SELECT tableid,status FROM %bill% WHERE id=?";
|
|
$row = CommonUtils::getRowSqlObject($pdo, $sql,array($billid));
|
|
if ($row->status == 'c') {
|
|
return $this->getCashBillTicket($pdo,$billid);
|
|
}
|
|
|
|
$sql = "SELECT count(id) as countid FROM %queue% WHERE billid=?";
|
|
$qrow = CommonUtils::getRowSqlObject($pdo, $sql, array($billid));
|
|
|
|
$tableid = $row->tableid;
|
|
if ($qrow->countid == 0) {
|
|
if ($tableid == 0) {
|
|
$sql = "SELECT DISTINCT opid,IF(status='c',CONCAT('V-',billuid),billuid) as billuid,billdate,brutto,ROUND(netto,2) as netto,'-' as tablename,username,%user%.id as userid,host,COALESCE(%bill%.status,'') as status,guestinfo,paymentid,printextras FROM %bill%,%user% WHERE %bill%.id=? AND userid=%user%.id AND tableid='0' ";
|
|
} else {
|
|
$sql = "SELECT DISTINCT opid,IF(status='c',CONCAT('V-',billuid),billuid) as billuid,billdate,brutto,ROUND(netto,2) as netto,tableno as tablename,username,%user%.id as userid,host,COALESCE(%bill%.status,'') as status,guestinfo,paymentid,printextras FROM %bill%,%user%,%resttables% WHERE %bill%.id=? AND userid=%user%.id AND tableid=%resttables%.id ";
|
|
}
|
|
} else {
|
|
if ($tableid == 0) {
|
|
$sql = "SELECT DISTINCT opid,IF(status='c',CONCAT('V-',billuid),billuid) as billuid,billdate,brutto,ROUND(netto,2) as netto,'-' as tablename,username,%user%.id as userid,host,COALESCE(%bill%.status,'') as status,guestinfo,paymentid,printextras FROM %bill%,%user%,%queue% WHERE %bill%.id=? AND %bill%.id=%queue%.billid AND userid=%user%.id AND tableid='0' AND paidtime is not null ";
|
|
} else {
|
|
$sql = "SELECT DISTINCT opid,IF(status='c',CONCAT('V-',billuid),billuid) as billuid,billdate,brutto,ROUND(netto,2) as netto,tableno as tablename,username,%user%.id as userid,host,COALESCE(%bill%.status,'') as status,guestinfo,paymentid,printextras FROM %bill%,%user%,%resttables%,%queue% WHERE %bill%.id=? AND %bill%.id=%queue%.billid AND userid=%user%.id AND tableid=%resttables%.id AND paidtime is not null ";
|
|
}
|
|
}
|
|
$row = CommonUtils::getRowSqlObject($pdo, $sql, array($billid));
|
|
|
|
$status = $row->status;
|
|
$sign = ($status == "s" ? "-" : "");
|
|
|
|
if ($tableid != 0) {
|
|
$sql = "SELECT abbreviation FROM %room%,%resttables% WHERE %resttables%.id=? AND %resttables%.roomid=%room%.id";
|
|
$trow = CommonUtils::getRowSqlObject($pdo, $sql, array($tableid));
|
|
if (is_null($trow->abbreviation) || ($trow->abbreviation == '')) {
|
|
$tablename = $row->tablename;
|
|
} else {
|
|
$tablename = $trow->abbreviation . "-" . $row->tablename;
|
|
}
|
|
} else {
|
|
$tablename = "-";
|
|
}
|
|
|
|
if ($row == null) {
|
|
echo json_encode(array("job" => array()));
|
|
return;
|
|
} else {
|
|
if (is_null($row->host)) {
|
|
$host = 0; // default
|
|
} else {
|
|
$host = $row->host;
|
|
}
|
|
|
|
$tseInfo = self::getTseInfoOfBill($pdo, $billid, self::$TSE_FORMAT_ASSOC_ARRAY);
|
|
|
|
$thetimedate = $row->billdate;
|
|
$printextrasOfReceipt = $row->printextras;
|
|
$billuid = $row->billuid;
|
|
$printExtras = false;
|
|
if ($printextrasOfReceipt == 1) {
|
|
$printExtras = true;
|
|
}
|
|
$masterData = self::getBillMasterDataAtBillTime($pdo,$billid,'rectemplate');
|
|
// str_replace(".",$decpoint,$netto)
|
|
$overallBrutto = str_replace(".",$decpoint,$row->brutto);
|
|
$overallNetto = str_replace(".",$decpoint,$row->netto);
|
|
|
|
$billoverallinfo = $this->createBillOverallInfo($billid,$billuid,$thetimedate,$tablename,$overallBrutto,$overallNetto,$row->username,$row->userid,0,$host,$masterData,$tseInfo);
|
|
|
|
// rem* guestinfo
|
|
if (is_null($row->guestinfo)) {
|
|
$billoverallinfo["guestinfo"] = '';
|
|
} else {
|
|
$billoverallinfo["guestinfo"] = $row->guestinfo;
|
|
}
|
|
|
|
|
|
// rem* PAYMENT INFO
|
|
$col = "name";
|
|
|
|
$paymentid = $row->paymentid;
|
|
$sql = "SELECT $col FROM %payment% as name WHERE id=?";
|
|
$paymentname = CommonUtils::getRowSqlObject($pdo, $sql, array($paymentid));
|
|
$billoverallinfo["payment"] = $paymentname->name;
|
|
|
|
}
|
|
|
|
$result = self::getBillProductsInCumulatedOrder($pdo, $billid);
|
|
|
|
$prodarray = array();
|
|
foreach($result as $zeile) {
|
|
$productname = $zeile['productname'];
|
|
if ($zeile["togo"] == 1) {
|
|
$productname = "To-Go: " . $productname;
|
|
}
|
|
$pricelevel = $zeile['pricelevelname'];
|
|
if ($pricelevel != "A") {
|
|
$productname .= " (" . $pricelevel . ")";
|
|
}
|
|
$prodarray[] = array("count" => $zeile['count'],
|
|
"productname" => $productname,
|
|
"pricelevel" => $zeile['pricelevelname'],
|
|
"price" => $sign . str_replace(".",$decpoint,$zeile['price']),
|
|
"total" => $sign . str_replace(".",$decpoint,$zeile['total'])
|
|
);
|
|
|
|
if ($printExtras) {
|
|
$extrasConcatStr = $zeile['concatstr'];
|
|
if (!is_null($extrasConcatStr)) {
|
|
$singleExtras = explode(',', $extrasConcatStr);
|
|
|
|
$printextraprice = CommonUtils::getConfigValue($pdo, 'printextraprice', 1);
|
|
|
|
$sql = "SELECT name FROM %extras% WHERE id=?";
|
|
if ($printextraprice == 1) {
|
|
$decpoint = CommonUtils::getConfigValue($pdo, 'decpoint', ';');
|
|
if (($decpoint != '.') && ($decpoint != ',')) {
|
|
$decpoint = ',';
|
|
}
|
|
$sql = "SELECT CONCAT(name,' (',REPLACE(price,'.','$decpoint'),')') as name FROM %extras% WHERE id=?";
|
|
}
|
|
|
|
|
|
foreach ($singleExtras as $aSingleExtra) {
|
|
$singleExtraParts = explode('-', $aSingleExtra);
|
|
$amount = $singleExtraParts[0];
|
|
$singleExtraId = $singleExtraParts[1];
|
|
$extraNameRes = CommonUtils::fetchSqlAll($pdo, $sql, array($singleExtraId));
|
|
if (count($extraNameRes) > 0) {
|
|
$extraText = $amount . "x " . $extraNameRes[0]["name"];
|
|
$prodarray[] = array("count" => ' ',
|
|
"productname" => ' + ' . $extraText,
|
|
"pricelevel" => $zeile['pricelevelname'],
|
|
"price" => ' ',
|
|
"total" => ' '
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$taxSql = "tax";
|
|
$mwstSql = "concat('$sign',round(sum(price) - sum(price / (1.0 + tax/100.0)),2))";
|
|
$nettoSql = "concat('$sign',round(sum(price / (1.0 + tax/100.0)),2))";
|
|
$bruttoSql = "concat('$sign',sum(price))";
|
|
if (($decpoint == '.') || ($decpoint == ',')) {
|
|
// REPLACE("XYZ FGH XYZ", "X", "M")
|
|
$taxSql = "REPLACE($taxSql,'.','$decpoint')";
|
|
$mwstSql = "REPLACE($mwstSql,'.','$decpoint')";
|
|
$nettoSql = "REPLACE($nettoSql,'.','$decpoint')";
|
|
$bruttoSql = "REPLACE($bruttoSql,'.','$decpoint')";
|
|
}
|
|
|
|
$sql = "select $taxSql as tax,$mwstSql as mwst, $nettoSql as netto, $bruttoSql as brutto FROM %queue%,%billproducts% WHERE %billproducts%.billid=? AND %billproducts%.queueid=%queue%.id group by tax ORDER BY tax";
|
|
$result = CommonUtils::fetchSqlAll($pdo, $sql, array($billid));
|
|
|
|
$billoverallinfo["products"] = $prodarray;
|
|
$billoverallinfo["taxes"] = $result;
|
|
return $billoverallinfo;
|
|
}
|
|
|
|
public static function setPositionsOfProductsOnBillProductsTable($pdo,$billid) {
|
|
$billarticles = self::getBillProductsInCumulatedOrder($pdo, $billid);
|
|
$pos = 1;
|
|
foreach ($billarticles as $billentry) {
|
|
$queueids = $billentry["queueids"];
|
|
$queueidsArr = explode(',', $queueids);
|
|
$sql = "UPDATE %billproducts% BP SET position=? WHERE billid=? AND queueid=?";
|
|
foreach($queueidsArr as $aQueueid) {
|
|
CommonUtils::execSql($pdo, $sql, array($pos,$billid,$aQueueid));
|
|
}
|
|
$pos++;
|
|
}
|
|
}
|
|
|
|
private static function getBillProductsInCumulatedOrder($pdo,$billid) {
|
|
$billprintextrasSql = CommonUtils::fetchSqlAll($pdo, "SELECT printextras FROM %bill% WHERE id=?", array($billid));
|
|
$printExtras = $billprintextrasSql[0]["printextras"];
|
|
$unit = CommonUtils::caseOfSqlUnitSelection($pdo);
|
|
$sql = "select CONCAT($unit,productname) as productname,price,(count(Q.productname) * price) as total,%pricelevel%.name as pricelevelname,togo,count(Q.productname) as count,%prodtype%.kind as kind,GROUP_CONCAT(Q.id) as queueids ";
|
|
$sql .= " FROM %queue% Q,%pricelevel%,%billproducts%,%prodtype%,%products% where %billproducts%.billid=? AND %billproducts%.queueid=Q.id ";
|
|
$sql .= " AND Q.pricelevel = %pricelevel%.id AND Q.productid = %products%.id AND %products%.category = %prodtype%.id ";
|
|
$sql .= " GROUP BY kind, CONCAT($unit,productname),price,pricelevelname,togo ";
|
|
$sql .= " ORDER BY kind, CONCAT($unit,productname),price,pricelevelname,togo ";
|
|
|
|
if ($printExtras == 1) {
|
|
$sql = "SELECT
|
|
CONCAT($unit,productname) as productname,
|
|
price,
|
|
(count(Q.productname) * price) as total,
|
|
PL.name as pricelevelname,
|
|
togo,
|
|
count(Q.productname) as count,
|
|
PT.kind as kind,
|
|
GROUP_CONCAT(Q.id) as queueids,
|
|
(
|
|
SELECT GROUP_CONCAT(CONCAT(amount,'-',extraid) ORDER BY extraid)
|
|
FROM
|
|
%queueextras% QE
|
|
WHERE
|
|
Q.id=QE.queueid
|
|
) as concatstr
|
|
FROM
|
|
%queue% Q,
|
|
%pricelevel% PL,
|
|
%billproducts% BP,
|
|
%prodtype% PT,
|
|
%products% P
|
|
WHERE
|
|
BP.billid=? AND
|
|
BP.queueid=Q.id AND
|
|
Q.pricelevel = PL.id AND
|
|
Q.productid = P.id AND
|
|
P.category = PT.id
|
|
GROUP BY
|
|
kind,
|
|
CONCAT($unit,productname),
|
|
price,
|
|
pricelevelname,
|
|
togo,
|
|
concatstr
|
|
ORDER BY kind, CONCAT($unit,productname),price,pricelevelname,togo
|
|
";
|
|
|
|
};
|
|
return CommonUtils::fetchSqlAll($pdo, $sql, array($billid));
|
|
}
|
|
|
|
/**
|
|
* get the content of a bill (to be used for printserver etc.)
|
|
*
|
|
* @param unknown $billid
|
|
*/
|
|
function getBillWithId($pdo,$billid,$language,$printer,$includeGuestInfo = false,$includePayment = false) {
|
|
set_time_limit(120);
|
|
|
|
$commonUtils = new CommonUtils();
|
|
$correct = $commonUtils->verifyBill($pdo, $billid);
|
|
if (!$correct) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_INCONSISTENT_DB, "msg" => ERROR_INCONSISTENT_DB_MSG));
|
|
return;
|
|
}
|
|
|
|
|
|
$sql = "SELECT tableid,status FROM %bill% WHERE id=?";
|
|
$row = CommonUtils::getRowSqlObject($pdo, $sql,array($billid));
|
|
if ($row->status == 'c') {
|
|
return $this->getCashBill($pdo,$billid,$language,$printer);
|
|
}
|
|
|
|
$sql = "SELECT count(id) as countid FROM %queue% WHERE billid=?";
|
|
$qrow = CommonUtils::getRowSqlObject($pdo, $sql, array($billid));
|
|
|
|
$tableid = $row->tableid;
|
|
if ($qrow->countid == 0) {
|
|
if ($tableid == 0) {
|
|
$sql = "SELECT DISTINCT IF(status='c',CONCAT('V-',billuid),billuid) as billuid,billdate,brutto,ROUND(netto,2) as netto,'-' as tablename,username,%user%.id as userid,host,COALESCE(%bill%.status,'') as status,guestinfo,paymentid,printextras FROM %bill%,%user% WHERE %bill%.id=? AND userid=%user%.id AND tableid='0' ";
|
|
} else {
|
|
$sql = "SELECT DISTINCT IF(status='c',CONCAT('V-',billuid),billuid) as billuid,billdate,brutto,ROUND(netto,2) as netto,tableno as tablename,username,%user%.id as userid,host,COALESCE(%bill%.status,'') as status,guestinfo,paymentid,printextras FROM %bill%,%user%,%resttables% WHERE %bill%.id=? AND userid=%user%.id AND tableid=%resttables%.id ";
|
|
}
|
|
} else {
|
|
if ($tableid == 0) {
|
|
$sql = "SELECT DISTINCT IF(status='c',CONCAT('V-',billuid),billuid) as billuid,billdate,brutto,ROUND(netto,2) as netto,'-' as tablename,username,%user%.id as userid,host,COALESCE(%bill%.status,'') as status,guestinfo,paymentid,printextras FROM %bill%,%user%,%queue% WHERE %bill%.id=? AND %bill%.id=%queue%.billid AND userid=%user%.id AND tableid='0' AND paidtime is not null ";
|
|
} else {
|
|
$sql = "SELECT DISTINCT IF(status='c',CONCAT('V-',billuid),billuid) as billuid,billdate,brutto,ROUND(netto,2) as netto,tableno as tablename,username,%user%.id as userid,host,COALESCE(%bill%.status,'') as status,guestinfo,paymentid,printextras FROM %bill%,%user%,%resttables%,%queue% WHERE %bill%.id=? AND %bill%.id=%queue%.billid AND userid=%user%.id AND tableid=%resttables%.id AND paidtime is not null ";
|
|
}
|
|
}
|
|
$row = CommonUtils::getRowSqlObject($pdo, $sql, array($billid));
|
|
|
|
$status = $row->status;
|
|
$sign = ($status == "s" ? "-" : "");
|
|
|
|
if ($tableid != 0) {
|
|
$sql = "SELECT abbreviation FROM %room%,%resttables% WHERE %resttables%.id=? AND %resttables%.roomid=%room%.id";
|
|
$trow = CommonUtils::getRowSqlObject($pdo, $sql, array($tableid));
|
|
if (is_null($trow->abbreviation) || ($trow->abbreviation == '')) {
|
|
$tablename = $row->tablename;
|
|
} else {
|
|
$tablename = $trow->abbreviation . "-" . $row->tablename;
|
|
}
|
|
} else {
|
|
$tablename = "-";
|
|
}
|
|
|
|
if ($row == null) {
|
|
echo json_encode(array("billoverallinfo" => array()));
|
|
return;
|
|
} else {
|
|
$tseInfo = self::getTseInfoOfBill($pdo, $billid, self::$TSE_FORMAT_ASSOC_ARRAY);
|
|
if (is_null($row->host)) {
|
|
$host = 0; // default
|
|
} else {
|
|
$host = $row->host;
|
|
}
|
|
$thetimedate = $row->billdate;
|
|
$printextrasOfReceipt = $row->printextras;
|
|
$billuid = $row->billuid;
|
|
$printExtras = false;
|
|
if ($printextrasOfReceipt == 1) {
|
|
$printExtras = true;
|
|
}
|
|
$masterData = self::getBillMasterDataAtBillTime($pdo,$billid,'rectemplate');
|
|
if (is_null($masterData["companyinfo"])) {
|
|
$masterData["companyinfo"] = "";
|
|
}
|
|
$billoverallinfo = $this->createBillOverallInfo($billid,$billuid,$thetimedate,$tablename,$row->brutto,$row->netto,$row->username,$row->userid,$printer,$host,$masterData,$tseInfo);
|
|
|
|
if ($includeGuestInfo) {
|
|
if (is_null($row->guestinfo)) {
|
|
$billoverallinfo["guestinfo"] = '';
|
|
} else {
|
|
$billoverallinfo["guestinfo"] = $row->guestinfo;
|
|
}
|
|
}
|
|
|
|
if ($includePayment) {
|
|
$col = "name";
|
|
if ($language == 1) {
|
|
$col = "name_en";
|
|
} else if ($language == 2) {
|
|
$col = "name_esp";
|
|
}
|
|
$paymentid = $row->paymentid;
|
|
$sql = "SELECT $col FROM %payment% as name WHERE id=?";
|
|
$paymentname = CommonUtils::getRowSqlObject($pdo, $sql, array($paymentid));
|
|
$billoverallinfo["payment"] = $paymentname->name;
|
|
}
|
|
|
|
$billtranslations = $this->createBillTranslations($language);
|
|
}
|
|
|
|
$result = self::getBillProductsInCumulatedOrder($pdo,$billid);
|
|
|
|
|
|
$prodarray = array();
|
|
foreach($result as $zeile) {
|
|
$productname = $zeile['productname'];
|
|
if ($zeile["togo"] == 1) {
|
|
$productname = "To-Go: " . $productname;
|
|
}
|
|
$prodarray[] = array("count" => $zeile['count'],
|
|
"productname" => $productname,
|
|
"pricelevel" => $zeile['pricelevelname'],
|
|
"price" => $sign . $zeile['price']
|
|
);
|
|
if ($printExtras) {
|
|
$extrasConcatStr = $zeile['concatstr'];
|
|
if (!is_null($extrasConcatStr)) {
|
|
$singleExtras = explode(',', $extrasConcatStr);
|
|
|
|
$printextraprice = CommonUtils::getConfigValue($pdo, 'printextraprice', 1);
|
|
|
|
$sql = "SELECT name FROM %extras% WHERE id=?";
|
|
if ($printextraprice == 1) {
|
|
$decpoint = CommonUtils::getConfigValue($pdo, 'decpoint', ';');
|
|
if (($decpoint != '.') && ($decpoint != ',')) {
|
|
$decpoint = ',';
|
|
}
|
|
$sql = "SELECT CONCAT(name,' (',REPLACE(price,'.','$decpoint'),')') as name FROM %extras% WHERE id=?";
|
|
}
|
|
|
|
|
|
foreach ($singleExtras as $aSingleExtra) {
|
|
$singleExtraParts = explode('-', $aSingleExtra);
|
|
$amount = $singleExtraParts[0];
|
|
$singleExtraId = $singleExtraParts[1];
|
|
$extraNameRes = CommonUtils::fetchSqlAll($pdo, $sql, array($singleExtraId));
|
|
if (count($extraNameRes) > 0) {
|
|
$extraText = $amount . "x " . $extraNameRes[0]["name"];
|
|
$prodarray[] = array("count" => 0,
|
|
"productname" => ' + ' . $extraText,
|
|
"pricelevel" => $zeile['pricelevelname'],
|
|
"price" => 0
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
$sql = "select tax,concat('$sign',round(sum(price) - sum(price / (1.0 + tax/100.0)),2)) as mwst, concat('$sign',round(sum(price / (1.0 + tax/100.0)),2)) as netto, concat('$sign',sum(price)) as brutto FROM %queue%,%billproducts% WHERE %billproducts%.billid=? AND %billproducts%.queueid=%queue%.id group by tax ORDER BY tax";
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
|
|
$stmt->execute(array($billid));
|
|
$result = $stmt->fetchAll(PDO::FETCH_OBJ);
|
|
|
|
$out = array("billoverallinfo" => $billoverallinfo,"translations" => $billtranslations,"products" => $prodarray, "taxes" => $result);
|
|
return $out;
|
|
}
|
|
|
|
private static function getTseInfoOfBill($pdo,$billid,$tseFormat) {
|
|
date_default_timezone_set(DbUtils::getTimeZone());
|
|
|
|
$sql = "SELECT opid FROM %bill% WHERE id=?";
|
|
$res = CommonUtils::fetchSqlAll($pdo, $sql, array($billid));
|
|
$opid = $res[0]["opid"];
|
|
if (is_null($opid)) {
|
|
return null;
|
|
}
|
|
|
|
$tsestatus = "(SELECT O.tseerror FROM %operations% O WHERE O.id=B.opid ) as tsestatus";
|
|
$tseserialnoSql = "(SELECT T.textvalue FROM %operations% O INNER JOIN %tsevalues% T ON O.serialno=T.id WHERE O.id=B.opid ) as serialno";
|
|
$sigalgSql = "(SELECT T.textvalue FROM %operations% O INNER JOIN %tsevalues% T ON O.sigalg=T.id WHERE O.id=B.opid ) as sigalg";
|
|
$pubkeySql = "(SELECT T.textvalue FROM %operations% O INNER JOIN %tsevalues% T ON O.pubkey=T.id WHERE O.id=B.opid ) as pubkey";
|
|
$logtimeSql = "(SELECT O.logtime FROM %operations% O WHERE O.id=B.opid ) as logtime";
|
|
$tsesignatureSql = "(SELECT O.tsesignature FROM %operations% O WHERE O.id=B.opid ) as tsesignature";
|
|
$transSql = "(SELECT O.trans FROM %operations% O WHERE O.id=B.opid ) as trans";
|
|
$sigcounterSql = "(SELECT O.sigcounter FROM %operations% O WHERE O.id=B.opid ) as sigcounter";
|
|
$signtxtSql = "(SELECT O.signtxt FROM %operations% O WHERE O.id=B.opid ) as signtxt";
|
|
|
|
$sql = "SELECT status,$tsestatus,$tseserialnoSql,$tsesignatureSql,$transSql,$sigalgSql,$pubkeySql,$logtimeSql,$sigcounterSql,$signtxtSql ";
|
|
$sql .= " FROM %bill% B ";
|
|
$sql .= " WHERE B.id=?";
|
|
|
|
$billProperties = CommonUtils::fetchSqlAll($pdo, $sql, array($billid));
|
|
if (count($billProperties) == 0) {
|
|
return "";
|
|
}
|
|
if (!isset($billProperties[0]["tsesignature"])) {
|
|
return null;
|
|
}
|
|
if ($billProperties[0]["tsestatus"] != 1) {
|
|
return null;
|
|
}
|
|
$tseSignature = $billProperties[0]["tsesignature"];
|
|
if (is_null($tseSignature) || ($tseSignature == "")) {
|
|
return null;
|
|
}
|
|
|
|
$qrCodeVersion = "V0";
|
|
$serialNoOfPOS = CommonUtils::getConfigValue($pdo, 'sn', "ORD1");
|
|
$tseserialno = $billProperties[0]["serialno"];
|
|
$processType = "Kassenbeleg-V1";
|
|
$processData = $billProperties[0]["signtxt"];
|
|
$transNumber = $billProperties[0]["trans"];
|
|
$sigcounter = $billProperties[0]["sigcounter"];
|
|
$logtime = self::epochTimeToDSfinTime($billProperties[0]["logtime"]);
|
|
$sigAlg = $billProperties[0]["sigalg"];
|
|
$logTimeFormat = "unixTime";
|
|
$pubkey = $billProperties[0]["pubkey"];
|
|
|
|
$billstatus = $billProperties[0]["status"];
|
|
if ($billstatus == 'c') {
|
|
$startlogtime = $logtime;
|
|
} else {
|
|
$startlogtime = self::getFirstLogTimeOfBill($pdo, $billid);
|
|
}
|
|
|
|
if ($tseFormat == self::$TSE_FORMAT_QR_TEXT) {
|
|
$tseInfo = array(
|
|
$qrCodeVersion,
|
|
$serialNoOfPOS,
|
|
$processType,
|
|
$processData,
|
|
$transNumber,
|
|
$sigcounter,
|
|
$startlogtime,
|
|
$logtime,
|
|
$sigAlg,
|
|
$logTimeFormat,
|
|
$tseSignature,
|
|
$pubkey
|
|
);
|
|
|
|
return implode(';',$tseInfo);
|
|
} else {
|
|
$tseInfo = array(
|
|
"serialno" => $serialNoOfPOS,
|
|
"tseserialno" => $tseserialno,
|
|
"transnumber" => $transNumber,
|
|
"sigcounter" => $sigcounter,
|
|
"startlogtime" => $startlogtime,
|
|
"logtime" => $logtime,
|
|
"sigalg" => $sigAlg,
|
|
"logtimeformat" => $logTimeFormat,
|
|
"tsesignature" => $tseSignature,
|
|
"pubkey" => $pubkey
|
|
);
|
|
return $tseInfo;
|
|
}
|
|
}
|
|
|
|
public static function getFirstLogTimeOfBill($pdo,$billid) {
|
|
$sql = "SELECT MIN(Q.logtime) as starttime FROM %queue% Q,%billproducts% BP WHERE BP.billid=? AND BP.queueid=Q.id";
|
|
$startlogRes = CommonUtils::fetchSqlAll($pdo, $sql, array($billid));
|
|
if (count($startlogRes) == 0) {
|
|
return "";
|
|
}
|
|
$startlogtime = self::epochTimeToDSfinTime($startlogRes[0]["starttime"]);
|
|
return $startlogtime;
|
|
}
|
|
|
|
public static function outputBillQrCode($billid) {
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
$tseInfo = self::getTseInfoOfBill($pdo, $billid,self::$TSE_FORMAT_QR_TEXT);
|
|
if (!is_null($tseInfo) && ($tseInfo != "")) {
|
|
QRcode::png($tseInfo);
|
|
} else {
|
|
CommonUtils::outputWideEmptyImage();
|
|
}
|
|
}
|
|
private static function epochTimeToDSfinTime($epoch) {
|
|
$datePart = date("Y-m-d",$epoch);
|
|
$timePart = date("H:i:s",$epoch);
|
|
return $datePart . "T" . $timePart. ".000";
|
|
}
|
|
|
|
private static function getBillMasterDataAtBillTime($pdo,$billid,$templatename) {
|
|
$sql = "SELECT billdate FROM %bill% WHERE id=?";
|
|
$res = CommonUtils::fetchSqlAll($pdo, $sql, array($billid));
|
|
$billdate = $res[0]["billdate"];
|
|
return CommonUtils::getMasterDataAtCertainDateTime($pdo, $billdate, $templatename);
|
|
}
|
|
|
|
private function getCashBill($pdo,$billid,$language,$printer) {
|
|
$sql = "SELECT billdate,ROUND(brutto,2) as brutto,ROUND(netto,2) as netto,ROUND(tax,2) as tax,username,userid,reason FROM %bill% B, %user% U WHERE B.id=? AND B.userid=U.id";
|
|
$result = CommonUtils::fetchSqlAll($pdo, $sql, array($billid));
|
|
$r = $result[0];
|
|
|
|
$brutto = $r["brutto"];
|
|
$netto = $r["netto"];
|
|
|
|
$masterData = self::getBillMasterDataAtBillTime($pdo,$billid,'cashtemplate');
|
|
$tseInfo = self::getTseInfoOfBill($pdo, $billid, self::$TSE_FORMAT_ASSOC_ARRAY);
|
|
$billoverallinfo = $this->createBillOverallInfo($billid,"V-" .$billid,$r["billdate"],' ',$brutto,$netto,$r["username"],$r["userid"],1,0,$masterData,$tseInfo);
|
|
$billoverallinfo["guestinfo"] = '';
|
|
|
|
$billtranslations = $this->createBillTranslations($language);
|
|
|
|
$prods = array();
|
|
$prods[] = array(
|
|
"productname" => "Barein-/auslage",
|
|
"price" => $r["brutto"],
|
|
"pricelevel" => "A",
|
|
"count" => 1
|
|
);
|
|
$reason = $r["reason"];
|
|
if (!is_null($reason)) {
|
|
$prods[] = array(
|
|
"productname" => "($reason)",
|
|
"price" => 0,
|
|
"pricelevel" => "A",
|
|
"count" => 0
|
|
);
|
|
}
|
|
|
|
$taxes = array(
|
|
array("tax"=> "0.00","mwst" => "0.00", "netto" => $netto,"brutto" => $brutto)
|
|
);
|
|
|
|
$out = array("billoverallinfo" => $billoverallinfo,"translations" => $billtranslations,"products" => $prods, "taxes" => $taxes);
|
|
return $out;
|
|
}
|
|
|
|
public function getAustriaTaxes($pdo,$billid) {
|
|
$sql = "select tax,IF(taxaustria is not null, taxaustria, 0) as taxaustria,concat('$sign',round(sum(price) - sum(price / (1.0 + tax/100.0)),2)) as mwst, concat('$sign',round(sum(price / (1.0 + tax/100.0)),2)) as netto, concat('$sign',sum(price)) as brutto FROM %queue%,%billproducts% WHERE %billproducts%.billid=? AND %billproducts%.queueid=%queue%.id group by tax ORDER BY taxaustria";
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
|
|
$stmt->execute(array($billid));
|
|
$result = $stmt->fetchAll(PDO::FETCH_OBJ);
|
|
return $result;
|
|
}
|
|
|
|
private static function doCashAction($money,$remark,$cashtype) {
|
|
date_default_timezone_set(DbUtils::getTimeZone());
|
|
$currentTime = date('Y-m-d H:i:s');
|
|
$userId = self::getUserIdStatic();
|
|
$result = self::doCashActionCore($money, $remark, $currentTime,$userId,$cashtype);
|
|
echo json_encode($result);
|
|
}
|
|
|
|
public static function doCashActionCore($money,$remark, $datetime,$userId,$cashtype) {
|
|
date_default_timezone_set(DbUtils::getTimeZone());
|
|
|
|
if (trim($money) == '') {
|
|
$money = '0.00';
|
|
}
|
|
|
|
$moneyFloat = floatval($money);
|
|
if ($cashtype == self::$CASHTYPE_Privatentnahme["value"]) {
|
|
if ($moneyFloat >= 0.00) {
|
|
$cashtype = self::$CASHTYPE_Privateinlage["value"];
|
|
}
|
|
} else if ($cashtype == self::$CASHTYPE_Einzahlung["value"]) {
|
|
if ($moneyFloat <= 0.00) {
|
|
$cashtype = self::$CASHTYPE_Auszahlung["value"];
|
|
}
|
|
}
|
|
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
CommonUtils::log($pdo, "QUEUE", "Cash action with money '$money' at billtime '$datetime' with cashtype '$cashtype'");
|
|
$pdo->beginTransaction();
|
|
|
|
$sql = "SELECT sum(brutto) as bruttosum FROM %bill% WHERE closingid is null AND paymentid=?";
|
|
$res = CommonUtils::fetchSqlAll($pdo, $sql, array(1));
|
|
|
|
if (count($res) > 0) {
|
|
$sum = $res[0]["bruttosum"];
|
|
if (is_null($sum)) {
|
|
$sum = 0.0;
|
|
}
|
|
|
|
$nextbillid = self::testForNewBillIdAndUpdateWorkTable($pdo);
|
|
if ($nextbillid < 0) {
|
|
$pdo->rollBack();
|
|
return(array("status" => "ERROR", "code" => ERROR_INCONSISTENT_DB, "msg" => ERROR_INCONSISTENT_DB_MSG));
|
|
}
|
|
|
|
CommonUtils::log($pdo, "QUEUE", "Calc bill signature for cash money '$money' at billtime '$datetime'");
|
|
$signature = CommonUtils::calcSignatureForBill($datetime, $money, $money, $userId);
|
|
|
|
$sql = "SELECT (COALESCE(MAX(billuid),0)) as maxbilluid FROM %bill%";
|
|
$maxuidRes = CommonUtils::fetchSqlAll($pdo, $sql);
|
|
$maxBilluid = $maxuidRes[0]["maxbilluid"];
|
|
$nextBilluid = intval($maxBilluid) + 1;
|
|
|
|
$sql = "INSERT INTO `%bill%` (`id` ,`billuid` , `billdate`,`brutto`,`netto`,`tax`,`tableid`, `status`, `paymentid`,`cashtype`,`userid`,`ref`,`reason`,`signature`) VALUES ( ?, ?,?,?,?,?, ?, 'c', ?,?,?,?,?,?)";
|
|
CommonUtils::execSql($pdo, $sql, array($nextbillid,$nextBilluid,$datetime,$money,$money,'0.00',-1,1,$cashtype,$userId,NULL,$remark,$signature));
|
|
|
|
$lastId = $pdo->lastInsertId();
|
|
if ($lastId > 1) {
|
|
$sql = "SELECT brutto,prevbrutto,netto,prevnetto FROM %bill% WHERE id=?";
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
|
|
$stmt->execute(array($lastId-1));
|
|
$row =$stmt->fetchObject();
|
|
}
|
|
$sql = "UPDATE %bill% SET prevbrutto=?,prevnetto=? WHERE id=?";
|
|
CommonUtils::execSql($pdo, $sql, array($row->brutto + $row->prevbrutto,$row->netto + $row->prevnetto,$lastId));
|
|
|
|
$moneyTwoDigits = number_format($money, 2, '.', '');
|
|
if (($cashtype == self::$CASHTYPE_Privateinlage["value"]) || ($cashtype == self::$CASHTYPE_Privatentnahme["value"])) {
|
|
$signStr = "Beleg^" . implode('_',array('0.00','0.00','0.00','0.00',$moneyTwoDigits)) . "^" . $moneyTwoDigits . ":Bar";
|
|
} else if ($cashtype == self::$CASHTYPE_Geldtransit["value"]) {
|
|
$signStr = "Beleg^" . implode('_',array($moneyTwoDigits,'0.00','0.00','0.00','0.00')) . "^" . $moneyTwoDigits . ":Bar";
|
|
} else if (($cashtype == self::$CASHTYPE_Einzahlung["value"]) || ($cashtype == self::$CASHTYPE_Auszahlung["value"])) {
|
|
$signStr = "Beleg^" . implode('_',array($moneyTwoDigits,'0.00','0.00','0.00','0.00')) . "^" . $moneyTwoDigits . ":Bar";
|
|
} else if ($cashtype == self::$CASHTYPE_TrinkgeldAN["value"]) {
|
|
$signStr = "Beleg^" . implode('_',array('0.00','0.00','0.00','0.00',$moneyTwoDigits)) . "^" . $moneyTwoDigits . ":Bar";
|
|
} else if ($cashtype == self::$CASHTYPE_TrinkgeldAG["value"]) {
|
|
$signStr = "Beleg^" . implode('_',array($moneyTwoDigits,'0.00','0.00','0.00','0.00')) . "^" . $moneyTwoDigits . ":Bar";
|
|
}
|
|
|
|
$status = self::signValueByTseAndUpdateBill($pdo, $lastId, $signStr);
|
|
if ($status["status"] != "OK") {
|
|
$pdo->rollBack();
|
|
return $status;
|
|
}
|
|
|
|
$printcash = CommonUtils::getConfigValue($pdo, 'printcash', 0);
|
|
if ($printcash == 1) {
|
|
if(session_id() == '') {
|
|
session_start();
|
|
}
|
|
$printer = $_SESSION['receiptprinter'];
|
|
PrintQueue::internalQueueReceiptPrintjob($pdo, $nextbillid, $printer);
|
|
}
|
|
$pdo->commit();
|
|
return(array("status" => "OK"));
|
|
|
|
} else {
|
|
$pdo->rollBack();
|
|
return(array("status" => "ERROR", "code" => ERROR_GENERAL_PAYDESK_SUM, "msg" => ERROR_GENERAL_PAYDESK_SUM_MSG));
|
|
}
|
|
}
|
|
|
|
/*
|
|
* User may ask what money he should have in his pocket by serving the guests. If the inserts and
|
|
* take outs are in in his waiter paydesk then this value is of interest, too. Return both.
|
|
*/
|
|
function getCashOverviewOfUser() {
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
$userId = $this->getUserId();
|
|
|
|
if(session_id() == '') {
|
|
session_start();
|
|
}
|
|
$lang = $_SESSION['language'];
|
|
$paymentnameitem = "name";
|
|
if ($lang == 1) {
|
|
$paymentnameitem = "name_en";
|
|
} else if ($lang == 2) {
|
|
$paymentnameitem = "name_esp";
|
|
}
|
|
$cashPerPayments = array();
|
|
for ($paymentid=1;$paymentid<=8;$paymentid++) {
|
|
$sql = "SELECT $paymentnameitem as payname FROM %payment% WHERE id=?";
|
|
$row = CommonUtils::getRowSqlObject($pdo, $sql, array($paymentid));
|
|
$paymentname = $row->payname;
|
|
|
|
$onlyCashByGuests = 0.0;
|
|
$pdo = $this->dbutils->openDbAndReturnPdo();
|
|
$sql = "SELECT sum(brutto) as sumtotal FROM %bill% WHERE closingid is null AND status is null AND paymentid=? AND userid=?";
|
|
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
|
|
$stmt->execute(array($paymentid,$userId));
|
|
$row =$stmt->fetchObject();
|
|
if ($row != null) {
|
|
if ($row->sumtotal != null) {
|
|
$onlyCashByGuests = $row->sumtotal;
|
|
}
|
|
}
|
|
if ($onlyCashByGuests != '0.00') {
|
|
$cashPerPayments[] = array("payment" => $paymentname,"value" => $onlyCashByGuests);
|
|
}
|
|
}
|
|
|
|
$cashByGuestsAndInsertTakeOut = 0.0;
|
|
$sql = "SELECT sum(brutto) as sumtotal FROM %bill% WHERE closingid is null AND paymentid='1' AND userid=? AND (status is null OR status ='c')";
|
|
$res = CommonUtils::fetchSqlAll($pdo, $sql, array($userId));
|
|
if (count($res) > 0) {
|
|
$cashVal = $res[0]["sumtotal"];
|
|
if (!is_null($cashVal)) {
|
|
$cashByGuestsAndInsertTakeOut = $cashVal;
|
|
}
|
|
}
|
|
|
|
$onlyCash = 0.0;
|
|
$sql = "SELECT sum(brutto) as sumtotal FROM %bill% WHERE closingid is null AND paymentid='1' AND userid=? AND status ='c'";
|
|
CommonUtils::fetchSqlAll($pdo, $sql, array($userId));
|
|
$res = CommonUtils::fetchSqlAll($pdo, $sql, array($userId));
|
|
if (count($res) > 0) {
|
|
$cashVal = $res[0]["sumtotal"];
|
|
if (!is_null($cashVal)) {
|
|
$onlyCash = $cashVal;
|
|
}
|
|
}
|
|
|
|
echo json_encode(array("cashperpayments" => $cashPerPayments,"total" => $cashByGuestsAndInsertTakeOut,"onlycash" => $onlyCash));
|
|
}
|
|
|
|
function getLastBillsWithContent($day,$month,$year) {
|
|
date_default_timezone_set(DbUtils::getTimeZone());
|
|
$startDate = "$year-$month-$day 00:00:00";
|
|
$endDate = "$year-$month-$day 23:59:59";
|
|
|
|
$whenClause = " (billdate >= ? AND billdate <= ?)";
|
|
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
$admin = new Admin();
|
|
$genValues = $admin->getGeneralConfigItems(false, $pdo);
|
|
$l = $genValues['billlanguage'];
|
|
|
|
$commonUtils = new CommonUtils();
|
|
|
|
$sql = "SELECT id,billuid,billdate,brutto,tableid,closingid,status,host FROM %bill% WHERE tableid >= '0' AND $whenClause ";
|
|
$sql .= "UNION ";
|
|
$sql .= "SELECT id,IF(status='c',CONCAT('V-',billuid),billuid) as billuid,billdate,brutto,tableid,closingid,status,host FROM %bill% WHERE status='c' AND $whenClause ";
|
|
$sql .= "ORDER BY id DESC,billdate DESC";
|
|
$result = CommonUtils::fetchSqlAll($pdo, $sql,array($startDate,$endDate,$startDate,$endDate));
|
|
|
|
$resultarray = array();
|
|
foreach($result as $zeile) {
|
|
$theId = $zeile['id'];
|
|
if (!$commonUtils->verifyBill($pdo, $theId)) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_INCONSISTENT_DB, "msg" => ERROR_INCONSISTENT_DB_MSG));
|
|
return;
|
|
}
|
|
date_default_timezone_set(DbUtils::getTimeZone());
|
|
$date = new DateTime($zeile['billdate']);
|
|
$shortdate = $date->format('H:i');
|
|
$closingID = $zeile['closingid'];
|
|
$isClosed = (is_null($closingID) ? 0 : 1);
|
|
|
|
$host = 0;
|
|
$tablename = "-";
|
|
if ($zeile["status"] != 'c') {
|
|
$host = $zeile['host'];
|
|
$tablename = $commonUtils->getTableNameFromId($pdo,$zeile['tableid']);
|
|
}
|
|
|
|
if ($this->billIsCancelled($pdo,$theId)) {
|
|
$isClosed = 1;
|
|
}
|
|
|
|
$arr = array("id" => $theId,
|
|
"billuid" => $zeile['billuid'],
|
|
"longdate" => $zeile['billdate'],
|
|
"shortdate" => $shortdate,
|
|
"brutto" => $zeile['brutto'],
|
|
"tablename" => $tablename,
|
|
"billcontent" => $this->getBillWithId($pdo,$theId,$l,0,true,false),
|
|
"isClosed" => $isClosed,
|
|
"host" => $host
|
|
);
|
|
|
|
$resultarray[] = $arr;
|
|
}
|
|
|
|
$hosthtml = file_get_contents("../customer/bon-bewirtungsvorlage.html");
|
|
|
|
ob_start();
|
|
echo json_encode(array("status" => "OK", "code" => OK, "msg" => $resultarray, "hosthtml" => $hosthtml));
|
|
ob_end_flush();
|
|
}
|
|
|
|
private function getUserId() {
|
|
if(session_id() == '') {
|
|
session_start();
|
|
}
|
|
return $_SESSION['userid'];
|
|
}
|
|
|
|
private static function getUserIdStatic() {
|
|
if(session_id() == '') {
|
|
session_start();
|
|
}
|
|
return $_SESSION['userid'];
|
|
}
|
|
/**
|
|
* Test if it is allowed to insert new bill as storno bill or if manipulation has happened
|
|
*
|
|
* Returns (-1) in case of an error, a positive return value is the new id, (which is already updated in work table)
|
|
*/
|
|
private static function testForNewBillIdAndUpdateWorkTable($pdo) {
|
|
$sql = "SELECT MAX(id) as maxbillid FROM %bill%";
|
|
$res = CommonUtils::fetchSqlAll($pdo, $sql);
|
|
$maxbillid = 0;
|
|
if (count($res) > 0) {
|
|
$maxbillid = $res[0]["maxbillid"];
|
|
if (is_null($maxbillid)) {
|
|
$maxbillid = 0;
|
|
}
|
|
}
|
|
$nextbillid = intval($maxbillid) + 1;
|
|
$commonUtils = new CommonUtils();
|
|
if (!$commonUtils->verifyLastBillId($pdo, $nextbillid)) {
|
|
return (-1);
|
|
} else {
|
|
$commonUtils->setLastBillIdInWorkTable($pdo, $nextbillid);
|
|
return $nextbillid;
|
|
}
|
|
}
|
|
|
|
private function initaustriareceipt($pdo) {
|
|
date_default_timezone_set(DbUtils::getTimeZone());
|
|
$currentTime = date('Y-m-d H:i:s');
|
|
|
|
$pdo->beginTransaction();
|
|
|
|
try {
|
|
// calculate next bill id
|
|
$sql = "SELECT MAX(id) as maxid FROM %bill%";
|
|
$row = CommonUtils::getRowSqlObject($pdo, $sql);
|
|
$maxbillid = $row->maxid;
|
|
$nextbillid = 1;
|
|
$newprevbrutto = 0;
|
|
$newprevnetto = 0;
|
|
if (!is_null($maxbillid)) {
|
|
$nextbillid = intval($maxbillid) + 1;
|
|
|
|
$sql = "SELECT brutto,ROUND(netto,2) as netto,prevbrutto,prevnetto FROM %bill% WHERE id=?";
|
|
$row = CommonUtils::getRowSqlObject($pdo, $sql, array(intval($maxbillid)));
|
|
$newprevbrutto = $row->prevbrutto ;
|
|
$newprevnetto = $row->prevnetto;
|
|
}
|
|
|
|
$commonUtils = new CommonUtils();
|
|
$commonUtils->setLastBillIdInWorkTable($pdo, $nextbillid);
|
|
|
|
$tableid = 0;
|
|
if(session_id() == '') {
|
|
session_start();
|
|
}
|
|
$userid = $_SESSION['userid'];
|
|
$signature = CommonUtils::calcSignatureForBill($currentTime, '0.00', '0.00', $userid);
|
|
|
|
$nextBillIds = self::getNextBillIds($pdo);
|
|
$nextBilluid = $nextBillIds["nextbilluid"];
|
|
$sql = "INSERT INTO `%bill%` (`id` ,`billuid`, `billdate`,`brutto`,`netto`,`prevbrutto`,`prevnetto`,`tableid`,`paymentid`,`userid`,`ref`,`tax`,`host`,`reservationid`,`guestinfo`,`intguestid`,`signature`,`reason`) VALUES (?,?,?,?,?,?,?,?,?,?,NULL,NULL,?,?,?,?,?,?)";
|
|
CommonUtils::execSql($pdo, $sql, array($nextbillid,$nextBilluid,$currentTime,'0.00', '0.00',$newprevbrutto,$newprevnetto,$tableid,1,$userid,0,null,null,null,$signature,'STARTBELEG'));
|
|
|
|
CommonUtils::log($pdo, "QUEUE", "Created bill STARTBELEG with id=$nextbillid from user $userid");
|
|
|
|
Rksv::doStartBeleg($pdo, $nextbillid, $currentTime);
|
|
|
|
} catch (Exception $ex) {
|
|
$pdo->rollBack();
|
|
return array("status" => "ERROR", "msg" => $ex->getMessage());
|
|
}
|
|
$pdo->commit();
|
|
|
|
return array("status" => "OK");
|
|
}
|
|
|
|
private function changeBillHost($pdo,$billid,$isNowHost) {
|
|
$sql = "SELECT host,closingid FROM %bill% WHERE id=?";
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
|
|
$stmt->execute(array($billid));
|
|
$row = $stmt->fetchObject();
|
|
if ($row->host != $isNowHost) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_NOT_WO_HOST, "msg" => ERROR_BILL_NOT_WO_HOST_MSG));
|
|
return;
|
|
}
|
|
if (!is_null($row->closingid)) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_ALREADY_CLOSED, "msg" => ERROR_BILL_ALREADY_CLOSED_MSG));
|
|
return;
|
|
}
|
|
|
|
$pdo->beginTransaction();
|
|
|
|
$sql = "SELECT queueid FROM %billproducts% WHERE billid=?";
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
|
|
$stmt->execute(array($billid));
|
|
$idsOfBill = $stmt->fetchAll();
|
|
$ids = array();
|
|
foreach($idsOfBill as $anId) {
|
|
$ids[] = $anId["queueid"];
|
|
}
|
|
|
|
$sql = "SELECT brutto,netto,tableid,paymentid,tax,reservationid,guestinfo,intguestid,intguestpaid FROM %bill% WHERE id=?";
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
|
|
$stmt->execute(array($billid));
|
|
$row = $stmt->fetchObject();
|
|
|
|
$ok = $this->cancelBill($pdo, $billid, "", "OrderSprinter-Bewirtungseigenschaft", false, false, false, 0);
|
|
if (!$ok) {
|
|
$pdo->rollBack();
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_CANCEL_IMOSSIBLE, "msg" => ERROR_BILL_CANCEL_IMOSSIBLE_MSG));
|
|
return;
|
|
}
|
|
|
|
$status = $this->recreateBill($pdo, $ids, $row->brutto, $row->netto, $row->tableid, $row->paymentid, $row->tax, 1-$isNowHost,$row->reservationid,$row->guestinfo,$row->intguestid,$row->intguestpaid);
|
|
if ($status["status"] != "OK") {
|
|
$pdo->rollBack();
|
|
echo json_encode($status);
|
|
}
|
|
|
|
$pdo->commit();
|
|
|
|
echo json_encode(array("status" => "OK", "code" => OK));
|
|
}
|
|
|
|
function recreateBill($pdo,$ids_array,$brutto,$netto,$tableid,$paymentId,$tax,$host,$reservationid,$guestinfo,$intguestid,$intguestpaid) {
|
|
|
|
$userid = $this->getUserId();
|
|
|
|
date_default_timezone_set(DbUtils::getTimeZone());
|
|
$currentTime = date('Y-m-d H:i:s');
|
|
|
|
$billid = (-1);
|
|
|
|
$sql = "SELECT id from %bill% ORDER BY id DESC";
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
|
|
$stmt->execute();
|
|
$row = $stmt->fetchObject();
|
|
$billid = intval($row->id)+1;
|
|
$commonUtils = new CommonUtils();
|
|
$commonUtils->setLastBillIdInWorkTable($pdo, $billid);
|
|
|
|
if (is_null($tableid)) {
|
|
$tableid = 0;
|
|
}
|
|
|
|
$signature = CommonUtils::calcSignatureForBill($currentTime, $brutto, $netto, $userid);
|
|
|
|
$nextBillIds = self::getNextBillIds($pdo);
|
|
$nextBilluid = $nextBillIds["nextbilluid"];
|
|
$billInsertSql = "INSERT INTO `%bill%` (`id` , `billuid`,`billdate`,`brutto`,`netto`,`tableid`,`paymentid`,`userid`,`ref`,`tax`,`host`,`reservationid`,`guestinfo`,`intguestid`,`intguestpaid`,`signature`) VALUES (?,?,?,?,?,?,?,?,NULL,NULL,?,?,?,?,?,?)";
|
|
CommonUtils::execSql($pdo, $billInsertSql, array($billid,$nextBilluid,$currentTime,$brutto,$netto,$tableid,$paymentId,$userid,$host,$reservationid,$guestinfo,$intguestid,$intguestpaid,$signature));
|
|
$newBillId = $pdo->lastInsertId();
|
|
|
|
for ($i=0;$i<count($ids_array);$i++) {
|
|
$queueid = $ids_array[$i];
|
|
|
|
$updateSql = "UPDATE %queue% SET paidtime=?, billid=? WHERE id=?";
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($updateSql));
|
|
$stmt->execute(array($currentTime,$billid,$queueid));
|
|
|
|
$billProdsSql = "INSERT INTO `%billproducts%` (`queueid`,`billid`) VALUES ( ?,?)";
|
|
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($billProdsSql));
|
|
$stmt->execute(array($queueid,$billid));
|
|
}
|
|
|
|
self::setPositionsOfProductsOnBillProductsTable($pdo, $newBillId);
|
|
|
|
$status = self::signOrdersBill($pdo,$newBillId,false);
|
|
if ($status["status"] != "OK") {
|
|
return $status;
|
|
}
|
|
|
|
Hotelinterface::insertIntoHsin($pdo, $newBillId);
|
|
|
|
return array("status" => "OK");
|
|
}
|
|
|
|
/*
|
|
* Cancel a bill - set all queue items to not paid and drop the bill entry
|
|
* Public: because it is called by demodata
|
|
*/
|
|
public function cancelBill($pdo,$billid,$stornocode,$reason,$doOwnTransaction,$doEcho,$checkStornoCode,$removeproducts = 0,$dateTime = null) {
|
|
date_default_timezone_set(DbUtils::getTimeZone());
|
|
$currentTime = date('Y-m-d H:i:s');
|
|
if (!is_null($dateTime)) {
|
|
$currentTime = $dateTime;
|
|
}
|
|
|
|
$recordaction = T_BILLSTORNO;
|
|
if ($removeproducts) {
|
|
$recordaction = T_BILLSTORNOREMOVE;
|
|
}
|
|
|
|
$stornocodeInDb = CommonUtils::getConfigValue($pdo, 'stornocode', null);
|
|
|
|
if (is_null($stornocodeInDb) && $checkStornoCode) {
|
|
if ($doEcho) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_NOT_STORNO_CODE, "msg" => ERROR_BILL_NOT_STORNO_CODE_MSG));
|
|
}
|
|
return false;
|
|
}
|
|
|
|
if ($checkStornoCode) {
|
|
if ($stornocode != $stornocodeInDb) {
|
|
if ($doEcho) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_WRONG_STORNO_CODE, "msg" => ERROR_BILL_WRONG_STORNO_CODE_MSG));
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (!is_numeric($billid)) {
|
|
if ($doEcho) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_WRONG_NUMERIC_VALUE, "msg" => ERROR_BILL_WRONG_NUMERIC_VALUE_MSG));
|
|
}
|
|
return false;
|
|
}
|
|
|
|
if ($doOwnTransaction) {
|
|
$pdo->beginTransaction();
|
|
}
|
|
|
|
$sql = "SELECT brutto,netto,tax,tableid,closingid,status,paymentid,reservationid,guestinfo,intguestid,intguestpaid FROM %bill% WHERE id=?";
|
|
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
|
|
$stmt->execute(array($billid));
|
|
$row =$stmt->fetchObject();
|
|
$closingId = null;
|
|
if ($row != null) {
|
|
$closingId = $row->closingid;
|
|
|
|
$brutto = $row->brutto;
|
|
$netto = $row->netto;
|
|
$tax = $row->tax;
|
|
$tableid = $row->tableid;
|
|
$status = $row->status;
|
|
$paymentid = $row->paymentid;
|
|
$reservationid = $row->reservationid;
|
|
$guestinfo = $row->guestinfo;
|
|
$intguestpaid = $row->intguestpaid;
|
|
}
|
|
|
|
if (!is_null($closingId) || ($status == 's') || ($status == 'x')) {
|
|
if ($doOwnTransaction) {
|
|
$pdo->rollBack();
|
|
}
|
|
if ($doEcho) {
|
|
if (($status == 's') || ($status == 'x')) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_ALREADY_CANCELLED, "msg" => ERROR_BILL_ALREADY_CANCELLED_MSG));
|
|
} else {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_ALREADY_CLOSED, "msg" => ERROR_BILL_ALREADY_CLOSED_MSG));
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
if (!is_null($intguestpaid)) {
|
|
if ($doOwnTransaction) {
|
|
$pdo->rollBack();
|
|
}
|
|
if ($doEcho) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_BILL_CUSTOMER_PAID, "msg" => ERROR_BILL_CUSTOMER_PAID_MSG));
|
|
}
|
|
return false;
|
|
}
|
|
|
|
$commonUtils = new CommonUtils();
|
|
$correct = $commonUtils->verifyBill($pdo, $billid);
|
|
if (!$correct) {
|
|
if ($doOwnTransaction) {
|
|
$pdo->rollBack();
|
|
}
|
|
if ($doEcho) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_INCONSISTENT_DB, "msg" => ERROR_INCONSISTENT_DB_MSG));
|
|
}
|
|
return false;
|
|
}
|
|
|
|
$nextbillid = self::testForNewBillIdAndUpdateWorkTable($pdo);
|
|
if ($nextbillid < 0) {
|
|
if ($doEcho) {
|
|
echo json_encode(array("status" => "ERROR", "code" => ERROR_INCONSISTENT_DB, "msg" => ERROR_INCONSISTENT_DB_MSG));
|
|
}
|
|
if ($doOwnTransaction) {
|
|
$pdo->rollBack();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
$sql = "SELECT id,ordertype,voucherid FROM %queue% WHERE billid=?";
|
|
$stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql));
|
|
$stmt->execute(array($billid));
|
|
$result = $stmt->fetchAll();
|
|
$queueIdArray = array();
|
|
|
|
foreach($result as $row) {
|
|
if ($removeproducts == 1) {
|
|
Workreceipts::createCancelWorkReceipt($pdo, $row['id']);
|
|
}
|
|
$queueIdArray[] = $row['id'];
|
|
|
|
$ordertype = $row["ordertype"];
|
|
|
|
if (($removeproducts == 1) || ($ordertype == DbUtils::$ORDERTYPE_1ZweckEinl)) {
|
|
$sql = "UPDATE %queue% SET toremove='1',paidtime=null,billid=null WHERE id=?";
|
|
CommonUtils::execSql($pdo, $sql, array($row["id"]));
|
|
vouchers::handleRemoveQueueItem($pdo, $row['id']);
|
|
|
|
$signRemoval = QueueContent::signRemovalOfQueueItem($pdo, $row['id']);
|
|
if ($signRemoval["status"] != "OK") {
|
|
if ($doOwnTransaction) {
|
|
$pdo->rollBack();
|
|
}
|
|
|
|
if ($doEcho) {
|
|
echo json_encode(array("status" => "ERROR","msg" => "TSE-Signierung fehlgeschlagen: " . $signRemoval["msg"]));
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($removeproducts == 0) {
|
|
$sql = "UPDATE %queue% SET paidtime=null,billid=null WHERE billid=?";
|
|
CommonUtils::execSql($pdo, $sql, array($billid));
|
|
}
|
|
|
|
$userIdOfStornoUser = $this->getUserId();
|
|
$stornval = 0.0 - floatval($brutto);
|
|
$stornonettoval = 0.0 - floatval($netto);
|
|
|
|
$commonUtils = new CommonUtils();
|
|
$signature = CommonUtils::calcSignatureForBill($currentTime, $stornval, $stornonettoval, $userIdOfStornoUser);
|
|
|
|
$nextBillIds = self::getNextBillIds($pdo);
|
|
$nextBilluid = $nextBillIds["nextbilluid"];
|
|
|
|
$sql = "INSERT INTO `%bill%` (`id` , `billuid`, `billdate`,`brutto`,`netto`,`tax`,`tableid`, `status`, `paymentid`,`userid`,`ref`,`host`,`reservationid`,`guestinfo`,`signature`) VALUES (?,?,?,?,?,?,?, 's', ?,?,?,?,?,?,?)";
|
|
CommonUtils::execSql($pdo, $sql, array($nextbillid,$nextBilluid,$currentTime,$stornval,$stornonettoval,$tax,$tableid,$paymentid,$userIdOfStornoUser,$billid,0,$reservationid,$guestinfo,$signature));
|
|
$refIdOfStornoEntry = $pdo->lastInsertId();
|
|
|
|
$sql = "SELECT brutto,netto,prevbrutto,prevnetto FROM %bill% WHERE id=?";
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
|
|
$stmt->execute(array($refIdOfStornoEntry-1));
|
|
$row =$stmt->fetchObject();
|
|
$sql = "UPDATE %bill% set prevbrutto=?,prevnetto=? WHERE id=?";
|
|
CommonUtils::execSql($pdo, $sql, array($row->brutto + $row->prevbrutto + $stornval,$row->netto + $row->prevnetto + $stornonettoval,$refIdOfStornoEntry));
|
|
|
|
$sql = "UPDATE %bill% SET status='x', closingid=null, ref=?, intguestid=?,intguestpaid=? WHERE id=?";
|
|
CommonUtils::execSql($pdo, $sql, array($refIdOfStornoEntry,null,null,$billid));
|
|
|
|
if (!is_null($reason) && ($reason != "")) {
|
|
$sql = "UPDATE %bill% SET reason=? WHERE id=?";
|
|
CommonUtils::execSql($pdo, $sql, array($reason,$billid));
|
|
}
|
|
|
|
foreach ($queueIdArray as $aQueueid) {
|
|
$billProdsSql = "INSERT INTO `%billproducts%` (`queueid` , `billid`) VALUES ( ?,?)";
|
|
CommonUtils::execSql($pdo, $billProdsSql, array($aQueueid,$refIdOfStornoEntry));
|
|
}
|
|
|
|
self::setPositionsOfProductsOnBillProductsTable($pdo, $refIdOfStornoEntry);
|
|
|
|
$status = self::signOrdersBill($pdo,$refIdOfStornoEntry,true);
|
|
if ($status["status"] != "OK") {
|
|
if ($doOwnTransaction) {
|
|
$pdo->rollBack();
|
|
echo json_encode(array("status" => "ERROR", "msg" => "Rechnung kann nicht storniert werden? Ist die TSE korrekt eingebunden?"));
|
|
}
|
|
return false;
|
|
}
|
|
|
|
if ($tableid == 0) {
|
|
$tableid = null;
|
|
}
|
|
$sql = "INSERT INTO %records% (date,userid,tableid,action) VALUES(?,?,?,?)";
|
|
CommonUtils::execSql($pdo, $sql, array($currentTime,$userIdOfStornoUser,$tableid,$recordaction));
|
|
$recordid = $pdo->lastInsertId();
|
|
foreach ($queueIdArray as $aQueueid) {
|
|
$sql = "INSERT INTO %recordsqueue% (recordid,queueid) VALUES(?,?)";
|
|
CommonUtils::execSql($pdo, $sql, array($recordid,$aQueueid));
|
|
}
|
|
|
|
Hotelinterface::insertIntoHsin($pdo,$refIdOfStornoEntry);
|
|
|
|
if ($doOwnTransaction) {
|
|
$pdo->commit();
|
|
}
|
|
|
|
if ($doEcho) {
|
|
echo json_encode(array("status" => "OK", "code" => OK));
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private function autoBackupPdfSummary($remoteaccesscode) {
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
|
|
$code = CommonUtils::getConfigValue($pdo, 'remoteaccesscode', null);
|
|
|
|
if (is_null($code)) {
|
|
echo "No remote access code available - backup not allowed";
|
|
return;
|
|
}
|
|
|
|
if (is_null($code) || (trim($code) == "")) {
|
|
echo "No remote access code set - backup not allowed";
|
|
return;
|
|
}
|
|
|
|
if ($code != md5($remoteaccesscode)) {
|
|
echo "Wrong remote access code used - backup not allowed";
|
|
return;
|
|
}
|
|
$pdo = null;
|
|
|
|
date_default_timezone_set(DbUtils::getTimeZone());
|
|
$currentYear = date('Y');
|
|
$currentMonth = date('n');
|
|
|
|
$this->exportPdfSummary(1, $currentYear, $currentMonth, $currentYear);
|
|
}
|
|
|
|
private function exportPdfReport($startMonth,$startYear,$endMonth,$endYear,$closidstart = null,$closidend = null) {
|
|
$pdfExport = new PdfExport();
|
|
$lang = 0;
|
|
if(isset($_GET["lang"])) {
|
|
$lang = $_GET['lang'];
|
|
}
|
|
$pdfExport->exportPdfReport($lang,$startMonth,$startYear,$endMonth,$endYear,$closidstart,$closidend);
|
|
}
|
|
private function exportPdfSummary($startMonth,$startYear,$endMonth,$endYear) {
|
|
$pdfExport = new PdfExport();
|
|
$lang = 0;
|
|
if(isset($_GET["lang"])) {
|
|
$lang = $_GET['lang'];
|
|
}
|
|
$pdfExport->exportPdfSummary($lang,$startMonth,$startYear,$endMonth,$endYear);
|
|
}
|
|
|
|
private function exportPdfSummaryClosPeriod($closidstart,$closidend) {
|
|
$pdfExport = new PdfExport();
|
|
$lang = 0;
|
|
if(isset($_GET["lang"])) {
|
|
$lang = $_GET['lang'];
|
|
}
|
|
$pdfExport->exportPdfSummaryClosPeriod($lang,$closidstart,$closidend);
|
|
}
|
|
private function exportCsvSummaryClosPeriod($closidstart,$closidend) {
|
|
$pdfExport = new PdfExport();
|
|
$lang = 0;
|
|
if(isset($_GET["lang"])) {
|
|
$lang = $_GET['lang'];
|
|
}
|
|
$pdfExport->exportCsvSummaryClosPeriod($lang,$closidstart,$closidend);
|
|
}
|
|
|
|
private function exportAllCsvOrExcel($startMonth,$startYear,$endMonth,$endYear,$exportFormat) {
|
|
set_time_limit(60*5);
|
|
if(session_id() == '') {
|
|
session_start();
|
|
}
|
|
$l = $_SESSION['language'];
|
|
|
|
$commonUtils = new CommonUtils();
|
|
$currency = $commonUtils->getCurrency();
|
|
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
$decpoint = CommonUtils::getConfigValue($pdo, 'decpoint', '.');
|
|
|
|
if ($startMonth < 10) {
|
|
$startMonth = "0" . $startMonth;
|
|
}
|
|
if ($endMonth < 10) {
|
|
$endMonth = "0" . $endMonth;
|
|
}
|
|
$startDate = $startYear . "-" . $startMonth . "-01 00:00:00";
|
|
$endDate = $endYear . "-" . $endMonth . "-01";
|
|
$lastdayOfMonth = date("t", strtotime($endDate));
|
|
$endDate = $endYear . "-" . $endMonth . "-" . $lastdayOfMonth . " 23:59:59";
|
|
|
|
$objPHPExcel = new PHPExcel();
|
|
|
|
PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP);
|
|
$locale = 'De';
|
|
if ($l == 1) {
|
|
$locale = 'En';
|
|
} else if ($l == 2) {
|
|
$locale = 'Es';
|
|
}
|
|
$validLocale = PHPExcel_Settings::setLocale($locale);
|
|
|
|
$objPHPExcel->getProperties()
|
|
->setCreator("OrderSprinter")
|
|
->setLastModifiedBy($_SESSION['currentuser'])
|
|
->setTitle("OrderSprinter Umsatzdatenexport")
|
|
->setSubject("OrderSprinter Umsatzdatenexport")
|
|
->setDescription("Umsätze")
|
|
->setKeywords("OrderSprinter Umsätze")
|
|
->setCategory("OrderSprinter Datenexport");
|
|
|
|
$objWorksheet = $objPHPExcel->getActiveSheet();
|
|
|
|
$allcells = array();
|
|
|
|
$firstRow = array(
|
|
'Bestellzeitpunkt',
|
|
'Abrechnungszeitpunkt',
|
|
'Tag der Bestellung',
|
|
$this->t['ID'][$l],
|
|
$this->t['Tablename'][$l],
|
|
'Produktpreis' . " ($currency)",
|
|
$this->t['Brutto'][$l] ."($currency)",
|
|
$this->t['Netto'][$l] . "($currency)",
|
|
'Umsatzsteuer (%)',
|
|
$this->t['host'][$l],
|
|
$this->t['Ref'][$l],
|
|
$this->t['State'][$l],
|
|
'Bestell-ID',
|
|
'Produkt',
|
|
'Produkt-ID',
|
|
'Barcode',
|
|
$this->t['PayWay'][$l],
|
|
$this->t['reason'][$l],
|
|
'Abrechnungsbenutzer',
|
|
'Abrechnungsbenutzer-ID',
|
|
$this->t['ClosDate'][$l],
|
|
$this->t['ClosRemark'][$l],
|
|
$this->t['ClosId'][$l]
|
|
);
|
|
|
|
$lineLength = count($firstRow);
|
|
|
|
$allcells[] = $firstRow;
|
|
|
|
$payment_lang = array("name","name_en","name_esp");
|
|
$payment_col = $payment_lang[$l];
|
|
|
|
$unit = CommonUtils::caseOfSqlUnitSelection($pdo);
|
|
|
|
$cashReadable = self::getTranslateSqlCashTypeToReadable();
|
|
|
|
$sql = "
|
|
SELECT * FROM (
|
|
SELECT B.billdate as billdate,B.id as billid,
|
|
ordertime,DATE_FORMAT(ordertime,'%w') as orderdayofweek,
|
|
IF(tableid > '0',(SELECT tableno FROM %resttables% WHERE id=tableid),'') as tablename,
|
|
price as productprice,
|
|
(IF(B.status='s',-1,1) * price) as brutto,
|
|
(IF(B.status='s',-1,1) * Q.price / (1 + Q.tax * 0.01)) as netto,
|
|
Q.tax as tax,
|
|
(IF(B.host = '1','x','-')) as host,
|
|
COALESCE(B.ref,'') as reference,
|
|
B.status as status,
|
|
'' as cashtype,
|
|
Q.id as queueid,
|
|
CONCAT($unit,productname) as productname,
|
|
productid,
|
|
COALESCE((SELECT barcode from %products% PR WHERE PR.id=productid),'') as barcode,
|
|
P.$payment_col as payment,
|
|
COALESCE(B.reason,'') as reason,
|
|
U.username,U.id as userid,C.closingdate as closingdate, COALESCE(C.remark,'') as remark,
|
|
Q.clsid
|
|
from %billproducts% BP,%queue% Q,%bill% B,%payment% P,%user% U,%closing% C
|
|
WHERE BP.queueid=Q.id AND BP.billid=B.id AND B.closingid is not null AND B.paymentid=P.id
|
|
AND U.id=B.userid AND B.closingid=C.id
|
|
AND B.billdate >= ? AND B.billdate <= ?
|
|
UNION ALL
|
|
SELECT '' as billdate, '' as billid,
|
|
ordertime,DATE_FORMAT(ordertime,'%w') as orderdayofweek,
|
|
IF(tablenr > '0',(SELECT tableno FROM %resttables% WHERE id=tablenr),'') as tablename,
|
|
price as productprice,
|
|
'0.00' as brutto,
|
|
'0.00' as netto,
|
|
Q.tax as tax,
|
|
'-' as host,
|
|
'' as reference,
|
|
'd' as status,
|
|
'' as cashtype,
|
|
Q.id as queueid,
|
|
CONCAT($unit,productname) as productname,
|
|
productid,
|
|
COALESCE((SELECT barcode from %products% PR WHERE PR.id=productid),'') as barcode,
|
|
'' as payment,
|
|
'' as reason,
|
|
'' as username,'' as userid,
|
|
'' as closingdate, '' as remark,
|
|
Q.clsid
|
|
FROM %queue% Q
|
|
WHERE Q.toremove = '1'
|
|
AND ordertime >= ? AND ordertime <= ?
|
|
AND paidtime is null
|
|
UNION ALL
|
|
SELECT B.billdate as billdate,B.id as billid,B.billdate as ordertime,
|
|
DATE_FORMAT(B.billdate,'%w') as orderdayofweek,
|
|
'' as tablename,
|
|
'' as productprice,
|
|
B.brutto as brutto,B.netto as netto,
|
|
'' as tax,
|
|
'' as host,
|
|
'' as reference,
|
|
status,
|
|
$cashReadable,
|
|
'' as queueid,
|
|
'Einlage' as productname,
|
|
'' as productid,
|
|
'' as barcode,
|
|
'Barzahlung' as payment, COALESCE(B.reason,'') as reason, U.username, U.id as userid,C.closingdate as closingdate,COALESCE(C.remark,'') as remark,
|
|
closingid
|
|
FROM %bill% B,%user% U,%closing% C WHERE B.status='c' AND B.closingid is not null AND B.userid=U.id AND B.closingid=C.id
|
|
AND B.billdate >= ? AND B.billdate <= ?
|
|
) a ORDER BY ordertime,billid
|
|
";
|
|
|
|
$result = CommonUtils::fetchSqlAll($pdo, $sql, array($startDate,$endDate,$startDate,$endDate,$startDate,$endDate));
|
|
|
|
foreach($result as $z) {
|
|
set_time_limit(60*5);
|
|
|
|
$prodprice = $z['productprice'];
|
|
$brutto = $z['brutto'];
|
|
$netto = $z['netto'];
|
|
$tax = $z['tax'];
|
|
if ($exportFormat == DO_CSV) {
|
|
$prodprice = number_format($prodprice, 2, $decpoint, '');
|
|
$brutto = number_format($brutto, 2, $decpoint, '');
|
|
$netto = str_replace(".",$decpoint,$netto);
|
|
if ($tax != '') {
|
|
$tax = number_format($tax, 2, $decpoint, '');
|
|
}
|
|
}
|
|
|
|
$status = $z['status'];
|
|
|
|
$cat = 'Produktverkauf';
|
|
if ($status == 'x') {
|
|
$cat = $this->t["laterCancelled"][$l];
|
|
} else if ($status == 's') {
|
|
$cat = $this->t["storno"][$l];
|
|
} else if ($status == 'c') {
|
|
$cat = $this->t["cashact"][$l] . $z['cashtype'];
|
|
} else if ($status == 'd') {
|
|
$cat = 'Storno vor Abrechnung';
|
|
}
|
|
|
|
$line = array(
|
|
$z['ordertime'],
|
|
$z['billdate'],
|
|
self::$daynamesStartSunday[intval($z['orderdayofweek'])][$l],
|
|
$z['billid'],$z['tablename'],
|
|
$prodprice,$brutto,$netto,
|
|
$tax,
|
|
$z['host'],
|
|
$z['reference'],
|
|
$cat,
|
|
$z['queueid'],
|
|
$z['productname'],
|
|
$z['productid'],
|
|
$z['barcode'],
|
|
$z['payment'],
|
|
$z['reason'],
|
|
$z['username'],$z['userid'],
|
|
$z['closingdate'],$z['remark'],$z['clsid']);
|
|
|
|
$allcells[] = $line;
|
|
}
|
|
|
|
$objWorksheet->fromArray(
|
|
$allcells, // The data to set
|
|
NULL, // Array values with this value will not be set
|
|
'A1' // Top left coordinate of the worksheet range where
|
|
);
|
|
|
|
$lastChar = chr(ord('A') + $lineLength - 1);
|
|
$range = "A1:$lastChar" . "1";
|
|
$objWorksheet->getStyle($range)->getFill()
|
|
->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
|
|
->getStartColor()->setARGB('FFadf6aa');
|
|
|
|
$range = "A2:" . $lastChar . count($allcells);
|
|
$objWorksheet->getStyle($range)->getFill()
|
|
->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
|
|
->getStartColor()->setARGB('FFd6edf8');
|
|
|
|
if ($exportFormat == DO_EXCEL) {
|
|
$formatCodeBrutto = "0.00";
|
|
$formatCodeNetto = "0.0000";
|
|
for ($i=1;$i<count($allcells);$i++) {
|
|
$aVal = $objWorksheet->getCell('F' . ($i+1)) ->getValue();
|
|
$objWorksheet->getCell('F' . ($i+1)) ->setValueExplicit($aVal,PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
|
$objWorksheet->getStyle('F' . ($i+1))->getNumberFormat()->setFormatCode($formatCodeBrutto);
|
|
|
|
$aVal = $objWorksheet->getCell('G' . ($i+1)) ->getValue();
|
|
$objWorksheet->getCell('G' . ($i+1)) ->setValueExplicit($aVal,PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
|
$objWorksheet->getStyle('G' . ($i+1))->getNumberFormat()->setFormatCode($formatCodeBrutto);
|
|
|
|
$aVal = $objWorksheet->getCell('H' . ($i+1)) ->getValue();
|
|
$objWorksheet->getCell('H' . ($i+1)) ->setValueExplicit($aVal,PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
|
$objWorksheet->getStyle('H' . ($i+1))->getNumberFormat()->setFormatCode($formatCodeNetto);
|
|
}
|
|
}
|
|
|
|
if ($exportFormat == DO_CSV) {
|
|
header("Content-type: text/x-csv");
|
|
header("Content-Disposition: attachment; filename=\"ordersprinter-datenexport.csv\"");
|
|
header("Cache-Control: max-age=0");
|
|
$objWriter = new PHPExcel_Writer_CSV($objPHPExcel);
|
|
$objWriter->setDelimiter(';');
|
|
} else {
|
|
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
header("Content-Disposition: attachment; filename=\"ordersprinter-datenexport.xls\"");
|
|
header("Cache-Control: max-age=0");
|
|
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
|
|
}
|
|
|
|
$objWriter->save("php://output");
|
|
|
|
$objPHPExcel->disconnectWorksheets();
|
|
unset($objPHPExcel);
|
|
}
|
|
|
|
private function exportCsv($startMonth,$startYear,$endMonth,$endYear,$exportType) {
|
|
$this->exportCsv_bin($startMonth,$startYear,$endMonth,$endYear,null,$exportType);
|
|
}
|
|
|
|
/*
|
|
* Method to export data of a special closing
|
|
*/
|
|
private function exportCsvOfClosing($closingid,$exportFormat) {
|
|
$this->exportCsv_bin(null,null,null,null,$closingid,$exportFormat);
|
|
}
|
|
|
|
private function exportCsv_bin($startMonth,$startYear,$endMonth,$endYear,$onlyClosingId,$exportFormat) {
|
|
if(session_id() == '') {
|
|
session_start();
|
|
}
|
|
$l = $_SESSION['language'];
|
|
|
|
$commonUtils = new CommonUtils();
|
|
$currency = $commonUtils->getCurrency();
|
|
|
|
$decpoint = ".";
|
|
|
|
$formatCode = "0.00";
|
|
|
|
if ($onlyClosingId == null) {
|
|
if ($startMonth < 10) {
|
|
$startMonth = "0" . $startMonth;
|
|
}
|
|
if ($endMonth < 10) {
|
|
$endMonth = "0" . $endMonth;
|
|
}
|
|
$startDate = $startYear . "-" . $startMonth . "-01 00:00:00";
|
|
$endDate = $endYear . "-" . $endMonth . "-01";
|
|
$lastdayOfMonth = date("t", strtotime($endDate));
|
|
$endDate = $endYear . "-" . $endMonth . "-" . $lastdayOfMonth . " 23:59:59";
|
|
}
|
|
|
|
$objPHPExcel = new PHPExcel();
|
|
|
|
PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP);
|
|
$locale = 'De';
|
|
if ($l == 1) {
|
|
$locale = 'En';
|
|
} else if ($l == 2) {
|
|
$locale = 'Es';
|
|
}
|
|
$validLocale = PHPExcel_Settings::setLocale($locale);
|
|
|
|
$objPHPExcel->getProperties()
|
|
->setCreator("OrderSprinter")
|
|
->setLastModifiedBy($_SESSION['currentuser'])
|
|
->setTitle("OrderSprinter Umsatzdatenexport")
|
|
->setSubject("OrderSprinter Umsatzdatenexport")
|
|
->setDescription("Umsätze")
|
|
->setKeywords("OrderSprinter Umsätze")
|
|
->setCategory("OrderSprinter Datenexport");
|
|
|
|
$objWorksheet = $objPHPExcel->getActiveSheet();
|
|
|
|
|
|
|
|
$allcells = array();
|
|
|
|
$firstRow = array(
|
|
$this->t['ID'][$l],
|
|
$this->t['Date'][$l],
|
|
$this->t['Brutto'][$l] ."($currency)",
|
|
$this->t['Netto'][$l] . "($currency)",
|
|
$this->t['Tablename'][$l],
|
|
$this->t['State'][$l],
|
|
$this->t['Ref'][$l],
|
|
$this->t['host'][$l],
|
|
$this->t['reason'][$l],
|
|
$this->t['Userid'][$l],
|
|
$this->t['User'][$l]);
|
|
|
|
if ($onlyClosingId == null) {
|
|
$firstRow[] = $this->t['ClosId'][$l];
|
|
$firstRow[] = $this->t['ClosDate'][$l];
|
|
$firstRow[] = $this->t['PayWay'][$l];
|
|
$firstRow[] = $this->t['ClosRemark'][$l];
|
|
} else {
|
|
$firstRow[] = $this->t['PayWay'][$l];
|
|
}
|
|
|
|
$lineLength = count($firstRow);
|
|
|
|
$allcells[] = $firstRow;
|
|
|
|
$billIdsForThatClosing = array();
|
|
|
|
$payment_lang = array("name","name_en","name_esp");
|
|
$payment_col = $payment_lang[$l];
|
|
|
|
$pdo = DbUtils::openDbAndReturnPdoStatic();
|
|
$cashtypeReadableSql = self::getTranslateSqlCashTypeToReadable();
|
|
$sql = "SELECT DISTINCT %bill%.id,IF(tableid > '0',(SELECT tableno FROM %resttables% WHERE id=tableid),'') as tablename,%bill%.signature,billdate,brutto,ROUND(netto,2) as netto,IF(tax is not null, tax, '0.00') as tax,status,closingdate,remark,%bill%.host,%bill%.closingid,%payment%.$payment_col as payway,userid,ref,username,IF(%bill%.reason is not null,reason,'') as reason,$cashtypeReadableSql FROM %bill%,%closing%,%payment%,%user% ";
|
|
$sql .= "WHERE closingid is not null AND %bill%.closingid=%closing%.id ";
|
|
$sql .= " AND %bill%.paymentid=%payment%.id ";
|
|
if ($onlyClosingId == null) {
|
|
$sql .= " AND %bill%.billdate BETWEEN ? AND ? ";
|
|
} else {
|
|
$sql .= " AND closingid=? ";
|
|
}
|
|
$sql .= " AND %bill%.userid = %user%.id ";
|
|
$sql .= "ORDER BY billdate";
|
|
|
|
$stmt = $pdo->prepare(DbUtils::substTableAlias($sql));
|
|
|
|
if ($onlyClosingId == null) {
|
|
$stmt->execute(array($startDate,$endDate));
|
|
} else {
|
|
$stmt->execute(array($onlyClosingId));
|
|
}
|
|
|
|
$dbresult = $stmt->fetchAll();
|
|
foreach($dbresult as $zeile) {
|
|
$billid = $zeile['id'];
|
|
$tablename = $zeile['tablename'];
|
|
$billdate = $zeile['billdate'];
|
|
|
|
$brutto_orig = $zeile['brutto'];
|
|
$netto_orig = $zeile['netto'];
|
|
$tax_orig = $zeile['tax'];
|
|
|
|
$brutto = str_replace(".",$decpoint,$brutto_orig);
|
|
$netto = str_replace(".",$decpoint,$netto_orig);
|
|
$tax = str_replace(".",$decpoint,$tax_orig);
|
|
$signature = $zeile['signature'];
|
|
$dbstatus = $zeile['status'];
|
|
$status = $zeile['status'];
|
|
if ($status == 'x') {
|
|
$status = $this->t["laterCancelled"][$l];
|
|
} else if ($status == 's') {
|
|
$status = $this->t["storno"][$l];
|
|
} else if ($status == 'c') {
|
|
$status = $this->t["cashact"][$l] . $zeile['cashtype'];
|
|
} else {
|
|
$status = "";
|
|
}
|
|
$ref = ($zeile['ref'] == null ? "" : $zeile['ref']);
|
|
$userid = $zeile['userid'];
|
|
$username = $zeile['username'];
|
|
$closingid = $zeile['closingid'];
|
|
$closingdate = $zeile['closingdate'];
|
|
$remark = $zeile['remark'];
|
|
$paymentname = $zeile['payway'];
|
|
$host = ($zeile['host'] == 1 ? "x" : "-");
|
|
$reason = $zeile['reason'];
|
|
|
|
if (!CommonUtils::verifyBillByValues(null,$billdate, $brutto_orig, $netto_orig, $userid, $signature,$dbstatus)) {
|
|
echo "Inconsistent Data Base Content!\n";
|
|
return;
|
|
}
|
|
|
|
if ($billid == null) {
|
|
$billid = "-";
|
|
}
|
|
|
|
if ($onlyClosingId == null) {
|
|
$line = array($billid , $billdate, $brutto, $netto, $tablename, $status, $ref, $host, $reason, $userid,$username , $closingid, $closingdate, $paymentname, $remark);
|
|
} else {
|
|
$line = array($billid , $billdate, $brutto, $netto, $tablename, $status, $ref, $host, $reason, $userid,$username , $paymentname);
|
|
}
|
|
$allcells[] = $line;
|
|
}
|
|
|
|
|
|
$objWorksheet->fromArray(
|
|
$allcells, // The data to set
|
|
NULL, // Array values with this value will not be set
|
|
'A1' // Top left coordinate of the worksheet range where
|
|
);
|
|
|
|
$lastChar = chr(ord('A') + $lineLength - 1);
|
|
$range = "A1:$lastChar" . "1";
|
|
$objWorksheet->getStyle($range)->getFill()
|
|
->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
|
|
->getStartColor()->setARGB('FFadf6aa');
|
|
|
|
$range = "A2:" . $lastChar . count($allcells);
|
|
$objWorksheet->getStyle($range)->getFill()
|
|
->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
|
|
->getStartColor()->setARGB('FFd6edf8');
|
|
|
|
for ($i=1;$i<count($allcells);$i++) {
|
|
$aVal = $objWorksheet->getCell('C' . ($i+1)) ->getValue();
|
|
$objWorksheet->getCell('C' . ($i+1)) ->setValueExplicit($aVal,PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
|
$objWorksheet->getStyle('C' . ($i+1))->getNumberFormat()->setFormatCode($formatCode);
|
|
|
|
$aVal = $objWorksheet->getCell('D' . ($i+1)) ->getValue();
|
|
$objWorksheet->getCell('D' . ($i+1)) ->setValueExplicit($aVal,PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
|
$objWorksheet->getStyle('D' . ($i+1))->getNumberFormat()->setFormatCode($formatCode);
|
|
}
|
|
|
|
if ($exportFormat == DO_CSV) {
|
|
header("Content-type: text/x-csv");
|
|
header("Content-Disposition: attachment; filename=\"ordersprinter-datenexport.csv\"");
|
|
header("Cache-Control: max-age=0");
|
|
$objWriter = new PHPExcel_Writer_CSV($objPHPExcel);
|
|
$objWriter->setDelimiter(';');
|
|
} else {
|
|
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
header("Content-Disposition: attachment; filename=\"ordersprinter-datenexport.xls\"");
|
|
header("Cache-Control: max-age=0");
|
|
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
|
|
}
|
|
|
|
$objWriter->save("php://output");
|
|
|
|
$objPHPExcel->disconnectWorksheets();
|
|
unset($objPHPExcel);
|
|
}
|
|
|
|
public static function getTranslateSqlCashTypeToReadable() {
|
|
$sql = "(IF(cashtype is null,'',CASE WHEN cashtype='1' THEN ' Pr.entn.' WHEN cashtype='2' THEN ' Pr.einl.'
|
|
WHEN cashtype='3' THEN ' Geldtransit' WHEN cashtype='4' THEN ' Lohnzahlung'
|
|
WHEN cashtype='5' THEN ' Einzahlung' WHEN cashtype='6' THEN ' Auszahlung' WHEN cashtype='7' THEN ' TG an AN' WHEN cashtype='8' THEN ' TG an AG' ELSE '' END)) as cashtype";
|
|
return $sql;
|
|
}
|
|
private static function isBillAssignedToGuestAndPaid($pdo,$billid) {
|
|
$sql = "SELECT paymentid,intguestid,COALESCE(intguestpaid,0) as intguestpaid,C.name as customername FROM %bill% B LEFT JOIN %customers% C ON B.intguestid=C.id WHERE B.id=?";
|
|
$result = CommonUtils::fetchSqlAll($pdo, $sql, array($billid));
|
|
if (count($result) > 0) {
|
|
$entry = $result[0];
|
|
|
|
if ($entry["intguestpaid"] == 1) {
|
|
return $entry["customername"];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static function getNextBillIds($pdo) {
|
|
$sql = "SELECT MAX(id) as maxid FROM %bill%";
|
|
$maxIdRes = CommonUtils::fetchSqlAll($pdo, $sql);
|
|
$maxId = $maxIdRes[0]["maxid"];
|
|
|
|
$sql = "SELECT (COALESCE(MAX(billuid),0)) as maxbilluid FROM %bill% WHERE status is null OR status <> 'c'";
|
|
$maxuidRes = CommonUtils::fetchSqlAll($pdo, $sql);
|
|
$maxBilluid = $maxuidRes[0]["maxbilluid"];
|
|
$nextBilluid = intval($maxBilluid) + 1;
|
|
return array("maxid" => $maxId,"nextbilluid" => $nextBilluid);
|
|
}
|
|
} |