diff --git a/javaprinter/javaprinter.jar b/javaprinter/javaprinter.jar index acf3def..3031475 100644 Binary files a/javaprinter/javaprinter.jar and b/javaprinter/javaprinter.jar differ diff --git a/printserver/OrderSprinterPrintserver.exe b/printserver/OrderSprinterPrintserver.exe index 3e5fa1a..5379dcb 100644 Binary files a/printserver/OrderSprinterPrintserver.exe and b/printserver/OrderSprinterPrintserver.exe differ diff --git a/spider/install/installer.php b/spider/install/installer.php index 6e33af7..a039fa5 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.3.22"); + Database::setVersion($pdo,$prefix,"1.3.23"); 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 index 3e5fa1a..5379dcb 100644 Binary files a/webapp/OrderSprinterPrintserver.exe and b/webapp/OrderSprinterPrintserver.exe differ diff --git a/webapp/bar.html b/webapp/bar.html index d047211..3c8adbc 100644 --- a/webapp/bar.html +++ b/webapp/bar.html @@ -5,7 +5,7 @@ - + diff --git a/webapp/bill.html b/webapp/bill.html index 11bb5d0..afda751 100644 --- a/webapp/bill.html +++ b/webapp/bill.html @@ -5,7 +5,7 @@ - + diff --git a/webapp/feedback.html b/webapp/feedback.html index 4647f2d..ef4e114 100644 --- a/webapp/feedback.html +++ b/webapp/feedback.html @@ -4,7 +4,7 @@ - + diff --git a/webapp/index.html b/webapp/index.html index 9c45a33..109edb7 100644 --- a/webapp/index.html +++ b/webapp/index.html @@ -9,8 +9,8 @@ - - + + @@ -31,7 +31,7 @@ var I_TIMEDIFF_NO_ADMIN = ["Zeit am Server und am Endgerät unterscheiden sich. function fillUserList(userinfo) { var text = '
'; text += ''; + text += ''; text += '
'; return text; } -function createButtonWithTextField(aLabel,displayedName,defaultText) { - var labelid = 'userlabel_' + aLabel; +function createButtonWithTextField(id,displayedName,defaultText) { var text = '
'; - text += ''; - text += ''; + text += ''; + text += ''; text += '
'; return text; } -function createLabelWithOption(aLabel,displayedName,hasTheRight) { - var labelid = 'userlabel_' + aLabel; +function createLabelWithOption(prefix,id,aLabel,displayedName,allValues,theValue) { + var labelid = prefix + aLabel + "_" + id; var text = '
'; text += ''; - if (hasTheRight) { - text += ''; - text += ''; - text += ''; + text += '
'; - + return text; } +function createYesNoArr() { + var yesnoarr = [ + {id:1,text:MAN_YES[lang]}, + {id:0,text:MAN_NO[lang]} + ]; + return yesnoarr; +} + +function createRolesArr(roles) { + var rolesArr = []; + for (var i=0;i'; collapsiblePart += '
'; if (forNewUser) { - collapsiblePart += createLabelWithTextField("username",MAN_USER_NAME[lang],MAN_USER_NAME[lang]); - collapsiblePart += createLabelWithTextField("password",MAN_USER_PASS[lang],MAN_USER_PASS[lang]); + collapsiblePart += createLabelWithTextField("userlabel_username_new",MAN_USER_NAME[lang],MAN_USER_NAME[lang]); + collapsiblePart += createLabelWithTextField("userlabel_password_new",MAN_USER_PASS[lang],MAN_USER_PASS[lang]); } - collapsiblePart += createLabelWithOption("admin",MAN_ADMIN[lang],isAdmin); - collapsiblePart += createLabelWithOption("waiter",MAN_WAITER[lang],rWaiter); - collapsiblePart += createLabelWithOption("kitchen",MAN_KITCHEN[lang],rKitchen); - collapsiblePart += createLabelWithOption("bar",MAN_BAR[lang],rBar); - collapsiblePart += createLabelWithOption("supplydesk",MAN_SUPPLY[lang],rSupply); - collapsiblePart += createLabelWithOption("paydesk",MAN_PAYDESK[lang],rPay); - collapsiblePart += createLabelWithOption("stat",MAN_STAT[lang],rStat); - collapsiblePart += createLabelWithOption("bill",MAN_BILLS[lang],rBill); - collapsiblePart += createLabelWithOption("products",MAN_PRODUCTS[lang],rProd); - collapsiblePart += createLabelWithOption("reservation",MAN_RESERVATION[lang],rReservation); - collapsiblePart += createLabelWithOption("rating",MAN_RATING[lang],rRating); - collapsiblePart += createLabelWithOption("changeprice",MAN_CHANGEPRICE[lang],rChangeprice); - collapsiblePart += createLabelWithOption("customers",MAN_CUSTOMERS[lang],rCustomers); - collapsiblePart += createLabelWithOption("closingright",MAN_CLOSINGRIGHT[lang],rClosing); - collapsiblePart += createLabelWithOption("dash",MAN_DASHRIGHT[lang],rDash); - collapsiblePart += createLabelWithOption("manager",MAN_MANAGER[lang],rManager); + + var rolesArr = createRolesArr(roles); + + collapsiblePart += createLabelWithOption("userlabel_",id,"userrole",MAN_ROLE[lang],rolesArr,roleid); if (forNewUser) { collapsiblePart += ''; } else { - collapsiblePart += ''; - collapsiblePart += createButtonWithTextField("newpassword", "Passwort ändern", "Anderes Passwort"); - collapsiblePart += ''; + collapsiblePart += ''; + collapsiblePart += createButtonWithTextField("changepasswordbtn_"+id, "Passwort ändern", "Anderes Passwort"); + collapsiblePart += ''; + } + collapsiblePart += ''; + collapsiblePart += ''; + return collapsiblePart; +} + +function createCollapsibeOfRole(id,name,isAdmin,rWaiter,rKitchen,rBar,rSupply,rPay,rStat,rBill,rProd,rReservation,rRating,rChangeprice,rCustomers,rClosing, rDash, rManager,forNewRole) { + var collapsiblePart = '
'; + collapsiblePart += ''; + + var possibleValues = createYesNoArr(); + + collapsiblePart += createLabelWithTextField("rolelabel_name_" + id,MAN_ROLE_NAME[lang],MAN_ROLE_NAME[lang]); + collapsiblePart += createLabelWithOption("rolelabel_",id,"admin",MAN_ADMIN[lang],possibleValues,isAdmin); + collapsiblePart += createLabelWithOption("rolelabel_",id,"waiter",MAN_WAITER[lang],possibleValues,rWaiter); + collapsiblePart += createLabelWithOption("rolelabel_",id,"kitchen",MAN_KITCHEN[lang],possibleValues,rKitchen); + collapsiblePart += createLabelWithOption("rolelabel_",id,"bar",MAN_BAR[lang],possibleValues,rBar); + collapsiblePart += createLabelWithOption("rolelabel_",id,"supplydesk",MAN_SUPPLY[lang],possibleValues,rSupply); + collapsiblePart += createLabelWithOption("rolelabel_",id,"paydesk",MAN_PAYDESK[lang],possibleValues,rPay); + collapsiblePart += createLabelWithOption("rolelabel_",id,"stat",MAN_STAT[lang],possibleValues,rStat); + collapsiblePart += createLabelWithOption("rolelabel_",id,"bill",MAN_BILLS[lang],possibleValues,rBill); + collapsiblePart += createLabelWithOption("rolelabel_",id,"products",MAN_PRODUCTS[lang],possibleValues,rProd); + collapsiblePart += createLabelWithOption("rolelabel_",id,"reservation",MAN_RESERVATION[lang],possibleValues,rReservation); + collapsiblePart += createLabelWithOption("rolelabel_",id,"rating",MAN_RATING[lang],possibleValues,rRating); + collapsiblePart += createLabelWithOption("rolelabel_",id,"changeprice",MAN_CHANGEPRICE[lang],possibleValues,rChangeprice); + collapsiblePart += createLabelWithOption("rolelabel_",id,"customers",MAN_CUSTOMERS[lang],possibleValues,rCustomers); + collapsiblePart += createLabelWithOption("rolelabel_",id,"closingright",MAN_CLOSINGRIGHT[lang],possibleValues,rClosing); + collapsiblePart += createLabelWithOption("rolelabel_",id,"dash",MAN_DASHRIGHT[lang],possibleValues,rDash); + collapsiblePart += createLabelWithOption("rolelabel_",id,"manager",MAN_MANAGER[lang],possibleValues,rManager); + + if (forNewRole) { + collapsiblePart += ''; + } else { + collapsiblePart += ''; + collapsiblePart += ''; } collapsiblePart += ''; collapsiblePart += '
'; @@ -2347,8 +2438,10 @@ function createCollapsibeOfUser(id,username,isAdmin,rWaiter,rKitchen,rBar,rSuppl } -function fillUserListIntoGui(userinfo) { +function fillUserListIntoGui(answer) { var userPart = ""; + var userinfo = answer.users; + var roles = answer.roles; $.each(userinfo, function (i, aUser) { var userid = aUser.id; var username = aUser.username; @@ -2356,46 +2449,76 @@ function fillUserListIntoGui(userinfo) { userPart += createCollapsibeOfUser( "userid_" + userid, username, - aUser.is_admin == 1, - aUser.right_waiter == 1, - aUser.right_kitchen == 1, - aUser.right_bar == 1, - aUser.right_supply == 1, - aUser.right_paydesk == 1, - aUser.right_statistics == 1, - aUser.right_bill == 1, - aUser.right_products == 1, - aUser.right_reservation == 1, - aUser.right_rating == 1, - aUser.right_changeprice == 1, - aUser.right_customers == 1, - aUser.right_closing == 1, - aUser.right_dash == 1, - aUser.right_manager == 1, - false + aUser.roleid, + false, + roles ); }); - userPart += createCollapsibeOfUser( - "userid_newuser", + "userid_newuser_newuser", MAN_NEW_USER[lang], - false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true); + 0, + true,roles); + $("#userlist").html(userPart); $('#userpart').trigger('create'); - $.each(userinfo, function (i, aUser) { - var userid = aUser.id; - var deleteButtonElem = $("#userlist").find("#userid_" + userid).find(".userDeleteButton"); - deleteButtonElem.data("userid",userid); - var updateButtonElem = $("#userlist").find("#userid_" + userid).find(".userUpdateButton"); - updateButtonElem.data("userid",userid); - var passwdButtonElem = $("#userlist").find("#userid_" + userid).find(".changepassword"); - passwdButtonElem.data("userid",userid); - }); - dynamicUserBinding(); } + +function fillRoleListIntoGui(answer) { + if (answer.status != "OK") { + return; + } + + rolesOnceExtended = true; + + var roles = answer.msg; + + var rolesPart = ""; + for (var i=0;i + + diff --git a/webapp/paydesk.html b/webapp/paydesk.html index f1849ff..19e17d0 100644 --- a/webapp/paydesk.html +++ b/webapp/paydesk.html @@ -5,7 +5,7 @@ - + diff --git a/webapp/php/admin.php b/webapp/php/admin.php index 2953de4..889945a 100644 --- a/webapp/php/admin.php +++ b/webapp/php/admin.php @@ -21,8 +21,11 @@ class Admin { private static $rights = array( "createNewUser" => array("loggedin" => 1, "isadmin" => 0, "rights" => array("manager_or_admin")), + "createNewRole" => array("loggedin" => 1, "isadmin" => 0, "rights" => array("manager_or_admin")), "updateUser" => array("loggedin" => 1, "isadmin" => 0, "rights" => array("manager_or_admin")), + "updateRole" => array("loggedin" => 1, "isadmin" => 0, "rights" => array("manager_or_admin")), "deleteUser" => array("loggedin" => 1, "isadmin" => 0, "rights" => array("manager_or_admin")), + "deleteRole" => array("loggedin" => 1, "isadmin" => 0, "rights" => array("manager_or_admin")), "changepassword" => array("loggedin" => 1, "isadmin" => 0, "rights" => array("manager_or_admin")), "changeConfig" => array("loggedin" => 1, "isadmin" => 0, "rights" => array("manager_or_admin")), "readlogo" => array("loggedin" => 1, "isadmin" => 0, "rights" => array("manager_or_admin")), @@ -40,6 +43,7 @@ class Admin { "hasUserPaydeskRight" => array("loggedin" => 1, "isadmin" => 0, "rights" => null), "getJsonMenuItemsAndVersion" => array("loggedin" => 0, "isadmin" => 0, "rights" => null), "getUserList" => array("loggedin" => 0, "isadmin" => 0, "rights" => null), + "getRoleList" => array("loggedin" => 0, "isadmin" => 0, "rights" => null), "setTime" => array("loggedin" => 1, "isadmin" => 1, "rights" => null), "changeOwnPassword" => array("loggedin" => 1, "isadmin" => 0, "rights" => null), @@ -124,7 +128,7 @@ class Admin { echo json_encode(array("status" => "ERROR", "code" => ERROR_NOT_AUTHOTRIZED, "msg" => ERROR_NOT_AUTHOTRIZED_MSG)); return false; } else { - if ($_SESSION['is_admin'] == 0) { + if ($_SESSION['is_admin'] == false) { echo json_encode(array("status" => "ERROR", "code" => ERROR_COMMAND_NOT_ADMIN, "msg" => ERROR_COMMAND_NOT_ADMIN_MSG)); return false; } @@ -133,11 +137,11 @@ class Admin { if (!is_null($cmdRights["rights"])) { foreach($cmdRights["rights"] as $aRight) { if ($aRight == 'manager_or_admin') { - if (($_SESSION['is_admin'] == 1) || ($_SESSION['right_manager'] == 1)) { + if (($_SESSION['is_admin']) || ($_SESSION['right_manager'])) { return true; } } else if ($aRight == 'dash') { - if ($_SESSION['right_dash'] == 1) { + if ($_SESSION['right_dash']) { return true; } } @@ -179,14 +183,22 @@ class Admin { $this->getJsonMenuItemsAndVersion(); } else if ($command == 'getUserList') { $this->getUserList(); + } else if ($command == 'getRoleList') { + $this->getRoleList(); } else if ($command == 'setTime') { $this->setTime($_POST['day'],$_POST['month'],$_POST['year'],$_POST['hour'],$_POST['minute']); } else if ($command == 'createNewUser') { $this->createNewUser(); + } else if ($command == 'createNewRole') { + $this->createNewRole(); } else if ($command == 'updateUser') { $this->updateUser(); + } else if ($command == 'updateRole') { + $this->updateRole(); } else if ($command == 'deleteUser') { $this->deleteUser($_POST['userid']); + } else if ($command == 'deleteRole') { + $this->deleteRole($_POST['roleid']); } else if ($command == 'changepassword') { $this->changepassword($_POST['userid'],$_POST['password']); } else if ($command == 'changeOwnPassword') { @@ -458,7 +470,7 @@ class Admin { } - $sql = "SELECT * FROM %user% WHERE id=? AND active='1'"; + $sql = "SELECT *,%user%.id as id FROM %user%,%roles% WHERE %user%.id=? AND active='1' AND %user%.roleid=%roles%.id"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($userid)); $result = $stmt->fetchAll(); @@ -923,7 +935,7 @@ class Admin { $right_changeprice = 0; $supplyRight = 0; if ($userLoggedIn) { - $sql = "SELECT language,right_supply,right_changeprice,keeptypelevel,extrasapplybtnpos,right_paydesk,IFNULL(preferimgdesk,0) as preferimgdesk,IFNULL(preferimgmobile,0) as preferimgmobile,IFNULL(showplusminus,0) as showplusminus FROM %user% WHERE id=?"; + $sql = "SELECT language,right_supply,right_changeprice,keeptypelevel,extrasapplybtnpos,right_paydesk,IFNULL(preferimgdesk,0) as preferimgdesk,IFNULL(preferimgmobile,0) as preferimgmobile,IFNULL(showplusminus,0) as showplusminus FROM %user%,%roles% WHERE %user%.id=? AND %user%.roleid=%roles%.id"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($_SESSION['userid'])); $row = $stmt->fetchObject(); @@ -967,6 +979,7 @@ class Admin { $rectemplate = CommonUtils::getConfigValueStmt($pdo,$stmt,"rectemplate",null); $foodtemplate = CommonUtils::getConfigValueStmt($pdo,$stmt,"foodtemplate",null); $drinktemplate = CommonUtils::getConfigValueStmt($pdo,$stmt,"drinktemplate",null); + $canceltemplate = CommonUtils::getConfigValueStmt($pdo,$stmt,"canceltemplate",null); $decpoint = CommonUtils::getConfigValueStmt($pdo,$stmt,"decpoint",null); $version = CommonUtils::getConfigValueStmt($pdo,$stmt,"version",null); $payprinttype = CommonUtils::getConfigValueStmt($pdo,$stmt,"payprinttype",null); @@ -1038,7 +1051,7 @@ class Admin { $smtpsecure = 1; $smtpport = ""; - if ( (isset($_SESSION['is_admin']) && ($_SESSION['is_admin'] == 1)) || (isset($_SESSION['right_manager']) && ($_SESSION['right_manager'] == 1))) { + if ( (isset($_SESSION['is_admin']) && ($_SESSION['is_admin'] == 1)) || (isset($_SESSION['right_manager']) && ($_SESSION['right_manager']))) { $smtphost = CommonUtils::getConfigValueStmt($pdo,$stmt,"smtphost",""); $smtpauth = CommonUtils::getConfigValueStmt($pdo,$stmt,"smtpauth",1); $smtpuser = CommonUtils::getConfigValueStmt($pdo,$stmt,"smtpuser",""); @@ -1080,7 +1093,7 @@ class Admin { date_default_timezone_set(DbUtils::getTimeZone()); $now = getdate(); - $retVal = array("companyinfo" => $companyInfo, "rectemplate" => $rectemplate, "foodtemplate" => $foodtemplate, "drinktemplate" => $drinktemplate, + $retVal = array("companyinfo" => $companyInfo, "rectemplate" => $rectemplate, "foodtemplate" => $foodtemplate, "drinktemplate" => $drinktemplate, "canceltemplate" => $canceltemplate, "version" => $version, "decpoint" => $decpoint, "serverurl" => $serverurl, "email" => $email, "receiveremail" => $receiveremail, "billlanguage" => $billlanguage, "hotelinterface" => $hotelinterface, "hsinfile" => $hsinfile, "hsoutfile" => $hsoutfile, "hscurrency" => $hscurrency, @@ -1190,11 +1203,11 @@ class Admin { if (($view == 'preferences.html') || ($view == 'feedback.html') || ($view == 'help.php')) { $valid = true; } else if ($view == 'manager.html') { - if (($_SESSION['is_admin'] == 1) || ($_SESSION['right_manager'] == 1) || ($_SESSION['right_closing'] == 1)) { + if (($_SESSION['is_admin']) || ($_SESSION['right_manager']) || ($_SESSION['right_closing'])) { $valid = true; } } else { - if (($view == "index.html") || ($_SESSION[$mapping[$view]] == 1)) { + if (($view == "index.html") || ($_SESSION[$mapping[$view]])) { $valid = true; } } @@ -1202,7 +1215,7 @@ class Admin { $view = "preferences.html"; } - echo json_encode($view . "?v=1.3.22"); + echo json_encode($view . "?v=1.3.23"); } } @@ -1409,27 +1422,27 @@ 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.3.22"); }; + if ($_SESSION['right_waiter']) { $mainMenu[] = array("name" => $waitertxt[$lang], "link" => "waiter.html?v=1.3.23"); }; } else { - if ($_SESSION['right_waiter']) { $mainMenu[] = array("name" => $waiterdesktxt[$lang], "link" => "waiterdesktop.php?v=1.3.22"); }; + if ($_SESSION['right_waiter']) { $mainMenu[] = array("name" => $waiterdesktxt[$lang], "link" => "waiterdesktop.php?v=1.3.23"); }; } - if ($_SESSION['right_kitchen']) { $mainMenu[] = array("name" => $kitchentxt[$lang], "link" => "kitchen.html?v=1.3.22"); }; - if ($_SESSION['right_bar']) { $mainMenu[] = array("name" => "Bar", "link" => "bar.html?v=1.3.22"); }; - if ($_SESSION['right_supply']) { $mainMenu[] = array("name" => $supplytxt[$lang], "link" => "supplydesk.html?v=1.3.22"); }; + if ($_SESSION['right_kitchen']) { $mainMenu[] = array("name" => $kitchentxt[$lang], "link" => "kitchen.html?v=1.3.23"); }; + if ($_SESSION['right_bar']) { $mainMenu[] = array("name" => "Bar", "link" => "bar.html?v=1.3.23"); }; + if ($_SESSION['right_supply']) { $mainMenu[] = array("name" => $supplytxt[$lang], "link" => "supplydesk.html?v=1.3.23"); }; if ($_SESSION['modus'] == 0) { - if ($_SESSION['right_paydesk']) { $mainMenu[] = array("name" => $paydesktxt[$lang], "link" => "paydesk.html?v=1.3.22"); }; + if ($_SESSION['right_paydesk']) { $mainMenu[] = array("name" => $paydesktxt[$lang], "link" => "paydesk.html?v=1.3.23"); }; } - if ($_SESSION['right_statistics']) { $mainMenu[] = array("name" => $stattxt[$lang], "link" => "reports.html?v=1.3.22"); }; - if ($_SESSION['right_bill']) { $mainMenu[] = array("name" => $bontxt[$lang], "link" => "bill.html?v=1.3.22"); }; - if ($_SESSION['right_products']) { $mainMenu[] = array("name" => $prodtxt[$lang], "link" => "products.html?v=1.3.22"); }; - if ($_SESSION['right_reservation']) { $mainMenu[] = array("name" => $restxt[$lang], "link" => "reservation.html?v=1.3.22"); }; - if ($_SESSION['right_rating']) { $mainMenu[] = array("name" => $ratingtxt[$lang], "link" => "rating.html?v=1.3.22"); }; - if ($_SESSION['right_customers']) { $mainMenu[] = array("name" => $customerstxt[$lang], "link" => "customers.html?v=1.3.22"); }; - if ($_SESSION['right_dash']) { $mainMenu[] = array("name" => $dashtxt[$lang], "link" => "dash.php?v=1.3.22"); }; - if ($_SESSION['right_manager'] || $_SESSION['is_admin'] || $_SESSION['right_closing']) { $mainMenu[] = array("name" => $admintxt[$lang], "link" => "manager.html?v=1.3.22"); }; - $mainMenu[] = array("name" => $settingtxt[$lang], "link" => "preferences.html?v=1.3.22"); - $mainMenu[] = array("name" => "Hilfe", "link" => "help.php?v=1.3.22"); - $mainMenu[] = array("name" => "Feedback", "link" => "feedback.html?v=1.3.22"); + if ($_SESSION['right_statistics']) { $mainMenu[] = array("name" => $stattxt[$lang], "link" => "reports.html?v=1.3.23"); }; + if ($_SESSION['right_bill']) { $mainMenu[] = array("name" => $bontxt[$lang], "link" => "bill.html?v=1.3.23"); }; + if ($_SESSION['right_products']) { $mainMenu[] = array("name" => $prodtxt[$lang], "link" => "products.html?v=1.3.23"); }; + if ($_SESSION['right_reservation']) { $mainMenu[] = array("name" => $restxt[$lang], "link" => "reservation.html?v=1.3.23"); }; + if ($_SESSION['right_rating']) { $mainMenu[] = array("name" => $ratingtxt[$lang], "link" => "rating.html?v=1.3.23"); }; + if ($_SESSION['right_customers']) { $mainMenu[] = array("name" => $customerstxt[$lang], "link" => "customers.html?v=1.3.23"); }; + if ($_SESSION['right_dash']) { $mainMenu[] = array("name" => $dashtxt[$lang], "link" => "dash.php?v=1.3.23"); }; + if ($_SESSION['right_manager'] || $_SESSION['is_admin'] || $_SESSION['right_closing']) { $mainMenu[] = array("name" => $admintxt[$lang], "link" => "manager.html?v=1.3.23"); }; + $mainMenu[] = array("name" => $settingtxt[$lang], "link" => "preferences.html?v=1.3.23"); + $mainMenu[] = array("name" => "Hilfe", "link" => "help.php?v=1.3.23"); + $mainMenu[] = array("name" => "Feedback", "link" => "feedback.html?v=1.3.23"); } $mainMenu[] = array("name" => $logout[$lang], "link" => "logout.php"); @@ -1437,7 +1450,7 @@ class Admin { $waiterMessage = $this->getMessage(null, "waitermessage"); } - $mainMenuAndVersion = array ("version" => "OrderSprinter 1.3.22", + $mainMenuAndVersion = array ("version" => "OrderSprinter 1.3.23", "user" => $currentUser, "menu" => $mainMenu, "waitermessage" => $waiterMessage, @@ -1573,13 +1586,30 @@ class Admin { } } - function getUserList() { + function getRoleList() { $pdo = DbUtils::openDbAndReturnPdoStatic(); - $sql = "SELECT * FROM %user% WHERE active='1' ORDER BY is_admin"; + $roles = $this->getRoleListCore($pdo); + echo json_encode(array("status" => "OK","msg" => $roles)); + } + + function getRoleListCore($pdo) { + $sql = "SELECT * from %roles% ORDER BY is_admin,right_manager"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(); - $result = $stmt->fetchAll(); - echo json_encode($result); + $roles = $stmt->fetchAll(PDO::FETCH_ASSOC); + return $roles; + } + + function getUserList() { + $pdo = DbUtils::openDbAndReturnPdoStatic(); + $sql = "SELECT *,%user%.id as id,is_admin,right_manager FROM %user%,%roles% WHERE active='1' AND %user%.roleid=%roles%.id ORDER BY is_admin,right_manager"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute(); + $users = $stmt->fetchAll(PDO::FETCH_ASSOC); + + $roles = $this->getRoleListCore($pdo); + + echo json_encode(array("users" => $users,"roles" => $roles)); } function setTime($day,$month,$year,$hour,$min) { @@ -1607,13 +1637,93 @@ class Admin { } } + function updateRole() { + + if(session_id() == '') { + session_start(); + } + + $pdo = DbUtils::openDbAndReturnPdoStatic(); + + if ($_POST["isAdmin"] == 1) { + echo json_encode(array("status" => "ERROR","msg" => "Nicht-Admins dürfen keine Rollen mit Admin-Rechten setzen!")); + return; + } + + $roleid = $_POST["roleid"]; + $roleIsAdmin = self::isRoleAdmin($pdo, $roleid); + + if ($roleIsAdmin && !($this->isCurrentUserAdmin())) { + echo json_encode(array("status" => "ERROR","msg" => "Benutzer ist kein Admin und darf keine Admin-Rollen bearbeiten!")); + return; + } + + $sql = "SELECT id FROM %user% WHERE roleid=? AND active='1'"; + $effectedUsers = CommonUtils::fetchSqlAll($pdo, $sql, array($roleid)); + + $keys = array(); + $vals = array(); + + foreach(DbUtils::$userCols as $userCol) { + if (!is_null($userCol["update"])) { + $key = $userCol["col"]; + $keys[] = $key . "=?"; + $vals[] = $_POST[$userCol["update"]]; + } + } + $keys[] = "name=?"; + $vals[] = $_POST["username"]; + $vals[] = $roleid; + + $keysStr = join(",",$keys); + $sql = "UPDATE %roles% SET " . $keysStr . " WHERE id=?"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute($vals); + + foreach( $effectedUsers as $aUser) { + $userid = $aUser["id"]; + HistFiller::updateUserInHist($pdo, $userid); + } + + echo json_encode(array("status" => "OK")); + } + + function createNewRole() { + $pdo = DbUtils::openDbAndReturnPdoStatic(); + + $keys = array(); + $vals = array(); + $quests = array(); + + foreach(DbUtils::$userCols as $userCol) { + if (!is_null($userCol["new"])) { + $quests[] = '?'; + $key = $userCol["col"]; + if ($key == "username") { + $key = "name"; + } + $keys[] = $key; + $vals[] = $_POST[$userCol['new']]; + } + } + + $keysStr = join(",",$keys); + $questsStr = join(",",$quests); + $sql = "INSERT INTO %roles% (" . $keysStr . ") VALUES(" . $questsStr . ")"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute($vals); + + echo json_encode(array("status" => "OK")); + + } function createNewUser() { $pdo = DbUtils::openDbAndReturnPdoStatic(); - $username = $_POST['username']; - $isAdmin = $_POST['isAdmin']; + $username = $_POST['name']; $password = $_POST['password']; + $roleid = $_POST['roleid']; + $sql = "SELECT count(id) as countid FROM %user% WHERE active='1' AND username=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($username)); @@ -1629,44 +1739,24 @@ class Admin { } $lang = $_SESSION['language']; - if ($isAdmin && !($this->isCurrentUserAdmin())) { + $roleIsAdmin = self::isRoleAdmin($pdo, $roleid); + if ($roleIsAdmin && !($this->isCurrentUserAdmin())) { echo json_encode(array("status" => "ERROR", "code" => ERROR_COMMAND_NOT_ADMIN, "msg" => ERROR_COMMAND_NOT_ADMIN_MSG)); return; } else { $password_hash = md5($password); - $keys = array('id','userpassword','language'); - $vals = array(null,$password_hash,$lang); - $quests = array('?','?','?'); - - foreach(DbUtils::$userCols as $userCol) { - if (!is_null($userCol["new"])) { - $quests[] = '?'; - $keys[] = $userCol["col"]; - $vals[] = $_POST[$userCol['new']]; - } else if (isset($userCol["default"])) { - $quests[] = '?'; - $keys[] = $userCol["col"]; - $vals[] = $userCol["default"]; - } - } - - $keysStr = join(",",$keys); - $questsStr = join(",",$quests); - $userInsertSql = "INSERT INTO %user% (" . $keysStr . ") VALUES(" . $questsStr . ")"; - $stmt = $pdo->prepare(DbUtils::substTableAlias($userInsertSql)); - $stmt->execute($vals); - + $sql = "INSERT INTO %user% (username,userpassword,roleid,language,showplusminus,keeptypelevel,extrasapplybtnpos,prefertablemap,preferimgdesk,preferimgmobile,active) VALUES(?,?,?,?,?,?,?,?,?,?,?)"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute(array($username,$password_hash,$roleid,$lang,1,1,1,1,1,1,1)); + $lastId = $pdo->lastInsertId(); - $sql = "UPDATE %user% SET showplusminus=? WHERE id=?"; - CommonUtils::execSql($pdo, $sql, array(1,$lastId)); + HistFiller::createUserInHist($pdo, $lastId); echo json_encode(array("status" => "OK")); } } - - HistFiller::createUserInHist($pdo,$lastId); } function getPayPrintType() { @@ -1775,6 +1865,7 @@ class Admin { "rectemplate" => array("dbcol" => "rectemplate","checknum" => 0), "foodtemplate" => array("dbcol" => "foodtemplate","checknum" => 0), "drinktemplate" => array("dbcol" => "drinktemplate","checknum" => 0), + "canceltemplate" => array("dbcol" => "canceltemplate","checknum" => 0), "serverUrl" => array("dbcol" => "serverurl","checknum" => 0), "email" => array("dbcol" => "email","checknum" => 0), "emailbadrating" => array("dbcol" => "emailbadrating","checknum" => 0), @@ -1973,77 +2064,70 @@ class Admin { return $theUserId; } + public static function isRoleAdmin($pdo,$roleid) { + $sql = "SELECT is_admin FROM %roles% WHERE id=?"; + $is_admin_role = CommonUtils::getRowSqlObject($pdo, $sql, array($roleid)); + return ($is_admin_role->is_admin == 1 ? true : false); + } + + public static function isRoleOfUserAdmin($pdo,$userid) { + $sql = "SELECT roleid FROM %user% WHERE id=?"; + $role = CommonUtils::getRowSqlObject($pdo, $sql, array($userid)); + $roleid = $role->roleid; + + return self::isRoleAdmin($pdo, $roleid); + } + function updateUser() { $pdo = DbUtils::openDbAndReturnPdoStatic(); $theUserId = $_POST['userid']; - $isAdmin = $_POST['isAdmin']; - $sql = "SELECT username,is_admin FROM %user% WHERE id=?"; - $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); - $stmt->execute(array($theUserId)); - $row = $stmt->fetchObject(); - $userToModIsAdmin = $row->is_admin; + $roleid = $_POST['roleid']; - $doChangeAdminRights = false; - if ($isAdmin != $userToModIsAdmin) { - $doChangeAdminRights = true; - } - - if ($doChangeAdminRights && !($this->isCurrentUserAdmin())) { + $is_admin_role = self::isRoleAdmin($pdo, $roleid); + + if (!$this->isCurrentUserAdmin() && $is_admin_role) { echo json_encode("noadmin"); } else { - $keys = array(); - $vals = array(); - - foreach(DbUtils::$userCols as $userCol) { - if (!is_null($userCol["update"])) { - $keys[] = $userCol["col"] . "=?"; - $vals[] = $_POST[$userCol["update"]]; - } - } - $vals[] = $theUserId; - - $keysStr = join(",",$keys); - $sql = "UPDATE %user% SET " . $keysStr . " WHERE active='1' AND id=?"; - $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); - $stmt->execute($vals); - - HistFiller::updateUserInHist($pdo,$theUserId); - - echo json_encode("OK"); + $sql = "UPDATE %user% SET roleid=? WHERE id=?"; + CommonUtils::execSql($pdo, $sql, array($roleid,$theUserId)); + HistFiller::updateUserInHist($pdo,$theUserId); + echo json_encode("OK"); + } + } + + function deleteRole($roleid) { + $pdo = DbUtils::openDbAndReturnPdoStatic(); + $sql = "SELECT id FROM %user% WHERE roleid=? AND active='1'"; + $result = CommonUtils::fetchSqlAll($pdo, $sql, array($roleid)); + if (count($result) > 0) { + echo json_encode(array("status" => "ERROR","msg" => "Rolle ist noch Benutzern zugewiesen!")); + } else { + $sql = "DELETE FROM %roles% WHERE id=?"; + CommonUtils::execSql($pdo, $sql, array($roleid)); + echo json_encode(array("status" => "OK")); } } function deleteUser($theUserId) { $pdo = DbUtils::openDbAndReturnPdoStatic(); - $sql = "SELECT is_admin FROM %user% WHERE active='1' AND id=?"; - $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); - $stmt->execute(array($theUserId)); - $row =$stmt->fetchObject(); - $userToDelIsAdmin = ($row->is_admin == 1 ? true : false); - - if ($userToDelIsAdmin && !($this->isCurrentUserAdmin())) { + $is_admin_role = self::isRoleOfUserAdmin($pdo, $theUserId); + if (!$this->isCurrentUserAdmin() && $is_admin_role) { echo json_encode("noadmin"); } else { - $sql = "SELECT count(id) as countid FROM %user% WHERE active='1' AND is_admin='1' AND id <> ?"; - $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); - $stmt->execute(array($theUserId)); - $row = $stmt->fetchObject(); - $numberOfOtherAdmins = $row->countid; + + $sql = "UPDATE %user% set active='0' WHERE id=?"; + CommonUtils::execSql($pdo, $sql, array($theUserId)); - if (($numberOfOtherAdmins == 0) && $userToDelIsAdmin) { - echo json_encode("lastadmin"); - } else { - $userSql = "UPDATE %user% set active='0' WHERE id=?"; - $stmt = $pdo->prepare(DbUtils::substTableAlias($userSql)); - $stmt->execute(array($theUserId)); - - HistFiller::updateUserInHist($pdo,$theUserId); - - echo json_encode("OK"); - } - } + HistFiller::updateUserInHist($pdo,$theUserId); + + $sql = "UPDATE %user% set roleid=? WHERE id=?"; + CommonUtils::execSql($pdo, $sql, array(null,$theUserId)); + + echo json_encode("OK"); + + } } function getCurrentUser() { @@ -2065,33 +2149,29 @@ class Admin { echo json_encode("ERROR"); return; } - $sql = "SELECT is_admin FROM %user% WHERE active='1' AND id=?"; - $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); - $stmt->execute(array($userid)); - $row = $stmt->fetchObject(); - $userToChgPassIsAdm = false; - if ($row->is_admin == 1) { - $userToChgPassIsAdm = true; - } + $userToChgPassIsAdm = self::isRoleOfUserAdmin($pdo, $userid); - - if(session_id() == '') { - session_start(); - } - $otherUser = false; - if ($_SESSION['userid'] != $userid) { - $otherUser = true; - } - - if ($otherUser && $userToChgPassIsAdm && !($this->isCurrentUserAdmin())) { + $currentUserAdmin = $this->isCurrentUserAdmin(); + if (!$currentUserAdmin && $userToChgPassIsAdm) { echo json_encode("noadmin"); } else { - $password_hash = md5($password); - $userSql = "UPDATE %user% set userpassword=? WHERE active='1' AND id=?"; - $stmt = $pdo->prepare(DbUtils::substTableAlias($userSql)); - $stmt->execute(array($password_hash,$userid)); - echo json_encode("OK"); + if(session_id() == '') { + session_start(); + } + $otherUser = false; + if ($_SESSION['userid'] != $userid) { + $otherUser = true; + } + + if ($otherUser && $userToChgPassIsAdm && !($this->isCurrentUserAdmin())) { + echo json_encode("noadmin"); + } else { + $password_hash = md5($password); + $sql = "UPDATE %user% set userpassword=? WHERE active='1' AND id=?"; + CommonUtils::execSql($pdo, $sql, array($password_hash,$userid)); + echo json_encode("OK"); + } } } @@ -2301,22 +2381,22 @@ class Admin { } private function getConfigTablesToBackupRestore() { - return array("logo","work","payment","room","resttables","tablepos","tablemaps","pricelevel","prodtype","prodimages","products","config","user","comments","histprod","histconfig","histuser","histactions","hist","extras","extrasprods"); + return array("logo","work","payment","room","resttables","tablepos","tablemaps","pricelevel","prodtype","prodimages","products","config","roles","user","comments","histprod","histconfig","histuser","histactions","hist","extras","extrasprods"); } private function getConfigGuestsTablesToBackupRestore() { - return array("logo","work","payment","room","resttables","tablepos","tablemaps","pricelevel","prodtype","prodimages","products","config","user","comments","histprod","histconfig","histuser","histactions","hist","extras","extrasprods","customers","groups","groupcustomer","vacations"); + return array("logo","work","payment","room","resttables","tablepos","tablemaps","pricelevel","prodtype","prodimages","products","config","roles","user","comments","histprod","histconfig","histuser","histactions","hist","extras","extrasprods","customers","groups","groupcustomer","vacations"); } private function getAllTablesToBackupRestore() { return array("closing","logo","printjobs","ratings","work","payment","room","resttables","tablepos","tablemaps","pricelevel","prodtype","prodimages","products","config", - "user","reservations","customers","groups","groupcustomer","vacations","bill","customerlog","queue","billproducts","hsin","hsout","comments","histprod","histconfig","histuser","histactions","hist", + "roles","user","reservations","customers","groups","groupcustomer","vacations","bill","customerlog","queue","billproducts","hsin","hsout","comments","histprod","histconfig","histuser","histactions","hist", "extras","extrasprods","queueextras"); } private function getAllWithLogsTablesToBackupRestore() { return array("log","closing","logo","printjobs","ratings","work","payment","room","resttables","tablepos","tablemaps","pricelevel","prodtype","prodimages","products","config", - "user","reservations","customers","groups","groupcustomer","vacations","bill","customerlog","queue","billproducts","hsin","hsout","comments","histprod","histconfig","histuser","histactions","hist", + "roles","user","reservations","customers","groups","groupcustomer","vacations","bill","customerlog","queue","billproducts","hsin","hsout","comments","histprod","histconfig","histuser","histactions","hist", "extras","extrasprods","queueextras"); } @@ -2922,6 +3002,7 @@ class Admin { self::doSql($pdo, "OPTIMIZE TABLE %extrasprods%", null); self::doSql($pdo, "OPTIMIZE TABLE %queueextras%", null); self::doSql($pdo, "OPTIMIZE TABLE %log%", null); + self::doSql($pdo, "OPTIMIZE TABLE %roles%", null); echo json_encode(array("status" => "OK")); } catch (Exception $ex) { echo json_encode(array("status" => "ERROR", "code" => ERROR_COMMAND_ERROR, "msg" => ERROR_COMMAND_ERROR_MSG)); @@ -3037,6 +3118,7 @@ class Admin { self::doSql($pdo, "DELETE FROM %vacations%", null); self::doSql($pdo, "DELETE FROM %groups%", null); self::doSql($pdo, "DELETE FROM %customers%", null); + Workreceipts::resetWorkReceiptId($pdo); echo json_encode(array("status" => "OK")); } catch(Exception $e) { diff --git a/webapp/php/bill.php b/webapp/php/bill.php index b9b3fd3..7efd3f4 100644 --- a/webapp/php/bill.php +++ b/webapp/php/bill.php @@ -795,13 +795,16 @@ class Bill { $queueIdArray = array(); foreach($result as $row) { + if ($removeproducts == 1) { + Workreceipts::createCancelWorkReceipt($pdo, $row['id']); + } $queueIdArray[] = $row['id']; } if ($removeproducts == 0) { $sql = "UPDATE %queue% SET paidtime=null,billid=null WHERE billid=?"; } else { - $sql = "UPDATE %queue% SET ordertime=null,paidtime=null,billid=null WHERE billid=?"; + $sql = "UPDATE %queue% SET ordertime=null,paidtime=null,billid=null WHERE billid=?"; } $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($billid)); diff --git a/webapp/php/closing.php b/webapp/php/closing.php index 9039105..7cf04a4 100644 --- a/webapp/php/closing.php +++ b/webapp/php/closing.php @@ -257,6 +257,8 @@ $sql = "DELETE FROM %log%"; CommonUtils::execSql($pdo, $sql, null); } +workreceipts::resetWorkReceiptId($pdo); + // commit must before email, because there direct access to db happens $pdo->commit(); diff --git a/webapp/php/contenthandler.php b/webapp/php/contenthandler.php index 66a7795..556b457 100644 --- a/webapp/php/contenthandler.php +++ b/webapp/php/contenthandler.php @@ -16,7 +16,9 @@ require_once ('rating.php'); require_once ('customers.php'); require_once ('commonutils.php'); require_once ('updater.php'); +require_once ('workreceipts.php'); require_once ('utilities/Logger.php'); +require_once ('utilities/roles.php'); $module = $_GET["module"]; $command = $_GET["command"]; diff --git a/webapp/php/dbutils.php b/webapp/php/dbutils.php index bb0c62d..9749714 100644 --- a/webapp/php/dbutils.php +++ b/webapp/php/dbutils.php @@ -114,6 +114,7 @@ class DbUtils { $out = str_replace("%queueextras%",$prefix . 'queueextras', $out); $out = str_replace("%ratings%",$prefix . 'ratings', $out); $out = str_replace("%prodimages%",$prefix . 'prodimages', $out); + $out = str_replace("%roles%",$prefix . 'roles', $out); return (str_replace("%prodtype%",$prefix . 'prodtype',$out)); } diff --git a/webapp/php/printqueue.php b/webapp/php/printqueue.php index 6a48b43..3de3d56 100644 --- a/webapp/php/printqueue.php +++ b/webapp/php/printqueue.php @@ -5,6 +5,7 @@ require_once ('globals.php'); require_once ('dbutils.php'); require_once ('bill.php'); require_once ('closing.php'); +require_once ('admin.php'); class PrintQueue { var $dbutils; @@ -12,6 +13,13 @@ class PrintQueue { var $admin; var $instance = null; + private static $FOOD = 1; + private static $DRINK = 2; + private static $RECEIPT = 3; + private static $CLOSING = 4; + public static $CANCELFOOD = 5; + public static $CANCELDRINK = 6; + function __construct() { $this->dbutils = new DbUtils(); $this->userrights = new Userrights(); @@ -48,6 +56,21 @@ class PrintQueue { } else { $this->getNextDrinkWorkPrintJobs(null,$_POST['pass'],$fl); } + + } else if ($command == 'getNextCancelFoodWorkPrintJobs') { + if (isset($_GET['printer'])) { + $this->getNextCancelFoodWorkPrintJobs($_GET['printer'],$_POST['pass'],$fl); + } else { + $this->getNextCancelFoodWorkPrintJobs(null,$_POST['pass'],$fl); + } + } else if ($command == 'getNextCancelDrinkWorkPrintJobs') { + if (isset($_GET['printer'])) { + $this->getNextCancelDrinkWorkPrintJobs($_GET['printer'],$_POST['pass'],$fl); + } else { + $this->getNextCancelDrinkWorkPrintJobs(null,$_POST['pass'],$fl); + } + + } else if ($command == 'deletePrintJob') { $this->deletePrintJob($_POST['pass'],$_POST['id']); } else if ($command == 'queueReceiptPrintJob') { @@ -78,6 +101,8 @@ class PrintQueue { $this->getLastLog($_POST['pass']); } else if ($command == 'deleteSpooledPrintJob') { $this->deleteSpooledPrintJob($_POST['id']); + } else if ($command == 'reprintworkreceipt') { + $this->reprintworkreceipt($_GET["workid"]); } else { echo "Kommando nicht erkannt!"; } @@ -135,10 +160,12 @@ class PrintQueue { * Insert a "work" (food or drink) job into the printjob queue. The POS Print Server will * pick these jobs and delete them after successful printing */ - public static function queueWorkPrintJob($pdo,$table,$timestamp,$prods,$kind,$printer,$username) { + public static function queueWorkPrintJob($pdo,$table,$timestamp,$prods,$kind,$printer,$username) { + $workId = Workreceipts::getNextWorkReceiptId($pdo); + $table .= " ($username)"; - $content = json_encode(array("table" => $table, "time" => $timestamp, "products" => $prods)); + $content = json_encode(array("workid" => $workId,"table" => $table, "time" => $timestamp, "products" => $prods)); $printInsertSql = "INSERT INTO `%printjobs%` (`id` , `content`,`type`,`printer`) VALUES ( NULL,?,?,?)"; $stmt = $pdo->prepare(DbUtils::substTableAlias($printInsertSql)); @@ -146,6 +173,13 @@ class PrintQueue { $idOfWorkJob = $pdo->lastInsertId(); + $sql = "UPDATE %queue% SET printjobid=? WHERE id=?"; + foreach($prods as $aProd) { + $queueid = $aProd["id"]; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute(array($idOfWorkJob,$queueid)); + } + CommonUtils::log($pdo,"QUEUE","Create work job with id=$idOfWorkJob for tableid $table from user $username of kind $kind for printer=$printer"); } @@ -168,16 +202,16 @@ class PrintQueue { $jobs[] = array("printer" => $printer, "count" => count($result),"jobs" => $result); } - $sql = "SELECT %printjobs%.id as id,content FROM %printjobs% WHERE type=?"; + $sql = "SELECT %printjobs%.id as id,content FROM %printjobs% WHERE type=? AND removed is null"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); - $stmt->execute(array(1)); + $stmt->execute(array(self::$FOOD)); $result = $stmt->fetchAll(); $works = array(); foreach($result as $r) { $works[] = array("id" => $r['id'],"content" => json_decode($r['content'])); } $jobs[] = array("printer" => 7, "count" => count($result),"jobs" => $works); - $stmt->execute(array(2)); + $stmt->execute(array(self::$DRINK)); $result = $stmt->fetchAll(); $works = array(); foreach($result as $r) { @@ -185,6 +219,7 @@ class PrintQueue { } $jobs[] = array("printer" => 8, "count" => count($result),"jobs" => $works); + echo json_encode(array("status" => "OK", "msg" => $jobs)); } @@ -195,9 +230,12 @@ class PrintQueue { echo json_encode(array("status" => "ERROR", "code" => ERROR_DB_PRIVS_MISSING, "msg" => ERROR_DB_PRIVS_MISSING_MSG)); return; } - $sql = "DELETE FROM %printjobs%"; - $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); - $stmt->execute(); + $sql = "DELETE FROM %printjobs% WHERE (type <> ?) AND (type <> ?)"; + CommonUtils::execSql($pdo, $sql, array(self::$FOOD,self::$DRINK)); + + $sql = "UPDATE %printjobs% SET removed=? WHERE (type = ?) OR (type = ?)"; + CommonUtils::execSql($pdo, $sql, array(1,self::$FOOD,self::$DRINK)); + $this->getPrintJobOverview($pdo); } @@ -238,18 +276,52 @@ class PrintQueue { } } - function deleteSpooledPrintJob($printjobid) { + function checkForUserRightManagerAdmin() { if (!($this->userrights->hasCurrentUserRight('right_manager')) && !($this->userrights->hasCurrentUserRight('is_admin')) ) { echo "Benutzerrechte nicht ausreichend!"; return false; + } else { + return true; + } + } + + function reprintworkreceipt($workid) { + if ($this->checkForUserRightManagerAdmin()) { + $pdo = DbUtils::openDbAndReturnPdoStatic(); + + if (is_null($workid)) { + echo json_encode(array("status" => "ERROR","msg" => "Keine gültige ID angegeben!")); + return; + } + + $workid = trim($workid); + + $sql = "SELECT id,content FROM %printjobs% WHERE type IN (?,?,?,?)"; + $result = CommonUtils::fetchSqlAll($pdo, $sql, array(self::$FOOD,self::$DRINK,self::$CANCELFOOD,self::$CANCELDRINK)); + + foreach ($result as $w) { + $content = json_decode($w["content"],true); + if ($content["workid"] == $workid) { + $sql = "UPDATE %printjobs% SET removed=? WHERE id=?"; + CommonUtils::execSql($pdo, $sql, array(null,$w["id"])); + echo json_encode(array("status" => "OK")); + return; + } + } + + echo json_encode(array("status" => "ERROR","msg" => "Kein Arbeitsbon-Druckjob mit der ID gefunden!")); + } + } + + function deleteSpooledPrintJob($printjobid) { + if ($this->checkForUserRightManagerAdmin()) { + $pdo = DbUtils::openDbAndReturnPdoStatic(); + $sql = "DELETE FROM %printjobs% WHERE id=?"; + CommonUtils::execSql($pdo, $sql, array($printjobid)); + echo json_encode(array("status" => "OK")); } - - $pdo = DbUtils::openDbAndReturnPdoStatic(); - $sql = "DELETE FROM %printjobs% WHERE id=?"; - CommonUtils::execSql($pdo, $sql, array($printjobid)); - echo json_encode(array("status" => "OK")); } function queueReceiptPrintJob($billid,$useaddrecprinter) { @@ -283,10 +355,10 @@ class PrintQueue { $printInsertSql = "INSERT INTO `%printjobs%` (`id` , `content`,`type`,`printer`) VALUES ( NULL,?,?,?)"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($printInsertSql)); - $stmt->execute(array((string)($billid),'3',$printer)); + $stmt->execute(array((string)($billid),self::$RECEIPT,$printer)); if (!is_null($addprinter) && ($addprinter != "") && ($useaddrecprinter == 1)) { - $stmt->execute(array((string)($billid),'3',$addprinter)); + $stmt->execute(array((string)($billid),self::$RECEIPT,$addprinter)); } echo json_encode("OK"); @@ -315,7 +387,7 @@ class PrintQueue { $printInsertSql = "INSERT INTO `%printjobs%` (`id` , `content`,`type`,`printer`) VALUES ( NULL,?,?,?)"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($printInsertSql)); - $stmt->execute(array((string)($closingid),'4',$printer)); + $stmt->execute(array((string)($closingid),self::$CLOSING,$printer)); echo json_encode("OK"); } } @@ -541,11 +613,11 @@ class PrintQueue { } function getNextFoodWorkPrintJobs($printer,$md5pass,$fl) { - $this->getNextWorkPrintJobs($md5pass,1,$printer,$fl); + $this->getNextWorkPrintJobs($md5pass,self::$FOOD,$printer,$fl); } function getNextDrinkWorkPrintJobs($printer,$md5pass,$fl) { - $this->getNextWorkPrintJobs($md5pass,2,$printer,$fl); + $this->getNextWorkPrintJobs($md5pass,self::$DRINK,$printer,$fl); } function getNextWorkPrintJobs($md5pass,$theType,$printer,$fl) { @@ -574,11 +646,11 @@ class PrintQueue { $template = $this->getTemplate($pdo, $templatekey); if (is_null($printer)) { - $sql = "SELECT id,content,type FROM %printjobs% WHERE type=? ORDER BY id"; + $sql = "SELECT id,content,type FROM %printjobs% WHERE type=? AND removed is null ORDER BY id"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($theType)); } else { - $sql = "SELECT id,content,type FROM %printjobs% WHERE type=? AND printer=? ORDER BY id"; + $sql = "SELECT id,content,type FROM %printjobs% WHERE type=? AND printer=? AND removed is null ORDER BY id"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($theType,$printer)); } @@ -591,6 +663,9 @@ class PrintQueue { $aWork = (array) json_decode($aWorkJob["content"]); // is in json format CommonUtils::log($pdo,"PRINTQUEUE", "getNextWorkPrintJobs: collect work receipt with id=" . $aWorkJob["id"] . " for printer=$printer"); + $workid = $aWork["workid"]; + unset($aWork["workid"]); + if (($fl >= 5) && ($fl <= 6)) { $prods = (array) ($aWork["products"]); $targetProds = array(); @@ -609,13 +684,12 @@ class PrintQueue { $targetProds[] = $newTargetProd; } $aWork["products"] = $targetProds; - } else - if ($fl < 5) { + } else if ($fl < 5) { $prods = (array) ($aWork["products"]); $targetProds = array(); foreach ($prods as $aProd) { $theArrProd = (array) $aProd; - + $newTargetProd = array("id" => $theArrProd["id"], "longname" => $theArrProd["longname"], "option" => $theArrProd["option"], @@ -629,10 +703,14 @@ class PrintQueue { $aWork["products"] = $targetProds; } if ($fl >= 2) { - $workarray[] = array("id" => $aWorkJob["id"],"content" => $aWork, "bigfontworkreceipt" => intval($bigFontWorkReceipt), "template" => $template); + if ($fl >= 10) { + $workarray[] = array("workid" => $workid,"id" => $aWorkJob["id"],"content" => $aWork, "bigfontworkreceipt" => intval($bigFontWorkReceipt), "template" => $template); + } else { + $workarray[] = array("id" => $aWorkJob["id"],"content" => $aWork, "bigfontworkreceipt" => intval($bigFontWorkReceipt), "template" => $template); + } } else { - // default without template - $workarray[] = array("id" => $aWorkJob["id"],"content" => $aWork, "bigfontworkreceipt" => intval($bigFontWorkReceipt)); + // default without template + $workarray[] = array("id" => $aWorkJob["id"],"content" => $aWork, "bigfontworkreceipt" => intval($bigFontWorkReceipt)); } } CommonUtils::log($pdo,"PRINTQUEUE", "getNextWorkPrintJobs: sent data to caller"); @@ -643,6 +721,75 @@ class PrintQueue { } } + function getNextCancelFoodWorkPrintJobs($printer,$md5pass,$fl) { + $this->getNextCancelWorkPrintJobs($md5pass,self::$CANCELFOOD,$printer,$fl); + } + + function getNextCancelDrinkWorkPrintJobs($printer,$md5pass,$fl) { + $this->getNextCancelWorkPrintJobs($md5pass,self::$CANCELDRINK,$printer,$fl); + } + + function getNextCancelWorkPrintJobs($md5pass,$theType,$printer,$fl) { + $pdo = $this->dbutils->openDbAndReturnPdo(); + $isCorrect = $this->isPasswordCorrect($pdo,$md5pass,false); + + if ($isCorrect) { + CommonUtils::log($pdo,"PRINTQUEUE", "getNextCancelWorkPrintJobs: type = $theType, printer = $printer, fl= $fl"); + + $checkType = "f"; + if ($theType == 6) { + $checkType = "d"; + } + if (!$this->checkForPrinterInstance($pdo, $checkType . $printer)) { + echo json_encode(array()); + return; + } + + $this->saveLastPrintServerAccess($pdo); + + $templatekey = "canceltemplate"; + + $template = $this->getTemplate($pdo, $templatekey); + + if (is_null($printer)) { + $sql = "SELECT id,content,type FROM %printjobs% WHERE type=? AND removed is null ORDER BY id"; + $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); + $stmt->execute(array($theType)); + } else { + $sql = "SELECT id,content,type FROM %printjobs% WHERE type=? AND printer=? AND removed is null ORDER BY id"; + $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); + $stmt->execute(array($theType,$printer)); + } + + $result = $stmt->fetchAll(); + CommonUtils::log($pdo,"PRINTQUEUE", "getNextCancelWorkPrintJobs: retrieve " . count($result) . " jobs"); + + $workarray = array(); + foreach($result as $aWorkJob) { + $aWork = (array) json_decode($aWorkJob["content"],true); // is in json format + CommonUtils::log($pdo,"PRINTQUEUE", "getNextCancelWorkPrintJobs: collect work receipt with id=" . $aWorkJob["id"] . " for printer=$printer"); + + $workid = $aWork["workid"]; + unset($aWork["workid"]); + + $workarray[] = array("workid" => $workid, + "id" => $aWorkJob["id"], + "refworkid" => $aWork["refworkid"], + "longname" => $aWork["longname"], + "kind" => $theType, + "table" => $aWork["table"], + "time" => $aWork["time"], + "price" => $aWork["price"], + "extras" => $aWork["extras"], + "template" => $template); + } + CommonUtils::log($pdo,"PRINTQUEUE", "getNextWorkPrintJobs: sent data to caller"); + echo json_encode($workarray); + } else { + CommonUtils::log($pdo,"PRINTQUEUE", "getNextWorkPrintJobs: wrong printcode"); + echo json_encode(array()); + } + } function deletePrintJob($pass,$id) { $pdo = $this->dbutils->openDbAndReturnPdo(); @@ -650,10 +797,20 @@ class PrintQueue { if ($isCorrect) { $pdo = $this->dbutils->openDbAndReturnPdo(); $this->saveLastPrintServerAccess($pdo); - $sql = "DELETE FROM %printjobs% WHERE id=?"; - $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); - $stmt->execute(array($id)); + $sql = "SELECT type FROM %printjobs% WHERE id=?"; + $result = CommonUtils::fetchSqlAll($pdo, $sql, array($id)); + if (count($result) > 0) { + $type = $result[0]['type']; + if (($type == self::$FOOD) || ($type == self::$DRINK) || ($type == self::$CANCELFOOD) || ($type == self::$CANCELDRINK)) { + $sql = "UPDATE %printjobs% SET removed=? WHERE id=?"; + CommonUtils::execSql($pdo, $sql, array(1,$id)); + } else { + $sql = "DELETE FROM %printjobs% WHERE id=?"; + CommonUtils::execSql($pdo, $sql, array($id)); + } + } + echo json_encode(array("status" => "OK", "code" => OK, "msg" => "Druckauftrag erfolgreich gelöscht.")); } else { CommonUtils::log($pdo,"PRINTQUEUE", "deletePrintJob: wrong printcode"); @@ -661,4 +818,3 @@ class PrintQueue { } } } -?> \ No newline at end of file diff --git a/webapp/php/queuecontent.php b/webapp/php/queuecontent.php index 57875f5..b3c8275 100644 --- a/webapp/php/queuecontent.php +++ b/webapp/php/queuecontent.php @@ -1056,6 +1056,7 @@ class QueueContent { $stmt->execute(array($queueid)); $rowsAffected = $stmt->rowCount(); if ($rowsAffected == 1) { + Workreceipts::createCancelWorkReceipt($pdo, $queueid); echo json_encode(array("status" => "OK")); } else { echo json_encode(array("status" => "Failed", "msg" => "Affected rows: $rowsAffected")); diff --git a/webapp/php/updater.php b/webapp/php/updater.php index 13098f6..514ef1f 100644 --- a/webapp/php/updater.php +++ b/webapp/php/updater.php @@ -110,6 +110,7 @@ class Updater { } private static function getAvailableVersion($pdo) { $url = CommonUtils::getConfigValue($pdo, "updateurl", ''); + $installedVersion = CommonUtils::getConfigValue($pdo, "version", ''); $infoFile = self::getInfoFile($url,'updateinfo.txt',true,3); if ($infoFile["status"] != "OK") { return array("status" => "ERROR","msg" => "could not get info file: " . $infoFile["msg"],"url" => $url); @@ -117,7 +118,7 @@ class Updater { $infoFileLines = $infoFile["msg"]; if (count($infoFileLines) > 1) { - $checkIfNewerVersion = self::isV2Newer('1.3.22',trim($infoFileLines[0])); + $checkIfNewerVersion = self::isV2Newer($installedVersion,trim($infoFileLines[0])); return array("status" => "OK","msg" => $infoFileLines[0],"url" => $url,"neweravailable" => ($checkIfNewerVersion ? 1 : 0)); } else { return array("status" => "ERROR","msg" => "Info file not valid","url" => $url); diff --git a/webapp/php/utilities/HistFiller.php b/webapp/php/utilities/HistFiller.php index dc98e3a..68c8fe4 100644 --- a/webapp/php/utilities/HistFiller.php +++ b/webapp/php/utilities/HistFiller.php @@ -41,10 +41,10 @@ class HistFiller { } public static function readUserTableAndSendToHist($pdo) { - $sql = "SELECT * FROM %user%"; + $sql = "SELECT * FROM %user% WHERE active='1'"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array()); - $result = $stmt->fetchAll(); + $result = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach($result as $aUser) { self::createUserInHist($pdo, $aUser["id"]); } @@ -60,7 +60,7 @@ class HistFiller { $pdo->commit(); } private static function updateOrCreateUserInHist($pdo,$userid,$histaction) { - self::updateOrCreateEntryInHist($pdo, $userid, $histaction, self::getColNamesForUserHistTable(), 'userid', 'user','histuser',null,null); + self::updateOrCreateUserEntryInHist($pdo, $userid, $histaction, self::getColNamesForUserHistTable(), 'userid', 'user','histuser',null,null); } public static function readAllProdsAndFillHistByDb($pdo) { @@ -94,7 +94,53 @@ class HistFiller { self::updateOrCreateEntryInHist($pdo, $prodid, $histaction, self::getColNamesForProdHistTable(), 'prodid', 'products', 'histprod',$extraCol,$extras); } - + private static function updateOrCreateUserEntryInHist($pdo,$id,$histaction,$colsInSourceTable,$idInHist,$sourcetable, $histtable,$extraCol,$extraVal) { + if (!is_null($extraVal)) { + if (strlen($extraVal) > 299) { + $extraVal = substr($extraVal, 0, 299); + } + } + + $sql = "SELECT * from %". $sourcetable . "%,%roles% WHERE %user%.id=? AND %user%.roleid=%roles%.id "; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute(array($id)); + $row = $stmt->fetchObject(); + + $cols = $colsInSourceTable; + array_splice($cols, 0, 1, $idInHist); + $valuesStr = implode(",", $cols); + $quests = array(); + $vals = array(); + + foreach($colsInSourceTable as $aHistCol) { + if ($aHistCol == "id") { + $vals[] = $id; + } else { + $vals[] = $row->$aHistCol; + } + $quests[] = "?"; + } + + $sql_insert_hist = "INSERT INTO %". $histtable . "% (id," . $valuesStr . ") VALUES(NULL," . implode(",",$quests) . ")"; + $stmt_insert_hist = $pdo->prepare(DbUtils::substTableAlias($sql_insert_hist)); + $stmt_insert_hist->execute($vals); + $newRefIdForHist = $pdo->lastInsertId(); + + if (!is_null($extraCol)) { + $sql = "UPDATE %". $histtable . "% SET " . $extraCol . "=? WHERE id=?"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + try { + if (strlen($extraVal) > 300) { + $extraVal = substr($extraVal, 0, 300); + } + $stmt->execute(array($extraVal,$newRefIdForHist)); + } catch (Exception $ex) { + } + } + + self::insertIntoHist($pdo, $histaction, $newRefIdForHist); + } + private static function updateOrCreateEntryInHist($pdo,$id,$histaction,$colsInSourceTable,$idInHist,$sourcetable, $histtable,$extraCol,$extraVal) { if (!is_null($extraVal)) { if (strlen($extraVal) > 299) { diff --git a/webapp/php/utilities/basedb.php b/webapp/php/utilities/basedb.php index ce74b79..39c60be 100644 --- a/webapp/php/utilities/basedb.php +++ b/webapp/php/utilities/basedb.php @@ -117,6 +117,7 @@ class Basedb { $this->doSQLcatch($pdo, "drop TABLE `%bill%`"); $this->doSQLcatch($pdo, "drop TABLE `%ratings%`"); $this->doSQLcatch($pdo, "drop TABLE `%user%`"); + $this->doSQLcatch($pdo, "drop TABLE `%roles%`"); $this->doSQLcatch($pdo, "drop TABLE `%closing%`"); $this->doSQLcatch($pdo, "drop TABLE `%config%`"); $this->doSQLcatch($pdo, "drop TABLE `%products%`"); @@ -191,22 +192,6 @@ class Basedb { `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `username` VARCHAR ( 150 ) NOT NULL, `userpassword` VARCHAR ( 150 ) NOT NULL, - `is_admin` INT (1) NOT NULL, - `right_waiter` INT (1) NOT NULL, - `right_kitchen` INT (1) NOT NULL, - `right_bar` INT (1) NOT NULL, - `right_supply` INT (1) NOT NULL, - `right_paydesk` INT (1) NOT NULL, - `right_statistics` INT (1) NOT NULL, - `right_bill` INT (1) NOT NULL, - `right_products` INT (1) NOT NULL, - `right_manager` INT (1) NOT NULL, - `right_closing` INT (1) NOT NULL, - `right_dash` INT (1) NOT NULL, - `right_reservation` INT (1) NOT NULL, - `right_rating` INT (1) NOT NULL, - `right_changeprice` INT (1) NOT NULL, - `right_customers` INT (1) NOT NULL, `lastmodule` VARCHAR ( 30 ) NULL, `ordervolume` INT (2) NULL, `language` INT (2) NULL, @@ -222,12 +207,45 @@ class Basedb { `keeptypelevel` INT(1) NOT NULL, `extrasapplybtnpos` INT(1) NOT NULL, `failedlogins` VARCHAR(20) NULL, - `active` INT (2) NOT NULL + `active` INT (2) NOT NULL, + `roleid` INT (10) NULL, + FOREIGN KEY (roleid) REFERENCES %roles%(id) ) CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDb ; "; $this->doSQL($pdo,$sql); } + function createRolesTable($pdo) + { + try { + $sql = " + CREATE TABLE %roles% ( + id INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , + name VARCHAR ( 150 ) NOT NULL, + is_admin INT (1) NOT NULL, + right_waiter INT (1) NOT NULL, + right_kitchen INT (1) NOT NULL, + right_bar INT (1) NOT NULL, + right_supply INT (1) NOT NULL, + right_paydesk INT (1) NOT NULL, + right_statistics INT (1) NOT NULL, + right_bill INT (1) NOT NULL, + right_products INT (1) NOT NULL, + right_manager INT (1) NOT NULL, + right_closing INT (1) NOT NULL, + right_dash INT (1) NOT NULL, + right_reservation INT (1) NOT NULL, + right_rating INT (1) NOT NULL, + right_changeprice INT (1) NOT NULL, + right_customers INT (1) NOT NULL + ) CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDb ; + "; + $this->doSQL($pdo,$sql); + } catch (Exception $ex) { + // table may exists due to other installations + } + } + function createRoomTable($pdo) { $sql = " @@ -578,6 +596,7 @@ class Basedb { `toremove` INT(3) NOT NULL, `cooking` INT(10) NULL, `workprinted` INT(2) NOT NULL, + `printjobid` INT(1) NULL, `isclosed` INT(1) NULL, FOREIGN KEY (tablenr) REFERENCES %resttables%(id), FOREIGN KEY (pricelevel) REFERENCES %pricelevel%(id), @@ -706,7 +725,8 @@ class Basedb { `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `content` TEXT NOT NULL , `type` INT (2) NOT NULL , - `printer` INT(2) NULL + `printer` INT(2) NULL, + `removed` INT(1) NULL ) CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDb ; "; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); @@ -837,6 +857,7 @@ class Basedb { { $this->createLogTable($pdo); $this->createPaymentTable($pdo); + $this->createRolesTable($pdo); $this->createUserTable($pdo); $this->createRoomTable($pdo); $this->createRestTables($pdo); diff --git a/webapp/php/utilities/roles.php b/webapp/php/utilities/roles.php new file mode 100644 index 0000000..1ce5a87 --- /dev/null +++ b/webapp/php/utilities/roles.php @@ -0,0 +1,86 @@ +prepare(DbUtils::substTableAlias($sql)); + $stmt->execute(array("Admin",1,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0)); + $id = $pdo->lastInsertId(); + return $id; + } + + public static function insertDigiManagerRole($pdo) { + $sql = "INSERT INTO %roles% (name," + . "is_admin,right_waiter,right_kitchen,right_bar,right_supply,right_paydesk," + . "right_statistics,right_bill,right_products,right_manager,right_closing," + . "right_dash,right_reservation,right_rating,right_changeprice,right_customers) VALUES(" + . "?,?,?,?,? ,?,?,?,?,?, ?,?,?,?,?, ?,?)"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute(array("Manager",0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)); + $id = $pdo->lastInsertId(); + return $id; + } + + public static function insertWorkManagerRole($pdo) { + $sql = "INSERT INTO %roles% (name," + . "is_admin,right_waiter,right_kitchen,right_bar,right_supply,right_paydesk," + . "right_statistics,right_bill,right_products,right_manager,right_closing," + . "right_dash,right_reservation,right_rating,right_changeprice,right_customers) VALUES(" + . "?,?,?,?,? ,?,?,?,?,?, ?,?,?,?,?, ?,?)"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute(array("Manager",0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1)); + $id = $pdo->lastInsertId(); + return $id; + } + + public static function insertDigiWaiterRole($pdo) { + $sql = "INSERT INTO %roles% (name," + . "is_admin,right_waiter,right_kitchen,right_bar,right_supply,right_paydesk," + . "right_statistics,right_bill,right_products,right_manager,right_closing," + . "right_dash,right_reservation,right_rating,right_changeprice,right_customers) VALUES(" + . "?,?,?,?,? ,?,?,?,?,?, ?,?,?,?,?, ?,?)"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute(array("Kellner",0,1,1,1,1,1,0,1,0,0,1,0,1,0,1,0)); + $id = $pdo->lastInsertId(); + return $id; + } + + public static function insertWorkWaiterRole($pdo) { + $sql = "INSERT INTO %roles% (name," + . "is_admin,right_waiter,right_kitchen,right_bar,right_supply,right_paydesk," + . "right_statistics,right_bill,right_products,right_manager,right_closing," + . "right_dash,right_reservation,right_rating,right_changeprice,right_customers) VALUES(" + . "?,?,?,?,? ,?,?,?,?,?, ?,?,?,?,?, ?,?)"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute(array("Kellner",0,1,0,0,0,1,0,1,0,0,1,0,1,0,1,0)); + $id = $pdo->lastInsertId(); + return $id; + } + + public static function insertCookRole($pdo) { + $sql = "INSERT INTO %roles% (name," + . "is_admin,right_waiter,right_kitchen,right_bar,right_supply,right_paydesk," + . "right_statistics,right_bill,right_products,right_manager,right_closing," + . "right_dash,right_reservation,right_rating,right_changeprice,right_customers) VALUES(" + . "?,?,?,?,? ,?,?,?,?,?, ?,?,?,?,?, ?,?)"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); + $stmt->execute(array("Koch",0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0)); + $id = $pdo->lastInsertId(); + return $id; + } +} diff --git a/webapp/php/workreceipts.php b/webapp/php/workreceipts.php new file mode 100644 index 0000000..954c68e --- /dev/null +++ b/webapp/php/workreceipts.php @@ -0,0 +1,93 @@ +content; + $printer = $row->printer; + $origJob = json_decode($origJobJson, true); + + $refworkid = $origJob["workid"]; + $table = $origJob["table"]; + $time = $origJob["time"]; + $products = $origJob["products"]; + + foreach ($products as $prod) { + $id = $prod["id"]; + if ($id == $queueid) { + $kind = $prod["kind"]; + $longname = $prod["longname"]; + $price = $prod["price"]; + $extrasArr = $prod["extras"]; + $extrasStr = implode(",", $extrasArr); + + $cancelJob = array( + "workid" => $workid, + "refworkid" => $refworkid, + "table" => $table, + "time" => $time, + "longname" => $longname, + "kind" => $kind, + "price" => $price, + "extras" => $extrasStr); + + $cancelJobJson = json_encode($cancelJob); + + $printInsertSql = "INSERT INTO `%printjobs%` (`id` , `content`,`type`,`printer`) VALUES ( NULL,?,?,?)"; + $stmt = $pdo->prepare(DbUtils::substTableAlias($printInsertSql)); + $type = PrintQueue::$CANCELFOOD; + if ($kind == 1) { + $type = PrintQueue::$CANCELDRINK; + } + $stmt->execute(array($cancelJobJson,$type,$printer)); + + $idOfWorkJob = $pdo->lastInsertId(); + + CommonUtils::log($pdo,"QUEUE","Create cancel work job with id=$idOfWorkJob for tableid $table of kind $kind for printer=$printer"); + } + } + } + } catch (Exception $ex) { + $msg = $ex->getMessage(); + return; + } + } + } +} diff --git a/webapp/preferences.html b/webapp/preferences.html index e960f7f..081c3b8 100644 --- a/webapp/preferences.html +++ b/webapp/preferences.html @@ -5,7 +5,7 @@ - + diff --git a/webapp/products.html b/webapp/products.html index c7f9b62..c06b004 100644 --- a/webapp/products.html +++ b/webapp/products.html @@ -7,7 +7,7 @@ - + diff --git a/webapp/rating.html b/webapp/rating.html index 9667b9f..032e04d 100644 --- a/webapp/rating.html +++ b/webapp/rating.html @@ -7,7 +7,7 @@ - + diff --git a/webapp/reports.html b/webapp/reports.html index 9208af2..6f3f4a9 100644 --- a/webapp/reports.html +++ b/webapp/reports.html @@ -7,7 +7,7 @@ - + diff --git a/webapp/reservation.html b/webapp/reservation.html index 3173e72..c3b60c3 100644 --- a/webapp/reservation.html +++ b/webapp/reservation.html @@ -5,7 +5,7 @@ - + diff --git a/webapp/supplydesk.html b/webapp/supplydesk.html index ffb8f3b..c4f55d5 100644 --- a/webapp/supplydesk.html +++ b/webapp/supplydesk.html @@ -5,7 +5,7 @@ - + diff --git a/webapp/waiter.html b/webapp/waiter.html index 0bcba25..ac21269 100644 --- a/webapp/waiter.html +++ b/webapp/waiter.html @@ -4,8 +4,8 @@ - - + + @@ -33,7 +33,7 @@ +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_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_SEARCHRESULTS=["Suchergebnis","Search Result","Encontrado"];var W_WRONG_PIN=["Falscher Stornocode","Wrong cancel code","Codigo falso"];var W_NO_ORDERS=["Keine gebuchten Orders vorhanden!","No orders available!","No hay ningún orden!"];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 Preiseingabe","No valid price","Precio no valido"];var W_NO_REORDER_VAR_PRICE=["Produkt mit variablem Preis kann nicht auf diese Weise nachbestellt werden.","Produkt with variable price cannot be reordered this way.","Producto con un precio variable no se puede reordenado asi."];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(h){lang=h;$("#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]);var f="";if(prominentsearch==0){f+='
'}else{f+='
'}f+="
";var e='
';if(prominentsearch==0){$("#searchposition-normal").html(f)}else{$("#searchposition-prominent").html(f)}var b=e;if((workflowconfig==WORKFLOW_DIGI_WORK)||(workflowconfig==WORKFLOW_DIGI)||(workflowconfig==WORKFLOW_WORK_SEND)){b+=''+W_SEND_ORDERS[lang]+""}if((workflowconfig==WORKFLOW_DIGI_WORK)||(workflowconfig==WORKFLOW_WORK)||(workflowconfig==WORKFLOW_WORK_SEND)){b+=''+W_WORK_TICKET[lang]+""}if(cashenabled==1){b+=''+W_TO_PAYDESK[lang]+""}b+='';$("#commandbuttons").html(b);$("#waiterui").trigger("create");var c='
';$("#actremark").html(c);if(rightchangeprice==1){var a='';$("#actchangepricesection").html(a);var g='
';g+=getDiscountButton("discount1","a",discount1,discountname1);g+=getDiscountButton("discount2","b",discount2,discountname2);g+=getDiscountButton("discount3","c",discount3,discountname3);g+="
";$("#actdiscount").html(g)}$("#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(k){var i=$("#select-comment").find(":selected").val();$("#optionfield").val(i)});$("#act-select-comment").off("change").on("change",function(k){var i=$("#act-select-comment").find(":selected").val();$("#act-optionfield").val(i)});$("#discard_new_orders_no").off("click").on("click",function(i){i.stopImmediatePropagation();i.preventDefault();parent.history.back()});$("#discard_priceenter").off("click").on("click",function(i){i.stopImmediatePropagation();i.preventDefault();$("#enterpricedlg").dialog("close")});$("#discard_new_orders_yes").off("click").on("click",function(i){i.stopImmediatePropagation();i.preventDefault();neworders=[];gotoOtherPage($("#discardnewordersdlg").data("link"))});$("#prodbackbtn").off("click").on("click",function(i){if(neworders.length!=0){i.stopImmediatePropagation();i.preventDefault();hideMenuProd();$("#discardnewordersdlg").data("link","back_table");$.mobile.changePage("#discardnewordersdlg")}else{parent.history.back()}});$("#searchField").off("keyup").on("keyup",function(i){generateSearchResults()})}function getDiscountButton(f,e,c,a){var b='";if(a.trim()!=""){b='"}return b}function generateSearchResults(){var e=$("#searchField").val().trim().toLowerCase();if(e.length";var a=$("#typprodpage").data("types_prods_sorted");$.each(a,function(h,k){var g=k.longname;if(g.toLowerCase().indexOf(e)>=0){b+='
  • ';if(preferimgmobile==1){var f="php/contenthandler.php?module=products&command=getprodimage&prodid="+k.id+"&size=l";b+=''}b+=toHtml(g);b+=createSearchProdInfoTxt(k.id);b+="
  • "}});b+="";$("#searchResult").html(b);$("#searchResult").trigger("create");$(".srinfo").off("click").on("click",function(i){i.stopImmediatePropagation();i.preventDefault();var f=this.id.split("_")[1];var h=getProdEntry(f);var g=h.price;alert(W_PRICE[lang]+": "+g+" "+currency)});$(".srplus").off("click").on("click",function(h){h.stopImmediatePropagation();h.preventDefault();var g=this.id.split("_")[1];var f=getSearchProdCount(g);$("#srprodcount_"+g).html(f+1)});$(".srminus").off("click").on("click",function(h){h.stopImmediatePropagation();h.preventDefault();var g=this.id.split("_")[1];var f=getSearchProdCount(g);if(f==2){$("#srprodcount_"+g).html("");selectedProdCount=1}else{if(f>2){$("#srprodcount_"+g).html(f-1)}}});$(".searchresult").off("click").on("click",function(g){g.stopImmediatePropagation();g.preventDefault();favOrSearchWasClicked=true;var f=this.id.split("_")[1];selectedProdCount=getSearchProdCount(f);clearSearchAndGoToHigherTypeIfExtrasOpen();levelOneType=0;handleClickOnProd(f)})}}function fillGenCommentsList(f){if(f.status!="OK"){alert("Fehler "+f.code+": "+f.msg);return}var b='';var e=f.msg;var c=0;for(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 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,e){var a=parseFloat(b);if(e!=null){for(var c=0;c";var m=groupedNewOrders.count.length;for(g=0;g1){l=""+h.toString()+"x "+l}var f=groupedNewOrders.prodids[g];if(k!=""){k="

    "+toHtml(k)+"

    "}var c=groupedNewOrders.changedPrices[g];var b=groupedNewOrders.togos[g];var o="";var e=groupedNewOrders.extras[g];if((e!=null)&&(e!="")){o=""+e+""}if(c!="NO"){c=c.replace(".",decpoint);if(b!=0){n+='
  • '+l+k+o+" ("+c+" - To-Go)
  • "}else{n+='
  • '+l+k+o+" ("+c+")
  • "}}else{if(b!=0){n+='
  • '+l+k+o+" - To-Go
  • "}else{n+='
  • '+l+k+o+"
  • "}}}$("#neworders").html(n);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]};$("#actiononneworderel").data("entry",a);$("#actiononneworderel").data("newcount",a.count);$("#actiononneworderel").data("groupedListIndex",b);$("#act-optionfield").val(a.option);$("#togocheckbox").prop("checked",a.togos==1?true:false);actionSelOnNewOrderElem()})}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 gotoTablePage(){var a=$("#tables-page").data("allroomtables");var b=a.length;if(!isTogoOrderSelected||(b==1)){$.mobile.changePage("#tables-page")}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,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+""});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("");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]+"";$("#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(p,s){var r=s.pricesum;var n=r.replace(".",decpoint)+" "+currency;var o=s.prodcount;var m=s.prodready;var q=s.readyQueueIds;if(r!=0){k+='
  • '+s.name+" ("+W_TO_PAY[lang]+": "+n+")"+createServeInfo(s.id,o,m)+"
  • "}else{k+='
  • '+s.name+createServeInfo(s.id,o,m)+"
  • "}});if(c=="t"){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){k+='
  • '+W_APPLY[lang]+"
  • "}for(var f=0;f=0){b="f";h="check"}k+='
  • '+toHtml(g)+"
  • "}if(requestPriceInExtras!=false){k+='
  • '}if(applyExtraBtnPos!=2){k+='
  • '+W_APPLY[lang]+"
  • "}k+=createHigherLine(l);return k}function bindExtrasSel(){$(".extrasel").off("click").on("click",function(n){n.stopImmediatePropagation();n.preventDefault();var a=this.id.split("_");var b=a[1];var f=a[2];if((b=="abottom")||(b=="atop")){var l=getProdEntry(f);var c=l.extras;var o=[];for(var h=0;h=0){o[o.length]={id:b,name:m,price:g.price}}}if(requestPriceInExtras){var k=$("#enterpriceextrasfield").val();k=k.trim();k=k.replace(decpoint,".");if((k!="")&&($.isNumeric(k))){requestPriceInExtras=false;presetPriceInExtras="";addProductToNewOrdersList(f,o,k)}else{alert(W_NO_VALID_PRICE[lang])}}else{addProductToNewOrdersList(f,o)}}else{if(w_extras.indexOf(b)>=0){w_extras.splice(w_extras.indexOf(b),1)}else{w_extras[w_extras.length]=b}if(requestPriceInExtras!==false){presetPriceInExtras=$("#enterpriceextrasfield").val()}var p=listOfExtras(f);$("#typeproducts-list").html(p);refreshList("#typeproducts-list");bindExtrasSel();bindHigherButtons()}})}function lastSelectedProdToStr(){return" ("+W_LAST_SELECTED[lang]+": "+lastSelectedProduct+")"}function listOfTypesProds(e){var a='
  • '+W_SELECTION[lang]+"";if(lastSelectedProduct!=""){a+=lastSelectedProdToStr()}a+="
  • ";var b=$("#typprodpage").data("types_prods");var c=getProdSizeClass();$.each(b.types,function(g,f){if(parseInt(f.ref)==e){a+='
  • '+toHtml(f.name)+"
  • "}});$.each(b.prods,function(g,h){if(parseInt(h.ref)==e){a+='
  • ';if(preferimgmobile==1){var f="php/contenthandler.php?module=products&command=getprodimage&prodid="+h.id+"&size=l";a+=''}a+=toHtml(h.name);if((h.amount!="null")&&(h.amount<11)){a+=" ("+W_ONLY[lang]+" "+h.amount+")"}a+=createProdInfoTxt(h.id);a+="
  • "}});if(e!=0){a+=createHigherLine(c)}return a}function createHigherLine(b){var a='
  • ';a+='
    ';a+='
    ';a+='
    ';a+="
    ";a+="
  • ";return a}function createProdEntryWithTextPrice(a,e,f){var c=getProdEntry(a);if(c!=null){var b=c.price.replace(".",decpoint);return"
    "+b+"
    "}return""}function createProdInfoTxt(b){var a="";if(priceinlist==0){a+="
    "}else{a+=createProdEntryWithTextPrice(b,"prodtextinfo","pinfo")}if(showplusminus==1){a+="
    ";a+="
    "}return a}function createSearchProdInfoTxt(b){var a="";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}}});c.sort(prodcompare);$.each(c,function(g,h){f+='
  • '+toHtml(h.longname);f+=createProdInfoTxt(h.id);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];selectedProdCount=getProdCount(a);handleClickOnProd(a)})}function displayTypesProds(c,b){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(i){i.stopImmediatePropagation();i.preventDefault();favOrSearchWasClicked=false;$("#searchField").val("");generateSearchResults();var g=this.id;var f=g.split("_");if(f[0]=="t"){if(c==0){levelOneType=f[1];c=f[1]}displayTypesProds(f[1],null)}else{var h=f[1];selectedProdCount=getProdCount(h);handleClickOnProd(h)}});bindHigherButtons()});$(".prodinfo").off("click").on("click",function(i){i.stopImmediatePropagation();i.preventDefault();var f=this.id.split("_")[1];var h=getProdEntry(f);var g=h.price;alert(W_PRICE[lang]+": "+g+" "+currency)});$(".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("");selectedProdCount=1}else{if(f>2){$("#prodcount_"+g).html(f-1)}}})}function getHigherType(){var c=$("#typprodpage").data("types_prods");var b=c.types;var f=0;if(!extrasMenuOpen){for(var e=0;e0)){w_extras=[];w_allextras=a;idOfHigherType=c.ref;if(c.unit==1){requestPriceInExtras=true;presetPriceInExtras=""}else{requestPriceInExtras=false}displayTypesProds(b,a);bindExtrasSel()}else{if(c.unit==1){hideMenuProd();enterpricedlgshown=true;$("#enterpricedlg").data("prodid",b);$("#enterpricefield").val("");$.mobile.changePage("#enterpricedlg");bindEnterPriceNumbers()}else{addProductToNewOrdersList(b,null)}}}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(c){c.stopImmediatePropagation();c.preventDefault();var a=$("#enterpricedlg").data("prodid");var b=$("#enterpricefield").val();b=b.trim();b=b.replace(decpoint,".");if((b!="")&&($.isNumeric(b))){$("#enterpricedlg").dialog("close");addProductToNewOrdersList(a,null,b)}else{alert(W_NO_VALID_PRICE[lang])}})}function addProductToNewOrdersList(b,c,f){var g=$("#typprodpage").data("table-info");var a=g[1];addProductToQueue(b,c,"NO",0,f);var h=getProdAudio(parseInt(b));var e=parseInt($("#typprodpage").data("ordervolume"))/10;if(h!=""){var k="customer/"+h;if(h.match(/mp3$/)){$("#audiofile").html('')}else{if(h.match(/ogg$/)){$("#audiofile").html('')}else{if(h.match(/wav$/)){$("#audiofile").html('')}}}document.getElementById("audiofile").load();document.getElementById("audiofile").volume=e;document.getElementById("audiofile").play()}else{if(e>0.5){beep()}}var i="php/contenthandler.php?module=queue&command=getJsonLongNamesOfProdsForTableNotDelivered&tableid="+a;fillNotDeliveredProductsOfATable(i);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,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//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(e){var b="";if(e.option!=""){b=" ("+toHtml(e.option)+")"}var c=e.longname;if(e.togo==1){c="To-Go: "+c}if(e.pricechanged==1){c+=" - "+e.price.replace(".",decpoint)}var a="";if(e.isready=="1"){a+=" ☞"}if(e.isCooking=="1"){a+=" ♨"}if(e.isPaid=="1"){a+=" ☑"}return toHtml(c)+b+a+"
    "+createExtraParagraph(e.extras)}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