von Frank S. » So 2. Aug 2026, 23:02
Hallo Stefan,
ich hätte eine Frage zur Umsetzung bzw. zu deiner ursprünglichen Absicht. Ich hoffe, ich habe den Ablauf richtig zusammengefasst:
In
roomtables.php -> getAllTablesAndRooms() wird durch
Code: Alles auswählen
$sql = "SELECT
Q.tablenr,
SUM(Q.price) as pricesum
FROM %queue% Q
LEFT JOIN %bill% B ON Q.billid=B.id
WHERE Q.toremove='0' $filterForOrderUser AND Q.paidtime is null AND Q.isclosed is null AND Q.billid is null AND (B.paymentid is null OR B.paymentid <> '8') AND Q.tablenr IN
(SELECT R.id as id FROM %resttables% R WHERE R.removed is null AND active='1' AND R.roomid=? ORDER BY R.sorting)
GROUP BY Q.tablenr";
$tablesWithPrices = CommonUtils::fetchSqlAll($pdo, $sql, array($roomid));
$assocPriceArr = array();
foreach ($tablesWithPrices as $aTableWithPrice) {
$tableid = intval($aTableWithPrice['tablenr']);
$pricesum = $aTableWithPrice['pricesum'];
$assocPriceArr[$tableid] = $pricesum;
}
foreach($tablesArray as &$aTableEntry) {
$tableid = intval($aTableEntry['id']);
if (array_key_exists($tableid, $assocPriceArr)) {
$aTableEntry['pricesum'] = $assocPriceArr[$tableid];
} else {
$aTableEntry['pricesum'] = '0.00';
}
}
die offene Summe abhängig von
$filterForOrderUser ermittelt.
Im nächsten Schritt wird dann die Anzahl der unbezahlten Produkte bestimmt:
Code: Alles auswählen
$numberOfUnpaidProducts = $queue->numberOfUnpaidProductsForTable($pdo,$tableEntry['id']);
In der entsprechenden Funktion
Code: Alles auswählen
public function numberOfUnpaidProductsForTable($pdo, $tableid) {
$whereTableClause = " (Q.tablenr IS NULL OR Q.tablenr='0') ";
$sqlArgs = array(DbUtils::$PAYMENT_GUEST, DbUtils::$PAYMENT_HOTEL);
if (!is_null($tableid)) {
$whereTableClause = " Q.tablenr=? ";
$sqlArgs[] = $tableid;
}
$sql = "SELECT Q.id AS queueid,B.id as billid
FROM %queue% Q
LEFT JOIN %bill% B
ON Q.billid = B.id
AND B.paymentid NOT IN (?, ?)
WHERE Q.clsid IS NULL
AND $whereTableClause
AND (Q.toremove IS NULL OR Q.toremove = '0')
HAVING billid IS NULL
";
$res = CommonUtils::fetchSqlAll($pdo, $sql, $sqlArgs);
return count($res);
}
fehlt jedoch
$filterForOrderUser bzw. der entsprechende SQL-Filter.
Dadurch entstehen Tische mit einer Summe von
0,00 €, aber einer Anzahl
x, wenn ein anderer Kellner noch offene Produkte auf diesem Tisch hat. Im Frontend werden diese Tische dann mit einer offenen Summe von
0,00 € angezeigt.
War das so beabsichtigt?
Für einen Kellner, der das System täglich nutzt, ist das vermutlich kein Problem. Bei uns gibt es aber Bedienungen, die das System teilweise nur einmal im Jahr verwenden. Für diese ist es hilfreich, dass sie Bestellungen anderer Kellner gar nicht erst abrechnen können. Wenn in der Tischübersicht dann allerdings
0,00 € angezeigt werden, wirkt das auch eher verwirrend.
Ich habe die Funktion deshalb wie folgt angepasst
Code: Alles auswählen
public function numberOfUnpaidProductsForTable($pdo, $tableid, $orderuser = null) {
$whereTableClause = " (Q.tablenr IS NULL OR Q.tablenr='0') ";
$sqlArgs = array();
if (!is_null($tableid)) {
$whereTableClause = " Q.tablenr=? ";
$sqlArgs[] = $tableid;
}
$orderUserClause = "";
if (!is_null($orderuser)) {
$orderUserClause = " AND Q.orderuser=? ";
$sqlArgs[] = $orderuser;
}
$sql = "SELECT Q.id AS queueid,B.id as billid
FROM %queue% Q
LEFT JOIN %bill% B
ON Q.billid = B.id
WHERE Q.clsid IS NULL
AND $whereTableClause
$orderUserClause
AND (Q.toremove IS NULL OR Q.toremove = '0')
HAVING billid IS NULL
";
$res = CommonUtils::fetchSqlAll($pdo, $sql, $sqlArgs);
return count($res);
}
Wie du siehst, habe ich außerdem diese Argumente entfernt (wie in Version 3.0.0)
Code: Alles auswählen
$sqlArgs = array(DbUtils::$PAYMENT_GUEST, DbUtils::$PAYMENT_HOTEL);
Dadurch hatte es ebenso
0,00 € Beträge im Frontend angezeigt, wenn Produkte bereits auf einen Gast gebucht waren.
Gruß
Frank
Hallo Stefan,
ich hätte eine Frage zur Umsetzung bzw. zu deiner ursprünglichen Absicht. Ich hoffe, ich habe den Ablauf richtig zusammengefasst:
In [b]roomtables.php -> getAllTablesAndRooms()[/b] wird durch
[code]
$sql = "SELECT
Q.tablenr,
SUM(Q.price) as pricesum
FROM %queue% Q
LEFT JOIN %bill% B ON Q.billid=B.id
WHERE Q.toremove='0' $filterForOrderUser AND Q.paidtime is null AND Q.isclosed is null AND Q.billid is null AND (B.paymentid is null OR B.paymentid <> '8') AND Q.tablenr IN
(SELECT R.id as id FROM %resttables% R WHERE R.removed is null AND active='1' AND R.roomid=? ORDER BY R.sorting)
GROUP BY Q.tablenr";
$tablesWithPrices = CommonUtils::fetchSqlAll($pdo, $sql, array($roomid));
$assocPriceArr = array();
foreach ($tablesWithPrices as $aTableWithPrice) {
$tableid = intval($aTableWithPrice['tablenr']);
$pricesum = $aTableWithPrice['pricesum'];
$assocPriceArr[$tableid] = $pricesum;
}
foreach($tablesArray as &$aTableEntry) {
$tableid = intval($aTableEntry['id']);
if (array_key_exists($tableid, $assocPriceArr)) {
$aTableEntry['pricesum'] = $assocPriceArr[$tableid];
} else {
$aTableEntry['pricesum'] = '0.00';
}
}
[/code]
die offene Summe abhängig von [b]$filterForOrderUser[/b] ermittelt.
Im nächsten Schritt wird dann die Anzahl der unbezahlten Produkte bestimmt:
[code]
$numberOfUnpaidProducts = $queue->numberOfUnpaidProductsForTable($pdo,$tableEntry['id']);
[/code]
In der entsprechenden Funktion
[code]
public function numberOfUnpaidProductsForTable($pdo, $tableid) {
$whereTableClause = " (Q.tablenr IS NULL OR Q.tablenr='0') ";
$sqlArgs = array(DbUtils::$PAYMENT_GUEST, DbUtils::$PAYMENT_HOTEL);
if (!is_null($tableid)) {
$whereTableClause = " Q.tablenr=? ";
$sqlArgs[] = $tableid;
}
$sql = "SELECT Q.id AS queueid,B.id as billid
FROM %queue% Q
LEFT JOIN %bill% B
ON Q.billid = B.id
AND B.paymentid NOT IN (?, ?)
WHERE Q.clsid IS NULL
AND $whereTableClause
AND (Q.toremove IS NULL OR Q.toremove = '0')
HAVING billid IS NULL
";
$res = CommonUtils::fetchSqlAll($pdo, $sql, $sqlArgs);
return count($res);
}
[/code]
fehlt jedoch [b]$filterForOrderUser[/b] bzw. der entsprechende SQL-Filter.
Dadurch entstehen Tische mit einer Summe von [b]0,00 €[/b], aber einer Anzahl [b]x[/b], wenn ein anderer Kellner noch offene Produkte auf diesem Tisch hat. Im Frontend werden diese Tische dann mit einer offenen Summe von [b]0,00 €[/b] angezeigt.
[b]War das so beabsichtigt?[/b]
Für einen Kellner, der das System täglich nutzt, ist das vermutlich kein Problem. Bei uns gibt es aber Bedienungen, die das System teilweise nur einmal im Jahr verwenden. Für diese ist es hilfreich, dass sie Bestellungen anderer Kellner gar nicht erst abrechnen können. Wenn in der Tischübersicht dann allerdings [b]0,00 €[/b] angezeigt werden, wirkt das auch eher verwirrend.
Ich habe die Funktion deshalb wie folgt angepasst
[code]
public function numberOfUnpaidProductsForTable($pdo, $tableid, $orderuser = null) {
$whereTableClause = " (Q.tablenr IS NULL OR Q.tablenr='0') ";
$sqlArgs = array();
if (!is_null($tableid)) {
$whereTableClause = " Q.tablenr=? ";
$sqlArgs[] = $tableid;
}
$orderUserClause = "";
if (!is_null($orderuser)) {
$orderUserClause = " AND Q.orderuser=? ";
$sqlArgs[] = $orderuser;
}
$sql = "SELECT Q.id AS queueid,B.id as billid
FROM %queue% Q
LEFT JOIN %bill% B
ON Q.billid = B.id
WHERE Q.clsid IS NULL
AND $whereTableClause
$orderUserClause
AND (Q.toremove IS NULL OR Q.toremove = '0')
HAVING billid IS NULL
";
$res = CommonUtils::fetchSqlAll($pdo, $sql, $sqlArgs);
return count($res);
}
[/code]
Wie du siehst, habe ich außerdem diese Argumente entfernt (wie in Version 3.0.0)
[code]
$sqlArgs = array(DbUtils::$PAYMENT_GUEST, DbUtils::$PAYMENT_HOTEL);
[/code]
Dadurch hatte es ebenso [b]0,00 €[/b] Beträge im Frontend angezeigt, wenn Produkte bereits auf einen Gast gebucht waren.
Gruß
Frank