From 14c0ebc7df53717c93cb01fc62a96d4bc7c4c60f Mon Sep 17 00:00:00 2001 From: Geno Date: Thu, 19 Nov 2020 23:13:57 +0100 Subject: [PATCH] OrderSprinter 1.6.1 --- gastsystem/index.php | 21 +- gastsystem/install.php | 4 +- gastsystem/js/ordering.js | 2 +- gastsystem/php/tables.php | 5 +- javaprinter/javaprinter.jar | Bin 66118 -> 67337 bytes printserver/OrderSprinterPrintserver.exe | Bin 283136 -> 284160 bytes spider/install/installer.php | 2 +- webapp/OrderSprinterPrintserver.exe | Bin 283136 -> 284160 bytes webapp/bar.html | 6 +- webapp/bill.html | 4 +- webapp/css/bestformat.css | 2 +- webapp/customers.html | 4 +- webapp/dash.php | 4 +- webapp/elements/groundplan.js | 37 + webapp/elements/reservation.js | 1 + webapp/feedback.html | 4 +- webapp/help.php | 6 +- webapp/index.html | 12 +- webapp/install.html | 2 +- webapp/install/installer.php | 2 +- webapp/kitchen.html | 6 +- webapp/manager.html | 75 +- webapp/paydesk.html | 6 +- webapp/php/3rdparty/LICENSE-phpqrcode.txt | 165 + webapp/php/3rdparty/phpqrcode.php | 3312 +++++++++++++++++++++ webapp/php/admin.php | 54 +- webapp/php/closing.php | 9 + webapp/php/customers.php | 2 +- webapp/php/debug.php | 2 +- webapp/php/reports.php | 23 +- webapp/php/reservation.php | 63 +- webapp/php/roomtables.php | 125 +- webapp/php/utilities/osqrcode.php | 23 + webapp/php/utilities/pdfexport.php | 4 +- webapp/php/utilities/version.php | 24 +- webapp/pickups.html | 4 +- webapp/preferences.html | 4 +- webapp/products.html | 8 +- webapp/productsdesktop.php | 4 +- webapp/rating.html | 4 +- webapp/reports.html | 51 +- webapp/reservation.html | 609 ++-- webapp/sumuphandler.php | 8 +- webapp/supplydesk.html | 4 +- webapp/tasks.html | 4 +- webapp/timetracking.html | 4 +- webapp/utilities.js | 5 + webapp/waiter.html | 6 +- webapp/waiterdesktop.php | 4 +- 49 files changed, 4258 insertions(+), 472 deletions(-) mode change 100644 => 100755 printserver/OrderSprinterPrintserver.exe mode change 100644 => 100755 webapp/OrderSprinterPrintserver.exe create mode 100644 webapp/elements/reservation.js create mode 100644 webapp/php/3rdparty/LICENSE-phpqrcode.txt create mode 100644 webapp/php/3rdparty/phpqrcode.php create mode 100644 webapp/php/utilities/osqrcode.php diff --git a/gastsystem/index.php b/gastsystem/index.php index 350c56c..773bc72 100644 --- a/gastsystem/index.php +++ b/gastsystem/index.php @@ -9,8 +9,8 @@ - - + + @@ -97,10 +97,16 @@

Bestellvorgang

Sollen noch weitere Speisen oder Getränke bestellt werden? -

-
-
-
+ + +

@@ -109,11 +115,10 @@
-
  OrderSprinter
-
1.5.33  
+
1.6.1  
diff --git a/gastsystem/install.php b/gastsystem/install.php index 146679c..c74c168 100644 --- a/gastsystem/install.php +++ b/gastsystem/install.php @@ -114,10 +114,10 @@ if (isset($_POST['code'])) { } else { echo ""; echo "Installation Gastsystem"; - echo ''; + echo ''; echo ""; echo "
"; - echo "Installation OrderSprinter-Gastsystem 1.5.33

"; + echo "Installation OrderSprinter-Gastsystem 1.6.1

"; echo "
"; echo "
"; echo "
"; diff --git a/gastsystem/js/ordering.js b/gastsystem/js/ordering.js index 811a4c5..5b31d4b 100644 --- a/gastsystem/js/ordering.js +++ b/gastsystem/js/ordering.js @@ -1 +1 @@ -$(document).on("pageinit","#guest-page",function(){var a=Date.now();$("#logoarea").html('');intervalCheckLastOsSystemAccess(5);getTables()});var selectedTableid=null;var syncisWorking=false;var dailycode=null;var tablecode=null;var products=null;var types=null;var currency="";var decpoint=".";var selectedproduct=null;var selectedtable=null;var timeout=0;var timecounter=0;var askdaycode=1;var asktablecode=1;var fetchTimer=null;var orders=[];var tablevalues=[];function intervalCheckLastOsSystemAccess(b){doAjax("GET","php/ossystem.php?command=getsystemstatus",null,insertSyncIsWorking,true);var a=setInterval(function(){doAjax("GET","php/ossystem.php?command=getsystemstatus",null,insertSyncIsWorking,true)},b*1000)}function timeouting(){if(fetchTimer!=null){clearTimeout(fetchTimer)}if(timeout!=0){timecounter=0;fetchTimer=setInterval(function(){updateTimer()},1000)}}function createReadableTimeValue(c){var b=Math.floor(c/60);var a=c%60;if(a<10){a="0"+a.toString()}return"Verbleibende Zeit bis Neuanmeldung: "+b+":"+a+"  "}function updateTimer(){if(timecounter>0){$("#timecounter").show();$("#timecounter").html(createReadableTimeValue(timecounter))}else{$("#timecounter").hide()}if(timecounter>0){timecounter--;if(timecounter==0){var a=$("#tableselection").is(":visible");if(!a){$(".notcollapsible").hide();getTables()}}}}function insertSyncIsWorking(c){if(c.status=="OK"){if(c.msg.lastaccessok==1){syncisWorking=true}else{syncisWorking=false}if(syncisWorking){$("#warningdiv").hide()}else{$("#warningdiv").show()}var a=c.msg.dbwritestatus;var d=a.writeable;if(d==0){var b=a.file;if(a.reason!=""){b+=" (Zusatzinfo: "+a.reason+")"}$("#writeprotectedfile").html(b);$("#warningdiv2").show()}else{$("#warningdiv2").hide()}}}function getTables(){orders=[];doAjax("GET","php/tables.php?command=gettables",null,insertTables,"Fehler beim Abruf der Tische",true)}function preventCollapsible(){$(".notcollapsible").off("collapsiblecollapse").on("collapsiblecollapse",function(a){a.stopImmediatePropagation();a.preventDefault();var b=this.id;$("#"+b).collapsible("expand")})}function insertTables(b){if(b.status!="OK"){alert("Es ist ein Fehler aufgetreten: "+b.msg)}else{currency=b.currency;decpoint=b.decpoint;timeout=b.timeout;askdaycode=b.askdaycode;asktablecode=b.asktablecode;var a="";a+=fillSelectionBox("tableselect",b.msg,"Tischauswahl");$("#tableselectionbox").html(a);$("#tableselection").show();$("#tableselection").trigger("create");preventCollapsible();$("#tableselectionbox").off("change").on("change",function(c){c.stopImmediatePropagation();c.preventDefault();selectedTableid=$("#tableselect").val();if(selectedTableid!=(-1)){$("#tableselection").hide();handleCodeInput()}});timeouting()}}function handleCodeInput(){if((askdaycode==0)&&(asktablecode==0)){tablecode="empty";dailycode="empty";timecounter=timeout;initProductsView();return}$("#tablecodediv").show();preventCollapsible();if(askdaycode==1){tablecode="empty";$("#daycodearea").show()}if(asktablecode==1){dailycode="empty";$("#tablecodearea").show()}$("#tablecodefield").val("");$("#dailycodefield").val("");$("#codebackbtn").off("click").on("click",function(a){a.stopImmediatePropagation();a.preventDefault();hideCodeAreas();$("#tablecodediv").hide();getTables()});$("#submitcodesbtn").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();tablecode=$("#tablecodefield").val().trim();dailycode=$("#dailycodefield").val().trim();var a={tableid:selectedTableid,tablecode:tablecode,dailycode:dailycode};doAjax("POST","php/tables.php?command=checkcodes",a,handleCodeCheck,"Fehler bei der Abfrage der Codes",true)})}function hideCodeAreas(){$("#daycodearea").hide();$("#tablecodearea").hide()}function handleCodeCheck(a){if(a.status!="OK"){alert(a.msg)}else{hideCodeAreas();timecounter=timeout;initProductsView()}}function fillSelectionBox(f,b,d){tablevalues=b;var e='
';e+='";return e}function toHtml(a){return(a.replace(/"/g,""").replace(//g,">"))}function initProductsView(){doAjax("POST","php/menu.php?command=getmenu",null,showProductsView,"Fehler bei der Abfrage der Speisekarte",true)}function showProductsView(a){timecounter=timeout;preventCollapsible();if(a.status!="OK"){alert("Fehler: "+a.msg);$("#productsdiv").hide();getTables()}else{products=a.msg.products;types=a.msg.types;showProdTypes(0);$("#tablecodediv").hide();$("#productsdiv").show();$("#prodbackbtn").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();$("#productsdiv").hide();getTables()})}}function showProdTypes(c){timecounter=timeout;var a=createTypesHtml(c);if(a!=null){$("#typesdiv").html(a);$("#typesdiv").trigger("create")}bindProdTypes();var b=createProdsHtml(c);if(b!=null){$("#prodsdiv").show();$("#prodsdiv").html(b);$("#prodsdiv").trigger("create");bindProducts()}else{$("#prodsdiv").hide()}preventCollapsible()}function bindProducts(){$(".product").off("click").on("click",function(c){c.stopImmediatePropagation();c.preventDefault();var b=this.id.split("_")[1];selectedproduct=b;$("#productsdiv").hide();$("#prodconfirmdiv").show();timecounter=timeout;var a=getProductName(selectedproduct);$("#selectedprod").html(toHtml(a));bindProdConfirm()})}function bindProdTypes(){$(".prodtype").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();var a=this.id.split("_")[1];showProdTypes(a)});$(".up").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();var a=this.id.split("_")[1];showProdTypes(a)})}function createTypesHtml(d){if(types==null){return null}var c='";return c}function getParentOfReference(c){for(var b=0;b";if(f){return g}else{return null}}function getProdDetails(e){for(var d=0;d';if(c){b+=''}b+=toHtml(a.prodname);b+=" ("+a.price+")";return b}function bindProdConfirm(){$("#prodconfirmbackbtn").off("click").on("click",function(a){a.stopImmediatePropagation();a.preventDefault();$("#prodconfirmdiv").hide();initProductsView()});$("#prodconfirmbtn").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();var a={prodid:selectedproduct,tableid:selectedTableid,dailycode:dailycode,tablecode:tablecode};doAjax("POST","php/queue.php?command=putintoqueue",a,askForMore,"Fehler beim Senden der Produktdaten",true)})}function askForMore(a){if(a.status!="OK"){alert("Fehler: "+a.msg)}else{var b=Date.now();orders[orders.length]={prodid:selectedproduct,ordertime:b};createOrdersList("#orderslist");$("#prodconfirmdiv").hide();$("#askformorediv").show();timecounter=timeout;preventCollapsible();$("#askformorenobtn").off("click").on("click",function(c){c.stopImmediatePropagation();c.preventDefault();$("#askformorediv").hide();getTables()});$("#askformoreyesbtn").off("click").on("click",function(c){c.stopImmediatePropagation();c.preventDefault();$("#askformorediv").hide();initProductsView()})}}function createOrdersList(a){var d='
    ';d+='
  • Bestellte Produkte für den Tisch "'+toHtml(getNameOfSelectedTable())+'"
  • ';for(var c=0;c";$(a).html(d);$(a).trigger("create")}function getNameOfSelectedTable(){for(var a=0;a');intervalCheckLastOsSystemAccess(5);tablesPreselected=false;var c=location.search;if(c.length!=0){var a=c.slice(1);var f=a.split("=");if((f.length>=2)&&(f[0]=="code")){var b=f[1];var e=b.split("_");if(e.length>=2){tablecode=e[0];selectedTableid=e[1];tablesPreselected=true}}}getTables()});var tablesPreselected=false;var selectedTableid=null;var syncisWorking=false;var dailycode=null;var tablecode=null;var products=null;var types=null;var currency="";var decpoint=".";var selectedproduct=null;var selectedtable=null;var timeout=0;var timecounter=0;var askdaycode=1;var asktablecode=1;var fetchTimer=null;var orders=[];var tablevalues=[];function intervalCheckLastOsSystemAccess(b){doAjax("GET","php/ossystem.php?command=getsystemstatus",null,insertSyncIsWorking,true);var a=setInterval(function(){doAjax("GET","php/ossystem.php?command=getsystemstatus",null,insertSyncIsWorking,true)},b*1000)}function timeouting(){if(fetchTimer!=null){clearTimeout(fetchTimer)}if(timeout!=0){timecounter=0;fetchTimer=setInterval(function(){updateTimer()},1000)}}function createReadableTimeValue(c){var b=Math.floor(c/60);var a=c%60;if(a<10){a="0"+a.toString()}return"Verbleibende Zeit bis Neuanmeldung: "+b+":"+a+"  "}function updateTimer(){if(timecounter>0){$("#timecounter").show();$("#timecounter").html(createReadableTimeValue(timecounter))}else{$("#timecounter").hide()}if(timecounter>0){timecounter--;if(timecounter==0){var a=$("#tableselection").is(":visible");if(!a){$(".notcollapsible").hide();getTables()}}}}function insertSyncIsWorking(c){if(c.status=="OK"){if(c.msg.lastaccessok==1){syncisWorking=true}else{syncisWorking=false}if(syncisWorking){$("#warningdiv").hide()}else{$("#warningdiv").show()}var a=c.msg.dbwritestatus;var d=a.writeable;if(d==0){var b=a.file;if(a.reason!=""){b+=" (Zusatzinfo: "+a.reason+")"}$("#writeprotectedfile").html(b);$("#warningdiv2").show()}else{$("#warningdiv2").hide()}}}function requestTableInfoWithoutGUI(){doAjax("GET","php/tables.php?command=gettables",null,insertTablesNoGui,"Fehler beim Abruf der Tische",true)}function requestTableInfoWithGUI(){orders=[];doAjax("GET","php/tables.php?command=gettables",null,insertTables,"Fehler beim Abruf der Tische",true)}function getTables(){if(tablesPreselected){requestTableInfoWithoutGUI()}else{requestTableInfoWithGUI()}}function preventCollapsible(){$(".notcollapsible").off("collapsiblecollapse").on("collapsiblecollapse",function(a){a.stopImmediatePropagation();a.preventDefault();var b=this.id;$("#"+b).collapsible("expand")})}function insertTablesNoGui(a){if(a.status!="OK"){alert("Es ist ein Fehler aufgetreten: "+a.msg)}else{currency=a.currency;decpoint=a.decpoint;timeout=a.timeout;askdaycode=a.askdaycode;asktablecode=a.asktablecode;tablevalues=a.msg;timeouting();handleCodeInput()}}function insertTables(b){if(b.status!="OK"){alert("Es ist ein Fehler aufgetreten: "+b.msg)}else{currency=b.currency;decpoint=b.decpoint;timeout=b.timeout;askdaycode=b.askdaycode;asktablecode=b.asktablecode;var a="";a+=fillSelectionBox("tableselect",b.msg,"Tischauswahl");$("#tableselectionbox").html(a);$("#tableselection").show();$("#tableselection").trigger("create");preventCollapsible();$("#tableselectionbox").off("change").on("change",function(c){c.stopImmediatePropagation();c.preventDefault();selectedTableid=$("#tableselect").val();if(selectedTableid!=(-1)){$("#tableselection").hide();handleCodeInput()}});timeouting()}}function handleCodeInput(){if((askdaycode==0)&&tablesPreselected){startCodeCheck(selectedTableid,tablecode,"empty");return}if((askdaycode==0)&&(asktablecode==0)){if(!tablesPreselected){tablecode="empty"}dailycode="empty";timecounter=timeout;initProductsView();return}$("#tablecodediv").show();preventCollapsible();if(askdaycode==1){if(!tablesPreselected){tablecode="empty"}$("#daycodearea").show()}if((asktablecode==1)&&!tablesPreselected){dailycode="empty";$("#tablecodearea").show()}$("#tablecodefield").val("");$("#dailycodefield").val("");$("#codebackbtn").off("click").on("click",function(a){a.stopImmediatePropagation();a.preventDefault();hideCodeAreas();$("#tablecodediv").hide();getTables()});$("#submitcodesbtn").off("click").on("click",function(a){a.stopImmediatePropagation();a.preventDefault();if(!tablesPreselected){tablecode=$("#tablecodefield").val().trim()}dailycode=$("#dailycodefield").val().trim();startCodeCheck(selectedTableid,tablecode,dailycode)})}function startCodeCheck(a,d,b){var c={tableid:a,tablecode:d,dailycode:b};doAjax("POST","php/tables.php?command=checkcodes",c,handleCodeCheck,"Fehler bei der Abfrage der Codes",true)}function hideCodeAreas(){$("#daycodearea").hide();$("#tablecodearea").hide()}function handleCodeCheck(a){if(a.status!="OK"){alert(a.msg)}else{hideCodeAreas();timecounter=timeout;initProductsView()}}function fillSelectionBox(f,b,d){tablevalues=b;var e='
    ';e+='";return e}function toHtml(a){return(a.replace(/"/g,""").replace(//g,">"))}function initProductsView(){doAjax("POST","php/menu.php?command=getmenu",null,showProductsView,"Fehler bei der Abfrage der Speisekarte",true)}function showProductsView(a){timecounter=timeout;preventCollapsible();if(a.status!="OK"){alert("Fehler: "+a.msg);$("#productsdiv").hide();getTables()}else{products=a.msg.products;types=a.msg.types;showProdTypes(0);$("#tablecodediv").hide();$("#productsdiv").show();$("#prodbackbtn").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();$("#productsdiv").hide();getTables()})}}function showProdTypes(c){timecounter=timeout;var a=createTypesHtml(c);if(a!=null){$("#typesdiv").html(a);$("#typesdiv").trigger("create")}bindProdTypes();var b=createProdsHtml(c);if(b!=null){$("#prodsdiv").show();$("#prodsdiv").html(b);$("#prodsdiv").trigger("create");bindProducts()}else{$("#prodsdiv").hide()}preventCollapsible()}function bindProducts(){$(".product").off("click").on("click",function(c){c.stopImmediatePropagation();c.preventDefault();var b=this.id.split("_")[1];selectedproduct=b;$("#productsdiv").hide();$("#prodconfirmdiv").show();timecounter=timeout;var a=getProductName(selectedproduct);$("#selectedprod").html(toHtml(a));bindProdConfirm()})}function bindProdTypes(){$(".prodtype").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();var a=this.id.split("_")[1];showProdTypes(a)});$(".up").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();var a=this.id.split("_")[1];showProdTypes(a)})}function createTypesHtml(d){if(types==null){return null}var c='";return c}function getParentOfReference(c){for(var b=0;b";if(f){return g}else{return null}}function getProdDetails(e){for(var d=0;d';if(c){b+=''}b+=toHtml(a.prodname);b+=" ("+a.price+")";return b}function bindProdConfirm(){$("#prodconfirmbackbtn").off("click").on("click",function(a){a.stopImmediatePropagation();a.preventDefault();$("#prodconfirmdiv").hide();initProductsView()});$("#prodconfirmbtn").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();var a={prodid:selectedproduct,tableid:selectedTableid,dailycode:dailycode,tablecode:tablecode};doAjax("POST","php/queue.php?command=putintoqueue",a,askForMore,"Fehler beim Senden der Produktdaten",true)})}function askForMore(a){if(a.status!="OK"){alert("Fehler: "+a.msg)}else{var b=Date.now();orders[orders.length]={prodid:selectedproduct,ordertime:b};createOrdersList("#orderslist");$("#prodconfirmdiv").hide();$("#askformorediv").show();if(tablesPreselected){$("#askformoreyesno").hide();$("#askformoreonlyyes").show()}else{$("#askformoreyesno").show();$("#askformoreonlyyes").hide()}timecounter=timeout;preventCollapsible();$("#askformorenobtn").off("click").on("click",function(c){c.stopImmediatePropagation();c.preventDefault();$("#askformorediv").hide();getTables()});$("#askformoreyesbtn").off("click").on("click",function(c){c.stopImmediatePropagation();c.preventDefault();$("#askformorediv").hide();initProductsView()});$("#askformoreyesbtn2").off("click").on("click",function(c){c.stopImmediatePropagation();c.preventDefault();$("#askformorediv").hide();initProductsView()})}}function createOrdersList(a){var d='
      ';d+='
    • Bestellte Produkte für den Tisch "'+toHtml(getNameOfSelectedTable())+'"
    • ';for(var c=0;c";$(a).html(d);$(a).trigger("create")}function getNameOfSelectedTable(){for(var a=0;aPiFpb+fw;POC9PzngaIB@wIMNnws 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 delta 15544 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 diff --git a/printserver/OrderSprinterPrintserver.exe b/printserver/OrderSprinterPrintserver.exe old mode 100644 new mode 100755 index a6838bca762d4fc4bf5d98cdac695bb875d0bcbf..bff5d93af3d61561d29331c9a16a75ccc02eaa44 GIT binary patch delta 68174 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 Jhm}c|{{jy7J-z?{ delta 67055 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

      J}b??5f$ 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 diff --git a/spider/install/installer.php b/spider/install/installer.php index 6e4c4bc..48a67ec 100644 --- a/spider/install/installer.php +++ b/spider/install/installer.php @@ -85,7 +85,7 @@ class Installer { } Database::dropTables($pdo); Database::createEmptyTables($pdo, $prefix); - Database::setVersion($pdo,$prefix,"1.5.33"); + Database::setVersion($pdo,$prefix,"1.6.1"); Database::setAccessPassword($pdo,$prefix,$adminpass); Database::setRefreshRate($pdo,$prefix,"5"); // default: 5 times per hour return array("status" => "OK","msg" => "Installation successful"); diff --git a/webapp/OrderSprinterPrintserver.exe b/webapp/OrderSprinterPrintserver.exe old mode 100644 new mode 100755 index a6838bca762d4fc4bf5d98cdac695bb875d0bcbf..bff5d93af3d61561d29331c9a16a75ccc02eaa44 GIT binary patch delta 68174 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 Jhm}c|{{jy7J-z?{ delta 67055 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

      J}b??5f$ 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 diff --git a/webapp/bar.html b/webapp/bar.html index e6414a0..de31156 100644 --- a/webapp/bar.html +++ b/webapp/bar.html @@ -5,7 +5,7 @@ - + @@ -13,8 +13,8 @@ - - + + +


              '; + echo join("
              ", $frame); + echo '






      '; + + } else { + + foreach ($frame as &$frameLine) { + $frameLine = join(' ', explode("\xc0", $frameLine)); + $frameLine = join('', explode("\xc1", $frameLine)); + $frameLine = join(' ', explode("\xa0", $frameLine)); + $frameLine = join('', explode("\xa1", $frameLine)); + $frameLine = join('', explode("\x84", $frameLine)); //format 0 + $frameLine = join('', explode("\x85", $frameLine)); //format 1 + $frameLine = join('', explode("\x81", $frameLine)); //special bit + $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 + $frameLine = join('', explode("\x91", $frameLine)); //clock 1 + $frameLine = join(' ', explode("\x88", $frameLine)); //version + $frameLine = join('', explode("\x89", $frameLine)); //version + $frameLine = join('♦', explode("\x01", $frameLine)); + $frameLine = join('⋅', explode("\0", $frameLine)); + } + + ?> + + "; + echo join("
      ", $frame); + echo "
      "; + + } + } + + //---------------------------------------------------------------------- + public static function serial($frame) + { + return gzcompress(join("\n", $frame), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + return explode("\n", gzuncompress($code)); + } + + //---------------------------------------------------------------------- + public static function newFrame($version) + { + if($version < 1 || $version > QRSPEC_VERSION_MAX) + return null; + + if(!isset(self::$frames[$version])) { + + $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + self::$frames[$version] = self::unserial(file_get_contents($fileName)); + } else { + self::$frames[$version] = self::createFrame($version); + file_put_contents($fileName, self::serial(self::$frames[$version])); + } + } else { + self::$frames[$version] = self::createFrame($version); + } + } + + if(is_null(self::$frames[$version])) + return null; + + return self::$frames[$version]; + } + + //---------------------------------------------------------------------- + public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } + public static function rsBlockNum1($spec) { return $spec[0]; } + public static function rsDataCodes1($spec) { return $spec[1]; } + public static function rsEccCodes1($spec) { return $spec[2]; } + public static function rsBlockNum2($spec) { return $spec[3]; } + public static function rsDataCodes2($spec) { return $spec[4]; } + public static function rsEccCodes2($spec) { return $spec[2]; } + public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } + public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } + + } + + + +//---- qrimage.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Image output of code using GD2 + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QR_IMAGE', true); + + class QRimage { + + //---------------------------------------------------------------------- + public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/png"); + ImagePng($image); + } else { + if($saveandprint===TRUE){ + ImagePng($image, $filename); + header("Content-type: image/png"); + ImagePng($image); + }else{ + ImagePng($image, $filename); + } + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/jpeg"); + ImageJpeg($image, null, $q); + } else { + ImageJpeg($image, $filename, $q); + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) + { + $h = count($frame); + $w = strlen($frame[0]); + + $imgW = $w + 2*$outerFrame; + $imgH = $h + 2*$outerFrame; + + $base_image =ImageCreate($imgW, $imgH); + + $col[0] = ImageColorAllocate($base_image,255,255,255); + $col[1] = ImageColorAllocate($base_image,0,0,0); + + imagefill($base_image, 0, 0, $col[0]); + + for($y=0; $y<$h; $y++) { + for($x=0; $x<$w; $x++) { + if ($frame[$y][$x] == '1') { + ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); + } + } + } + + $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); + ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); + ImageDestroy($base_image); + + return $target_image; + } + } + + + +//---- qrinput.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Input encoding class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('STRUCTURE_HEADER_BITS', 20); + define('MAX_STRUCTURED_SYMBOLS', 16); + + class QRinputItem { + + public $mode; + public $size; + public $data; + public $bstream; + + public function __construct($mode, $size, $data, $bstream = null) + { + $setData = array_slice($data, 0, $size); + + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); + } + + if(!QRinput::check($mode, $size, $setData)) { + throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); + return null; + } + + $this->mode = $mode; + $this->size = $size; + $this->data = $setData; + $this->bstream = $bstream; + } + + //---------------------------------------------------------------------- + public function encodeModeNum($version) + { + try { + + $words = (int)($this->size / 3); + $bs = new QRbitstream(); + + $val = 0x1; + $bs->appendNum(4, $val); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; + $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; + $val += (ord($this->data[$i*3+2]) - ord('0')); + $bs->appendNum(10, $val); + } + + if($this->size - $words * 3 == 1) { + $val = ord($this->data[$words*3]) - ord('0'); + $bs->appendNum(4, $val); + } else if($this->size - $words * 3 == 2) { + $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; + $val += (ord($this->data[$words*3+1]) - ord('0')); + $bs->appendNum(7, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeAn($version) + { + try { + $words = (int)($this->size / 2); + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x02); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; + $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); + + $bs->appendNum(11, $val); + } + + if($this->size & 1) { + $val = QRinput::lookAnTable(ord($this->data[$words * 2])); + $bs->appendNum(6, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeMode8($version) + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x4); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); + + for($i=0; $i<$this->size; $i++) { + $bs->appendNum(8, ord($this->data[$i])); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeKanji($version) + { + try { + + $bs = new QRbitrtream(); + + $bs->appendNum(4, 0x8); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); + + for($i=0; $i<$this->size; $i+=2) { + $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); + if($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + + $bs->appendNum(13, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeStructure() + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x03); + $bs->appendNum(4, ord($this->data[1]) - 1); + $bs->appendNum(4, ord($this->data[0]) - 1); + $bs->appendNum(8, ord($this->data[2])); + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function estimateBitStreamSizeOfEntry($version) + { + $bits = 0; + + if($version == 0) + $version = 1; + + switch($this->mode) { + case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; + case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; + case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; + case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; + case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; + default: + return 0; + } + + $l = QRspec::lengthIndicator($this->mode, $version); + $m = 1 << $l; + $num = (int)(($this->size + $m - 1) / $m); + + $bits += $num * (4 + $l); + + return $bits; + } + + //---------------------------------------------------------------------- + public function encodeBitStream($version) + { + try { + + unset($this->bstream); + $words = QRspec::maximumWords($this->mode, $version); + + if($this->size > $words) { + + $st1 = new QRinputItem($this->mode, $words, $this->data); + $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); + + $st1->encodeBitStream($version); + $st2->encodeBitStream($version); + + $this->bstream = new QRbitstream(); + $this->bstream->append($st1->bstream); + $this->bstream->append($st2->bstream); + + unset($st1); + unset($st2); + + } else { + + $ret = 0; + + switch($this->mode) { + case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; + case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; + case QR_MODE_8: $ret = $this->encodeMode8($version); break; + case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; + case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; + + default: + break; + } + + if($ret < 0) + return -1; + } + + return $this->bstream->size(); + + } catch (Exception $e) { + return -1; + } + } + }; + + //########################################################################## + + class QRinput { + + public $items; + + private $version; + private $level; + + //---------------------------------------------------------------------- + public function __construct($version = 0, $level = QR_ECLEVEL_L) + { + if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { + throw new Exception('Invalid version no'); + return NULL; + } + + $this->version = $version; + $this->level = $level; + } + + //---------------------------------------------------------------------- + public function getVersion() + { + return $this->version; + } + + //---------------------------------------------------------------------- + public function setVersion($version) + { + if($version < 0 || $version > QRSPEC_VERSION_MAX) { + throw new Exception('Invalid version no'); + return -1; + } + + $this->version = $version; + + return 0; + } + + //---------------------------------------------------------------------- + public function getErrorCorrectionLevel() + { + return $this->level; + } + + //---------------------------------------------------------------------- + public function setErrorCorrectionLevel($level) + { + if($level > QR_ECLEVEL_H) { + throw new Exception('Invalid ECLEVEL'); + return -1; + } + + $this->level = $level; + + return 0; + } + + //---------------------------------------------------------------------- + public function appendEntry(QRinputItem $entry) + { + $this->items[] = $entry; + } + + //---------------------------------------------------------------------- + public function append($mode, $size, $data) + { + try { + $entry = new QRinputItem($mode, $size, $data); + $this->items[] = $entry; + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + + public function insertStructuredAppendHeader($size, $index, $parity) + { + if( $size > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong size'); + } + + if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong index'); + } + + $buf = array($size, $index, $parity); + + try { + $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); + array_unshift($this->items, $entry); + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function calcParity() + { + $parity = 0; + + foreach($this->items as $item) { + if($item->mode != QR_MODE_STRUCTURE) { + for($i=$item->size-1; $i>=0; $i--) { + $parity ^= $item->data[$i]; + } + } + } + + return $parity; + } + + //---------------------------------------------------------------------- + public static function checkModeNum($size, $data) + { + for($i=0; $i<$size; $i++) { + if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeNum($size) + { + $w = (int)$size / 3; + $bits = $w * 10; + + switch($size - $w * 3) { + case 1: + $bits += 4; + break; + case 2: + $bits += 7; + break; + default: + break; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + ); + + //---------------------------------------------------------------------- + public static function lookAnTable($c) + { + return (($c > 127)?-1:self::$anTable[$c]); + } + + //---------------------------------------------------------------------- + public static function checkModeAn($size, $data) + { + for($i=0; $i<$size; $i++) { + if (self::lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeAn($size) + { + $w = (int)($size / 2); + $bits = $w * 11; + + if($size & 1) { + $bits += 6; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static function estimateBitsMode8($size) + { + return $size * 8; + } + + //---------------------------------------------------------------------- + public function estimateBitsModeKanji($size) + { + return (int)(($size / 2) * 13); + } + + //---------------------------------------------------------------------- + public static function checkModeKanji($size, $data) + { + if($size & 1) + return false; + + for($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if( $val < 0x8140 + || ($val > 0x9ffc && $val < 0xe040) + || $val > 0xebbf) { + return false; + } + } + + return true; + } + + /*********************************************************************** + * Validation + **********************************************************************/ + + public static function check($mode, $size, $data) + { + if($size <= 0) + return false; + + switch($mode) { + case QR_MODE_NUM: return self::checkModeNum($size, $data); break; + case QR_MODE_AN: return self::checkModeAn($size, $data); break; + case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; + case QR_MODE_8: return true; break; + case QR_MODE_STRUCTURE: return true; break; + + default: + break; + } + + return false; + } + + + //---------------------------------------------------------------------- + public function estimateBitStreamSize($version) + { + $bits = 0; + + foreach($this->items as $item) { + $bits += $item->estimateBitStreamSizeOfEntry($version); + } + + return $bits; + } + + //---------------------------------------------------------------------- + public function estimateVersion() + { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($prev); + $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + + return $version; + } + + //---------------------------------------------------------------------- + public static function lengthOfCode($mode, $version, $bits) + { + $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NUM: + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if($remain >= 7) { + $size += 2; + } else if($remain >= 4) { + $size += 1; + } + break; + case QR_MODE_AN: + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if($remain >= 6) + $size++; + break; + case QR_MODE_8: + $size = (int)($payload / 8); + break; + case QR_MODE_KANJI: + $size = (int)(($payload / 13) * 2); + break; + case QR_MODE_STRUCTURE: + $size = (int)($payload / 8); + break; + default: + $size = 0; + break; + } + + $maxsize = QRspec::maximumWords($mode, $version); + if($size < 0) $size = 0; + if($size > $maxsize) $size = $maxsize; + + return $size; + } + + //---------------------------------------------------------------------- + public function createBitStream() + { + $total = 0; + + foreach($this->items as $item) { + $bits = $item->encodeBitStream($this->version); + + if($bits < 0) + return -1; + + $total += $bits; + } + + return $total; + } + + //---------------------------------------------------------------------- + public function convertData() + { + $ver = $this->estimateVersion(); + if($ver > $this->getVersion()) { + $this->setVersion($ver); + } + + for(;;) { + $bits = $this->createBitStream(); + + if($bits < 0) + return -1; + + $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if($ver < 0) { + throw new Exception('WRONG VERSION'); + return -1; + } else if($ver > $this->getVersion()) { + $this->setVersion($ver); + } else { + break; + } + } + + return 0; + } + + //---------------------------------------------------------------------- + public function appendPaddingBit(&$bstream) + { + $bits = $bstream->size(); + $maxwords = QRspec::getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + + if ($maxbits == $bits) { + return 0; + } + + if ($maxbits - $bits < 5) { + return $bstream->appendNum($maxbits - $bits, 0); + } + + $bits += 4; + $words = (int)(($bits + 7) / 8); + + $padding = new QRbitstream(); + $ret = $padding->appendNum($words * 8 - $bits + 4, 0); + + if($ret < 0) + return $ret; + + $padlen = $maxwords - $words; + + if($padlen > 0) { + + $padbuf = array(); + for($i=0; $i<$padlen; $i++) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + + $ret = $padding->appendBytes($padlen, $padbuf); + + if($ret < 0) + return $ret; + + } + + $ret = $bstream->append($padding); + + return $ret; + } + + //---------------------------------------------------------------------- + public function mergeBitStream() + { + if($this->convertData() < 0) { + return null; + } + + $bstream = new QRbitstream(); + + foreach($this->items as $item) { + $ret = $bstream->append($item->bstream); + if($ret < 0) { + return null; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getBitStream() + { + + $bstream = $this->mergeBitStream(); + + if($bstream == null) { + return null; + } + + $ret = $this->appendPaddingBit($bstream); + if($ret < 0) { + return null; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getByteStream() + { + $bstream = $this->getBitStream(); + if($bstream == null) { + return null; + } + + return $bstream->toByte(); + } + } + + + + + + +//---- qrbitstream.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Bitstream class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRbitstream { + + public $data = array(); + + //---------------------------------------------------------------------- + public function size() + { + return count($this->data); + } + + //---------------------------------------------------------------------- + public function allocate($setLength) + { + $this->data = array_fill(0, $setLength, 0); + return 0; + } + + //---------------------------------------------------------------------- + public static function newFromNum($bits, $num) + { + $bstream = new QRbitstream(); + $bstream->allocate($bits); + + $mask = 1 << ($bits - 1); + for($i=0; $i<$bits; $i++) { + if($num & $mask) { + $bstream->data[$i] = 1; + } else { + $bstream->data[$i] = 0; + } + $mask = $mask >> 1; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public static function newFromBytes($size, $data) + { + $bstream = new QRbitstream(); + $bstream->allocate($size * 8); + $p=0; + + for($i=0; $i<$size; $i++) { + $mask = 0x80; + for($j=0; $j<8; $j++) { + if($data[$i] & $mask) { + $bstream->data[$p] = 1; + } else { + $bstream->data[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function append(QRbitstream $arg) + { + if (is_null($arg)) { + return -1; + } + + if($arg->size() == 0) { + return 0; + } + + if($this->size() == 0) { + $this->data = $arg->data; + return 0; + } + + $this->data = array_values(array_merge($this->data, $arg->data)); + + return 0; + } + + //---------------------------------------------------------------------- + public function appendNum($bits, $num) + { + if ($bits == 0) + return 0; + + $b = QRbitstream::newFromNum($bits, $num); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function appendBytes($size, $data) + { + if ($size == 0) + return 0; + + $b = QRbitstream::newFromBytes($size, $data); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function toByte() + { + + $size = $this->size(); + + if($size == 0) { + return array(); + } + + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + + $p = 0; + + for($i=0; $i<$bytes; $i++) { + $v = 0; + for($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$i] = $v; + } + + if($size & 7) { + $v = 0; + for($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$bytes] = $v; + } + + return $data; + } + + } + + + + +//---- qrsplit.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Input splitting classes + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + class QRsplit { + + public $dataStr = ''; + public $input; + public $modeHint; + + //---------------------------------------------------------------------- + public function __construct($dataStr, $input, $modeHint) + { + $this->dataStr = $dataStr; + $this->input = $input; + $this->modeHint = $modeHint; + } + + //---------------------------------------------------------------------- + public static function isdigitat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + //---------------------------------------------------------------------- + public static function isalnumat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return (QRinput::lookAnTable(ord($str[$pos])) >= 0); + } + + //---------------------------------------------------------------------- + public function identifyMode($pos) + { + if ($pos >= strlen($this->dataStr)) + return QR_MODE_NUL; + + $c = $this->dataStr[$pos]; + + if(self::isdigitat($this->dataStr, $pos)) { + return QR_MODE_NUM; + } else if(self::isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } else if($this->modeHint == QR_MODE_KANJI) { + + if ($pos+1 < strlen($this->dataStr)) + { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KANJI; + } + } + } + + return QR_MODE_8; + } + + //---------------------------------------------------------------------- + public function eatNum() + { + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + while(self::isdigitat($this->dataStr, $p)) { + $p++; + } + + $run = $p; + $mode = $this->identifyMode($p); + + if($mode == QR_MODE_8) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + if($mode == QR_MODE_AN) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsModeAn(1) // + 4 + la + - QRinput::estimateBitsModeAn($run + 1);// - 4 - la + if($dif > 0) { + return $this->eatAn(); + } + } + + $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatAn() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + + while(self::isalnumat($this->dataStr, $p)) { + if(self::isdigitat($this->dataStr, $p)) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + + $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsModeAn($q); // - 4 - la + + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + + if(!self::isalnumat($this->dataStr, $p)) { + $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + + $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatKanji() + { + $p = 0; + + while($this->identifyMode($p) == QR_MODE_KANJI) { + $p += 2; + } + + $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eat8() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 1; + $dataStrLen = strlen($this->dataStr); + + while($p < $dataStrLen) { + + $mode = $this->identifyMode($p); + if($mode == QR_MODE_KANJI) { + break; + } + if($mode == QR_MODE_NUM) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else if($mode == QR_MODE_AN) { + $q = $p; + while(self::isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeAn($q - $p) + 4 + $la + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); + + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function splitString() + { + while (strlen($this->dataStr) > 0) + { + if($this->dataStr == '') + return 0; + + $mode = $this->identifyMode(0); + + switch ($mode) { + case QR_MODE_NUM: $length = $this->eatNum(); break; + case QR_MODE_AN: $length = $this->eatAn(); break; + case QR_MODE_KANJI: + if ($hint == QR_MODE_KANJI) + $length = $this->eatKanji(); + else $length = $this->eat8(); + break; + default: $length = $this->eat8(); break; + + } + + if($length == 0) return 0; + if($length < 0) return -1; + + $this->dataStr = substr($this->dataStr, $length); + } + } + + //---------------------------------------------------------------------- + public function toUpper() + { + $stringLen = strlen($this->dataStr); + $p = 0; + + while ($p<$stringLen) { + $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); + if($mode == QR_MODE_KANJI) { + $p += 2; + } else { + if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + + return $this->dataStr; + } + + //---------------------------------------------------------------------- + public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) + { + if(is_null($string) || $string == '\0' || $string == '') { + throw new Exception('empty string!!!'); + } + + $split = new QRsplit($string, $input, $modeHint); + + if(!$casesensitive) + $split->toUpper(); + + return $split->splitString(); + } + } + + + +//---- qrrscode.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Reed-Solomon error correction support + * + * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q + * (libfec is released under the GNU Lesser General Public License.) + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsItem { + + public $mm; // Bits per symbol + public $nn; // Symbols per block (= (1<= $this->nn) { + $x -= $this->nn; + $x = ($x >> $this->mm) + ($x & $this->nn); + } + + return $x; + } + + //---------------------------------------------------------------------- + public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + // Common code for intializing a Reed-Solomon control block (char or int symbols) + // Copyright 2004 Phil Karn, KA9Q + // May be used under the terms of the GNU Lesser General Public License (LGPL) + + $rs = null; + + // Check parameter ranges + if($symsize < 0 || $symsize > 8) return $rs; + if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; + if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; + if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! + if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding + + $rs = new QRrsItem(); + $rs->mm = $symsize; + $rs->nn = (1<<$symsize)-1; + $rs->pad = $pad; + + $rs->alpha_to = array_fill(0, $rs->nn+1, 0); + $rs->index_of = array_fill(0, $rs->nn+1, 0); + + // PHP style macro replacement ;) + $NN =& $rs->nn; + $A0 =& $NN; + + // Generate Galois field lookup tables + $rs->index_of[0] = $A0; // log(zero) = -inf + $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 + $sr = 1; + + for($i=0; $i<$rs->nn; $i++) { + $rs->index_of[$sr] = $i; + $rs->alpha_to[$i] = $sr; + $sr <<= 1; + if($sr & (1<<$symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs->nn; + } + + if($sr != 1){ + // field generator polynomial is not primitive! + $rs = NULL; + return $rs; + } + + /* Form RS code generator polynomial from its roots */ + $rs->genpoly = array_fill(0, $nroots+1, 0); + + $rs->fcr = $fcr; + $rs->prim = $prim; + $rs->nroots = $nroots; + $rs->gfpoly = $gfpoly; + + /* Find prim-th root of 1, used in decoding */ + for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) + ; // intentional empty-body loop! + + $rs->iprim = (int)($iprim / $prim); + $rs->genpoly[0] = 1; + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs->genpoly[$i+1] = 1; + + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; $j--) { + if ($rs->genpoly[$j] != 0) { + $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; + } else { + $rs->genpoly[$j] = $rs->genpoly[$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; + } + + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; $i++) + $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; + + return $rs; + } + + //---------------------------------------------------------------------- + public function encode_rs_char($data, &$parity) + { + $MM =& $this->mm; + $NN =& $this->nn; + $ALPHA_TO =& $this->alpha_to; + $INDEX_OF =& $this->index_of; + $GENPOLY =& $this->genpoly; + $NROOTS =& $this->nroots; + $FCR =& $this->fcr; + $PRIM =& $this->prim; + $IPRIM =& $this->iprim; + $PAD =& $this->pad; + $A0 =& $NN; + + $parity = array_fill(0, $NROOTS, 0); + + for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { + + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if($feedback != $A0) { + // feedback term is non-zero + + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); + + for($j=1;$j<$NROOTS;$j++) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; + } + } + + // Shift + array_shift($parity); + if($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + } + } + + //########################################################################## + + class QRrs { + + public static $items = array(); + + //---------------------------------------------------------------------- + public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + foreach(self::$items as $rs) { + if($rs->pad != $pad) continue; + if($rs->nroots != $nroots) continue; + if($rs->mm != $symsize) continue; + if($rs->gfpoly != $gfpoly) continue; + if($rs->fcr != $fcr) continue; + if($rs->prim != $prim) continue; + + return $rs; + } + + $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift(self::$items, $rs); + + return $rs; + } + } + + + +//---- qrmask.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Masking + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('N1', 3); + define('N2', 3); + define('N3', 40); + define('N4', 10); + + class QRmask { + + public $runLength = array(); + + //---------------------------------------------------------------------- + public function __construct() + { + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + } + + //---------------------------------------------------------------------- + public function writeFormatInformation($width, &$frame, $mask, $level) + { + $blacks = 0; + $format = QRspec::getFormatInfo($mask, $level); + + for($i=0; $i<8; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[8][$width - 1 - $i] = chr($v); + if($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + + for($i=0; $i<7; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[$width - 7 + $i][8] = chr($v); + if($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + + $format = $format >> 1; + } + + return $blacks; + } + + //---------------------------------------------------------------------- + public function mask0($x, $y) { return ($x+$y)&1; } + public function mask1($x, $y) { return ($y&1); } + public function mask2($x, $y) { return ($x%3); } + public function mask3($x, $y) { return ($x+$y)%3; } + public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } + public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } + public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } + public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } + + //---------------------------------------------------------------------- + private function generateMaskNo($maskNo, $width, $frame) + { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if(ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + + } + } + + return $bitMask; + } + + //---------------------------------------------------------------------- + public static function serial($bitFrame) + { + $codeArr = array(); + + foreach ($bitFrame as $line) + $codeArr[] = join('', $line); + + return gzcompress(join("\n", $codeArr), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + $codeArr = array(); + + $codeLines = explode("\n", gzuncompress($code)); + foreach ($codeLines as $line) + $codeArr[] = str_split($line); + + return $codeArr; + } + + //---------------------------------------------------------------------- + public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) + { + $b = 0; + $bitMask = array(); + + $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + $bitMask = self::unserial(file_get_contents($fileName)); + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) + mkdir(QR_CACHE_DIR.'mask_'.$maskNo); + file_put_contents($fileName, self::serial($bitMask)); + } + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + } + + if ($maskGenOnly) + return; + + $d = $s; + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + + return $b; + } + + //---------------------------------------------------------------------- + public function makeMask($width, $frame, $maskNo, $level) + { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + + return $masked; + } + + //---------------------------------------------------------------------- + public function calcN1N3($length) + { + $demerit = 0; + + for($i=0; $i<$length; $i++) { + + if($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if($i & 1) { + if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if(($this->runLength[$i-2] == $fact) && + ($this->runLength[$i-1] == $fact) && + ($this->runLength[$i+1] == $fact) && + ($this->runLength[$i+2] == $fact)) { + if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + //---------------------------------------------------------------------- + public function evaluateSymbol($width, $frame) + { + $head = 0; + $demerit = 0; + + for($y=0; $y<$width; $y++) { + $head = 0; + $this->runLength[0] = 1; + + $frameY = $frame[$y]; + + if ($y>0) + $frameYM = $frame[$y-1]; + + for($x=0; $x<$width; $x++) { + if(($x > 0) && ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + + if(($b22 | ($w22 ^ 1))&1) { + $demerit += N2; + } + } + if(($x == 0) && (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($x > 0) { + if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + for($x=0; $x<$width; $x++) { + $head = 0; + $this->runLength[0] = 1; + + for($y=0; $y<$width; $y++) { + if($y == 0 && (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($y > 0) { + if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + return $demerit; + } + + + //---------------------------------------------------------------------- + public function mask($width, $frame, $level) + { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + + $checked_masks = array(0,1,2,3,4,5,6,7); + + if (QR_FIND_FROM_RANDOM !== false) { + + $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; $i++) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + + } + + $bestMask = $frame; + + foreach($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + + if($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + + return $bestMask; + } + + //---------------------------------------------------------------------- + } + + + + +//---- qrencode.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Main encoder classes. + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsblock { + public $dataLength; + public $data = array(); + public $eccLength; + public $ecc = array(); + + public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) + { + $rs->encode_rs_char($data, $ecc); + + $this->dataLength = $dl; + $this->data = $data; + $this->eccLength = $el; + $this->ecc = $ecc; + } + }; + + //########################################################################## + + class QRrawcode { + public $version; + public $datacode = array(); + public $ecccode = array(); + public $blocks; + public $rsblocks = array(); //of RSblock + public $count; + public $dataLength; + public $eccLength; + public $b1; + + //---------------------------------------------------------------------- + public function __construct(QRinput $input) + { + $spec = array(0,0,0,0,0); + + $this->datacode = $input->getByteStream(); + if(is_null($this->datacode)) { + throw new Exception('null imput string'); + } + + QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); + + $this->version = $input->getVersion(); + $this->b1 = QRspec::rsBlockNum1($spec); + $this->dataLength = QRspec::rsDataLength($spec); + $this->eccLength = QRspec::rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = QRspec::rsBlockNum($spec); + + $ret = $this->init($spec); + if($ret < 0) { + throw new Exception('block alloc error'); + return null; + } + + $this->count = 0; + } + + //---------------------------------------------------------------------- + public function init(array $spec) + { + $dl = QRspec::rsDataCodes1($spec); + $el = QRspec::rsEccCodes1($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + if(QRspec::rsBlockNum2($spec) == 0) + return 0; + + $dl = QRspec::rsDataCodes2($spec); + $el = QRspec::rsEccCodes2($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + if($rs == NULL) return -1; + + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + return 0; + } + + //---------------------------------------------------------------------- + public function getCode() + { + $ret; + + if($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if($col >= $this->rsblocks[0]->dataLength) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]->data[$col]; + } else if($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]->ecc[$col]; + } else { + return 0; + } + $this->count++; + + return $ret; + } + } + + //########################################################################## + + class QRcode { + + public $version; + public $width; + public $data; + + //---------------------------------------------------------------------- + public function encodeMask(QRinput $input, $mask) + { + if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { + throw new Exception('wrong version'); + } + if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { + throw new Exception('wrong level'); + } + + $raw = new QRrawcode($input); + + QRtools::markTime('after_raw'); + + $version = $raw->version; + $width = QRspec::getWidth($version); + $frame = QRspec::newFrame($version); + + $filler = new FrameFiller($width, $frame); + if(is_null($filler)) { + return NULL; + } + + // inteleaved data and ecc codes + for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { + $code = $raw->getCode(); + $bit = 0x80; + for($j=0; $j<8; $j++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + + QRtools::markTime('after_filler'); + + unset($raw); + + // remainder bits + $j = QRspec::getRemainder($version); + for($i=0; $i<$j; $i++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02); + } + + $frame = $filler->frame; + unset($filler); + + + // masking + $maskObj = new QRmask(); + if($mask < 0) { + + if (QR_FIND_BEST_MASK) { + $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); + } else { + $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); + } + } else { + $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); + } + + if($masked == NULL) { + return NULL; + } + + QRtools::markTime('after_mask'); + + $this->version = $version; + $this->width = $width; + $this->data = $masked; + + return $this; + } + + //---------------------------------------------------------------------- + public function encodeInput(QRinput $input) + { + return $this->encodeMask($input, -1); + } + + //---------------------------------------------------------------------- + public function encodeString8bit($string, $version, $level) + { + if(string == NULL) { + throw new Exception('empty string!'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); + if($ret < 0) { + unset($input); + return NULL; + } + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public function encodeString($string, $version, $level, $hint, $casesensitive) + { + + if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { + throw new Exception('bad hint'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); + if($ret < 0) { + return NULL; + } + + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodePNG($text, $outfile, $saveandprint=false); + } + + //---------------------------------------------------------------------- + public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encode($text, $outfile); + } + + //---------------------------------------------------------------------- + public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodeRAW($text, $outfile); + } + } + + //########################################################################## + + class FrameFiller { + + public $width; + public $frame; + public $x; + public $y; + public $dir; + public $bit; + + //---------------------------------------------------------------------- + public function __construct($width, &$frame) + { + $this->width = $width; + $this->frame = $frame; + $this->x = $width - 1; + $this->y = $width - 1; + $this->dir = -1; + $this->bit = -1; + } + + //---------------------------------------------------------------------- + public function setFrameAt($at, $val) + { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + //---------------------------------------------------------------------- + public function getFrameAt($at) + { + return ord($this->frame[$at['y']][$at['x']]); + } + + //---------------------------------------------------------------------- + public function next() + { + do { + + if($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + + $x = $this->x; + $y = $this->y; + $w = $this->width; + + if($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + + if($this->dir < 0) { + if($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if($x == 6) { + $x--; + $y = 9; + } + } + } else { + if($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if($x == 6) { + $x--; + $y -= 8; + } + } + } + if($x < 0 || $y < 0) return null; + + $this->x = $x; + $this->y = $y; + + } while(ord($this->frame[$y][$x]) & 0x80); + + return array('x'=>$x, 'y'=>$y); + } + + } ; + + //########################################################################## + + class QRencode { + + public $casesensitive = true; + public $eightbit = false; + + public $version = 0; + public $size = 3; + public $margin = 4; + + public $structured = 0; // not supported yet + + public $level = QR_ECLEVEL_L; + public $hint = QR_MODE_8; + + //---------------------------------------------------------------------- + public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = new QRencode(); + $enc->size = $size; + $enc->margin = $margin; + + switch ($level.'') { + case '0': + case '1': + case '2': + case '3': + $enc->level = $level; + break; + case 'l': + case 'L': + $enc->level = QR_ECLEVEL_L; + break; + case 'm': + case 'M': + $enc->level = QR_ECLEVEL_M; + break; + case 'q': + case 'Q': + $enc->level = QR_ECLEVEL_Q; + break; + case 'h': + case 'H': + $enc->level = QR_ECLEVEL_H; + break; + } + + return $enc; + } + + //---------------------------------------------------------------------- + public function encodeRAW($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + return $code->data; + } + + //---------------------------------------------------------------------- + public function encode($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + QRtools::markTime('after_encode'); + + if ($outfile!== false) { + file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); + } else { + return QRtools::binarize($code->data); + } + } + + //---------------------------------------------------------------------- + public function encodePNG($intext, $outfile = false,$saveandprint=false) + { + try { + + ob_start(); + $tab = $this->encode($intext); + $err = ob_get_contents(); + ob_end_clean(); + + if ($err != '') + QRtools::log($outfile, $err); + + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); + + QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); + + } catch (Exception $e) { + + QRtools::log($outfile, $e->getMessage()); + + } + } + } + + diff --git a/webapp/php/admin.php b/webapp/php/admin.php index 4125a46..07376ea 100644 --- a/webapp/php/admin.php +++ b/webapp/php/admin.php @@ -1228,7 +1228,11 @@ class Admin { array("austriabind",0,false), array("doublereceipt",0,false), array("printextraprice",1,false), - array("turbo",5,false) + array("turbo",5,false), + array("guestqrtext",null,false), + array("guestqrsize",null,false), + array("guestqrfontsize",null,false), + array("reservationitem",null,false) ); if (is_null($pdo)) { @@ -1423,7 +1427,7 @@ class Admin { $view = "preferences.html"; } - echo json_encode($view . "?v=1.5.33"); + echo json_encode($view . "?v=1.6.1"); } } @@ -1644,31 +1648,31 @@ class Admin { if (!self::isOnlyRatingUser($rights, $right_rating, true)) { if ($_SESSION['modus'] == 0) { - if ($_SESSION['right_waiter']) { $mainMenu[] = array("name" => $waitertxt[$lang], "link" => "waiter.html?v=1.5.33"); } + if ($_SESSION['right_waiter']) { $mainMenu[] = array("name" => $waitertxt[$lang], "link" => "waiter.html?v=1.6.1"); } } else { - if ($_SESSION['right_waiter']) { $mainMenu[] = array("name" => $waiterdesktxt[$lang], "link" => "waiterdesktop.php?v=1.5.33"); } + if ($_SESSION['right_waiter']) { $mainMenu[] = array("name" => $waiterdesktxt[$lang], "link" => "waiterdesktop.php?v=1.6.1"); } } - if ($_SESSION['right_kitchen']) { $mainMenu[] = array("name" => $kitchentxt[$lang], "link" => "kitchen.html?v=1.5.33"); } - if ($_SESSION['right_bar']) { $mainMenu[] = array("name" => "Bar", "link" => "bar.html?v=1.5.33"); } - if ($_SESSION['right_supply']) { $mainMenu[] = array("name" => $supplytxt[$lang], "link" => "supplydesk.html?v=1.5.33"); } + if ($_SESSION['right_kitchen']) { $mainMenu[] = array("name" => $kitchentxt[$lang], "link" => "kitchen.html?v=1.6.1"); } + if ($_SESSION['right_bar']) { $mainMenu[] = array("name" => "Bar", "link" => "bar.html?v=1.6.1"); } + if ($_SESSION['right_supply']) { $mainMenu[] = array("name" => $supplytxt[$lang], "link" => "supplydesk.html?v=1.6.1"); } if ($_SESSION['modus'] == 0) { - if ($_SESSION['right_paydesk']) { $mainMenu[] = array("name" => $paydesktxt[$lang], "link" => "paydesk.html?v=1.5.33"); } + if ($_SESSION['right_paydesk']) { $mainMenu[] = array("name" => $paydesktxt[$lang], "link" => "paydesk.html?v=1.6.1"); } } - if ($_SESSION['right_statistics']) { $mainMenu[] = array("name" => $stattxt[$lang], "link" => "reports.html?v=1.5.33"); } - if ($_SESSION['right_bill']) { $mainMenu[] = array("name" => $bontxt[$lang], "link" => "bill.html?v=1.5.33"); } - if ($_SESSION['right_products']) { $mainMenu[] = array("name" => $prodtxt[$lang], "link" => "products.html?v=1.5.33"); } - if ($_SESSION['right_reservation']) { $mainMenu[] = array("name" => $restxt[$lang], "link" => "reservation.html?v=1.5.33"); } - if ($_SESSION['right_tasks'] || $_SESSION['right_tasksmanagement']) { $mainMenu[] = array("name" => $taskstxt[$lang], "link" => "tasks.html?v=1.5.33"); } - if ($_SESSION['right_rating']) { $mainMenu[] = array("name" => $ratingtxt[$lang], "link" => "rating.html?v=1.5.33"); } - if ($_SESSION['right_customers']) { $mainMenu[] = array("name" => $customerstxt[$lang], "link" => "customers.html?v=1.5.33"); } - if ($_SESSION['right_pickups']) { $mainMenu[] = array("name" => $pickupstxt[$lang], "link" => "pickups.html?v=1.5.33"); } - if ($_SESSION['right_dash']) { $mainMenu[] = array("name" => $dashtxt[$lang], "link" => "dash.php?v=1.5.33"); } - if ($_SESSION['right_manager'] || $_SESSION['is_admin'] || $_SESSION['right_closing']) { $mainMenu[] = array("name" => $admintxt[$lang], "link" => "manager.html?v=1.5.33"); } - $mainMenu[] = array("name" => $settingtxt[$lang], "link" => "preferences.html?v=1.5.33"); - if ($_SESSION['right_timetracking'] || $_SESSION['right_timemanager']) { $mainMenu[] = array("name" => $timetrackingtxt[$lang], "link" => "timetracking.html?v=1.5.33"); } + if ($_SESSION['right_statistics']) { $mainMenu[] = array("name" => $stattxt[$lang], "link" => "reports.html?v=1.6.1"); } + if ($_SESSION['right_bill']) { $mainMenu[] = array("name" => $bontxt[$lang], "link" => "bill.html?v=1.6.1"); } + if ($_SESSION['right_products']) { $mainMenu[] = array("name" => $prodtxt[$lang], "link" => "products.html?v=1.6.1"); } + if ($_SESSION['right_reservation']) { $mainMenu[] = array("name" => $restxt[$lang], "link" => "reservation.html?v=1.6.1"); } + if ($_SESSION['right_tasks'] || $_SESSION['right_tasksmanagement']) { $mainMenu[] = array("name" => $taskstxt[$lang], "link" => "tasks.html?v=1.6.1"); } + if ($_SESSION['right_rating']) { $mainMenu[] = array("name" => $ratingtxt[$lang], "link" => "rating.html?v=1.6.1"); } + if ($_SESSION['right_customers']) { $mainMenu[] = array("name" => $customerstxt[$lang], "link" => "customers.html?v=1.6.1"); } + if ($_SESSION['right_pickups']) { $mainMenu[] = array("name" => $pickupstxt[$lang], "link" => "pickups.html?v=1.6.1"); } + if ($_SESSION['right_dash']) { $mainMenu[] = array("name" => $dashtxt[$lang], "link" => "dash.php?v=1.6.1"); } + if ($_SESSION['right_manager'] || $_SESSION['is_admin'] || $_SESSION['right_closing']) { $mainMenu[] = array("name" => $admintxt[$lang], "link" => "manager.html?v=1.6.1"); } + $mainMenu[] = array("name" => $settingtxt[$lang], "link" => "preferences.html?v=1.6.1"); + if ($_SESSION['right_timetracking'] || $_SESSION['right_timemanager']) { $mainMenu[] = array("name" => $timetrackingtxt[$lang], "link" => "timetracking.html?v=1.6.1"); } - $mainMenu[] = array("name" => "Hilfe", "link" => "help.php?v=1.5.33"); - $mainMenu[] = array("name" => "Feedback", "link" => "feedback.html?v=1.5.33"); + $mainMenu[] = array("name" => "Hilfe", "link" => "help.php?v=1.6.1"); + $mainMenu[] = array("name" => "Feedback", "link" => "feedback.html?v=1.6.1"); } $mainMenu[] = array("name" => $logout[$lang], "link" => "logout.php"); @@ -2288,7 +2292,11 @@ class Admin { "logolocation" => array("dbcol" => "logolocation","checknum" => 1), "austriabind" => array("dbcol" => "austriabind","checknum" => 0), "doublereceipt" => array("dbcol" => "doublereceipt","checknum" => 0), - "printextraprice" => array("dbcol" => "printextraprice","checknum" => 0) + "printextraprice" => array("dbcol" => "printextraprice","checknum" => 0), + "guestqrtext" => array("dbcol" => "guestqrtext","checknum" => 0), + "guestqrsize" => array("dbcol" => "guestqrsize","checknum" => 1), + "guestqrfontsize" => array("dbcol" => "guestqrfontsize","checknum" => 1), + "reservationitem" => array("dbcol" => "reservationitem","checknum" => 0) ); $problem = false; foreach ($changedValues as $aChangeSet) { diff --git a/webapp/php/closing.php b/webapp/php/closing.php index 088145b..7a11f24 100644 --- a/webapp/php/closing.php +++ b/webapp/php/closing.php @@ -189,6 +189,7 @@ $newClosingId = $maxIdVal + 1; $closingEntrySql = "INSERT INTO `%closing%` (`id`,`closingdate`,`remark`,`billcount`,`billsum`,`signature`) VALUES (?,?,?,?,?,?)"; CommonUtils::execSql($pdo, $closingEntrySql, array($newClosingId,$closingTime,$remark,0,0.0,null)); +set_time_limit(60*60); $sql = "SELECT id FROM %bill% WHERE closingid is null AND (tableid >= '0' OR status='c') "; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(); @@ -207,9 +208,11 @@ if (!$ok) { return(array("status" => "ERROR", "code" => ERROR_INCONSISTENT_DB, "msg" => ERROR_INCONSISTENT_DB_MSG)); } +set_time_limit(60*60); $sql = "UPDATE %bill% SET closingid='$newClosingId' WHERE closingid is null AND (tableid >= '0' OR status='c') AND (paymentid <> ?)"; CommonUtils::execSql($pdo, $sql, array(8)); +set_time_limit(60*60); $sql = "SELECT count(id) as billstotake FROM %bill% WHERE closingid=? AND (tableid >= '0' OR status='c')"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($newClosingId)); @@ -238,9 +241,11 @@ $pricesumstr = number_format($pricesum, 2, ".", ''); $data = "I($newClosingId)-S($prevClosingDate)-E($closingTime)-D($billsToTake)-S($pricesumstr)"; $signature = md5($data); +set_time_limit(60*60); $sql = "UPDATE %closing% SET billcount=?, billsum=?,signature=? WHERE id=?"; CommonUtils::execSql($pdo, $sql, array($billsToTake,$pricesum,$signature,$newClosingId)); +set_time_limit(60*60); $sql = "SELECT value as val FROM %work% WHERE item=?"; $indexunclosedqueue = 0; $r = CommonUtils::fetchSqlAll($pdo, $sql, array('indexunclosedqueue')); @@ -250,15 +255,18 @@ if (!is_null($rval)) { $indexunclosedqueue = intval($rval); } } +set_time_limit(60*60); $sql = "UPDATE %queue% Q,%work% W SET Q.clsid=? WHERE Q.id > ? AND Q.clsid is null"; CommonUtils::execSql($pdo, $sql, array($newClosingId,$indexunclosedqueue)); +set_time_limit(60*60); $sql = "UPDATE %queue% SET toremove='1' WHERE billid is null AND clsid=?"; CommonUtils::execSql($pdo, $sql, array($newClosingId)); +set_time_limit(60*60); $sql = "UPDATE %queue% set paidtime=?,delivertime=? WHERE billid is not null AND paidtime is null"; CommonUtils::execSql($pdo, $sql, array($closingTime,$closingTime)); @@ -272,6 +280,7 @@ CommonUtils::execSql($pdo, "OPTIMIZE TABLE %printjobs%", null); $sql = "DELETE FROM %work% WHERE item=?"; CommonUtils::execSql($pdo, $sql, array("sumuphash")); +set_time_limit(60*60); $sql = "UPDATE %queue% SET isclosed=?"; CommonUtils::execSql($pdo, $sql, array(1)); diff --git a/webapp/php/customers.php b/webapp/php/customers.php index f9585c3..f1e176e 100644 --- a/webapp/php/customers.php +++ b/webapp/php/customers.php @@ -878,7 +878,7 @@ class Customers { $txt = ""; $txt .= "" . self::$CUS_OVERVIEW[$lang] . ""; $txt .= ''; - $txt .= ''; + $txt .= ''; $txt .= ""; return $txt; } diff --git a/webapp/php/debug.php b/webapp/php/debug.php index cea4b58..2a73bb4 100644 --- a/webapp/php/debug.php +++ b/webapp/php/debug.php @@ -27,7 +27,7 @@ if (isset($_POST["cmd"])) { if (strlen($status) > 150) { $status = substr($status, 0,149); } - $version = "1.5.33"; + $version = "1.6.1"; $arr = array("cmd" => $cmd,"fct" => $fct, "xhr" => $xhr,"errormsg" => $errormsg,"status" => $status,"version" => $version,"phpversion" => $phpversion); } else { diff --git a/webapp/php/reports.php b/webapp/php/reports.php index 772ee71..6f6259f 100644 --- a/webapp/php/reports.php +++ b/webapp/php/reports.php @@ -84,7 +84,11 @@ class Reports { echo json_encode(array("status" => "OK","msg" => $values)); break; case 'getProds': - $values = $this->sumSortedByProducts($pdo, $allDates['last30days'][0], $allDates['currentTimeStr']); + $days = null; + if (isset($_GET['days'])) { + $days = intval($_GET['days']); + } + $values = $this->sumSortedByProducts($pdo, $allDates['last30days'][0], $allDates['currentTimeStr'],null,null,$days); echo json_encode(array("status" => "OK","msg" => $values)); break; case 'getRatings': @@ -204,7 +208,7 @@ class Reports { $retArrayLastMonth = $this->iterateForDays($pdo, $allDates['monthAndYearOfLastMonth'],intval($allDates['lastDayOfLastMonth']),true); // products in the last 30 days: - $retArrayProds = $this->sumSortedByProducts($pdo, $allDates['last30days'][0], $allDates['currentTimeStr']); + $retArrayProds = $this->sumSortedByProducts($pdo, $allDates['last30days'][0], $allDates['currentTimeStr'],null,null,null); $retRatings = $this->getRatings($pdo,$allDates['last30days'],$allDates['lastMonthComplete'], $allDates['currentTimeStr']); @@ -305,16 +309,15 @@ class Reports { } return ($asum < $bsum) ? 1 : -1; } - - /* - * returns a sorted by prices list: - * array("prodid" => $aProdId,"prodname" => $aProd['prodname'], "sum" => $sumprice); - * array("prodid" => $aProdId,"prodname" => $aProd['prodname'], "sum" => $sumprice); - * (...) - */ - public function sumSortedByProducts($pdo,$startDateTime,$endDateTime,$closidstart=null,$closidend=null) { + + public function sumSortedByProducts($pdo,$startDateTime,$endDateTime,$closidstart=null,$closidend=null,$days=null) { // first get all products and with their id and name + if (!is_null($days)) { + date_default_timezone_set(DbUtils::getTimeZone()); + $startDateTime = date("Y-m-d", strtotime('-' . ($days - 1) . ' day') ); + } + if (is_null($closidstart)) { $sql = "SELECT DISTINCT productid from %queue%,%bill%,%products% "; $sql .= "WHERE %queue%.productid=%products%.id "; diff --git a/webapp/php/reservation.php b/webapp/php/reservation.php index 7fa9cd1..9c525a4 100644 --- a/webapp/php/reservation.php +++ b/webapp/php/reservation.php @@ -13,11 +13,11 @@ class Reservation { echo json_encode(array("status" => "ERROR", "code" => ERROR_RES_NOT_AUTHOTRIZED, "msg" => ERROR_RES_NOT_AUTHOTRIZED_MSG)); } else { if ($command == 'createReservation') { - $this->createReservation($_POST['day'],$_POST['month'],$_POST['year'],$_POST['start'],$_POST['name'],$_POST['email'],$_POST['persons'],$_POST['duration'],$_POST['phone'],$_POST['remark'],$_POST["tableid"]); + $this->createReservation($_POST['day'],$_POST['month'],$_POST['year'],$_POST['starthour'],$_POST['startmin'],$_POST['name'],$_POST['email'],$_POST['persons'],$_POST['durationhours'],$_POST['durationmins'],$_POST['phone'],$_POST['remark'],$_POST["tableid"]); } else if ($command == 'getReservations') { $this->getReservations($_GET['day'],$_GET['month'],$_GET['year']); } else if ($command == 'changeReservation') { - $this->changeReservation($_POST['id'],$_POST['day'],$_POST['month'],$_POST['year'],$_POST['start'],$_POST['name'],$_POST['email'],$_POST['persons'],$_POST['duration'],$_POST['phone'],$_POST['remark'],$_POST["tableid"]); + $this->changeReservation($_POST['id'],$_POST['day'],$_POST['month'],$_POST['year'],$_POST['starthour'],$_POST['startmin'],$_POST['name'],$_POST['email'],$_POST['persons'],$_POST['durationhours'],$_POST['durationmins'],$_POST['phone'],$_POST['remark'],$_POST["tableid"]); } else if ($command == 'delReservation') { $this->delReservation($_POST['id']); } else if ($command == 'emailConfirmReservation') { @@ -42,7 +42,7 @@ class Reservation { } } - private function createReservation($day,$month,$year,$start,$name,$email,$persons,$duration,$phone,$remark,$tableid) { + private function createReservation($day,$month,$year,$start,$startmin,$name,$email,$persons,$durationhours,$durationmins,$phone,$remark,$tableid) { $userid = $_SESSION['userid']; date_default_timezone_set(DbUtils::getTimeZone()); $currentTime = date('Y-m-d H:i:s'); @@ -56,11 +56,11 @@ class Reservation { $pdo->beginTransaction(); $sql = "INSERT INTO `%reservations%` ( - `id` , `creator`,`creationdate`,`scheduledate`,`name`,`email`,`starttime`,`duration`,`persons`,`phone`,`remark`,`tableid`) + `id` , `creator`,`creationdate`,`scheduledate`,`name`,`email`,`starttime`,`starttimemin`,`duration`,`durationmins`,`persons`,`phone`,`remark`,`tableid`) VALUES ( - NULL , ?,?,?,?,?,?,?,?,?,?,?)"; + NULL , ?,?,?,?,?,?,?,?,?,?,?,?,?)"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); - $stmt->execute(array($userid,$currentTime,$scheduledDate,$name,$email,$start,$duration,$persons,$phone,$remark,$tableid)); + $stmt->execute(array($userid,$currentTime,$scheduledDate,$name,$email,$start,$startmin,$durationhours,$durationmins,$persons,$phone,$remark,$tableid)); $pdo->commit(); echo json_encode(array("status" => "OK")); } @@ -70,7 +70,7 @@ class Reservation { } } - private function changeReservation($id,$day,$month,$year,$start,$name,$email,$persons,$duration,$phone,$remark,$tableid) { + private function changeReservation($id,$day,$month,$year,$startHour,$startMin,$name,$email,$persons,$durationHours,$durationMins,$phone,$remark,$tableid) { $userid = $_SESSION['userid']; date_default_timezone_set(DbUtils::getTimeZone()); $currentTime = date('Y-m-d H:i:s'); @@ -80,8 +80,8 @@ class Reservation { try { $pdo->beginTransaction(); - $sql = "UPDATE `%reservations%` SET creator=?,creationdate=?,scheduledate=?,name=?,email=?,starttime=?,duration=?,persons=?,phone=?,remark=?,tableid=? WHERE id=?"; - CommonUtils::execSql($pdo, $sql, array($userid,$currentTime,$scheduledDate,$name,$email,$start,$duration,$persons,$phone,$remark,$tableid,$id)); + $sql = "UPDATE `%reservations%` SET creator=?,creationdate=?,scheduledate=?,name=?,email=?,starttime=?,starttimemin=?,duration=?,durationmins=?,persons=?,phone=?,remark=?,tableid=? WHERE id=?"; + CommonUtils::execSql($pdo, $sql, array($userid,$currentTime,$scheduledDate,$name,$email,$startHour,$startMin,$durationHours,$durationMins,$persons,$phone,$remark,$tableid,$id)); $pdo->commit(); echo json_encode(array("status" => "OK")); } @@ -144,7 +144,7 @@ class Reservation { $txt = ""; $txt .= "Reservierungsübersicht"; $txt .= ''; - $txt .= ''; + $txt .= ''; $txt .= ""; $txt .= ""; $txt .= "

      Reservierungsübersicht für $day.$month.$year

      "; @@ -170,7 +170,8 @@ class Reservation { } private static function getSqlForResByTime() { // REM* roomname and tablename only for the html output - $sql = "SELECT R.id,U.username as username,creationdate,scheduledate,starttime,name,email,persons,duration,phone,remark,tableid, "; + $sqlEndTime = self::sqlForEndTime(); + $sql = "SELECT R.id,U.username as username,creationdate,scheduledate,starttime as starthour,starttimemin as startmin,$sqlEndTime,name,email,persons,duration,durationmins,phone,remark,tableid, "; $sql .= "IF(tableid is null,'-1',(SELECT RO.id as roomid FROM %room% RO,%resttables% T WHERE T.id=tableid AND T.roomid=RO.id)) as roomid, "; $sql .= "IF(tableid is null,'-1',(SELECT RO.sorting as roomsorting FROM %room% RO,%resttables% T WHERE T.id=tableid AND T.roomid=RO.id)) as roomsorting, "; $sql .= "IF(tableid is null,'',(SELECT RO.roomname as roomname FROM %room% RO,%resttables% T WHERE T.id=tableid AND T.roomid=RO.id)) as roomname, "; @@ -180,14 +181,25 @@ class Reservation { $sql .= "WHERE DATE(scheduledate)=? AND R.creator=U.id "; return $sql; } + // REM* the end time may be in next day, and the minutes may also need an hiour to be increased + private static function sqlForEndTime() { + $sqlEndTimeStamp = 'ADDTIME(CONCAT(starttime,":",starttimemin,":00"),CONCAT(duration,":",durationmins,":00"))'; + // REM* will return something like 26:15:00 in case endtime is on next day + $sqlEndHour = 'HOUR(' . $sqlEndTimeStamp . ') as endhour'; + $sqlEndMin = 'MINUTE(' . $sqlEndTimeStamp . ') as endmin'; + $sqlEndTime = "$sqlEndHour,$sqlEndMin"; + return $sqlEndTime; + } private function getReservations($day,$month,$year) { $pdo = DbUtils::openDbAndReturnPdoStatic(); + $sqlEndTime = self::sqlForEndTime(); + // REM* the many sortings in the sql allow the sorting by time, room-sort and table-sort $sql = self::getSqlForResByTime(); $timeSortedReservations = $this->getReservationsCore($pdo,$day,$month,$year,$sql . " ORDER BY starttime,roomsorting,tablesorting"); // REM* and now by table - $sql = "SELECT DISTINCT R.tableid as tableid,ROOM.id as roomid,ROOM.sorting as roomsorting,T.sorting as tablesorting FROM %reservations% R,%room% ROOM,%resttables% T "; + $sql = "SELECT DISTINCT R.tableid as tableid,T.tableno as tablename,ROOM.id as roomid,ROOM.sorting as roomsorting,T.sorting as tablesorting FROM %reservations% R,%room% ROOM,%resttables% T "; $sql .= " WHERE DATE(scheduledate)=? AND tableid is not null AND tableid >= '0' "; $sql .= " AND R.tableid = T.id AND T.roomid=ROOM.id "; $sql .= " ORDER BY ROOM.sorting,T.sorting "; @@ -198,23 +210,23 @@ class Reservation { $byTables = array(); foreach($allTablesOfResAtThatDate as $tableRes) { - $sql = "SELECT R.id,U.username as creator,creationdate,scheduledate,starttime as start,name as guest,email,persons,duration,(starttime + duration) as endhour,"; + $sql = "SELECT R.id,U.username as creator,creationdate,scheduledate,YEAR(scheduledate) as year,MONTH(scheduledate) as month, DAY(scheduledate) as day,starttime as starthour,starttimemin as startmin,name as guest,email,persons,duration as durationhours,durationmins,$sqlEndTime,"; $sql .= " phone,remark,tableid,'" . $tableRes["roomid"] . "' as roomid "; $sql .= "FROM %reservations% R,%user% U "; $sql .= "WHERE DATE(scheduledate)=? AND R.creator=U.id AND tableid=? "; $sql .= "ORDER BY starttime"; $allResOfThatTable = CommonUtils::fetchSqlAll($pdo, $sql, array($scheduledDate,$tableRes["tableid"])); - $byTables[] = array("tableid" => $tableRes["tableid"],"roomid" => $tableRes["roomid"], "reservations" => $allResOfThatTable); + $byTables[] = array("tableid" => $tableRes["tableid"],"tablename" => $tableRes["tablename"],"roomid" => $tableRes["roomid"], "reservations" => $allResOfThatTable); } // REM* these were all reservations by table at the given date. Let's add all reservations without a table assignment - $sql = "SELECT R.id,U.username as creator,creationdate,scheduledate,starttime as start,name as guest,email,persons,duration,(starttime + duration) as endhour,"; + $sql = "SELECT R.id,U.username as creator,creationdate,scheduledate,YEAR(scheduledate) as year,MONTH(scheduledate) as month, DAY(scheduledate) as day,starttime as starthour,starttimemin as startmin,name as guest,email,persons,duration as durationhours,durationmins,$sqlEndTime,"; $sql .= " phone,remark,'-1' as tableid,'-1' as roomid "; $sql .= "FROM %reservations% R,%user% U "; $sql .= "WHERE DATE(scheduledate)=? AND R.creator=U.id AND (tableid is null OR tableid='-1') "; $sql .= "ORDER BY starttime"; $allResOfUndefinedTable = CommonUtils::fetchSqlAll($pdo, $sql, array($scheduledDate)); if (count($allResOfUndefinedTable) > 0) { - $byTables[] = array("tableid" => '-1',"roomid" => '-1', "reservations" => $allResOfUndefinedTable); + $byTables[] = array("tableid" => '-1',"tablename" => "?","roomid" => '-1', "reservations" => $allResOfUndefinedTable); } $msg = array("bytimes" => $timeSortedReservations,"bytables" => $byTables); @@ -239,21 +251,22 @@ class Reservation { $resArray = array(); foreach($result as $row) { - $datetimeparts = explode(" ",$row['scheduledate']); - $thedate = $datetimeparts[0]; - $thedateparts = explode("-",$thedate); $resArray[] = array( "id" => $row['id'], "creator" => $row['username'], "creationdate" => $row['creationdate'], - "day" => $thedateparts[2], - "month" => $thedateparts[1], - "year" => $thedateparts[0], - "start" => $row['starttime'], + "day" => $row['day'], + "month" => $row['month'], + "year" => $row['year'], + "starthour" => $row['starthour'], + "startmin" => $row['startmin'], + "endhour" => $row['endhour'], + "endmin" => $row['endmin'], "guest" => $row['name'], "email" => $row['email'], "persons" => $row['persons'], - "duration" => $row['duration'], + "durationhours" => $row['duration'], + "durationmins" => $row['durationmins'], "phone" => $row['phone'], "remark" => $row['remark'], "roomid" => $row['roomid'], @@ -286,4 +299,4 @@ class Reservation { return array(); } } -} +} \ No newline at end of file diff --git a/webapp/php/roomtables.php b/webapp/php/roomtables.php index 8ef798e..021a38f 100644 --- a/webapp/php/roomtables.php +++ b/webapp/php/roomtables.php @@ -38,13 +38,17 @@ class Roomtables { } else if ($command == 'getRoomfieldAlsoInactive') { $this->getRoomfieldAlsoInactive(); } else if ($command == 'setRoomInfo') { - if ($this->hasCurrentUserAdminRights()) { + if (self::hasCurrentUserAdminRights()) { $this->setRoomInfo($_POST['rooms'],$_POST['togoworkprinter']); } + } else if ($command == 'createTableCodes') { + self::createTableCodes(); + } else if ($command == 'tableqrcodes') { + self::tableqrcodes(); } } - private function hasCurrentUserAdminRights() { + private static function hasCurrentUserAdminRights() { if(session_id() == '') { session_start(); } @@ -55,6 +59,27 @@ class Roomtables { } } + private static function createTableCodes() { + if (!self::hasCurrentUserAdminRights()) { + echo json_encode(array("status" => "ERROR","msg" => "Benutzerrechte nicht ausreichend")); + return; + } + try { + $pdo = DbUtils::openDbAndReturnPdoStatic(); + $sql = "SELECT id FROM %resttables% WHERE removed is null AND (code is NULL OR code='')"; + $activeTables = CommonUtils::fetchSqlAll($pdo, $sql); + $updateSql = "UPDATE %resttables% SET code=? WHERE id=?"; + foreach($activeTables as $table) { + $tableid = $table["id"]; + $uniqid = md5(uniqid()); + CommonUtils::execSql($pdo, $updateSql, array($uniqid,$tableid)); + } + echo json_encode(array("status" => "OK")); + } catch (Exception $ex) { + echo json_encode(array("status" => "ERROR","msg" => "Datenbank nicht erreichbar")); + } + } + function showAllRooms() { $pdo = DbUtils::openDbAndReturnPdoStatic(); $roomtables = $this->getAllTablesAndRooms($pdo); @@ -220,9 +245,22 @@ class Roomtables { return ''; } + private static function sqlForEndTime() { + $sqlEndTimeStamp = 'ADDTIME(CONCAT(starttime,":",starttimemin,":00"),CONCAT(duration,":",durationmins,":00"))'; + $sqlEndHour = 'HOUR(' . $sqlEndTimeStamp . ') as endhour'; + $sqlEndMin = 'MINUTE(' . $sqlEndTimeStamp . ') as endmin'; + $sqlEndTime = "$sqlEndHour,$sqlEndMin"; + return $sqlEndTime; + } + private function getAllTablesAndRooms($pdo) { - $sql = "SELECT tableid,GROUP_CONCAT(DISTINCT CONCAT(starttime,':00-',(starttime+duration),':00') ORDER BY starttime) as times from %reservations% R "; + $sqlEndTimeStamp = 'ADDTIME(CONCAT(starttime,":",starttimemin,":00"),CONCAT(duration,":",durationmins,":00"))'; + $sqlEndHour = 'HOUR(' . $sqlEndTimeStamp . ') '; + $sqlEndMin = 'LPAD(MINUTE(' . $sqlEndTimeStamp . '),2,0)'; + + $sql = "SELECT tableid,GROUP_CONCAT(DISTINCT CONCAT(starttime,':',LPAD(starttimemin,2,0),'-',($sqlEndHour),':',($sqlEndMin)) ORDER BY starttime) as times from %reservations% R "; + //$sql = "SELECT tableid,GROUP_CONCAT(DISTINCT CONCAT(starttime,':00-',(starttime+duration),':00') ORDER BY starttime) as times from %reservations% R "; $sql .= "WHERE DATE(scheduledate)=CURDATE() AND (HOUR(NOW())-1) <= starttime GROUP BY tableid"; $reservations = CommonUtils::fetchSqlAll($pdo, $sql); @@ -484,4 +522,85 @@ class Roomtables { $result = CommonUtils::fetchSqlAll($pdo, $sql, array(1,1)); return $result; } + + private static function createSingleQRCode($guesturl,$tablename,$tableid,$code,$addOnText,$guestqrsize,$guestqrfontsize) { + $arg = $guesturl . '/index.php?code=' . $code . "_" . $tableid; + $txt = '

      '; + $txt .= 'Tisch: ' . $tablename . '
      '; + if (!is_null($code) && ($code != '')) { + $txt .= '
      '; + } else { + $txt .= '

      Tischcode wurde noch nicht zugewiesen
      '; + } + $txt .= '

      ' . $addOnText . ''; + $txt .= '

      '; + return $txt; + } + + private static function createQrCodeForTables($pdo,$guesturl,$addOnText,$guestqrsize,$guestqrfontsize) { + $maxCols = round(500.0/($guestqrsize + 20)); + $allTables = self::getTablesForGuestsystem($pdo); + $txt = ''; + $col = 0; + foreach($allTables as $aTable) { + $code = $aTable['code']; + $tableid = $aTable['id']; + $tablename = $aTable['name']; + if ($col == 0) { + $txt .= ""; + } + $txt .= '"; + } + } + $txt .= "
      ' . self::createSingleQRCode($guesturl, $tablename, $tableid, $code, $addOnText, $guestqrsize, $guestqrfontsize); + $col++; + if ($col == $maxCols) { + $col = 0; + $txt .= "
      "; + return $txt; + } + + private static function tableqrcodes() { + header( "Expires: Mon, 20 Dec 1998 01:00:00 GMT" ); + header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" ); + header( "Cache-Control: no-cache, must-revalidate" ); + header( "Content-Type: text/html; charset=utf8" ); + + $pdo = DbUtils::openDbAndReturnPdoStatic(); + $guestUrl = CommonUtils::getConfigValue($pdo, 'guesturl', ''); + + if (CommonUtils::strEndsWith($guestUrl, "/")) { + $guestUrl = substr($guestUrl, 0, strlen($guestUrl) - 1); + } + + if (CommonUtils::strEndsWith($guestUrl, "/index.php")) { + $guestUrl = substr($guestUrl, 0, strlen($guestUrl) - strlen("/index.php")); + } + + $guestqrtext = CommonUtils::getConfigValue($pdo, 'guestqrtext', ''); + $guestqrsize = CommonUtils::getConfigValue($pdo, 'guestqrsize', ''); + if (($guestqrsize < 20) || ($guestqrsize > 500)) { + $guestqrsize = 150; + } + $guestqrfontsize = CommonUtils::getConfigValue($pdo, 'guestqrfontsize', ''); + if (($guestqrfontsize < 5) || ($guestqrfontsize > 50)) { + $guestqrfontsize = 15; + } + if (is_null($guestUrl) || ($guestUrl == '')) { + echo "Gastbestell-URL noch nicht konfiguriert"; + return; + } + + $txt = ""; + $txt .= "Tisch QR-Codes für die Gastbestellung"; + $txt .= ''; + $txt .= ''; + $txt .= ""; + $txt .= ""; + $txt .= "

      Tisch QR-Codes für die Gastbestellung

      "; + + $txt .= self::createQrCodeForTables($pdo,$guestUrl,$guestqrtext,$guestqrsize,$guestqrfontsize); + $txt .= ""; + echo $txt; + } } diff --git a/webapp/php/utilities/osqrcode.php b/webapp/php/utilities/osqrcode.php new file mode 100644 index 0000000..f119af1 --- /dev/null +++ b/webapp/php/utilities/osqrcode.php @@ -0,0 +1,23 @@ +calcStartDate($startMonth, $startYear); $endDate = $this->calcEndDate($endMonth, $endYear); - $prodStat = $reports->sumSortedByProducts($pdo, $startDate, $endDate,null,null); + $prodStat = $reports->sumSortedByProducts($pdo, $startDate, $endDate,null,null,null); } else { - $prodStat = $reports->sumSortedByProducts($pdo, 0,0,$closidstart,$closidend); + $prodStat = $reports->sumSortedByProducts($pdo, 0,0,$closidstart,$closidend,null); } $this->setProdsTableHeader(); diff --git a/webapp/php/utilities/version.php b/webapp/php/utilities/version.php index ff6f57d..787c82a 100644 --- a/webapp/php/utilities/version.php +++ b/webapp/php/utilities/version.php @@ -1287,6 +1287,26 @@ class Version { return array(true); } + public static function upd_1533_1600($pdo, $prefix, $dbname) { + try { + self::execSql($pdo, "ALTER TABLE %reservations% ADD starttimemin INT(3) NULL AFTER `starttime`"); + self::execSql($pdo, "UPDATE %reservations% SET starttimemin='0'"); + self::execSql($pdo, "ALTER TABLE %reservations% ADD durationmins INT(3) NULL AFTER `duration`"); + self::execSql($pdo, "UPDATE %reservations% SET durationmins='0'"); + self::insertOrUpdateConfigItem($pdo, 'guestqrtext', 'Gastbestellung'); + self::insertOrUpdateConfigItem($pdo, 'guestqrfontsize', '15'); + self::insertOrUpdateConfigItem($pdo, 'guestqrsize', '150'); + self::insertOrUpdateConfigItem($pdo, 'reservationitem', "{Name}\n{Start-Stunde}:{Start-Minute}-{Ende-Stunde}:{Ende-Minute}\nDauer: {Dauer-Stunden}:{Dauer-Minuten}\n{Personen} Personen\n{Bemerkung}"); + return array(true); + } catch (PDOException $e) { + return array(false,$e); + } + } + + public static function upd_1600_1601($pdo, $prefix, $dbname) { + return array(true); + } + public static $updateOrder = array( "1.3.0" => array("upd_1300_1301","1.3.1"), "1.3.1" => array("upd_1301_1302","1.3.2"), @@ -1367,7 +1387,9 @@ class Version { "1.5.29" => array("upd_1529_1530","1.5.30"), "1.5.30" => array("upd_1530_1531","1.5.31"), "1.5.31" => array("upd_1531_1532","1.5.32"), - "1.5.32" => array("upd_1532_1533","1.5.33") + "1.5.32" => array("upd_1532_1533","1.5.33"), + "1.5.33" => array("upd_1533_1600","1.6.0"), + "1.6.0" => array("upd_1600_1601","1.6.1") ); public static function runUpdateProcess($pdo,$prefix, $dbname, $untilVersion,$checkValidVersion) { diff --git a/webapp/pickups.html b/webapp/pickups.html index a3a40d9..8e3eff2 100644 --- a/webapp/pickups.html +++ b/webapp/pickups.html @@ -5,7 +5,7 @@ - + @@ -13,7 +13,7 @@ - + diff --git a/webapp/preferences.html b/webapp/preferences.html index 92b0701..9239af7 100644 --- a/webapp/preferences.html +++ b/webapp/preferences.html @@ -5,7 +5,7 @@ - + @@ -13,7 +13,7 @@ - + diff --git a/webapp/products.html b/webapp/products.html index b6572fc..f9f363e 100644 --- a/webapp/products.html +++ b/webapp/products.html @@ -7,16 +7,16 @@ - + - - - + + + diff --git a/webapp/productsdesktop.php b/webapp/productsdesktop.php index da2a712..c080146 100644 --- a/webapp/productsdesktop.php +++ b/webapp/productsdesktop.php @@ -4,7 +4,7 @@ - + @@ -15,7 +15,7 @@ - + - + diff --git a/webapp/reports.html b/webapp/reports.html index 6cb0431..0410b6f 100644 --- a/webapp/reports.html +++ b/webapp/reports.html @@ -7,14 +7,14 @@ - + - + @@ -51,9 +51,9 @@ var REP_THIS_MONTH_TXT = ["Diese Übersicht umfasst alle Einnahmen dieses Monats var REP_LAST_MONTH_TXT = ["Diese Übersicht umfasst Einnahmen des letzten Monats.", "This overview shows all revenues of the last month.", "Este parte muestra todo el cobro del mes pasado."]; -var REP_PROD_LAST30_TXT = ["Diese Übersicht zeigt die Einnahmen, die mit den in den letzten 30 Tagen verkauften Produkten erzielt wurden.", - "This overview displays the revenue that could be achieved with all sold products in the last 30 days.", - "Este parte muestra el cobro con el productos vendido en los últimos 30 días."]; +var REP_PROD_LAST30_TXT = ["Diese Übersicht zeigt die Einnahmen, die mit den in den letzten Tagen verkauften Produkten erzielt wurden.", + "This overview displays the revenue that could be achieved with all sold products in the last days.", + "Este parte muestra el cobro con el productos vendido en los últimos días."]; var REP_NO_DATA = ["Es liegen keine Daten vor.", "There is no data.", "No hay ningún datos."]; var REP_PRODREP = ["Produktstatistik","Product report","Estadistica de productos"]; var REP_TITLE = ["Statistik","Statistics","Estadisticas"]; @@ -76,6 +76,7 @@ var REP_RECORD_ACTION = [ ["Tischwechsel Produktbuchung","Received moved products","Recibo productos de otra mesa"] ]; var REP_NO_ENTRIES = ["Keine Einträge","No entries","Ningún data"]; +var REP_PRODSLIDER_LABEL = ["Seit wievielen Tagen","Since how many days","Desce hace cuantos dias"]; var lang = 0; var allorders = []; @@ -193,6 +194,27 @@ function setLanguage(language) { }); } + function getProdsSlider() { + var txt = '

      '; + txt += ''; + txt += '
      '; + txt += '

      '; + return txt; + } + + function bindProdsSlider() { + $("#prodsslider").off("slidestop").on("slidestop", function (e) { + e.stopImmediatePropagation(); + e.preventDefault(); + requestNewProdStat(); + }); + } + + function requestNewProdStat() { + var days = $("#prodsslider").val(); + $("#content_prods_section .divaroundtable").html(''); + doAjax("GET", "php/contenthandler.php?module=reports&command=getProds&days=" + days, null, updateProdsStat, "Fehler keine Daten für Produktverkäufe",true); + } function fillUsersums(answer) { if (answer.status == "OK") { var htmlTable = createTableWithData(answer.msg,REP_USER[lang],"center",15,10,75); @@ -230,10 +252,18 @@ function setLanguage(language) { function fillProds(answer) { if (answer.status == "OK") { var htmlTable = createTableWithData(answer.msg,REP_PROD[lang],"left",30,10,60); - $("#content_prods_section").html(htmlTable); + var prodsSlider = getProdsSlider(); + $("#content_prods_section").html(prodsSlider + htmlTable); + $("#prodsliderarea").trigger("create"); + bindProdsSlider(); + } + } + function updateProdsStat(answer) { + if (answer.status == "OK") { + var htmlTable = createTableWithData(answer.msg,REP_PROD[lang],"left",30,10,60); + $("#content_prods_section .divaroundtable").html(htmlTable); } } - function fillRatings(answer) { if (answer.status == "OK") { var htmlPart = createRatingsPartCore(answer.msg,REP_DAY[lang],10,10,40,40); @@ -459,10 +489,11 @@ function setLanguage(language) { function createTableWithData(values,iterObjName,iterAlignment,width1,width2,width3) { var maxValue = values.max; - var content = REP_NO_DATA[lang]; + var content = "

      " + REP_NO_DATA[lang] + "
      "; if (maxValue != 0.0) { - var content = ""; + var content = "
      "; + content += "
      "; content += aTableHeader(iterObjName,REP_SUM[lang],"Graph",width1,width2,width3); var contentValues = values.content; @@ -475,7 +506,7 @@ function setLanguage(language) { width1,width2,width3); }); - content += "
      "; + content += "
    "; } return content; } diff --git a/webapp/reservation.html b/webapp/reservation.html index 143c527..dda0984 100644 --- a/webapp/reservation.html +++ b/webapp/reservation.html @@ -5,7 +5,7 @@ - + @@ -13,8 +13,9 @@ + - + @@ -29,6 +30,11 @@ +var W_TABLES=["Tische","Tables","Mesas"];var W_ATABLE=["Tisch","Table","Mesa"];var W_ROOMS=["Räume","Rooms","Espacios"];var W_SELECTION=["Auswahl","Selection","Selección"];var W_LAST_SELECTED=["zuletzt","last","seleccionado"];var W_FAVS=["Favoriten","Favorites","Favoritos"];var W_NEW_ORDER=["Neue Order","New Orders","Ordenes nuevas"];var W_KIT_BAR=["nicht serviert/unbezahlt","unserved/unpaid","no servido/impagado"];var W_OTHER_PROD=["Auswahl Produktkategorie","Select product categroy","Categoría diferente"];var W_WORK_TICKET=["Arbeitsbon","Work ticket","Tique de trabajar"];var W_NOTE=["Bemerkung","Comment","Comentario"];var W_NUMBER=["Anzahl","Number","Número"];var W_SEND_ORDERS=["Bestellung senden","Send orders","Enviar Ordenes"];var W_TO_PAYDESK=["-> Kasse","-> Paydesk","-> Caja"];var W_TABLECHANGE=["Tischwechsel","Change table","Cambiar mesa"];var W_ROOMTABLE=["Raum-Tisch","Room-Table","Espacio-Mesa"];var W_TABLE_SEL=["Tischauswahl","Select table","Qué mesa?"];var W_UNDELIV_INFO=["Liste enthält die Produkte die noch in der Küchen-/Baransicht sind, sowie unbezahlte Produkte, die die Bereitstellungsansicht nicht durchlaufen.","List contains the products which are still in kitchen or bar view, as well as unpaid products that do not pass the supplydesk view.","La lista contiene los productos que estan todavía en modulo de cocina/bar, también productos impagados que no pasan vista de productos preparados."];var W_REMOVE_ERROR=["Ansicht nicht mehr aktuell - Liste wird neu geladen.","View is obsolete - List will be reloaded.","Vista no esta actual - vamos a actualisar la lista."];var W_FOOD_FOR=["Speisen für","Food for","Comidas para"];var W_DRINKS_FOR=["Getränke für","Beverage for","Bebidas para"];var W_ACT_NEW_ORD_EL=["Aktion auswählen","Select action","Que acción?"];var W_ACT_CHANGE=["Ändern","Modify","Modificar"];var W_ACT_CHANGE_ALL=["Alle Ändern","Modify all","Modificar todo"];var W_ACT_CHANGE_ONE=["Einen Artikel ändern","Modify one item","Modificar un artículo"];var W_APPLY=["Anwenden","Apply","Aplicar"];var W_CANCEL=["Abbrechen","Cancel","Cancelar"];var W_STILL_UNSENT_ORDERS=["Es sind noch ungesendete Orders vorhanden!","There are unsent orders in the list","Hay elementos in la liste que no han enviados"];var W_EXTRAS=["Extras/Optionen","Add-ons/Options","Opciones"];var W_OPEN_PANEL=["Extras-Auswahl noch offen","Add-ons selection still open","Selección de opciones todavía abierta"];var W_DEL=["Löschen","Delete","Removar"];var W_MSG=["Nachricht","Message","Mensaje"];var W_CHANGE_PRICE=["Neuer Preis: ","New price: ","Cambiar precio: "];var W_PRICE=["Preis","Price","Precio"];var W_WRONG_FORMAT=["Falsches Zahlenformat","Wrong number format","Formato de precio incorecto"];var W_TOGO=["Außer-Haus-Verkauf","Sale with Tax No 2","Venta IVA 2"];var W_YES=["Ja","Yes","Si"];var W_NO=["Nein","No","No"];var W_DISCARD_NO_ASK=["Es sind noch ungesendete Orders vorhanden! Sollen diese verworfen werden?","There are still unsent orders. Do you want to discard them?","Hay todavía ordenes non-enviados. Removarlos?"];var W_DISCARD_HEADER=["Neue Orders verwerfen?","Discard new orders?","Removar ordenes nuevos?"];var W_SEARCH=["Produktsuche","Product search","Buscar producto"];var W_BARCODE=["Barcode","Barcode","Código de barras"];var W_SEARCHRESULTS=["Suchergebnis","Search Result","Encontrado"];var W_WRONG_PIN=["Falscher Stornocode","Wrong cancel code","Codigo falso"];var W_NO_ORDERS=["Keine neuen Orders zum Versand vorhanden!","No new orders available!","No hay ningún orden nuevo!"];var W_TO_PAY=["offen","to pay","a pagar"];var W_MOVE_PRODS=["Produkte verschieben","Move products","Productos a otra mesa"];var W_NO_PRODS_SELECTED=["Es wurden keine Produkte ausgewählt!","You have not chosen any products!","No ha seleccionado ningún producto!"];var W_MAX_PRICE_EXCEEDED=["Der Maximalwert für den Preis wurde überschritten!","The max. value for the price is exceeded!","El valor del precio es más que el maximum!"];var W_REORDER=["Nachbestellen","Reorder","Order una vez mas"];var W_REMOVE=["Entfernen","Remove","Removar"];var W_SELALL=["Alles auswählen","Select all","Elegir todo"];var W_UNSELALL=["Alles abwählen","Unselect all","No elegir nada"];var W_ONLY=["noch","only","sólo"];var W_DEL_ALL_UNDELIVERED=["Entferne alles","Remove all","Borrar todo"];var W_DEL_ALL_ASSIGNED_PRODS=["Alle Produkte löschen?","Delete all products?","Removar todos los productos?"];var W_NO_VALID_PRICE=["Keine gültige Zahl","No valid value","No es un número valido"];var W_NO_REORDER_VAR_PRICE=["Nur Produkte mit der Einheit 'Stück' könne auf diese Weise nachbestellt werden.","Only products of unit 'Piece' can be reordered this way.","Un producto de esta unidad no se puede reordenado asi."];var W_INVALID_NO_ENTERING=["Fehler bei der Eingabe","Input contains errors","Número invalido"];var w_INVALID_NO_RANGE=["Ungültiger Zahlenbereich (1-1000)","Invalid number range (1-1000)","Número no es entre 1 y 1000"];var W_DAYCODETXT=["Tageslosung","Day code","Código del día"];var W_RECORDS_HEADER=["Tischprotokoll","Records of table","Historia de la mesa"];var W_RECORDS_INIT=["Tischprotokoll (Anklicken zum Öffnen)","Records of table (click to open)","Historia de la mesa (click para abrir)"];var W_RECORD_ACTION=[["Bestellung","Ordering","Ordenar"],["Rechnung","Bill","Pagar"],["Produktstorno","Discard product","Descartar producto"],["Rechnungsstorno","Discard bill","Descartar pago"],["Rechnungs- und Produktstorno","Discard bill and product","Descrtar pago y producto"],["Tischwechsel Produktentfernung","Move products to other table","Productos a otra mesa"],["Tischwechsel Produktbuchung","Received moved products","Recibo productos de otra mesa"]];var W_NO_ENTRIES=["Keine Einträge","No entries","Ningún data"];var W_NOT_SUPPORTED=["Nicht unterstützt für dieses Produkt","Not supported for this product","No posible para este producto"];var CHANGE_ALL=0;var CHANGE_ONE=1;var WORKFLOW_DIGI_WORK=0;var WORKFLOW_DIGI=1;var WORKFLOW_WORK=2;var WORKFLOW_WORK_SEND=3;function Grouping(b,a){this.set=b;this.sortedset=[];this.group=function(){this.sortedset=[];for(var g=0;g/g,">"))}function setLanguage(c){lang=c;$("#roomtableheader2").html(W_ROOMTABLE[lang]);$("#tableselection").html(W_TABLE_SEL[lang]);$("#actiontxt").html(W_ACT_NEW_ORD_EL[lang]);$("#actdeltxt").html(W_DEL[lang]);$("#discard_new_orders_yes").html(W_YES[lang]);$("#discard_new_orders_no").html(W_NO[lang]);$("#discardnewordersask").html(W_DISCARD_NO_ASK[lang]);$("#discardnoheader").html(W_DISCARD_HEADER[lang]);$("#moveprods").html(W_MOVE_PRODS[lang]);$(".daycodetxt").html(W_DAYCODETXT[lang]);var k="";if(prominentsearch==0){k+='
    ';if(usebarcode==1){k+=''}}else{if(usebarcode==0){k+='
    ';k+="
    "}else{k+='
    ';k+='';k+="
    "}}k+="
    ";var a='
    ';if(prominentsearch==0){$("#searchposition-normal").html(k)}else{$("#searchposition-prominent").html(k)}if(usebarcode==1){$("#barcode").focus()}var g=a;var f="";if((workflowconfig==WORKFLOW_DIGI_WORK)||(workflowconfig==WORKFLOW_DIGI)||(workflowconfig==WORKFLOW_WORK_SEND)){f=" osbigbtn ";if(preferfixbtns==1){f=" ossmallbtn fixedsendorderbtn "}if(showtransferbtns==1){g+=''+W_SEND_ORDERS[lang]+""}}if((workflowconfig==WORKFLOW_DIGI_WORK)||(workflowconfig==WORKFLOW_WORK)||(workflowconfig==WORKFLOW_WORK_SEND)){f=" osbigbtn ";if(preferfixbtns==1){f=" ossmallbtn fixedworkprintbtn "}if(showtransferbtns==1){g+=''+W_WORK_TICKET[lang]+""}}if(cashenabled==1){f=" osbigbtn ";if(preferfixbtns==1){f=" ossmallbtn fixedgopaydeskbtn "}g+=''+W_TO_PAYDESK[lang]+""}g+='';$("#commandbuttons").html(g);if(preferfixbtns==1){$("#waiterui").addClass("fixedwaiterui")}$("#waiterui").trigger("create");var i="
    "+W_NUMBER[lang]+':
    ';var b='
    ';$("#actremark").html(i+b);if(rightchangeprice==1){var e='';$("#actchangepricesection").html(e);var h='
    ';h+=getDiscountButton("discount1","a",discount1,discountname1);h+=getDiscountButton("discount2","b",discount2,discountname2);h+=getDiscountButton("discount3","c",discount3,discountname3);h+="
    ";$("#actdiscount").html(h)}$("#actionneworderconfirm_all").html(W_ACT_CHANGE_ALL[lang]);$("#actionneworderconfirm_one").html(W_ACT_CHANGE_ONE[lang]);$("#actionnewordercancel").html(W_CANCEL[lang]);$("#select-comment").off("change").on("change",function(m){var l=$("#select-comment").find(":selected").val();$("#optionfield").val(l)});$("#act-select-comment").off("change").on("change",function(m){var l=$("#act-select-comment").find(":selected").val();$("#act-optionfield").val(l)});$("#discard_new_orders_no").off("click").on("click",function(l){l.stopImmediatePropagation();l.preventDefault();parent.history.back()});$("#discard_priceenter").off("click").on("click",function(l){l.stopImmediatePropagation();l.preventDefault();$("#enterpricedlg").dialog("close")});$("#discard_numberenter").off("click").on("click",function(l){l.stopImmediatePropagation();l.preventDefault();$("#enternumberdlg").dialog("close")});$("#discard_new_orders_yes").off("click").on("click",function(l){l.stopImmediatePropagation();l.preventDefault();neworders=[];gotoOtherPage($("#discardnewordersdlg").data("link"))});$("#prodbackbtn").off("click").on("click",function(l){if(neworders.length!=0){l.stopImmediatePropagation();l.preventDefault();hideMenuProd();$("#discardnewordersdlg").data("link","back_table");$.mobile.changePage("#discardnewordersdlg")}else{parent.history.back()}});$("#searchField").off("keyup").on("keyup",function(l){generateSearchResults()});if(usebarcode==1){$("#barcode").focus()}$("#barcode").off("keyup").on("keyup",function(l){handleBarcodeInput()})}function getDiscountButton(f,e,c,a){var b='";if(a.trim()!=""){b='"}return b}function generateSearchResults(){var i=$("#searchField").val().trim().toLowerCase();if(i.length";var h=$("#typprodpage").data("types_prods_sorted");var a=false;var g=null;for(var f=0;f=0){g=e.prodimageid;if(g!=0){a=true;break}}}$.each(h,function(n,o){var m=o.longname;if(m.toLowerCase().indexOf(i)>=0){c+='
  • ';if(a&&(preferimgmobile==1)){var l="php/contenthandler.php?module=products&command=getprodimage&prodid="+o.id+"&size=l";c+=''}c+=toHtml(m);c+=createSearchProdInfoTxt(o.id,o.unit);c+="
  • "}});c+="
";$("#searchResult").html(c);$("#searchResult").trigger("create");$(".srinfo").off("click").on("click",function(q){q.stopImmediatePropagation();q.preventDefault();var m=this.id.split("_")[1];var p=getProdEntry(m);var o=p.price;var n=p.unit;var l=W_PRICE[lang]+": "+o+" "+currency;if(n>2){l+="/"+g_units_arr[n].text}alert(l)});$(".srplus").off("click").on("click",function(n){n.stopImmediatePropagation();n.preventDefault();var m=this.id.split("_")[1];var l=getSearchProdCount(m);$("#srprodcount_"+m).html(l+1)});$(".srminus").off("click").on("click",function(n){n.stopImmediatePropagation();n.preventDefault();var m=this.id.split("_")[1];var l=getSearchProdCount(m);if(l==2){$("#srprodcount_"+m).html(1);selectedProdCount=1}else{if(l>2){$("#srprodcount_"+m).html(l-1)}}});$(".srprodcount").off("click").on("click",function(o){o.stopImmediatePropagation();o.preventDefault();var n=this.id.split("_")[1];var m=getProdEntry(n);var l=m.unit;if(l>1){alert(W_NOT_SUPPORTED[lang]);return}$("#enternumberdlg").data("prodid",n);enternumberdlgshown=true;$("#enternumberfield").val("");$.mobile.changePage("#enternumberdlg");var p=$(this).parent().attr("id");bindEnterSearchNumberNumbers(p)});$(".searchresult").off("click").on("click",function(m){m.stopImmediatePropagation();m.preventDefault();var l=this.id.split("_")[1];handleClickOnSearchResult(l)})}}function handleBarcodeInput(){var c=$("#barcode").val();c=c.split("-").join("");c=c.split(" ").join("");if(c!=""){var a=findProdWithBarcode(c);if(a!=null){$("#barcode").val("");var b=a.id;beep();handleClickOnProd(b)}}}function findProdWithBarcode(b){var e=$("#typprodpage").data("types_prods_sorted");for(var c=0;c'+a+""}htmlComments=b;predefinedComments=b;$("#select-comment").html(b);$("#select-comment").selectmenu("refresh")}function initializeMainMenu(a,h,e,i,g){$("#"+e).html(" "+a.user);$("#"+i).html(a.version+" ");var k='
  • Module
  • ';$.each(a.menu,function(n,m){var l=m.name;var o=m.link;if(g){k+='
  • '+l+"
  • "}else{k+='
  • '+l+"
  • "}});$(h).empty().append(k).promise().done(function(){refreshList(h)});if(h=="#modulemenu-room"){var c=a.waitermessage;if(c!=""){$("#waitermessage").show();var b='
  • '+W_MSG[lang]+"
  • ";var f='
  • '+toHtml(c)+"
  • ";$("#waitermessage").html(b+f);refreshList("#waitermessage")}else{$("#waitermessage").hide()}}$(".modulebutton").off("click").on("click",function(m){var l=$(this).attr("href");doJsonAjaxAsync("POST","php/contenthandler.php?module=admin&command=setLastModuleOfUser",{view:l},null,"Problem Benutzerdatenpflege",false)})}function intervalCheckConnection(b){checkConnection();var a=setInterval(function(){checkConnection()},b*1000)}function checkConnection(){var a=new Image();a.onerror=function(){$(".connectionstatus").show()};a.onload=function(){$(".connectionstatus").hide()};a.src="img/gray.png?t="+(+new Date)}function refreshList(a){if($(a).hasClass("ui-listview")){$(a).listview("refresh")}else{$(a).trigger("create")}}function gotoOtherPage(a){var b=a.split("_");if(b[0]=="menu"){doJsonAjax("POST","php/contenthandler.php?module=admin&command=setLastModuleOfUser",{view:b[1]},null,null);setTimeout(function(){document.location.href=b[1]},250)}else{if(b[0]=="back"){$("#discardnewordersdlg").dialog("close");parent.history.back()}}}function moduleForward(a){if(neworders.length==0){gotoOtherPage(a)}else{hideMenuProd();$("#discardnewordersdlg").data("link",a);$.mobile.changePage("#discardnewordersdlg")}}function getPayPrintType(){doJsonAjax("GET","php/contenthandler.php?module=admin&command=getPayPrintType",null,insertPayPrintType,"Fehler Druckkonfiguration")}function insertPayPrintType(a){$("#workprintarea").data("payPrintType",a)}function getUserHasRightForPaydesk(){doJsonAjax("GET","php/contenthandler.php?module=admin&command=hasUserPaydeskRight",null,hasUserPaydeskRight,"Fehler Kassenberechtigung")}function hasUserPaydeskRight(a){$("#gopaydesk_btn").data("allowed",a)}function hideMenuRoom(){$("#modulepanel-room").panel("close");$("#menuswitch").off("click").on("click",function(a){a.stopImmediatePropagation();a.preventDefault();$("#modulepanel-room").panel("open")})}function hideMenuTable(){$("#modulepanel-table").panel("close");$("#menuswitchtable").off("click").on("click",function(a){a.stopImmediatePropagation();a.preventDefault();$("#modulepanel-table").panel("open")})}function hideMenuProd(){$("#modulepanel-prod").panel("close");$("#menuswitchprod").off("click").on("click",function(a){a.stopImmediatePropagation();a.preventDefault();$("#modulepanel-prod").panel("open")})}function calcTotalPriceOfProdAndExtras(b,c){var e=parseFloat(b);var a=extrasManagement.calcPriceOfAssignedExtras(c);totalPrice=(parseFloat(e+a)).toFixed(2);return totalPrice}function addProductToQueueNoGuiUpdate(f,m,h,c,e,o,g){var b=getProdProperties(f);var a=b.name;var k=calcTotalPriceOfProdAndExtras(b.price,h);var n={name:a,option:m,extras:h,prodid:f,price:k,changedPrice:c,togo:e,unit:o,unitamount:g};for(var l=0;l";var f=groupedNewOrders.count.length;for(s=0;s1){t=n+g_units_arr[o].text+" "}var q=toHtml(groupedNewOrders.name[s]);var u=groupedNewOrders.option[s];var h=groupedNewOrders.count[s];if(h>1){q=""+h.toString()+"x "+t+q}else{q=t+q}var p=groupedNewOrders.prodids[s];if(u!=""){u="

    "+toHtml(u)+"

    "}var e=groupedNewOrders.changedPrices[s];var k=groupedNewOrders.togos[s];var a="";var g=groupedNewOrders.extras[s];if((g!=null)&&(g!="")){a=""+g+""}var r='
  • ';var b=q+u+a;if(e!="NO"){e=e.replace(".",decpoint)+" "+currency;if(o>1){e+="/"+g_units_arr[o].text}if(k!=0){m+=r+''+b+" ("+e+" - To-Go)
  • "}else{m+=r+''+b+" ("+e+")"}}else{if(k!=0){m+=r+''+b+" - To-Go"}else{m+=r+''+b+""}}}$("#neworders").html(m);refreshList("#neworders");binding_neworderelem()}function getProdSizeClass(){if(osprodbtnsize==1){return("osprod-1")}else{if(osprodbtnsize==2){return("osprod-2")}}return""}function binding_neworderelem(){$(".neworder_el").off("click").on("click",function(c){c.stopImmediatePropagation();c.preventDefault();var b=$("#neworders li").index($(this).closest("li"))-1;var a={count:groupedNewOrders.count[b],name:groupedNewOrders.name[b],price:groupedNewOrders.price[b],option:groupedNewOrders.option[b],extras:groupedNewOrders.extras[b],prodid:groupedNewOrders.prodids[b],origidxs:groupedNewOrders.origidxs[b],changedPrices:groupedNewOrders.changedPrices[b],togos:groupedNewOrders.togos[b],unit:groupedNewOrders.units[b],unitamount:groupedNewOrders.unitamounts[b]};$("#actiononneworderel").data("entry",a);$("#actiononneworderel").data("newcount",a.count);$("#actiononneworderel").data("groupedListIndex",b);$("#actiononneworderel").data("countatdialogstart",a.count);$("#act-optionfield").val(a.option);$("#act-numberfield").val(a.count);$("#togocheckbox").prop("checked",a.togos==1?true:false);actionSelOnNewOrderElem()})}function calcTotalPriceOfNewOrders(){var a=0;if(neworders.length!=0){neworders.forEach(function(c,b){if(c.changedPrice.toLowerCase()=="no"){a+=parseFloat(c.price)}else{a+=parseFloat(c.changedPrice)}})}a=a.toFixed(2).replace(".",decpoint);return a+" "+currency}function sendNewOrders(c,f,a){var g=$("#typprodpage").data("table-info");var b=g[1];if(neworders.length!=0){var e={tableid:b,prods:neworders,print:(c?1:0),payprinttype:f};$("#typprodpage").data("neworders",[]);if(f=="s"){doJsonAjax("POST","php/contenthandler.php?module=queue&command=addProductListToQueue",e,a,"Fehler bei Produktversand")}else{doJsonAjax("POST","php/contenthandler.php?module=queue&command=addProductListToQueue",e,fillPrintAreaAndPrint,"Fehler bei Produktversand")}}else{if(c&¬DeliveredProdsAvailable){}}}function reloadPage(){tableListActive=false;setTimeout(function(){document.location.href="waiter.html"},250)}function removeCurrentOrders(){groupedNewOrders={count:[],joinedvals:[],name:[],prodids:[],extras:[],origidxs:[],changedPrices:[],togos:[]};neworders=[]}function gotoTablePage(){removeCurrentOrders();var a=$("#tables-page").data("allroomtables");var b=a.length;if(!isTogoOrderSelected||(b==1)){if(tablesAfterSend==1){$.mobile.changePage("#tables-page")}else{reloadPage()}}else{reloadPage()}}function removeProductFromQueue(a,c,f,e,b,g){if(typeof g==="undefined"){g=true}if(!b){alert(W_WRONG_PIN[lang]);return}$.ajax({type:"POST",dataType:"json",url:"php/contenthandler.php?module=queue&command=removeProductFromQueue",data:{queueid:a,isPaid:c,isCooking:f,isReady:e},async:false,success:function(l){if(l.status!="OK"){alert(W_REMOVE_ERROR[lang])}var k=$("#typprodpage").data("table-info");var h=k[1];var i="php/contenthandler.php?module=queue&command=getJsonLongNamesOfProdsForTableNotDelivered&tableid="+h;if(g){fillNotDeliveredProductsOfATable(i)}},error:function(h){alert("Sorry, Fehler bei Produktentfernung!")}})}function reorderProduct(f,b,h,g){var a=getProdProperties(f);if((a.unit!=0)&&(a.unit!="null")){alert(W_NO_REORDER_VAR_PRICE[lang]);return}var e=[];for(var c=0;c'+k.name+""});if(showtogo==1){a+='
  • '+W_TOGO[lang]}var f=h.takeawayprice;var c=f.replace(".",decpoint)+" "+currency;if(f!=0){a+=" ("+W_TO_PAY[lang]+": "+c+")"}a+=createServeInfo(null,h.takeawayprodcount,h.takeawayprodready);a+="
  • ";$("#room-list").append(a).promise().done(function(){bindTogoOrdering();bindServeClick();$(this).off("click").on("click","a",function(l){l.stopImmediatePropagation();l.preventDefault();var k=b[this.id];currentRoomIndex=this.id;isTogoOrderSelected=false;$("#tables-page").data("roomdetail",k);nextPage="tables-page";$.mobile.changePage("#tables-page")});refreshList(this)})}}})}function handleClickInTablemap(a){forwardDisplayToProductView.call(this,a.roomid,a.tableid,a.tablename)}$(document).on("pagebeforeshow","#tables-page",function(){lastSelectedProduct="";tableListActive=true;if(nextPage==""){reloadPage()}hideMenuTable();checkForLogIn();$("#searchField").val("");$("#barcode").val("");generateSearchResults();$("#tableselbackbtn").off("click").on("click",function(a){a.stopImmediatePropagation();a.preventDefault();tableListActive=false;$.mobile.changePage("#info-page")});updateTableList()});$(document).on("pagebeforeshow","#changetablewhatdialog",function(){var a=$("#changetablewhatdialog").data("fromtableid");doJsonAjax("GET","php/contenthandler.php?module=queue&command=getProdsForTableChange",{tableId:a},insertProductsToChangeTableDlg,"Tischartikel")});function insertProductsToChangeTableDlg(a){if(a.status!="OK"){alert("Fehler");return}prodsToMove=a.msg;allselected=1;updateProdToMoveList();$("#selectallnothing").off("click").on("click",function(f){f.stopImmediatePropagation();f.preventDefault();allselected=1-allselected;for(var c=0;c"+c.productname+b+"";a+="
  • "+g+"
  • "}$("#productsToMoveList").html(a);refreshList("#productsToMoveList");handleClickOnMoveableProd()}function handleClickOnMoveableProd(){$(".prodToMoveEl").off("click").on("click",function(f){f.stopImmediatePropagation();f.preventDefault();var b=this.id.split("_")[1];var a=prodsToMove[b];var c=a["class"];if(c=="unselecteditem"){a["class"]="selecteditem"}else{a["class"]="unselecteditem"}updateProdToMoveList()});$("#moveprods").off("click").on("click",function(k){k.stopImmediatePropagation();k.preventDefault();var g=[];for(var f=0;f'+W_TOGO[lang]+""}k+="";$("#tables-list-togo").html(k);$("#togoarea").show();refreshList("#tables-list-togo");bindTogoOrdering();bindServeClick()}}else{$(h).show();$("#togoarea").hide();$("#tablemapcontent").hide();var k='
  • '+W_TABLES[lang]+"
  • ";var f="";if(ostablebtnsize==1){f="ostable-1"}else{if(ostablebtnsize==2){f="ostable-2"}}$.each(l,function(s,u){var r=u.pricesum;var q=r.replace(".",decpoint)+" "+currency;var o=u.prodcount;var t=u.prodready;var n=u.readyQueueIds;var m=u.reservations;var p=u.name;if(m!=""){p+=" (Res.: "+m+")"}if(r!=0){k+='
  • '+p+" ("+W_TO_PAY[lang]+": "+q+")"+createServeInfo(u.id,o,t)+"
  • "}else{k+='
  • '+p+createServeInfo(u.id,o,t)+"
  • "}});if(c=="t"){if(showtogo==1){k+='
  • '+W_TOGO[lang]+"
  • "}}$(h).empty().append(k).promise().done(function(){bindTogoOrdering();bindServeClick();$(this).off("click").on("click",".info-go",function(p){p.stopImmediatePropagation();p.preventDefault();var o=g;var m=l[this.id]["id"];var n=l[this.id]["name"];forwardDisplayToProductView.call(this,a,m,n)});refreshList(this)})}}function bindServeClick(){$(".prodreadyicon").off("click").on("click",function(l){l.stopImmediatePropagation();l.preventDefault();var f=this.id.split("_")[1];var h=queueIdsOfTakeAway;if((f!=null)&&(f!="n")){var a=$("#tables-page").data("roomdetail");var c=a.tables;for(var b=0;b0){var k=h.join();doJsonAjax("POST","php/contenthandler.php?module=queue&command=declareMultipleProductsDelivered",{queueids:k},updateAfterDelivery,"Bereitstellung")}})}function updateAfterDelivery(a){if(tableListActive){updateTableList()}else{reloadPage()}}function bindTogoOrdering(){$(".togoorder").off("click").on("click",function(a){a.stopImmediatePropagation();a.preventDefault();isTogoOrderSelected=true;forwardDisplayToProductView.call(this,0,0,W_TOGO[lang])})}function forwardDisplayToProductView(b,a,c){neworders=[];updateNewOrdersGui();var e=new Array(b,a,c);$("#typprodpage").data("table-info",e);nextPage="typprodpage";$.mobile.changePage("#typprodpage");neworders=[];updateNewOrdersGui()}function attachAndDisplayFirstRefTypes(e){$("#typprodpage").data("types_prods",e);var a=e.prods;var c=[];for(var b=0;b";if(applyExtraBtnPos!=1){a+='
  • '+W_APPLY[lang]+"
  • "}a+=extrasManagement.renderExtras(c,b,true);if(requestPriceInExtras!=false){a+='
  •  '+currency+"
  • "}if(applyExtraBtnPos!=2){a+='
  • '+W_APPLY[lang]+"
  • "}a+=createHigherLine(b);return a}function bindExtrasSel(){$(".extrasel").off("click").on("click",function(i){i.stopImmediatePropagation();i.preventDefault();var a=this.id.split("_");var b=a[1];var f=a[2];if((b=="abottom")||(b=="atop")){var g=getProdEntry(f);var c=g.extras;var k=extrasManagement.getAssignedExtras();if(requestPriceInExtras){var h=$("#enterpriceextrasfield").val();h=h.trim();h=h.replace(decpoint,".");if((h!="")&&($.isNumeric(h))){requestPriceInExtras=false;presetPriceInExtras="";addProductToNewOrdersList(f,k,h,0,1)}else{alert(W_NO_VALID_PRICE[lang])}}else{addProductToNewOrdersList(f,k,null,0,1)}}else{extrasManagement.extraClicked(b);if(requestPriceInExtras!==false){presetPriceInExtras=$("#enterpriceextrasfield").val()}var l=listOfExtras(f);$("#typeproducts-list").html(l);refreshList("#typeproducts-list");bindExtrasSel();bindHigherButtons()}})}function lastSelectedProdToStr(){return" ("+W_LAST_SELECTED[lang]+": "+lastSelectedProduct+")"}function listOfTypesProds(g){var a='
  • '+W_SELECTION[lang]+"";if(lastSelectedProduct!=""){a+=lastSelectedProdToStr()}a+="
  • ";var b=$("#typprodpage").data("types_prods");var f=getProdSizeClass();$.each(b.types,function(l,k){if(parseInt(k.ref)==g){a+='
  • '+toHtml(k.name)+"
  • "}});var i=false;if(preferimgmobile==1){var e=null;for(var c=0;c';if(i&&(preferimgmobile==1)){var k="php/contenthandler.php?module=products&command=getprodimage&prodid="+m.id+"&size=l";a+=''}a+=toHtml(m.name);if((m.amount!="null")&&(m.amount<11)){a+=" ("+W_ONLY[lang]+" "+m.amount+")"}a+=createProdInfoTxt(m.id,m.unit);a+=""}});if(g!=0){a+=createHigherLine(f)}return a}function createHigherLine(e){var f="f";if(preferfixbtns==1){f="a"}var a='
  • ';a+='
    ';var c="";var b="";if(preferfixbtns==1){c="fixedtypetopimg";b="fixedtypehigherimg"}a+='
    ';a+='
    ';a+="
    ";a+="
  • ";return a}function createProdEntryWithTextPrice(a,f,g){var e=getProdEntry(a);var c=e.unit;if(e!=null){var b=e.price.replace(".",decpoint);if(c>1){b+="
    /"+g_units_arr[c].text}return"
    "+b+"
    "}return""}function createProdInfoTxt(b,c){var a="";if(showplusminus==1){a+="1";7}if(priceinlist==0){a+="
    "}else{a+=createProdEntryWithTextPrice(b,"prodtextinfo","pinfo")}if(showplusminus==1){a+="
    ";a+="
    "}return a}function createSearchProdInfoTxt(b,c){var a="";if(showplusminus==1){a+="1"}if(priceinlist==0){a+="
    "}else{a+=createProdEntryWithTextPrice(b,"srtextinfo","srinfo")}if(showplusminus==1){a+="
    ";a+="
    "}return a}function createServeInfo(e,c,b){if(supplyright==0){return""}if(e==null){e="n"}if(b>0){var a=""+b+"("+c+")";if(b>=c){a+="
    "}else{a+="
    "}return a}else{return""}}function getProdEntry(e){var b=$("#typprodpage").data("types_prods");var c=0;var a=b.prods;for(c=0;c";var b=$("#typprodpage").data("types_prods");var e=getProdSizeClass();var a=false;var c=[];$.each(b.prods,function(g,h){if(parseInt(h.favorite)==1){a=true;c[c.length]={id:h.id,longname:h.longname,unit:h.unit}}});c.sort(prodcompare);$.each(c,function(g,h){f+='
  • '+toHtml(h.longname);f+=createProdInfoTxt(h.id,h.unit);f+="
  • "});f+="";if(a){$("#favarea").html(f);$("#favarea").trigger("create")}else{$("#favarea").html("");$("#favarea").trigger("create")}}function bindFavEvent(){$(".fav").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();favOrSearchWasClicked=true;levelOneType=0;var a=this.id.split("_")[1];if(showplusminus==1){selectedProdCount=getProdCount(a)}else{selectedProdCount=1}handleClickOnProd(a)})}function displayTypesProds(c,b){if(preferfixbtns!=1){window.scrollTo(0,0)}if(c==0){fillFavArea();bindFavEvent()}else{$("#favarea").html("")}var a=null;if(b==null){idOfHigherType=c;a=listOfTypesProds(parseInt(c));extrasMenuOpen=false}else{a=listOfExtras(parseInt(c));extrasMenuOpen=true}$("#typeproducts-list").empty().append(a).promise().done(function(){refreshList("#typeproducts-list");$(this).off("click").on("click","a",function(f){f.stopImmediatePropagation();f.preventDefault();productInListClicked(this.id,c)});bindHigherButtons()});$(".prodinfo").off("click").on("click",function(l){l.stopImmediatePropagation();l.preventDefault();var g=this.id.split("_")[1];var k=getProdEntry(g);var i=k.price;var h=k.unit;var f=W_PRICE[lang]+": "+i+" "+currency;if(h>2){f+="/"+g_units_arr[h].text}alert(f)});$(".prodplus").off("click").on("click",function(h){h.stopImmediatePropagation();h.preventDefault();var g=this.id.split("_")[1];var f=getProdCount(g);$("#prodcount_"+g).html(f+1)});$(".prodminus").off("click").on("click",function(h){h.stopImmediatePropagation();h.preventDefault();var g=this.id.split("_")[1];var f=getProdCount(g);if(f==2){$("#prodcount_"+g).html(1);selectedProdCount=1}else{if(f>2){$("#prodcount_"+g).html(f-1)}}});$(".prodcount").off("click").on("click",function(i){i.stopImmediatePropagation();i.preventDefault();var h=this.id.split("_")[1];var g=getProdEntry(h);var f=g.unit;if(f>1){alert(W_NOT_SUPPORTED[lang]);return}$("#enternumberdlg").data("prodid",h);enternumberdlgshown=true;$("#enternumberfield").val("");$.mobile.changePage("#enternumberdlg");var k=$(this).parent().attr("id");bindEnterNumberNumbers(k,c)})}function productInListClicked(b,e){favOrSearchWasClicked=false;$("#searchField").val("");$("#barcode").val("");generateSearchResults();var a=b.split("_");if(a[0]=="t"){if(e==0){levelOneType=a[1];e=a[1]}displayTypesProds(a[1],null)}else{var c=a[1];if(showplusminus==1){selectedProdCount=getProdCount(c)}else{selectedProdCount=1}$("#prodcount_"+c).html(1);handleClickOnProd(c)}}function getHigherType(){var c=$("#typprodpage").data("types_prods");var b=c.types;var f=0;if(!extrasMenuOpen){for(var e=0;e0)&&(e<2)){idOfHigherType=f.ref;if(f.unit==1){requestPriceInExtras=true;presetPriceInExtras=""}else{requestPriceInExtras=false}displayTypesProds(c,b);bindExtrasSel()}else{if(f.unit!=0){var a=g_units_arr[f.unit].longtext;$("#enterpriceheader").html(a);$("#enterpricedlg").data("unit",f.unit);hideMenuProd();enterpricedlgshown=true;$("#enterpricedlg").data("prodid",c);$("#enterpricefield").val("");$.mobile.changePage("#enterpricedlg");bindEnterPriceNumbers()}else{addProductToNewOrdersList(c,null,null,0,1)}}}function bindEnterPriceNumbers(){$(".numfield td").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();var f=$(this).html();var a=$(this).attr("class");if(a!="keyboardapply"){var c=String($("#enterpricefield").val());$("#enterpricefield").val(c+f)}});$("#apply_priceenter").off("click").on("click",function(f){f.stopImmediatePropagation();f.preventDefault();var a=$("#enterpricedlg").data("prodid");var c=$("#enterpricefield").val();c=c.trim();c=c.replace(decpoint,".");var b=$("#enterpricedlg").data("unit");if((c!="")&&($.isNumeric(c))){$("#enterpricedlg").dialog("close");if(b==1){addProductToNewOrdersList(a,null,c,0,1)}else{addProductToNewOrdersList(a,null,null,b,c)}}else{alert(W_NO_VALID_PRICE[lang])}})}function bindPartNumberEntry(){$(".numfield td").off("click").on("click",function(f){f.stopImmediatePropagation();f.preventDefault();var g=$(this).html();var c=$(this).attr("class");if(c!="keyboardapply"){var a=String($("#enternumberfield").val());if(c=="dellastkey"){var h=a.length;if(h>0){var b=a.substring(0,h-1);$("#enternumberfield").val(b)}}else{$("#enternumberfield").val(a+g)}}})}function bindEnterNumberNumbers(b,a){bindPartNumberEntry();$("#apply_numberenter").off("click").on("click",function(g){g.stopImmediatePropagation();g.preventDefault();var f=$("#enternumberdlg").data("prodid");var c=$("#enternumberfield").val().trim();if(c==""){c=1}if($.isNumeric(c)){if((c<1)||(c>1000)){alert(w_INVALID_NO_RANGE[lang])}else{if(c>1){$("#enternumberdlg").dialog("close");$("#prodcount_"+f).html(c);productInListClicked(b,a)}else{$("#enternumberdlg").dialog("close");$("#prodcount_"+f).html("");productInListClicked(b,a)}}}else{alert(W_INVALID_NO_ENTERING[lang])}})}function bindEnterSearchNumberNumbers(a){bindPartNumberEntry();$("#apply_numberenter").off("click").on("click",function(f){f.stopImmediatePropagation();f.preventDefault();var c=$("#enternumberdlg").data("prodid");var b=$("#enternumberfield").val().trim();if(b==""){b=1}if($.isNumeric(b)){if((b<1)||(b>1000)){alert(w_INVALID_NO_RANGE[lang])}else{if(b>1){$("#enternumberdlg").dialog("close");$("#srprodcount_"+c).html(b);handleClickOnSearchResult(c)}else{$("#enternumberdlg").dialog("close");$("#srprodcount_"+c).html(1);handleClickOnSearchResult(c)}}}else{alert(W_INVALID_NO_ENTERING[lang])}})}function addProductToNewOrdersList(e,f,g,m,b){if(g==undefined){g=null}if(m==undefined){m=0}if(b==undefined){b=1}var h=$("#typprodpage").data("table-info");var a=h[1];addProductToQueue(e,f,"NO",0,g,m,b);var i=getProdAudio(parseInt(e));var c=parseInt($("#typprodpage").data("ordervolume"))/10;if(i!=""){var l="customer/"+i;if(i.match(/mp3$/)){$("#audiofile").html('')}else{if(i.match(/ogg$/)){$("#audiofile").html('')}else{if(i.match(/wav$/)){$("#audiofile").html('')}}}document.getElementById("audiofile").load();document.getElementById("audiofile").volume=c;document.getElementById("audiofile").play()}else{if(c>0.5){beep()}}var k="php/contenthandler.php?module=queue&command=getJsonLongNamesOfProdsForTableNotDelivered&tableid="+a;fillNotDeliveredProductsOfATable(k);if((keeptypelevel==0)||(favOrSearchWasClicked)){displayTypesProds(levelOneType,null)}else{if(extrasMenuOpen){displayTypesProds(idOfHigherType,null)}}allowPrintAndOrderBtn=true;refreshList("#typeproducts-list")}function beep(){var a=new Audio("data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");a.play()}function fetchTypeProdsFromServer(){doJsonAjaxAsync("GET","php/contenthandler.php?module=products&command=getAllTypesAndAvailProds",null,attachAndDisplayFirstRefTypes,true)}var waitProdTimer=null;function fillTypeProdList(b){var a=$("#typprodpage").data("types_prods");if(a!=undefined){displayTypesProds(b,null)}else{waitProdTimer=setInterval(function(){var c=$("#typprodpage").data("types_prods");if(c!=undefined){clearInterval(waitProdTimer);displayTypesProds(b,null)}},200)}}function fillTypeProdList_(a){displayTypesProds(a,null)}function createTxtAssignedProd(f){var b="";if(f.option!=""){b=" ("+toHtml(f.option)+")"}var c=f.longname;if(f.togo==1){c="To-Go: "+c}if(f.pricechanged==1){c+=" - "+f.price.replace(".",decpoint)+" "+currency}if(f.unit>1){var g=g_units_arr[f.unit].text;var e=f.unitamount.replace(".",decpoint);c+=" ("+e+" "+g+")"}var a="";if(f.isready=="1"){a+=" ☞"}if(f.isCooking=="1"){a+=" ♨"}if(f.isPaid=="1"){a+=" ☑"}return toHtml(c)+b+a+"
    "+createExtraParagraph(f.extras,f.extrasamounts)}function createListElOfAssignedProd(b){var a="";if("count" in b){if(b.count>1){a=b.count+"x "}}if(b.isready=="0"){return'
  • '+a+createTxtAssignedProd(b)+"
  • "}else{return'
  • '+a+createTxtAssignedProd(b)+"
  • "}}function fillAssignedProdList(b){if(b.length>0){notDeliveredProdsAvailable=true}else{notDeliveredProdsAvailable=false}$("#cancelcodefield").val("");if(cancelunpaidcode!=""){if(b.length>0){$("#cancelcodearea").show()}else{$("#cancelcodearea").hide()}}else{$("#cancelcodearea").hide()}var c=new Grouping(b,createTxtAssignedProd);c.group();var a='
  • '+W_KIT_BAR[lang]+"
  • ";a+=c.outputList(createListElOfAssignedProd);if(notDeliveredProdsAvailable){a+='
  • '+W_DEL_ALL_UNDELIVERED[lang]+"
  • "}$("#orderedprod-list-0").html(a);refreshList("#orderedprod-list-0");$("#undeliveredheader").off("click").on("click",function(f){f.stopImmediatePropagation();f.preventDefault();alert(W_UNDELIV_INFO[lang])});bindingOfAssignedProds(c);bindDelAllUndeliveredProds(b);$("#cancelcodeform").off("submit").on("submit",function(f){f.stopImmediatePropagation();f.preventDefault()})}function bindDelAllUndeliveredProds(a){$("#delallundelivered").off("click").on("click",function(b){b.stopImmediatePropagation();b.preventDefault();areYouSure("Produkte löschen.",W_DEL_ALL_ASSIGNED_PRODS[lang],W_REMOVE[lang],function(){removeAllAssignedProds(a)})})}function removeAllAssignedProds(h){var c=true;if(cancelunpaidcode!=""){if($("#cancelcodefield").val()!=cancelunpaidcode){c=false;alert(W_WRONG_PIN[lang]);return}}for(var f=0;f