dbutils = new DbUtils(); // $this->products = new Products(); --> endless loop! // $this->lastSettingOfDisplayMode = "all"; //error_reporting(E_ALL); } public static function setPluginConfig($plugins) { self::$plugins = $plugins; } public static $g_units_arr = array( array("text" => "Stück","value" => 0,"id" => "piece"), array("text" => "Eingabe","value" => 1,"id" => "piece"), array("text" => "kg","value" => 2,"id" => "kg"), array("text" => "gr","value" => 3,"id" => "gr"), array("text" => "mg","value" => 4,"id" => "mg"), array("text" => "l","value" => 5,"id" => "l"), array("text" => "ml","value" => 6,"id" => "ml"), array("text" => "m","value" => 7,"id" => "m"), array("text" => "EinzweckgutscheinKauf","value" => 8,"id" => "EGK"), array("text" => "EinzweckgutscheinEinl","value" => 9,"id" => "EGE") ); public static function g_units_export_arr() { return array(); } function verifyLastBillId($pdo,$nextIdToUse) { if ($nextIdToUse == 1) { return true; } if (is_null($pdo)) { $pdo = $this->dbutils->openDbAndReturnPdo(); } $nextIdToUse = intval($nextIdToUse); $sql = "SELECT value,signature FROM %work% WHERE item=?"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array("lastbillid")); $row =$stmt->fetchObject(); $lastBillid = intval($row->value); $lastBillInc = $lastBillid+1; if ($lastBillInc != $nextIdToUse) { return false; } else { $sql = "SELECT id FROM %bill% WHERE id=?"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($nextIdToUse)); if ($stmt->rowCount() > 0) { return false; } else { // is there a gap or does the previous id exist? $sql = "SELECT id FROM %bill% WHERE id=?"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($nextIdToUse - 1)); if ($stmt->rowCount() != 1) { return false; } else { return true; } } } } function getKeyFromWorkTable($pdo,$key) { $sql = "SELECT signature FROM %work% WHERE item=?"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($key)); $row =$stmt->fetchObject(); return($row->signature); } public static function setMd5OfLastBillidInWorkTable($pdo) { $sql = "SELECT value FROM %work% where item=?"; $r = self::fetchSqlAll($pdo, $sql, array("lastbillid")); if (count($r) > 0) { $maxid = $r[0]["value"]; $signature = md5("B($maxid)"); $sql = "UPDATE %work% SET signature=? WHERE item=?"; self::execSql($pdo, $sql, array($signature,"lastbillid")); } } function setLastBillIdInWorkTable($pdo,$lastBillId) { if (is_null($pdo)) { $pdo = $this->dbutils->openDbAndReturnPdo(); } $signature = md5("B($lastBillId)"); $sql = "UPDATE %work% SET value=?, signature=? WHERE item=?"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($lastBillId,$signature,"lastbillid")); } function verifyBill($pdo,$id) { if (is_null($pdo)) { $pdo = $this->dbutils->openDbAndReturnPdo(); } $sql = "SELECT billdate,brutto,ROUND(netto,2) as netto,userid,IF(tax is not null, tax, '0.00') as tax,signature,status FROM %bill% WHERE id=?"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(array($id)); $row = $stmt->fetchObject(); $billdate = $row->billdate; $brutto = $row->brutto; $netto = $row->netto; $tax = $row->tax; $userid = $row->userid; $signature = $row->signature; $status = $row->status; return(self::verifyBillByValues($pdo,$billdate, $brutto, $netto, $userid, $signature, $status)); } public static function verifyBillByValues($pdo,$billdate,$brutto,$netto,$userid,$signature,$status) { if (($status == "c") && ($brutto == 0.00)) { // workaround - the signature for cash inserts of vaue 0.00 are sometimes incorrect return true; } if (is_null($signature)) { return false; } if (is_null($pdo)) { $pdo = DbUtils::openDbAndReturnPdoStatic(); } $brutto = number_format($brutto, 2, ".", ''); $netto = number_format($netto, 2, ".", ''); $data = "D($billdate)B($brutto)N($netto)T(0)U($userid)"; $md5OfData = md5($data); if ($signature != $md5OfData) { return false; } else { return true; } } public static function calcSignaturesForAllBills($pdo) { $sql = "SELECT id,billdate,brutto,netto,userid FROM %bill%"; $r = CommonUtils::fetchSqlAll($pdo, $sql); $sql = "UPDATE %bill% SET signature=? WHERE id=?"; foreach($r as $b) { $bruttostr = number_format($b["brutto"], 2, ".", ''); $nettostr = number_format($b["netto"], 2, ".", ''); $theTime = $b["billdate"]; $userid = $b["userid"]; $data = md5("D($theTime)B($bruttostr)N($nettostr)T(0)U($userid)"); CommonUtils::execSql($pdo, $sql, array($data,$b["id"])); } } public static function calcSignatureForBill($theTime,$brutto,$netto,$userid) { // now calculate the signature for the bill entry $bruttostr = number_format($brutto, 2, ".", ''); $nettostr = number_format($netto, 2, ".", ''); $data = "D($theTime)B($bruttostr)N($nettostr)T(0)U($userid)"; $signature = md5($data); return $signature; } function createGridTableWithSqrtSizeOfButtons ($inputArray) { // create a table that is optimal (sqrt-like size) $numberOfIcons = count($inputArray); if ($numberOfIcons == 0) { // no items to display return; } $numberOfCols = ceil(sqrt($numberOfIcons)); $porcentageWidth = floor(100/$numberOfCols); echo ''; $colcounter = 0; for ($index=0;$index<$numberOfIcons;$index++) { if ($colcounter == 0) { echo ""; } } echo ""; echo "
"; } $anEntry = $inputArray[$index]; $textOfButton = $anEntry["textOfButton"]; # $onClickMethod = $anEntry["onClickMethod"]; // With parameters! $button = ''; echo $button; $colcounter++; if ($colcounter == $numberOfCols) { $colcounter = 0; echo "
"; } function createGridTableWithSqrtSizeOfStyleButtons($inputArray) { $this->createGridTableWithSqrtSizeOfStyleButtonsAndHeader($inputArray,'','dummy'); } function getTableNameFromId($pdo,$tableid) { if (is_null($tableid) || ($tableid == 0)) { return "-"; // togo } $sql = "SELECT tableno FROM %resttables% WHERE id=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($tableid)); $row = $stmt->fetchObject(); return $row->tableno; } function getCurrentPriceLevel($pdo) { $sql = "SELECT setting FROM %config% WHERE name='pricelevel'"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(); $row = $stmt->fetchObject(); $pricelevelid = $row->setting; $sql = "SELECT id,name FROM %pricelevel% WHERE id=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($pricelevelid)); $row = $stmt->fetchObject(); $pricelevelname = $row->name; return (array("id" => $pricelevelid, "name" => $pricelevelname)); } function createGridTableWithSqrtSizeOfStyleButtonsAndHeader ($inputArray,$headline,$headercolor) { // create a table that is optimal (sqrt-like size) $numberOfIcons = count($inputArray); if ($numberOfIcons == 0) { // no items to display return; } $numberOfCols = ceil(sqrt($numberOfIcons)); $porcentageWidth = floor(100.0/$numberOfCols); echo ''; // Headline if ($headline <> '') { echo ''; } $colcounter = 0; for ($index=0;$index<$numberOfIcons;$index++) { if ($colcounter == 0) { echo ""; } } echo ""; echo "
' . $headline . '
"; } $anEntry = $inputArray[$index]; $textOfButton = $anEntry["textOfButton"]; # $onClickMethod = $anEntry["onClickMethod"]; // With parameters! $style = $anEntry["style"]; $button = ''; echo $button; $colcounter++; if ($colcounter == $numberOfCols) { $colcounter = 0; echo "
"; } function getCurrency() { $pdo = $this->dbutils->openDbAndReturnPdo(); $sql = "SELECT setting from %config% where name='currency'"; $stmt = $pdo->prepare($this->dbutils->resolveTablenamesInSqlString($sql)); $stmt->execute(); $row =$stmt->fetchObject(); if ($row != null) { return $row->setting; } else { return "Euro"; } } public static function getRowSqlObject($pdo,$sql,$params = null) { $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); if (is_null($params)) { $stmt->execute(); } else { $stmt->execute($params); } return ($stmt->fetchObject()); } public static function fetchSqlAll($pdo,$sql,$params = null) { $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); if (is_null($params)) { $stmt->execute(); } else { $stmt->execute($params); } return ($stmt->fetchAll(PDO::FETCH_ASSOC)); } public static function execSql($pdo,$sql,$params) { $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); if (is_null($params)) { $stmt->execute(); } else { $stmt->execute($params); } } public static function getConfigValueStmt($pdo,$stmt,$item,$default) { $stmt->execute(array($item)); $row =$stmt->fetchObject(); if ($row->countid == 0) { return $default; } else { return self::getExistingConfigValue($pdo, $item); } } public static function getConfigValue($pdo,$item,$default) { $sql = "SELECT count(id) as countid FROM %config% WHERE name=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($item)); $row = $stmt->fetchObject(); if ($row->countid == 0) { return $default; } else { return self::getExistingConfigValue($pdo, $item); } } public static function getConfigValueAtClosingTime($pdo,$item,$default,$closingid) { if (is_null($closingid)) { return self::getConfigValue($pdo, $item, $default); } else { $sql1 = "SELECT MAX(H.id) from %hist% H,%histconfig% C,%config% CO WHERE H.refid=C.id AND (H.action=2 OR H.action=6) AND C.configid=CO.id AND CO.name=? AND H.clsid <= ?"; $sql = "SELECT setting FROM %histconfig% HCO,%hist% H WHERE H.refid=HCO.id AND H.id=($sql1)"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($item,$closingid)); $r = $stmt->fetchAll(PDO::FETCH_ASSOC); if (count($r) == 0) { return $default; } else { return $r[0]["setting"]; } } } public static function getConfigValueAtDateTime($pdo,$item,$default,$datetime) { $sql1 = "SELECT MAX(HC.id) as hcid FROM %hist% H, %histconfig% HC, %config% C WHERE date < ? and H.refid=HC.id AND HC.configid=C.id AND (H.action=2 OR H.action=6) AND C.name=?"; $sql = "SELECT setting FROM %histconfig% where id=($sql1)"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($datetime,$item)); $r = $stmt->fetchAll(PDO::FETCH_ASSOC); if (count($r) == 0) { return $default; } else { return $r[0]["setting"]; } } public static function getExistingConfigValue($pdo,$item) { $sql = "SELECT setting FROM %config% WHERE name=?"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($item)); $row = $stmt->fetchObject(); return $row->setting; } public static function callPlugin($pdo,$fct,$condition) { try { if (!is_null(self::$plugins)) { if (array_key_exists($fct,self::$plugins)) { $plugin = self::$plugins->$fct; if (($plugin->execution) === $condition) { $cls = $plugin->PluginClass; $fct=$plugin->PluginFct; $call = "Plugin\\$cls::$fct"; call_user_func($call,$pdo); return true; } } } } catch(Exception $e) { } return false; } public static function log($pdo, $component, $message) { $dblog = self::getConfigValue($pdo, "dblog", 1); if ($dblog == 1) { date_default_timezone_set(DbUtils::getTimeZoneDb($pdo)); $currentTime = date('Y-m-d H:i:s'); $sql = "INSERT INTO %log% (date,component,message) VALUES(?,?,?)"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(array($currentTime, $component, $message)); } } public static function getLog($pdo) { $sql = "SELECT date,component,message FROM %log%"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(); $result = $stmt->fetchAll(); $txt = ""; foreach ($result as $aLogLine) { $txt .= $aLogLine["date"] . ";" . $aLogLine["component"] . ";" . $aLogLine["message"] . "\n"; } return $txt; } public static function getLastLog($pdo) { $sql = "SELECT date,component,message FROM %log% WHERE DATE_SUB(NOW(),INTERVAL 2 HOUR) <= date"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(); $result = $stmt->fetchAll(); $txt = ""; foreach ($result as $aLogLine) { $txt .= $aLogLine["date"] . ";" . $aLogLine["component"] . ";" . $aLogLine["message"] . "\n"; } return $txt; } public static function keepOnlyLastLog($pdo) { $sql = "DELETE FROM %log% WHERE DATE_SUB(NOW(),INTERVAL 2 HOUR) > date"; $stmt = $pdo->prepare(DbUtils::substTableAlias($sql)); $stmt->execute(); } public static function strEndsWith($haystack, $needle) { return $needle === "" || substr($haystack, -strlen($needle)) === $needle; } public static function startsWith($aText, $needle) { return $needle === "" || strpos($aText, $needle) === 0; } public static function caseOfSqlUnitSelection($pdo) { $decpoint = htmlspecialchars(CommonUtils::getConfigValue($pdo, "decpoint", ".")); $unit = "CASE "; foreach(CommonUtils::$g_units_arr as $aUnit) { if (($aUnit["value"] > 1) && ($aUnit["value"] < 8)) { $unit .= " WHEN Q.unit='" . $aUnit["value"] . "' THEN CONCAT(REPLACE(unitamount,'.','$decpoint'),'" . $aUnit["text"] . "',' ') "; } } $unit .= " ELSE '' "; $unit .= "END"; return $unit; } public static function scaleImg($fn,$maxDim) { list($width, $height, $type, $attr) = getimagesize($fn); $size = getimagesize($fn); $ratio = $size[0] / $size[1]; // width/height if ($ratio > 1) { $width = $maxDim; $height = $maxDim / $ratio; } else { $width = $maxDim * $ratio; $height = $maxDim; } $src = imagecreatefromstring(file_get_contents($fn)); $dst = imagecreatetruecolor($width, $height); imagealphablending($dst, false); imagesavealpha($dst, true); $transparent = imagecolorallocatealpha($dst, 255, 255, 255, 127); imagefilledrectangle($dst, 0, 0, $width, $height, $transparent); imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]); imagedestroy($src); ob_start(); imagepng($dst); // adjust format as needed $imagedata = ob_get_contents(); ob_end_clean(); imagedestroy($dst); return $imagedata; } public static function getFirstSqlQuery($pdo,$sql,$params,$default) { $result = self::fetchSqlAll($pdo, $sql, $params); if (count($result) > 0) { return $result[0]["value"]; } else { return $default; } } public static function canMasterDataBeChanged($pdo) { $sql = "SELECT COUNT(id) as countid FROM %queue% WHERE isclosed is null OR isclosed='0'"; $res = CommonUtils::fetchSqlAll($pdo, $sql); if (intval($res[0]["countid"]) > 0) { return false; } else { return true; } } public static function checkRights($command,$rights) { if (session_id() == '') { session_start(); } if (!array_key_exists($command, $rights)) { echo json_encode(array("status" => "ERROR", "code" => ERROR_COMMAND_NOT_FOUND, "msg" => ERROR_COMMAND_NOT_FOUND_MSG)); return false; } $cmdRights = $rights[$command]; if ($cmdRights["loggedin"] == 1) { if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) { echo json_encode(array("status" => "ERROR", "code" => ERROR_NOT_AUTHOTRIZED, "msg" => ERROR_NOT_AUTHOTRIZED_MSG)); return false; } } if ($cmdRights["isadmin"] == 1) { if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) { echo json_encode(array("status" => "ERROR", "code" => ERROR_NOT_AUTHOTRIZED, "msg" => ERROR_NOT_AUTHOTRIZED_MSG)); return false; } else { if ($_SESSION['is_admin'] == false) { echo json_encode(array("status" => "ERROR", "code" => ERROR_COMMAND_NOT_ADMIN, "msg" => ERROR_COMMAND_NOT_ADMIN_MSG)); return false; } } } if (!is_null($cmdRights["rights"])) { foreach ($cmdRights["rights"] as $aRight) { if ($aRight == 'manager_or_admin') { if (($_SESSION['is_admin']) || ($_SESSION['right_manager'])) { return true; } } else if ($aRight == 'dash') { if ($_SESSION['right_dash']) { return true; } } } echo json_encode(array("status" => "ERROR", "code" => ERROR_NOT_AUTHOTRIZED, "msg" => ERROR_NOT_AUTHOTRIZED_MSG)); return false; } return true; } public static function base64_encode_url($string) { $null = base64_encode( $string ); $eins = strtr( $null, '+/', '-_'); $zwei = rtrim($eins, '='); $bla = $zwei; return rtrim( strtr( base64_encode( $string ), '+/', '-_'), '='); } public static function base64_decode_url($string) { return base64_decode(str_replace(['-', '_'], ['+', '/'], $string)); } public static function referenceValueInTseValuesTable($pdo,$tsevalue) { $sql = "SELECT id FROM %tsevalues% WHERE textvalue=?"; $result = CommonUtils::fetchSqlAll($pdo, $sql, array($tsevalue)); if (count($result) == 0) { $sql = "INSERT INTO %tsevalues% (textvalue) VALUES(?)"; CommonUtils::execSql($pdo, $sql, array($tsevalue)); return $pdo->lastInsertId(); } else { return $result[0]["id"]; } } public static function outputEmptyImage() { header("Content-Type: image/png"); $my_img = imagecreate( 1,1 ); $background = imagecolorallocate( $my_img, 255, 255, 255 ); $black = imagecolorallocate($my_img, 0, 0, 0); imagecolortransparent($my_img, $black); imagepng( $my_img ); imagecolordeallocate( $my_img, $background ); imagecolordeallocate( $my_img, $black ); imagedestroy( $my_img ); } public static function outputWideEmptyImage() { header("Content-Type: image/png"); $my_img = imagecreate( 1000,10 ); $background = imagecolorallocate( $my_img, 255, 255, 255 ); $black = imagecolorallocate($my_img, 0, 0, 0); imagecolortransparent($my_img, $black); imagepng( $my_img ); imagecolordeallocate( $my_img, $background ); imagecolordeallocate( $my_img, $black ); imagedestroy( $my_img ); } public static function getMasterDataAtCertainDateTime($pdo,$thedatetime,$templatename) { $sql = "SELECT H.date from %hist% H, %histconfig% HC, %config% C WHERE HC.configid=C.id AND C.name='usetse' and H.refid=HC.id AND H.action='2'"; $resut = CommonUtils::fetchSqlAll($pdo, $sql); $dateOf2_0_0 = $resut[0]["date"]; $systemParams = array( array("companyinfo","2010-01-01 00:00:00"), array("hosttext","2010-01-01 00:00:00"), array("uid",$dateOf2_0_0), array("sn",$dateOf2_0_0), array("systemid",$dateOf2_0_0), array($templatename,$dateOf2_0_0), array("cashtemplate",$dateOf2_0_0), array("coinvalname",$dateOf2_0_0), array("notevalname",$dateOf2_0_0), array("dsfinvk_name",$dateOf2_0_0), array("dsfinvk_street",$dateOf2_0_0), array("dsfinvk_postalcode",$dateOf2_0_0), array("dsfinvk_city",$dateOf2_0_0), array("dsfinvk_country",$dateOf2_0_0), array("dsfinvk_stnr",$dateOf2_0_0), array("dsfinvk_ustid",$dateOf2_0_0), array("version","2010-01-01 00:00:00")); $sql = "SELECT setting FROM %histconfig% HC where id=("; $sql .= "SELECT MAX(HC.id) as maxid from %hist% H, %histconfig% HC, %config% C WHERE HC.configid=C.id AND C.name=? and H.refid=HC.id"; $sql .= " AND (H.action='2' OR H.action='6') "; $sql .= " AND H.date <= GREATEST(?,?)"; $sql .= ")"; $out = array(); foreach ($systemParams as $aParam) { $theParamName = $aParam[0]; $minDate = $aParam[1]; $settingResult = CommonUtils::fetchSqlAll($pdo, $sql, array($theParamName,$thedatetime,$minDate)); if ($theParamName == $templatename) { $out['template'] = $settingResult[0]["setting"]; } else { if (count($settingResult) == 0) { $out[$theParamName] = null; } else { $out[$theParamName] = $settingResult[0]["setting"]; } } } return $out; } public static function outTransImage() { $name = '../img/trans.png'; $fp = fopen($name, 'rb'); header("Content-Type: image/png"); header("Content-Length: " . filesize($name)); fpassthru($fp); } public static function getTaxesArray($pdo) { $normaltax = CommonUtils::getConfigValue($pdo, 'tax', 19.00); $togotax = CommonUtils::getConfigValue($pdo, 'togotax', 7.00); $taxes = array( array("key" => 1, "value" => $normaltax, "name" => "Allgemeiner Steuersatz (§ 12 Abs. 1 UStG)"), array("key" => 2, "value" => $togotax, "name" => "Ermäßigter Steuersatz (§ 12 Abs. 2 UStG)"), array("key" => 3, "value" => 10.70, "name" => "Durchschnittsatz (§ 24 Abs. 1 Nr. 3 UStG) übrige Fälle"), array("key" => 4, "value" => 5.50, "name" => "Durchschnittsatz (§ 24 Abs. 1 Nr. 1 UStG)"), array("key" => 5, "value" => 0.00, "name" => "Nicht Steuerbar"), array("key" => 6, "value" => 0.00, "name" => "Umsatzsteuerfrei"), array("key" => 7, "value" => 0.00, "name" => "UmsatzsteuerNichtErmittelbar"), array("key" => 11, "value" => 19.00, "name" => "Historischer allgemeiner Steuersatz (§ 12 Abs. 1 UStG)"), array("key" => 12, "value" => 7.00, "name" => "Historischer ermäßigter Steuersatz (§ 12 Abs. 2 UStG)"), array("key" => 21, "value" => 16.00, "name" => "Historischer allgemeiner Steuersatz (§ 12 Abs. 1 UStG)"), array("key" => 22, "value" => 5.00, "name" => "Historischer ermäßigter Steuersatz (§ 12 Abs. 2 UStG)"), ); return $taxes; } public static function getTaxFromKey($pdo,$taxkey) { $taxes = self::getTaxesArray($pdo); foreach($taxes as $t) { if ($taxkey == $t["key"]) { return $t["value"]; } } return 0.0; } public static function getTaxDescriptionFromKey($pdo,$taxkey) { $taxes = self::getTaxesArray($pdo); foreach($taxes as $t) { if ($taxkey == $t["key"]) { return $t["name"]; } } return 0.0; } public static function getCurrencyAsIsoVal($pdo) { $currency = self::getConfigValue($pdo, 'currency', 'Euro'); if (in_array(strtoupper($currency), array("EURO","EUR","E","€"))) { return "EUR"; } return $currency; } }