Seite 1 von 1

Probleme in Version 2.9.10 beim Stornieren von Belegen

Verfasst: So 16. Nov 2025, 13:47
von MrTeufel
Fehlermeldung „Serverantwort unbekannt“

https://youtube.com/shorts/CEzlMgZB0y8

Re: Probleme in Version 2.9.10 beim Stornieren von Belegen

Verfasst: So 16. Nov 2025, 22:33
von MrTeufel
Bild

Re: Probleme in Version 2.9.10 beim Stornieren von Belegen

Verfasst: So 16. Nov 2025, 22:41
von MrTeufel

Code: Alles auswählen

172.18.0.2 -  16/Nov/2025:21:40:52 +0000 "POST /php/contenthandler.php" 500
NOTICE: PHP message: PHP Fatal error:  Uncaught PDOException: SQLSTATE[25001]: Active sql transaction: 1568 Transaction characteristics can't be changed while a transaction is in progress in /var/www/html/webapp/php/commonutils.php:452
Stack trace:
#0 /var/www/html/webapp/php/commonutils.php(452): PDOStatement->execute()
#1 /var/www/html/webapp/php/commonutils.php(577): CommonUtils::execSql()
#2 /var/www/html/webapp/php/bill.php(1235): CommonUtils::setTransactionSerializable()
#3 /var/www/html/webapp/php/bill.php(1320): Bill::cashActionCoreTask()
#4 /var/www/html/webapp/php/bill.php(2150): Bill::doCashActionCore()
#5 /var/www/html/webapp/php/bill.php(237): Bill->cancelBill()
#6 /var/www/html/webapp/php/contenthandler.php(87): Bill->handleCommand()
#7 {main}
  thrown in /var/www/html/webapp/php/commonutils.php on line 452
172.18.0.2 -  16/Nov/2025:21:40:52 +0000 "POST /php/contenthandler.php" 200
172.18.0.2 -  16/Nov/2025:21:40:53 +0000 "POST /php/debug.php" 200

Re: Probleme in Version 2.9.10 beim Stornieren von Belegen

Verfasst: So 16. Nov 2025, 23:09
von MrTeufel
Fix:

Code: Alles auswählen

diff --git a/webapp/php/bill.php b/webapp/php/bill.php
index 0dc3ba15..0e705282 100755
--- a/webapp/php/bill.php
+++ b/webapp/php/bill.php
@@ -1231,9 +1231,11 @@ class Bill {
                }

                CommonUtils::log($pdo, "QUEUE", "Cash action with money '$money' at billtime '$datetime' with cashtype '$cashtype' of payment " . $paymentid);
-               if ($allowOwnTransactions == ALLOW_TRANSACTIONS) {
+               $startedTransaction = false;
+               if ($allowOwnTransactions == ALLOW_TRANSACTIONS && !$pdo->inTransaction()) {
                        CommonUtils::setTransactionSerializable($pdo);
                        $pdo->beginTransaction();
+                       $startedTransaction = true;
                }

                $nextbillid = self::testForNewBillIdAndUpdateWorkTable($pdo);
@@ -1286,12 +1288,12 @@ class Bill {

                $status = self::signValueByTseAndUpdateBill($pdo, $lastId, $signStr);
                if ($status["status"] != "OK") {
-                       if ($allowOwnTransactions == ALLOW_TRANSACTIONS) {
+                       if ($startedTransaction) {
                                $pdo->rollBack();
                                CommonUtils::resetTransactionIsolationLevel($pdo);
                        }
                }
-               if ($allowOwnTransactions == ALLOW_TRANSACTIONS) {
+               if ($startedTransaction) {
                        $pdo->commit();
                        CommonUtils::resetTransactionIsolationLevel($pdo);
                }
diff --git a/webapp/php/commonutils.php b/webapp/php/commonutils.php
index 31d2e7f9..4827747c 100755
--- a/webapp/php/commonutils.php
+++ b/webapp/php/commonutils.php
@@ -574,10 +574,16 @@ class CommonUtils {
        }

         public static function setTransactionSerializable($pdo) {
-                CommonUtils::execSql($pdo, 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE',null);
+                       if (method_exists($pdo, 'inTransaction') && $pdo->inTransaction()) {
+                               return;
+                       }
+                       CommonUtils::execSql($pdo, 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE',null);
         }
         public static function resetTransactionIsolationLevel($pdo) {
-                CommonUtils::execSql($pdo, 'SET TRANSACTION ISOLATION LEVEL REPEATABLE READ',null);
+                       if (method_exists($pdo, 'inTransaction') && $pdo->inTransaction()) {
+                               return;
+                       }
+                       CommonUtils::execSql($pdo, 'SET TRANSACTION ISOLATION LEVEL REPEATABLE READ',null);
         }

        public static function callPlugin($pdo,$fct,$condition) {

Re: Probleme in Version 2.9.10 beim Stornieren von Belegen

Verfasst: Mo 17. Nov 2025, 21:12
von pichel
Hallo,

erst mal vielen Dank für den Fehlerbericht und den Lösungsvorschlag.

Ich schlage allerdings einen anderen Weg vor. Sowie ich das im Moment sehe, habe ich in der Signatur von doCashActionCore versehentlich $allowOwnTransaction als bool deklariert, es ist aber ein int. In PHP wird ein int-Wert beim Übergeben an einen bool-Parameter automatisch in einen Boolean konvertiert.

Zum Hintergrund: Ich hatte ursprünglch noch mehr Optionen vorgesehen und deswegen wollte ich mich nicht auf einen booleschen Wert festlegen (ok, im Nachhinein hätte auch ein bool gereicht...). Mit der richtigen Signatur in bill.php sollte es jedenfalls funktionieren:

Code: Alles auswählen

public static function doCashActionCore($pdo,$money,$remark, $datetime,$userId,$cashtype,$paymentid,int $allowOwnTransactions,$checkForPermissions)
Bevor ich das in eine neue Version gieße, möchte ich es aber noch etwas mehr testen.

Gruß,

Stefan

Re: Probleme in Version 2.9.10 beim Stornieren von Belegen

Verfasst: Di 18. Nov 2025, 15:34
von Christoph3751
Der Fehler kommt nur wenn man die Zahlung mit Wechselgeldrechner macht.
Ohne Wechselgeldrechner ist Storno ohne Fehler möglich.

LG
Christoph

Re: Probleme in Version 2.9.10 beim Stornieren von Belegen

Verfasst: Di 18. Nov 2025, 16:27
von pichel
Es ist die Stornierung von Bon und Trinkgeld. Ich werde bald eine korrigierte Version veröffentlichen

Re: Probleme in Version 2.9.10 beim Stornieren von Belegen

Verfasst: Fr 21. Nov 2025, 11:29
von pichel
Moin,

ich habe heute morgen die Version 2.9.11 veröffentlicht. darin ist das Problem gelöst.

Viele Grüße,

Stefan