von pichel » Do 25. Feb 2021, 22:57
Hallo,
die Anfrage ist schon mehrfach an mich gestellt worden und technisch ist das gar nicht so schwierig. Mit der Möglichkeit, Artikelbestellungen auf Gäste auszustellen (Zahlungsweg "Gast"), ist die Lösung auch schon in greifbarer Nähe (man muss nur noch die Artikel eines Gastes in eine hübsche Rechnung gießen). Ich habe allerdings im Moment das Problem, dass ich nicht so ganz sicher bin, wie ich das rechtskonform im Rahmen der Kassensichv umsetze und zwar so, dass es demnächst absolut keine Missverständnisse gibt, was nun Rechnung oder Kassenbon ist bzw. wann denn nun der Geldeingang zu verbuchen ist. Wenn also die Rechnung in der Gastansicht als DIN A4 gedruckt wird, darf ja nicht später noch ein Bon mit anderem Layout auf dem Bondrucker über die gleiche Artikelliste rauskommen. Alles lösbare Herausforderungen, aber tatsächlich habe ich das wegen der rechtlichen Unsicherheiten erst mal nach hinten geschoben.
@Thomas: Dein Ansatz würde natürlich technisch funktionieren. Du fragst nach der SQL-Anweisung, die kannst du dir aus der Methode getBillProductsInCumulatedOrder() von bill.php und caseOfSqlUnitSelection() aus communUtils.php holen:
Code: Alles auswählen
$unit = "CASE ";
foreach(CommonUtils::$g_units_arr as $aUnit) {
if (($aUnit["value"] > 1) && ($aUnit["value"] < 8)) {
$unit .= " WHEN Q.unit='" . $aUnit["value"] . "' THEN CONCAT(REPLACE(unitamount,'.','$decpoint'),'" . $aUnit["text"] . "',' ') ";
}
}
$unit .= " ELSE '' ";
$unit .= "END";
$sql = "select CONCAT($unit,productname) as productname,price,round(Q.price / (1.0 + Q.tax/100.0),2) as netto,(count(Q.productname) * price) as total,"
. "ROUND((count(Q.productname) * (Q.price / (1.0 + Q.tax/100.0))),2) as totalnetto,"
. "%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,
round(Q.price / (1.0 + Q.tax/100.0),2) as netto,
(count(Q.productname) * price) as total,
ROUND((count(Q.productname) * (Q.price / (1.0 + Q.tax/100.0))),2) as totalnetto,
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,
round(Q.price / (1.0 + Q.tax/100.0),2),
pricelevelname,
togo,
concatstr
ORDER BY kind, CONCAT($unit,productname),price,pricelevelname,togo
";
}
Die in Prozentzeichen eingefassten Tabellennamen stehen für die Tabellennamen mit Präfix, wie er bei der Installation gewählt wurde. Du kannst dir also die Daten mit der SQL-Abfrage rausholen, aber statt der Lösung mit LibreOffice würde ich einen html-Export erstellen, der bei gut gewähltem Layout auch problemlos gedruckt werden kann.
ABER: Dir fehlt die Information über den Gast, auf den die Rechnung ausgestellt werden soll. Und außerdem kann es sein, dass ich den Source-Code mit zukünftigen Versionen beliebig verändere.
Deswegen: der bessere Weg ist die Behandlung beim Zahlungsweg "Gast". Orientiere dich an "Report über alle unbezahlten Rechnungen" in der Gästeansicht - oder warte, bis ich das eingebaut habe (was aber wie eben gesagt noch etwas dauern kann).
Gruß,
Stefan
Hallo,
die Anfrage ist schon mehrfach an mich gestellt worden und technisch ist das gar nicht so schwierig. Mit der Möglichkeit, Artikelbestellungen auf Gäste auszustellen (Zahlungsweg "Gast"), ist die Lösung auch schon in greifbarer Nähe (man muss nur noch die Artikel eines Gastes in eine hübsche Rechnung gießen). Ich habe allerdings im Moment das Problem, dass ich nicht so ganz sicher bin, wie ich das rechtskonform im Rahmen der Kassensichv umsetze und zwar so, dass es demnächst absolut keine Missverständnisse gibt, was nun Rechnung oder Kassenbon ist bzw. wann denn nun der Geldeingang zu verbuchen ist. Wenn also die Rechnung in der Gastansicht als DIN A4 gedruckt wird, darf ja nicht später noch ein Bon mit anderem Layout auf dem Bondrucker über die gleiche Artikelliste rauskommen. Alles lösbare Herausforderungen, aber tatsächlich habe ich das wegen der rechtlichen Unsicherheiten erst mal nach hinten geschoben.
@Thomas: Dein Ansatz würde natürlich technisch funktionieren. Du fragst nach der SQL-Anweisung, die kannst du dir aus der Methode getBillProductsInCumulatedOrder() von bill.php und caseOfSqlUnitSelection() aus communUtils.php holen:
[code]$unit = "CASE ";
foreach(CommonUtils::$g_units_arr as $aUnit) {
if (($aUnit["value"] > 1) && ($aUnit["value"] < 8)) {
$unit .= " WHEN Q.unit='" . $aUnit["value"] . "' THEN CONCAT(REPLACE(unitamount,'.','$decpoint'),'" . $aUnit["text"] . "',' ') ";
}
}
$unit .= " ELSE '' ";
$unit .= "END";
$sql = "select CONCAT($unit,productname) as productname,price,round(Q.price / (1.0 + Q.tax/100.0),2) as netto,(count(Q.productname) * price) as total,"
. "ROUND((count(Q.productname) * (Q.price / (1.0 + Q.tax/100.0))),2) as totalnetto,"
. "%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,
round(Q.price / (1.0 + Q.tax/100.0),2) as netto,
(count(Q.productname) * price) as total,
ROUND((count(Q.productname) * (Q.price / (1.0 + Q.tax/100.0))),2) as totalnetto,
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,
round(Q.price / (1.0 + Q.tax/100.0),2),
pricelevelname,
togo,
concatstr
ORDER BY kind, CONCAT($unit,productname),price,pricelevelname,togo
";
}
[/code]
Die in Prozentzeichen eingefassten Tabellennamen stehen für die Tabellennamen mit Präfix, wie er bei der Installation gewählt wurde. Du kannst dir also die Daten mit der SQL-Abfrage rausholen, aber statt der Lösung mit LibreOffice würde ich einen html-Export erstellen, der bei gut gewähltem Layout auch problemlos gedruckt werden kann.
ABER: Dir fehlt die Information über den Gast, auf den die Rechnung ausgestellt werden soll. Und außerdem kann es sein, dass ich den Source-Code mit zukünftigen Versionen beliebig verändere.
Deswegen: der bessere Weg ist die Behandlung beim Zahlungsweg "Gast". Orientiere dich an "Report über alle unbezahlten Rechnungen" in der Gästeansicht - oder warte, bis ich das eingebaut habe (was aber wie eben gesagt noch etwas dauern kann).
Gruß,
Stefan