<?php
//V2.09 2023-06-20	RFR: Proforma Rechnung und Rechnung aus Filialsystem - Menü - gesplittet
//V2.09 2023-06-21	RFR: autobackup löschen nach x Versionen eingefügt

require_once("config/connect.php");
require_once("display/display.php");
require_once("include/qr_lib/qr_sitposprint.php");
require_once("global_functions_ec_terminal.php");
require_once("global_functions_2.php");
require_once("auswertungen_global_functions.php");
require_once("config/sIT_global_db_functions.php");


function isNullOrEmpty($question)
{
	return (!isset($question) || trim($question) === '');
}



function openBonSomaCalc()
{

	$shopPr = false;
	$prNo = false;
	$extendProdSel = "";
	$currentCart = $_SESSION['aktuellerWarenkorb'];
	$checkKp = "";

	if (preg_match('/[0-9]$/', SONDERPREIS_KATEGORIE, $matchRes) == true) {
		$prNo = $matchRes[0];

		$getOpenBon = mysql_query("SELECT offener_bon.ID AS lineId, offener_bon.produkt_id AS prodId, offener_bon.name AS prodName, offener_bon.printname AS printName,  
					(CASE WHEN products.pricesell_" . $prNo . "	= 0 OR products.pricesell_" . $prNo . " IS NULL THEN products.pricesell ELSE products.pricesell_" . $prNo . " END) AS priceSell, 
					offener_bon.stueck AS prodQty, offener_bon.discountChild AS discountChild, offener_bon.tax_rate AS taxRate,  products.VARPRICE AS varprice, 
					(CASE WHEN products.pricesell_" . $prNo . "	= 0 OR products.pricesell_" . $prNo . " IS NULL THEN products.PRICESELL_KAUF_X_ZAHL_Y_X 
						ELSE products.PRICESELL_" . $prNo . "_KAUF_X_ZAHL_Y_X END) AS kzx, 
					(CASE WHEN products.pricesell_" . $prNo . "	= 0 OR products.pricesell_" . $prNo . " IS NULL THEN products.PRICESELL_KAUF_X_ZAHL_Y_Y 
						ELSE products.PRICESELL_" . $prNo . "_KAUF_X_ZAHL_Y_Y END) AS kzy,  							
					(CASE WHEN products.pricesell_" . $prNo . "	= 0 OR products.pricesell_" . $prNo . " IS NULL THEN products.PRICESELL_X_PROZENT_AB_Y_STUECK_X 
						ELSE products.PRICESELL_" . $prNo . "_X_PROZENT_AB_Y_STUECK_X END) AS prozx, 
					(CASE WHEN products.pricesell_" . $prNo . "	= 0 OR products.pricesell_" . $prNo . " IS NULL THEN products.PRICESELL_X_PROZENT_AB_Y_STUECK_Y 
						ELSE products.PRICESELL_" . $prNo . "_X_PROZENT_AB_Y_STUECK_Y END) AS prozy, 
					(CASE WHEN products.pricesell_" . $prNo . "	= 0 OR products.pricesell_" . $prNo . " IS NULL THEN products.PRICESELL_X_FIXRABATT_AB_Y_STUECK_X 
						ELSE products.PRICESELL_" . $prNo . "_X_FIXRABATT_AB_Y_STUECK_X END) AS fixx, 
					(CASE WHEN products.pricesell_" . $prNo . "	= 0 OR products.pricesell_" . $prNo . " IS NULL THEN products.PRICESELL_X_FIXRABATT_AB_Y_STUECK_Y 
						ELSE products.PRICESELL_" . $prNo . "_X_FIXRABATT_AB_Y_STUECK_Y END) AS fixy 
						
						FROM offener_bon 
						LEFT JOIN products ON offener_bon.produkt_id = products.ID
						WHERE bon_id = '" . $currentCart . "' ");
	} else if (strtolower(SONDERPREIS_KATEGORIE) == 'standard') {

		$getOpenBon = mysql_query("SELECT offener_bon.ID AS lineId, offener_bon.produkt_id AS prodId, offener_bon.name AS prodName, offener_bon.name AS prodName,
									offener_bon.printname AS printName, products.pricesell AS priceSell, 
									offener_bon.stueck AS prodQty, offener_bon.discountChild AS discountChild, offener_bon.tax_rate AS taxRate, products.VARPRICE AS varprice, 
									products.PRICESELL_KAUF_X_ZAHL_Y_X  AS kzx, products.PRICESELL_KAUF_X_ZAHL_Y_Y  AS kzy, 
									products.PRICESELL_X_PROZENT_AB_Y_STUECK_X AS prozx, products.PRICESELL_X_PROZENT_AB_Y_STUECK_Y AS prozy,
									products.PRICESELL_X_FIXRABATT_AB_Y_STUECK_X AS fixx, products.PRICESELL_X_FIXRABATT_AB_Y_STUECK_Y AS fixy
						FROM offener_bon 
						LEFT JOIN products ON offener_bon.produkt_id = products.ID
						WHERE bon_id = '" . $currentCart . "' ");
	} else {
		echo json_encode(array("keineSonderpreisKategorie", false, false, "openBonSomaCalc abgebrochen\n", $checkKp));
		#writeLog(basename( __FILE__)." ". __LINE__ , "function openBonSomaCalc abgebrochen -> keine sonderpreis Kategorie erkannt !\n");
		return false;
	}


	$checkKp = "";
	$lineToSelect = false;			# brauchen wir für verschobene Zeile (ans ende geschoben)
	$lineToLock = array();			# wird für sperren und stylen der Discount Zeile verwendet
	while ($somaProd = mysql_fetch_array($getOpenBon)) {

		if (isset($somaProd['varprice']) && $somaProd['varprice'] > 0) {
			#writeLog(basename( __FILE__)." ". __LINE__ , "varprice detected  ->".$somaProd['prodName']." ".$somaProd['varprice']."\n");	
			#  wenn Variabler Preis gibt es keine Preisgruppen Kalkulation
			#   Fehler, wird ein Var-Artikel boniert und dabei das Limit überschritten, wird das aufgrund vom continue nicht angezeigt
			#    wird aber beim nächsten bonieren (kein Var-Artikel) schon berechnet

			#continue;
		}

		$lineToLockElem = false;

		// Kauf 2 zahl 1
		if (($somaProd['kzx'] > 0 || $somaProd['kzx'] < 0) && ($somaProd['kzy'] > 0 || $somaProd['kzy'] < 0)) {

			$prodId = $somaProd['prodId'];
			$parentId = $somaProd['lineId'];
			# wie oft kommt der discount zum tragen, beispiel 4/2 wenn 4 erreicht 2 minus, wenn 8, 4 minus, dazwischen immer der
			#	   niedrigere Wert, deswegen auf Integer abrunden !
			$multipler = floor($somaProd['prodQty'] / $somaProd['kzx']);
			$discountQty = false;
			if ($multipler > 0) $discountQty = ($somaProd['kzx'] - $somaProd['kzy']) * $multipler;

			$getDiscountZeile = mysql_fetch_array(mysql_query("SELECT ID, stueck FROM offener_bon WHERE discountChild = " . $parentId . "  LIMIT 1"));

			$lineToLockElem = $getDiscountZeile['ID'];

			if ($getDiscountZeile['ID'] > 0) {

				if ($discountQty == 0) {
					$delQl = mysql_query("DELETE FROM offener_bon WHERE ID = " . $getDiscountZeile['ID'] . " ");
					if (!$delQl) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);
				} else if (number_format($getDiscountZeile['stueck'], 3, ".", "") != number_format($discountQty, 3, ".", "")) {
					$upQl = mysql_query("UPDATE offener_bon SET stueck = '" . $discountQty . "' WHERE ID = " . $getDiscountZeile['ID'] . " ");
					if (!$upQl) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);
				}
			} else if (!$getDiscountZeile['ID'] && $discountQty > 0) {

				$mId = mysql_fetch_array(mysql_query("SELECT MAX(ID) AS maxId FROM offener_bon "));
				$maxId = $mId['maxId'] + 1;

				if ($somaProd['lineId'] <= $maxId) {
					# wenn es ganz hinten steht ist das nicht relevant, ansonsten höchste ID aller offener_bon Zeilen geben !
					$orderOffenenBon = mysql_query("UPDATE offener_bon SET ID = " . $maxId . " WHERE ID = " . $somaProd['lineId'] . "");
					if (!$orderOffenenBon) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);

					$setAutoincrem = mysql_query("ALTER TABLE offener_bon AUTO_INCREMENT = 1 ");
					if (!$setAutoincrem) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);

					# brauchen wir für offener Bon Zeile Selectieren wenn Zeile (DiscountParent) nach unten verschoben wurde
					$lineToSelect = $maxId;
					#$lineToLock=$getDiscountZeile['ID'];  -> das müsste noch imer false sein, siehe oben das else if !!!
				}

				# in name wird die id vom discountParent eingefügt
				# dazu muss davor der parent an die letzte Stelle vom offener_bon gestellt werder, ganz als letztes alles Warenkörbe !!						
				$kzxTxt = "Kauf " . number_format($somaProd['kzx'], 1, ",", "") . " bezahle " . number_format($somaProd['kzy'], 1, ",", "") . " Aktion";

				writeLog(basename(__FILE__) . " " . __LINE__, "varprice detected  ->" . $somaProd['prodName'] . " " . $somaProd['varprice'] . "  line ID -> " . $somaProd['lineId'] . "\n");

				if (isset($somaProd['varprice']) && $somaProd['varprice'] > 0) {
					$getPrFromOpenBon = mysql_fetch_array(mysql_query("SELECT pricesell FROM offener_bon WHERE ID = " . $lineToSelect . " LIMIT 1 "));
					$somaProd['priceSell'] = $getPrFromOpenBon['pricesell'];
				}

				$insQl = mysql_query("INSERT INTO offener_bon SET name='" . $lineToSelect . "', discountChild='" . $lineToSelect . "', 
								pricesell='-" . $somaProd['priceSell'] . "', tax_rate='" . $somaProd['taxRate'] . "', printname='" . $kzxTxt . "',  
								reference='', code='', pricebuy='0', category='0', varprice=" . $somaProd['varprice'] . ", bon_id='" . $currentCart . "', stueck='" . $discountQty . "' ");
				$lineToLockElem = mysql_insert_id();
			}

			if ($lineToLockElem != false) array_push($lineToLock, $lineToLockElem);
		}
		// Prozent ab Stück Discount
		else if (($somaProd['prozx'] > 0 || $somaProd['prozx'] < 0) && ($somaProd['prozy'] > 0 || $somaProd['prozy'] < 0)) {
			$checkKp .= " " . $somaProd['prozx'] . " prozent ab " . $somaProd['prozy'] . " erkannt\n";
			$prodId = $somaProd['prodId'];
			$parentId = $somaProd['lineId'];
			$lineToLockElem = false;

			# gibts schon eine Discount Zeile ?
			#$getDiscountZeile=mysql_fetch_array(mysql_query("SELECT ID, pricesell, stueck FROM offener_bon WHERE name = '".$prodId."'  LIMIT 1"));
			$getDiscountZeile = mysql_fetch_array(mysql_query("SELECT ID, stueck FROM offener_bon WHERE discountChild = " . $parentId . "  LIMIT 1"));

			$lineToLockElem = $getDiscountZeile['ID'];

			$checkKp .= " check discountzeile " . $getDiscountZeile['ID'] . "   stk-> " . number_format($getDiscountZeile['stueck'], 3, ".", "") . "\n";


			if ($somaProd['prodQty'] >= $somaProd['prozy']) {

				$discountPrice = $somaProd['priceSell'] * ($somaProd['prozx'] / 100);
				$discountSum = $discountPrice * $somaProd['prodQty'];

				$prozTxt = number_format($somaProd['prozx'], 1, ",", "") . " % ab " . number_format($somaProd['prozy'], 0, ",", "") . " Stk. Aktion";

				if ($getDiscountZeile['ID'] > 0) {
					$upQl = mysql_query("UPDATE offener_bon SET pricesell = '-" . $discountSum . "' WHERE ID = " . $getDiscountZeile['ID'] . " ");
					if (!$upQl) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);
					$lineToLockElem = $getDiscountZeile['ID'];
				} else if (!$getDiscountZeile['ID']) {

					$mId = mysql_fetch_array(mysql_query("SELECT MAX(ID) AS maxId FROM offener_bon "));
					$maxId = $mId['maxId'] + 1;

					if ($somaProd['lineId'] - 1 <= $maxId) {
						writeLog(basename(__FILE__) . " " . __LINE__, "in Proz wird ein insert fällig \n");

						$orderOffenenBon = mysql_query("UPDATE offener_bon SET ID = " . $maxId . " WHERE ID = " . $somaProd['lineId'] . "");
						if (!$orderOffenenBon) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);

						$setAutoincrem = mysql_query("ALTER TABLE offener_bon AUTO_INCREMENT = 1 ");
						if (!$setAutoincrem) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);

						# brauchen wir für offener Bon Zeile Selectieren wenn Zeile (DiscountParent) nach unten verschoben wurde
						$lineToSelect = $maxId;
						$lineToLockElem = $getDiscountZeile['ID'];
					}

					$insQl = mysql_query("INSERT INTO offener_bon SET name='" . $lineToSelect . "', discountChild='" . $lineToSelect . "', 
									pricesell='-" . $discountSum . "', tax_rate='" . $somaProd['taxRate'] . "', printname='" . $prozTxt . "', reference='', 
									code='', pricebuy='0', category='0', varprice=false, bon_id='" . $currentCart . "', stueck='1' ");
					$lineToLockElem = mysql_insert_id();
					if (!$insQl) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);
				}
			}
			if ($somaProd['prodQty'] < $somaProd['prozy']) {
				if ($getDiscountZeile['ID'] > 0) {
					$delQl = mysql_query("DELETE FROM offener_bon WHERE ID = " . $getDiscountZeile['ID'] . " ");
					if (!$delQl) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);
				}
			}

			if ($lineToLockElem != false) array_push($lineToLock, $lineToLockElem);
		}
		// Fix Betrag ab Stück Discount	
		else if (($somaProd['fixx'] > 0 || $somaProd['fixx'] < 0) && ($somaProd['fixy'] > 0 || $somaProd['fixy'] < 0)) {

			$prodId = $somaProd['prodId'];
			$parentId = $somaProd['lineId'];
			$lineToLockElem = false;

			$getDiscountZeile = mysql_fetch_array(mysql_query("SELECT ID, stueck FROM offener_bon WHERE discountChild = " . $parentId . "  LIMIT 1"));

			if ($somaProd['prodQty'] >= $somaProd['fixy']) {
				#$discountPrice=$somaProd['priceSell']-$somaProd['fixx'];
				#   der Discount fixBetrag ist als Brutto zu sehen, deswegen Ust rausrechnen

				$checkKp .= " Fix Rabatt u prod Qty erkannt !" . $somaProd['prodQty'] . " / " . $somaProd['fixy'] . "\n";

				$fixNetto = berechne_nettopreis($somaProd['fixx'], $somaProd['taxRate'], $somaProd['prodQty']);
				$discountSum = $fixNetto[1];



				if ($getDiscountZeile['ID'] > 0) {
					$upQl = mysql_query("UPDATE offener_bon SET pricesell = '-" . $discountSum . "' WHERE ID = " . $getDiscountZeile['ID'] . " ");
					if (!$upQl) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);
					$lineToLockElem = $getDiscountZeile['ID'];
				} else if (!$getDiscountZeile['ID']) {
					$mId = mysql_fetch_array(mysql_query("SELECT MAX(ID) AS maxId FROM offener_bon "));
					$maxId = $mId['maxId'] + 1;

					$checkKp .= " fix -> Discount Zeile: false \n";

					if ($somaProd['lineId'] - 1 <= $maxId) {
						//log_to_file("bin in fixrabatt ID:".$maxId);
						$orderOffenenBon = mysql_query("UPDATE offener_bon SET ID = " . $maxId . " WHERE ID = " . $somaProd['lineId'] . "");
						if (!$orderOffenenBon) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);

						$setAutoincrem = mysql_query("ALTER TABLE offener_bon AUTO_INCREMENT = 1 ");
						if (!$setAutoincrem) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);

						# brauchen wir für offener Bon Zeile Selectieren wenn Zeile (DiscountParent) nach unten verschoben wurde
						$lineToSelect = $maxId;
						$lineToLockElem = $getDiscountZeile['ID'];
					}

					$fixTxt = "Minus € " . number_format($somaProd['fixx'], 1, ",", "") . " ab " . number_format($somaProd['fixy'], 1, ",", "") . " Stk. Aktion";

					$insQl = mysql_query("INSERT INTO offener_bon SET name='" . $lineToSelect . "', discountChild='" . $lineToSelect . "',
									pricesell='-" . $discountSum . "', tax_rate='" . $somaProd['taxRate'] . "', printname='" . $fixTxt . "', reference='', code='', 
									pricebuy='0', category='0', varprice=false, bon_id='" . $currentCart . "', stueck='1' ");
					$lineToLockElem = mysql_insert_id();
					if (!$insQl) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);
				}
			} else if ($somaProd['prodQty'] < $somaProd['fixy']) {
				if ($getDiscountZeile['ID'] > 0) {
					$delQl = mysql_query("DELETE FROM offener_bon WHERE ID = " . $getDiscountZeile['ID'] . " ");
					if (!$delQl) log_to_file(basename(__FILE__) . " " . __LINE__ . " Datenbank Error " . mysql_error() . " ", false, false);
				}
			}

			if ($lineToLockElem != false) array_push($lineToLock, $lineToLockElem);
		} else {

			#$checkKp.=$somaProd['prodName']. " Kein SonderDiscount ! \n";
		}
	}
	return array("openBonSomaCalcReturnArray", $lineToSelect, $lineToLock);
	//echo json_encode(array("test openBonSomaCalc", $lineToSelect, $lineToLock, "Bon Id->".$currentCart."\n shopPrice-> ".$shopPr."\n", $checkKp));
}

// Funktion fügt einen Artikel zum Bon dazu
function produkt_hinzufuegen($produkt_id, $stueck, $preis, $aktueller_bon, $ean = true)
{

	if (!isset($_SESSION)) {
		session_start();
	}
	$currentUserId = $_SESSION['userId'];

	$checkOpenCart = mysql_fetch_array(mysql_query("SELECT ID, kunden_id FROM offener_bon WHERE bon_id = " . $aktueller_bon . " LIMIT 1"));

	if (!$checkOpenCart && mysql_error() == false) {
		if (isset($_SESSION["customerToEmptyBon"]) && $_SESSION["customerToEmptyBon"] > 0) {
			$kundeToBon = $_SESSION["customerToEmptyBon"];
			unset($_SESSION['customerToEmptyBon']);
		}
	} else if ($checkOpenCart[0] > 0 && $checkOpenCart[1] > 0) $kundeToBon = $checkOpenCart[1];
	else $kundeToBon = 0;

	if (isset($kundeToBon) && $kundeToBon > 0) $customerIdInsert = " kunden_id='" . $kundeToBon . "',";
	else {
		$customerIdInsert = "";
		$kundeToBon = false;
	}

	//$ean=false;
	if (isset($_REQUEST['ean'])) $ean = rtrim($_REQUEST['ean']);
	//	print_fehler($produkt_id);

	$extendProdSel = "";
	#if(defined('SONDERPREIS_ENABLED') && SONDERPREIS_ENABLED == 'ja'){
	$extendProdSel = ", products.PRICESELL_KAUF_X_ZAHL_Y_X AS kzx, products.PRICESELL_KAUF_X_ZAHL_Y_Y AS kzy, products.PRICESELL_X_PROZENT_AB_Y_STUECK_X AS prozx, 
						products.PRICESELL_X_PROZENT_AB_Y_STUECK_Y AS prozy, products.PRICESELL_X_FIXRABATT_AB_Y_STUECK_X AS fixx, products.PRICESELL_X_FIXRABATT_AB_Y_STUECK_Y AS fixy,
						
						products.PRICESELL_2 AS pricesell_2, products.PRICESELL_2_KAUF_X_ZAHL_Y_X AS kzx2, products.PRICESELL_2_KAUF_X_ZAHL_Y_Y AS kzy2, products.PRICESELL_2_X_PROZENT_AB_Y_STUECK_X AS prozx2, 
						products.PRICESELL_2_X_PROZENT_AB_Y_STUECK_Y AS prozy2, products.PRICESELL_2_X_FIXRABATT_AB_Y_STUECK_X AS fixx2, products.PRICESELL_2_X_FIXRABATT_AB_Y_STUECK_Y AS fixy2,
								
						products.PRICESELL_3 AS pricesell_3, products.PRICESELL_3_KAUF_X_ZAHL_Y_X AS kzx3, products.PRICESELL_3_KAUF_X_ZAHL_Y_Y AS kzy3, products.PRICESELL_3_X_PROZENT_AB_Y_STUECK_X AS prozx3, 
						products.PRICESELL_3_X_PROZENT_AB_Y_STUECK_Y AS prozy3, products.PRICESELL_3_X_FIXRABATT_AB_Y_STUECK_X AS fixx3, products.PRICESELL_3_X_FIXRABATT_AB_Y_STUECK_Y AS fixy3, 
						
						products.PRICESELL_4 AS pricesell_4, products.PRICESELL_4_KAUF_X_ZAHL_Y_X AS kzx4, products.PRICESELL_4_KAUF_X_ZAHL_Y_Y AS kzy4, products.PRICESELL_4_X_PROZENT_AB_Y_STUECK_X AS prozx4, 
						products.PRICESELL_4_X_PROZENT_AB_Y_STUECK_Y AS prozy4, products.PRICESELL_4_X_FIXRABATT_AB_Y_STUECK_X AS fixx4, products.PRICESELL_4_X_FIXRABATT_AB_Y_STUECK_Y AS fixy4, 
						
						products.PRICESELL_5 AS pricesell_5, products.PRICESELL_5_KAUF_X_ZAHL_Y_X AS kzx5, products.PRICESELL_5_KAUF_X_ZAHL_Y_Y AS kzy5, products.PRICESELL_5_X_PROZENT_AB_Y_STUECK_X AS prozx5, 
						products.PRICESELL_5_X_PROZENT_AB_Y_STUECK_Y AS prozy5, products.PRICESELL_5_X_FIXRABATT_AB_Y_STUECK_X AS fixx5, products.PRICESELL_5_X_FIXRABATT_AB_Y_STUECK_Y AS fixy5, 
						
						products.KAUFEBESCHRAENKUNG_X_PRODUKTE_IN_Y_TAGEN_X AS kaufbeschr_x, products.KAUFEBESCHRAENKUNG_X_PRODUKTE_IN_Y_TAGEN_Y AS kaufbeschr_y ";

	#}   macht weiter unten Error wenn preisgruppen abgedeht sind

	if ($ean == "true") {
		#	$sql="select id, reference, code, name, pricebuy, category, pricesell, taxcat, printname, negativeprice, varprice from products WHERE code='".$produkt_id."'";
		if (defined('MEHRFACH_EAN_QUERY') && strtolower(MEHRFACH_EAN_QUERY) == 'ja') {
			$whereCond = " WHERE (code = '" . $produkt_id . "' OR code LIKE '" . $produkt_id . ", %' OR code LIKE '%, " . $produkt_id . "' OR code LIKE '%, " . $produkt_id . ", %') AND products.geloescht=0";
			#bei mehrfach Ean, steht am Anfang vom Datensatz, gibt einen davor und danach, also Mitte oder steht am Ende

		} else $whereCond = " WHERE (code = '" . $produkt_id . "' OR REFERENCE = '" . $produkt_id . "') AND products.geloescht=0";
		
		$sql = "SELECT products.id, reference, code, products.name, pricebuy, category, pricesell, taxcat, printname, negativeprice, varprice, 
							products.supplyprint as prodPrint, categories.supplyprint as catPrint, PRODUKTORDER, products.artikel_art AS artikelArtProd, 
							categories.artikel_art AS artikelArtCat, products.zeitpreis_netto AS productZeitprNetto, 
							categories.zeitpreis_brutto AS catZeitprBrutto " . $extendProdSel . "  
					FROM products 
					LEFT JOIN categories on categories.id=products.category
					 " . $whereCond . " ";
		$preis = "";
		// print_fehler($ean ." ". $sql);
	} else {
		#	$sql="select id, reference, code, name, pricebuy, category, pricesell, taxcat, printname, negativeprice, varprice from products WHERE id='".$produkt_id."'";
		$sql = "select products.id, reference, code, products.name, pricebuy, category, pricesell, taxcat, printname, negativeprice, varprice, 
							products.supplyprint as prodPrint, categories.supplyprint as catPrint, PRODUKTORDER, products.artikel_art AS artikelArtProd, 
							categories.artikel_art AS artikelArtCat, products.zeitpreis_netto AS productZeitprNetto, 
							categories.zeitpreis_brutto AS catZeitprBrutto " . $extendProdSel . "
					from products 
					LEFT JOIN categories on categories.id=products.category
					WHERE products.id='" . $produkt_id . "'";
	}

	$responseFields = "";

	$sql_produkte = mysql_query($sql);
	if (!$sql_produkte) {
		echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	//echo $sql;
	while ($row_produkt = mysql_fetch_assoc($sql_produkte)) {

		$checkProdKaufLImit = false;
		if (isset($row_produkt['kaufbeschr_x']) && is_numeric($row_produkt['kaufbeschr_x']) && $row_produkt['kaufbeschr_x'] > 0) {
			#writeLog(basename( __FILE__)." ". __LINE__ , "kaufbeschr exists ".$row_produkt['kaufbeschr_x']."  \n");

			$checkProdKaufLImit = true;
		}

		if ($ean == "true") {
			$produkt_id = $row_produkt['id'];
		}

		// Wenn kein Print Name angegebne wurde, dann schreibe den Namen in den Printnamen hinein
		if (isNullOrEmpty($row_produkt['printname'])) {
			$printname = $row_produkt['name'];
		} else $printname = $row_produkt['printname'];
		// Wenn kein Stück angegeben wurde, dann setze die Stück auf 1
		if (isNullOrEmpty($stueck)) {
			$stueck = 1;
		}

		if ($row_produkt['prodPrint'] > 0) $supplyPrint = $row_produkt['prodPrint'];
		else if ($row_produkt['catPrint'] > 0) $supplyPrint = $row_produkt['catPrint'];
		else $supplyPrint = 'NULL';


		$refPrintname = $printname;
		global $pattern, $replace;   //   pattern & replace defined in connect.php
		$printname = preg_replace($pattern, $replace, $printname);
		$name = preg_replace($pattern, $replace, $row_produkt['name']);

		if ($row_produkt['artikelArtProd'] > 0) $artikelArt = $row_produkt['artikelArtProd'];
		else if ($row_produkt['artikelArtCat'] > 0) $artikelArt = $row_produkt['artikelArtCat'];
		else $artikelArt = 0;

		# wird am ende der function für sondermarkt Discount Abfrage verwendet KPE
		$rowProdArraySoma = $row_produkt;
		$prodIdSoma = $row_produkt['id'];
		$prodQtySoma = $stueck;
		if ($row_produkt['varprice']) {


			// Schau, ob auch ein Preis einegeben wurde ...
			if (is_numeric($preis)) {
				// Checke ob das Produkt mit negativem Preis konfiguriert wurde;
				if ($row_produkt['negativeprice']) {
					$preis = $preis * -1;
				}

				if (strtolower(PREISEINGABE) != "ja") {
					// steht auf netto eingabe, Preis kann wie er ist in table offener_bon eingefuegt werden
					$vk_preis = $preis;
				} else  // Preisangabe erfolgt brutto
				{
					$sql_query = "SELECT rate from taxes WHERE id='" . $row_produkt['taxcat'] . "'";
					$sql_tax = mysql_query($sql_query);
					if (!$sql_tax) {
						echo "SQL Fehler: " . mysql_error();
						exit(1);
					}
					while ($row_tax = mysql_fetch_assoc($sql_tax)) {
						$steuer = $row_tax['rate'];
						$vk_preis = $preis / (1 + $steuer);
					}
				}

				# check auf Combi Artikel


				$childesExist = mysql_query("SELECT productid, print, variableAufteilung, TAXCAT, RATE FROM combiartikel
										LEFT JOIN products ON productid = products.ID
										LEFT JOIN taxes ON products.TAXCAT = taxes.ID
										WHERE childvon = " . $produkt_id . " ");
				if (mysql_num_rows($childesExist) > 0) {

					$combiArray = array();
					$i = 0;
					$combiPrice = 0;
					while ($combiRow = mysql_fetch_array($childesExist)) {
						$combiArray[$i][0] = $combiRow['productid'];
						$combiArray[$i][1] = $combiRow['print'];

						if (strtolower(PREISEINGABE) != "ja") {
							$teilArtikelPreis = ($combiRow['variableAufteilung'] / 100) * $preis;
							$combiPrice += $teilArtikelPreis * (1 + $combiRow['RATE']);
						} else {
							$teilArtikelPreis = (($combiRow['variableAufteilung'] / 100) * $preis) / (1 + $combiRow['RATE']);
							$combiPrice += ($combiRow['variableAufteilung'] / 100) * $preis;
						}

						$combiArray[$i][2] = $teilArtikelPreis;
						$i++;
					}

					array_unshift($combiArray, array($produkt_id, 0, $combiPrice));
					$vk_preis = $combiPrice;
				}

				$checkVk = number_format($vk_preis, 8, ".", "");		// aus der Ust Rechnung ergibt sich eine zahl mit 10 od mehr kommastellen, die ist ungleich der DB Zahl mit 8 kommastellen
				// deswegen wird hier number format auf 8 stellen gemacht
				$checkExist = mysql_fetch_assoc(mysql_query("SELECT ID, printname, pricesell, beilagen_aenderung_minus, beilagen_aenderung_minus, 
										stueck, produkt_id FROM offener_bon 
									WHERE bon_id=" . mysql_real_escape_string($aktueller_bon) . " AND  produkt_id=" . mysql_real_escape_string($produkt_id) . " AND pricesell=" . mysql_real_escape_string($checkVk) . "  AND printname='" . mysql_real_escape_string($refPrintname) . "'
										AND beilagen_aenderung_minus = '' AND beilagen_aenderung_plus = ''  "));

				if ($checkExist['ID'] > 0 && strtolower(ARTIKEL_OFFENERBON_ADDIEREN) == 'ja') {
					if ($checkExist['stueck'] + $stueck < 0 && strtolower(DISABLE_BON_MINUS_ANZAHL) == 'ja') {
						$responseFields = array('unerlaubte Anzahl', 0, $checkExist['ID']);
					} else {
						if (isset($combiArray)) {
							$updQl = mysql_query("UPDATE offener_bon SET stueck = stueck + " . $stueck . " WHERE ID = " . $checkExist['ID'] . " ");
							if (!$updQl) $responseFields = array('Datenbank Fehler 1 aufgetreten. ' . mysql_error($updQl) . '', $checkExist['ID'] . 0);
							$upd2Ql = mysql_query("UPDATE offener_bon SET stueck = stueck + " . $stueck . " 
													WHERE has_parent = " . $checkExist['ID'] . " AND bon_id = " . $aktueller_bon . " ");

							if (!$updQl || !$upd2Ql) $responseFields = array('Datenbank Fehler 2 aufgetreten. ' . mysql_error($upd2Ql) . '', $checkExist['ID'] . 0);
							else {
								$_SESSION["last_insert_product"] = 0;
								$_SESSION["last_updated_product"] = $checkExist['ID'];
								$responseFields = array('Combiartikel (variable) Menge verändert', $checkExist['ID'], 0);
							}
						} else {
							$updQl = mysql_query("UPDATE offener_bon SET stueck = stueck + " . $stueck . " WHERE ID = " . $checkExist['ID'] . " ");
							$_SESSION["last_insert_product"] = 0;
							$_SESSION["last_updated_product"] = $checkExist['ID'];
							$responseFields = array('erfolgreich', 0, $checkExist['ID']);
						}
					}
				} else {

					if (isset($combiArray)) {
						for ($j = 0; $j < sizeof($combiArray); $j++) {
							if ($j == 0) {
								$hasChild = 1;
								$hasParent = 0;
							} else {
								$hasChild = 0;
								$hasParent = $toSelectId;
							}
							# wenn es ein combin artikel ist		beilagen_prod_orig_preis='".$vk_preis."',	
							// Das scheinen nur Kombi Proudkte zu sein, wo variable Preiseingabe aktiviert ist - glaube ich zumindest - RFR
							$insQl = mysql_query("INSERT INTO offener_bon
													(bon_id, produkt_id, category, TAXCAT, REFERENCE, CODE, NAME, PRICESELL, beilagen_prod_orig_preis, pricebuy, VARPRICE, 
													printname, stueck, tax_rate, PRODUKTORDER, NEGATIVEPRICE, benutzer_id, supplyprint, article_art_id, has_childs, has_parent, childPrint)
													SELECT '" . $aktueller_bon . "', '" . $combiArray[$j][0] . "', CATEGORY, TAXCAT, REFERENCE, 
													CODE, NAME, '" . $combiArray[$j][2] . "', '" . $combiArray[$j][2] . "', PRICEBUY, 1,
													(CASE WHEN PRINTNAME = '' THEN NAME ELSE PRINTNAME END), " . $stueck . ", 
													(SELECT rate from taxes WHERE id=TAXCAT), PRODUKTORDER, NEGATIVEPRICE, '" . $currentUserId . "',supplyprint, 
													artikel_art, " . $hasChild . ", " . $hasParent . ", '" . $combiArray[$j][1] . "'  FROM products 
													WHERE ID = " . $combiArray[$j][0] . " 
									");
							if (!$insQl) {
								file_put_contents('kpcheckit.txt', "\n" . basename(__FILE__) . " " . __LINE__ . "DB operation: " . mysql_error() . "\n", FILE_APPEND);
							} else {
								if ($j == 0) {
									$toSelectId = mysql_insert_id(); # wird auch als parent id für die childs verwendet
									$upQl = mysql_query("UPDATE offener_bon SET parent_id = " . $toSelectId . " WHERE id=" . $toSelectId . "  ");
								}
							}
						}

						$_SESSION["last_updated_product"] = 0;
						$_SESSION["last_insert_product"] = $toSelectId;
						$responseFields = array('Combiartikel (variable) eingefügt', $toSelectId, 0);
					} else {

						$sql = "INSERT INTO offener_bon SET produkt_id=$produkt_id, category='" . $row_produkt['category'] . "', 
										reference='" . $row_produkt['reference'] . "', code='" . $row_produkt['code'] . "',
										name='" . $name . "', pricebuy='" . $row_produkt['pricebuy'] . "', pricesell='" . $vk_preis . "', beilagen_prod_orig_preis='" . $vk_preis . "',
										taxcat=" . $row_produkt['taxcat'] . ", printname='" . $printname . "', negativeprice=" . $row_produkt['negativeprice'] . ",
										benutzer_id = '" . $currentUserId . "', supplyprint='" . $supplyPrint . "', varprice=" . $row_produkt['varprice'] . ", 
										stueck='" . $stueck . "', PRODUKTORDER=" . $row_produkt['PRODUKTORDER'] . ", bon_id='" . $aktueller_bon . "', 
										article_art_id = " . $artikelArt . ", " . $customerIdInsert . "
										tax_rate=(SELECT rate from taxes WHERE id='" . $row_produkt['taxcat'] . "')";
						//echo $sql;
						$sql_query = mysql_query($sql);
						#	run_mysql_query($sql_query);

						if (!$sql_query) {
							$responseFields = array(mysql_error(), 0, 0);
						} else {
							$lastInsId = mysql_insert_id();
							$_SESSION["last_updated_product"] = 0;
							$_SESSION["last_insert_product"] = $lastInsId;
							$responseFields = array('erfolgreich', $lastInsId, 0);
						}
					}
				}
			} else {
				if (!isset($_SESSION['customerToEmptyBon']) && (isset($kundeToBon) && $kundeToBon > 0)) {
					$_SESSION['customerToEmptyBon'] = $kundeToBon;
					# die Session wurde oben gelöscht, weil es ja durch das bonieren einen offenen Bon geben sollte der die Kunden Id 
					#		beinhaltet. Ist es ein Varpreis mit fehlender Preiseingabe bei aktuellen 'customerToEmptyBon' session, würde es keinen
					#		offener_bon geben und die Session wurde in Variable ($kundeToBon) geschrieben haben wir eine Fehler bonieren (Varpreis) und die Cust Session
					#		gelöscht. -> Fehler beim Bonieren -> kein offener Bon -> Kunde to empty bon gelöscht, also weg !
				}
				$responseFields = array('FEHLER: variables Produkt - bitte Preis eingeben', 0, 0);

				# bis hier sind wir im variablen Preis IF !!!!!!
			}
		} else   // Produkt ist mit Fixpreis angelegt
		{
			// Schau, ob auch ein Preis einegeben wurde ...
			if (is_numeric($preis)) {
				$responseFields = array('Fehler: Fixpreis Produkt - keinen Preis eingeben', 0, 0);
				# print_fehler("Fehler: Fixpreis Produkt - keinen Preis eingeben");
			} else // kein Preis für Fixpreis Produkt eingegeben, alles OK
			{
				// Checke ob das Produkt mit negativem Preis konfiguriert wurde;
				if ($row_produkt['negativeprice']) {
					$preis = $preis * -1;
				}

				# 	file_put_contents('kpcheckit.txt', "\n".basename( __FILE__ )." ". __LINE__ ."num Rows: ".mysql_num_rows($childesExist)."\n", FILE_APPEND);
				# check auf Combi Artikel


				$childesExist = mysql_query("SELECT productid, print FROM combiartikel WHERE childvon = " . $produkt_id . " ");
				if (mysql_num_rows($childesExist) > 0) {
					$combiArray = array();
					$combiArray[0][0] = $produkt_id; 		# hier wird das parent Product als erstes, vor den childes eingefügt
					$combiArray[0][1] = 0;
					$i = 1;
					$combiBrutto = 0;
					$combiNetto = 0;
					while ($combiRow = mysql_fetch_array($childesExist)) {
						$combiArray[$i][0] = $combiRow['productid'];
						$combiArray[$i][1] = $combiRow['print'];
						$pr = mysql_fetch_array(mysql_query("SELECT PRICESELL*(1+(SELECT rate FROM taxes WHERE taxes.ID = TAXCAT)) AS bruttopr,
																	PRICESELL AS nettopr
												FROM products WHERE products.ID = " . $combiRow['productid'] . " "));
						$combiBrutto += $pr[0];
						$combiNetto += $pr[1];
						$i++;
					}
				}

				# referenz Price, wenn combiartikel wird der summenpreis zum vergleiche ob dieser im offenn bon steht hergenommen
				# wenn nicht combi ist es der preis aus dem produkte table
				if (isset($combiArray)) {
					$refPrice = $combiBrutto;
				} else $refPrice = $row_produkt['pricesell'];

				$zeitpreis = false;
				if ($row_produkt['productZeitprNetto'] > 0 || $row_produkt['catZeitprBrutto'] > 0) {
					$zeitpreis = checkZeitpreis($produkt_id);
					if ($zeitpreis != false) {
						$refPrice = $zeitpreis;
					}
				}

				# hier wird der prod Price für preisgruppen sondermarkt Funktionen ermittelt, in der function get store price wird zunächst der gesetzte preis ausgelesen, wenn der leer ist
				#   wird der standard price -> pricesell genommen -> wenn pricesell_2-5 leer (nicht eingetragen) nimmer pricesell !
				$soMaPr = getStorePrice($produkt_id);
				if ($soMaPr != false && is_numeric(trim($soMaPr)) == true) $refPrice = $soMaPr;

				$checkExist = mysql_fetch_assoc(mysql_query("SELECT ID, printname, beilagen_aenderung_minus, beilagen_aenderung_minus, stueck, produkt_id, pricesell 
									FROM offener_bon 
									WHERE bon_id=" . mysql_real_escape_string($aktueller_bon) . " AND  produkt_id= " . mysql_real_escape_string($produkt_id) . " AND ROUND(pricesell, 7) = ROUND(" . mysql_real_escape_string($refPrice) . ", 7) 
									AND printname ='" . mysql_real_escape_string($refPrintname) . "' AND beilagen_aenderung_minus = '' AND beilagen_aenderung_plus = '' 
									AND article_art_id = " . mysql_real_escape_string($artikelArt) . " AND has_parent = 0 "));

				#	writeLog(basename( __FILE__)." ". __LINE__ , " ".$checkExist['printname'].", ".$checkExist['pricesell'].", ".$refPrice);

				if ($checkExist['ID'] > 0 && strtolower(ARTIKEL_OFFENERBON_ADDIEREN) == 'ja') {
					if ($checkExist['stueck'] + $stueck < 0 && strtolower(DISABLE_BON_MINUS_ANZAHL) == 'ja') {
						$responseFields = array('unerlaubte Anzahl', 0, $checkExist['ID']);
					} else {
						if (isset($combiArray)) {
							$updQl = mysql_query("UPDATE offener_bon SET stueck = stueck + " . $stueck . " WHERE ID = " . $checkExist['ID'] . " ");
							$upd2Ql = mysql_query("UPDATE offener_bon SET stueck = stueck + " . $stueck . " 
													WHERE has_parent = " . $checkExist['ID'] . " AND bon_id = " . $aktueller_bon . " ");

							if (!$updQl || !$upd2Ql) $responseFields = "Datenbank Fehler 3 aufgetreten." . $responseFields;
							else {
								$_SESSION["last_insert_product"] = 0;
								$_SESSION["last_updated_product"] = $checkExist['ID'];
								$responseFields = array('erfolgreich', 0, $checkExist['ID']);
							}
						} else {
							# GREATEST(0, stueck + ".$stueck.")  ansatz nicht verfolgt, schwer ein message davon zurückzubekommen
							$updQl = mysql_query("UPDATE offener_bon SET stueck = stueck + " . $stueck . " WHERE ID = " . $checkExist['ID'] . " ");

							if (!$updQl) $responseFields = "Datenbank Fehler 4 aufgetreten." . $responseFields;
							else {
								$_SESSION["last_insert_product"] = 0;
								$_SESSION["last_updated_product"] = $checkExist['ID'];
								$responseFields = array('erfolgreich', 0, $checkExist['ID']);
							}
						}
					}
				} else {
					if (isset($combiArray)) {
						if ($stueck < 0 && strtolower(DISABLE_BON_MINUS_ANZAHL) == 'ja') {
							$responseFields = array('unerlaubte Anzahl', 0, 0);
						} else {
							if (isset($kundeToBon) && $kundeToBon > 0) $kundeToBon = $kundeToBon;
							else $kundeToBon = 0;
							$toSelectId = false;

							for ($j = 0; $j < sizeof($combiArray); $j++) {
								$taxRate = mysql_fetch_assoc(mysql_query("SELECT rate FROM taxes WHERE id=(SELECT TAXCAT FROM products WHERE ID = " . $combiArray[$j][0] . ")"));
								$tRate = $taxRate['rate'];
								if ($j == 0) {
									$price = $combiBrutto;
									$hasChild = 1;
									$hasParent = 0;
								} else {
									$price = 'PRICESELL';
									$hasChild = 0;
									$hasParent = $toSelectId;
								}
								file_put_contents('kpcheckit.txt', "\n " . basename(__FILE__) . " " . __LINE__ . ", supplyPrint id: " . $supplyPrint . " \n", FILE_APPEND);

								$insQl = mysql_query("INSERT INTO offener_bon
														(bon_id, produkt_id, category, reference, code, name, pricebuy, pricesell, beilagen_prod_orig_preis, taxcat, printname,
														negativeprice, benutzer_id, supplyprint, varprice, stueck, PRODUKTORDER, article_art_id, kunden_id, tax_rate, 
														has_childs, has_parent, childPrint)
														SELECT '" . $aktueller_bon . "', '" . $combiArray[$j][0] . "', CATEGORY, REFERENCE, CODE, products.NAME, 
														PRICEBUY, " . $price . ", " . $price . ", TAXCAT, (CASE WHEN PRINTNAME = '' THEN products.NAME ELSE PRINTNAME END), 
														NEGATIVEPRICE, '" . $currentUserId . "', IF (products.supplyprint>0, products.supplyprint, categories.supplyprint) , VARPRICE, '" . $stueck . "', PRODUKTORDER, 
														products.artikel_art, '" . $kundeToBon . "', '" . $tRate . "', " . $hasChild . ", '" . $hasParent . "', '" . $combiArray[$j][1] . "'	FROM products 
														LEFT JOIN categories ON categories.id=products.category
														WHERE products.ID = " . $combiArray[$j][0] . " ");
								if (!$insQl) {
									file_put_contents('kpcheckit.txt', "\n" . basename(__FILE__) . " " . __LINE__ . "DB operation: " . mysql_error() . "\n", FILE_APPEND);
								} else {
									if ($j == 0) {
										$toSelectId = mysql_insert_id(); # wird auch als parent id für die childs verwendet
										$upQl = mysql_query("UPDATE offener_bon SET parent_id = " . $toSelectId . " WHERE id=" . $toSelectId . "  ");
									}
								}
							}

							$responseFields = array('Combiartikel eingefügt', $toSelectId, 0);
						}
					} else {

						if ($stueck < 0 && strtolower(DISABLE_BON_MINUS_ANZAHL) == 'ja') {
							$responseFields = array('unerlaubte Anzahl', 0, 0);
						} else {
							# hier ist es für hapy Hour relevant
							# wenn es aus produkt od categorie einen Zeitpreis gibt rufe die funktion checken und calkulieren auf	
							$pricesell = $row_produkt['pricesell'];
							$zeitpreis = false;
							if ($row_produkt['productZeitprNetto'] > 0 || $row_produkt['catZeitprBrutto'] > 0) {
								$zeitpreis = checkZeitpreis($produkt_id);
								if ($zeitpreis != false) $pricesell = $zeitpreis;
							}
							# Wenn Sondermarkt, Sozialmarkt Funktion freigegeben ...KPE
							if (defined('SONDERPREIS_ENABLED') && SONDERPREIS_ENABLED == 'ja') {
								$soMaPr = getStorePrice($produkt_id);
								if ($soMaPr != false && is_numeric(trim($soMaPr)) == true) $pricesell = $soMaPr;
							}
							#writeLog(basename( __FILE__)." ". __LINE__ , " standard PriceSell-> ".$row_produkt['pricesell']."\n");
							$produkt_id=mysql_real_escape_string($produkt_id); 
							$name=mysql_real_escape_string($name);
							$row_produkt['code']=mysql_real_escape_string($row_produkt['code']);
							$produkt_id=mysql_real_escape_string($produkt_id);
							$supplyPrint=mysql_real_escape_string($supplyPrint);
							$row_produkt['reference']=mysql_real_escape_string($row_produkt['reference']);
							$sql = "INSERT INTO offener_bon SET produkt_id=$produkt_id, category='" . $row_produkt['category'] . "', 
												reference='" . $row_produkt['reference'] . "', code='" . $row_produkt['code'] . "',
												name='" . $name . "', pricebuy='" . $row_produkt['pricebuy'] . "', pricesell='" . $pricesell . "', beilagen_prod_orig_preis='" . $pricesell . "',
												taxcat='" . $row_produkt['taxcat'] . "', printname='" . $printname . "', negativeprice='" . $row_produkt['negativeprice'] . "', 
												benutzer_id = '" . $currentUserId . "', supplyprint=" . $supplyPrint . ", varprice='" . $row_produkt['varprice'] . "', stueck='" . $stueck . "', 
												PRODUKTORDER=" . $row_produkt['PRODUKTORDER'] . ", bon_id='" . $aktueller_bon . "',
												article_art_id = '" . $artikelArt . "', " . $customerIdInsert . " 
												tax_rate=(SELECT rate from taxes WHERE id='" . $row_produkt['taxcat'] . "')";
							$insQl = mysql_query($sql);
							if (!$insQl) {
								$responseFields = array("Datenbank Fehler 5 aufgetreten." . mysql_error() . " SQL: " . $sql, 0, 0);
							} else {
								$_SESSION["last_updated_product"] = 0;
								$_SESSION["last_insert_product"] = mysql_insert_id();
								$lastInsId = mysql_insert_id();
								$responseFields = array('erfolgreich', $lastInsId, 0);
							}
						}
					}
				}
			}
		}
	}



	# prodQty ist schon im offener_bon und qty bonieren 
	$prodQty = $stueck;        # noch checken ob schon im offener_bon vorhanden !!!!!!!
	$checkQtyLimit = checkQtyLimit($kundeToBon, $produkt_id, $prodQty, $aktueller_bon);

	#writeLog(basename( __FILE__)." ". __LINE__ . "sonderpreis: ".SONDERPREIS_ENABLED." kd-> ".$kundeToBon." prod-> ".$produkt_id." qty-> ".$prodQty." retour kommt: ".$checkQtyLimit[3]."\n");

	$openToEdit = false;
	if (defined('FUNKTION_BONIEREN_AUTOMATISCH_EDITIEREN') && strtolower(FUNKTION_BONIEREN_AUTOMATISCH_EDITIEREN) == 'ja') $openToEdit = 'openToEdit';
	$bonData = offenen_bon_anzeigen($aktueller_bon, 'bonieren_funktion');
	$responseFields[4] = $bonData;			# da steht der offene Bon inhalt drinnen
	// $bonData[6] ist offenerBonToEdit
	$responseFields[5] = $openToEdit;
	if ($ean == "true") $responseFields[6] = 'eanBonieren';

	$responseFields[8] = $checkQtyLimit[3];


	# EK Limit abzüglich schon gekauft und abzüglich derzeit im offener_bon checken

	#	$kdEinkaufsLimit=false;
	#	$responseFields[8] = $kdEinkaufsLimit;

	#werden an kassieren Zeile 4xx function produkt_bonieren (ajax call) zurückgegeben  nachfolgend gilt für normal bonieren, bei combi, unerlaubt Minus Anzahl, .. ist alles anders !!!
	#	$responseFields[0] txt-> erfolgreich od ??, [1], [2], [3], [4]-> offenerBonInhaltHtmlZeugs, [5]->openToEdit, [6]->'eanBonieren',  []->wird event Soma LImit Überschritten mit wert od so
	echo json_encode($responseFields);
}

function wurde_arbeitszeit_geschrieben($benutzer_id, $con)
{
	$datum = date("Y-m-d");

	$Q1 = sIT_mysql_run_query($con, "SELECT ID, benutzer_id, datum, absenz_name, az_beginn, az_ende 
										FROM arbeitszeit_schreiben
										WHERE datum='$datum' AND benutzer_id='$benutzer_id'", true);
	if (sIT_mysql_num_rows($Q1) > 0) return true;
	else return false;
}

// Funktion schaut nach, ob alle Zeiten geschrieben wurden
function wurden_alle_arbeitszeiten_geschrieben()
{
	$con = sIT_mysql_connect(SQL_HOST, SQL_USER, SQL_PW, SQL_DB);

	$datum = date("Y-m-d");

	$Q1 = sIT_mysql_run_query($con, "SELECT id,name from benutzer WHERE arbeitszeit_schreiben=1", true);
	while ($row1 = sIT_mysql_get_row($Q1)) {
		$user_id = $row1['id'];
		if (!wurde_arbeitszeit_geschrieben($user_id, $con)) return (false);
	}
	return (true);
}

function berechne_nettopreis($brutto_preis, $tax_rate, $stueck)
{
	$netto_einzel = $brutto_preis / (1 + $tax_rate);
	# KPE jan 20121 rundungsfehler Soma -   
	# Angabe von RFR -> fixpreis Rabatt, Produkt mit 50 Cent VK Brutto 10% Steuer 0.30 Euro Rabatt ab 1 Stück.
	#	Angeblich macht das einen Rundungsfehler beim 2. Stück, das dritte funktioniert wieder.
	#$netto_summe=round($netto_einzel*$stueck, 2);
	$netto_summe = $netto_einzel * $stueck;
	$steuer = $netto_einzel * $tax_rate;
	$brutto_summe = $brutto_preis * $stueck;
	$steuer_summe = round($brutto_summe - $netto_summe, 2);

	return (array($netto_einzel, $netto_summe, $steuer, $steuer_summe));
}

// Funktion berechnet den Brutto Preis einer Produktzeile
function berechne_bruttopreis($netto_preis, $tax_rate, $stueck)
{
	$brutto_einzel = $netto_preis + $netto_preis * $tax_rate;
	$brutto_summe = $brutto_einzel * $stueck;
	$brutto_summe = round($brutto_summe, 2);

	$netto_summe = $netto_preis * $stueck;

	$steuer = $netto_preis * $tax_rate;
	$steuer_summe = $brutto_summe - $netto_summe;
	$steuer_summe = round($steuer_summe, 2);

	/*
		
		$steuer_summe=$netto_preis*$tax_rate*$stueck;
		*/

	return (array($brutto_einzel, $brutto_summe, $steuer, $steuer_summe));
}

// Berechnet den Gesamtpreis brutto von einem Kombiartikel aus den Childs
// netto macht keinen Sinn, da mehrere Steuersätze beteiligt sind!
function berechne_bruttopreis_von_kombiartikel($offene_produkt_kombi_id)
{
	$gesamtpreis_brutto = 0;
	$sql = "SELECT offener_bon.ID, offener_bon.NAME, TAXCAT, RATE as tax_rate, stueck, PRICESELL 
				from offener_bon 
				LEFT JOIN taxes ON TAXCAT=taxes.ID
				WHERE has_parent='$offene_produkt_kombi_id'";
	$Q1 = mysql_query($sql);
	if (!$Q1) echo mysql_error();
	while ($row1 = mysql_fetch_assoc($Q1)) {
		$line_id = $row1['ID'];
		$netto_preis = $row1['PRICESELL'];
		$tax_rate = $row1['tax_rate'];
		$stueck = $row1['stueck'];
		list($brutto_einzel, $brutto_summe, $steuer, $steuer_summe) = berechne_bruttopreis($netto_preis, $tax_rate, $stueck);
		$gesamtpreis_brutto += $brutto_einzel;
	}
	$sql = "UPDATE offener_bon SET PRICESELL='" . $gesamtpreis_brutto . "' WHERE ID='$offene_produkt_kombi_id'";
	mysql_query($sql);
	return $gesamtpreis_brutto;
}

// Wenn ein Kombiprodukt geändert wird, (Beilagen)
// und es mehr als ein Stück ist, dann wird das Produkt in 2 Produkte aufgeteilt
// einmal ein Stück und einmal der Rest
function ein_kombiprodukt_wegsplitten($parent_produkt_id)
{
	$currentUserId = $_SESSION['userId'];
	$Q1 = mysql_query("SELECT * FROM offener_bon WHERE ID='" . $parent_produkt_id . "'");
	while ($row1 = mysql_fetch_assoc($Q1)) {
		// TODO: Alex
		if ($row1['stueck'] > 1) {
			echo "Stück ist größer als 1";
			$neue_stueck = $row1['stueck'] - 1;

			$dbId = $parent_produkt_id;
			$origData = mysql_fetch_array(mysql_query("SELECT * FROM offener_bon WHERE ID = " . $dbId . ""));
			$name = $origData['NAME'];
			$insQl = mysql_query("INSERT INTO offener_bon SET bon_id = '" . $origData['bon_id'] . "', produkt_id = '" . $origData['produkt_id'] . "', 
									REFERENCE = '" . $origData['REFERENCE'] . "', CODE = '" . $origData['CODE'] . "', NAME = '" . $origData['NAME'] . "', 
									PRICEBUY = '" . $origData['PRICEBUY'] . "', PRICESELL = " . $origData['PRICESELL'] . ", CATEGORY = '" . $origData['CATEGORY'] . "', 
									TAXCAT = '" . $origData['TAXCAT'] . "', IMAGE = '" . $origData['IMAGE'] . "', DISPLAY = '" . $origData['DISPLAY'] . "', 
									VARPRICE = '" . $origData['VARPRICE'] . "', printname = '" . mysql_real_escape_string($name) . "', 
									NEGATIVEPRICE = '" . $origData['NEGATIVEPRICE'] . "', PRODUKTORDER = '" . $origData['PRODUKTORDER'] . "', 
									SICHTBAR = '" . $origData['SICHTBAR'] . "', supplyprint = '" . $origData['supplyprint'] . "', articlePrinted = 0, 
									stueck = '" . $neue_stueck . "', tax_rate = '" . $origData['tax_rate'] . "', beilagen_aenderung_minus = '" . $origData['beilagen_aenderung_minus'] . "', 
									beilagen_aenderung_plus = '" . $origData['beilagen_aenderung_plus'] . "', article_art_id = '" . $origData['article_art_id'] . "', 
									kunden_id = '" . $origData['kunden_id'] . "', beilagen_sum_netto = '" . $origData['beilagen_sum_netto'] . "', beilagen_sum_brutto = '" . $origData['beilagen_sum_brutto'] . "',
									beilagen_prod_orig_preis = '" . $origData['beilagen_prod_orig_preis'] . "', beilagen_basispreis_key='" . $origData['beilagen_basispreis_key'] . "',
									benutzer_id = '" . $currentUserId . "', has_childs = '" . $origData['has_childs'] . "'");

			if (!$insQl) {
				writeSitposLog(basename(__FILE__) . "*+* " . __LINE__, "Datenbank Error: " . mysql_error());
				echo mysql_error();
			} else {

				$insertedId = mysql_insert_id();
				// 2 Sterne an den geänderten Artikel hängen
				$sql = "UPDATE offener_bon SET PRINTNAME='" . mysql_real_escape_string($name . " **") . "' WHERE ID = " . $dbId . "";
				echo $sql;
				mysql_query($sql);

				// Childs auch noch migrieren
				// hier gehört eigentlich der jetzige benutzer eingefügt, nicht der der damals boniert hat!
				if ($origData['has_childs']) {
					// Das Feld parent_id auf die eigene ID setzen!
					$updQl = mysql_query("UPDATE offener_bon SET parent_id = " . $insertedId . " WHERE ID = " . $insertedId . " ");
				}
				$Q3 = mysql_query("SELECT * FROM offener_bon WHERE has_parent = " . $dbId . "");
				while ($origData = mysql_fetch_array($Q3)) {
					$insQl = mysql_query("INSERT INTO offener_bon SET bon_id = '" . $origData['bon_id'] . "', produkt_id = '" . $origData['produkt_id'] . "', 
									REFERENCE = '" . $origData['REFERENCE'] . "', CODE = '" . $origData['CODE'] . "', NAME = '" . $origData['NAME'] . "', 
									PRICEBUY = '" . $origData['PRICEBUY'] . "', PRICESELL = " . $origData['PRICESELL'] . ", CATEGORY = '" . $origData['CATEGORY'] . "', 
									TAXCAT = '" . $origData['TAXCAT'] . "', IMAGE = '" . $origData['IMAGE'] . "', DISPLAY = '" . $origData['DISPLAY'] . "', 
									VARPRICE = '" . $origData['VARPRICE'] . "', printname = '" . $origData['printname'] . "', 
									NEGATIVEPRICE = '" . $origData['NEGATIVEPRICE'] . "', PRODUKTORDER = '" . $origData['PRODUKTORDER'] . "', 
									SICHTBAR = '" . $origData['SICHTBAR'] . "', supplyprint = '" . $origData['supplyprint'] . "', articlePrinted = 0, 
									stueck = '" . $neue_stueck . "', tax_rate = '" . $origData['tax_rate'] . "', beilagen_aenderung_minus = '', 
									beilagen_aenderung_plus = '', article_art_id = '" . $origData['article_art_id'] . "', benutzer_id = '" . $currentUserId . "',
									kunden_id = '" . $origData['kunden_id'] . "', beilagen_sum_netto = '" . $origData['beilagen_sum_netto'] . "', beilagen_sum_brutto = '" . $origData['beilagen_sum_brutto'] . "',
									beilagen_prod_orig_preis = '" . $origData['beilagen_prod_orig_preis'] . "', beilagen_basispreis_key='" . $origData['beilagen_basispreis_key'] . "',
									has_parent=$insertedId");
				}

				$updQl = mysql_query("UPDATE offener_bon SET stueck = 1 WHERE ID = " . $dbId . " ");
				if (!$updQl) file_put_contents('kpcheckit.txt', "\n " . basename(__FILE__) . " " . __LINE__ . "Datenbank Error: " . mysql_error() . "  \n ", FILE_APPEND);
				$updQl = mysql_query("UPDATE offener_bon SET stueck = 1 WHERE has_parent = " . $dbId . " ");
				berechne_bruttopreis_von_kombiartikel($dbId);
				berechne_bruttopreis_von_kombiartikel($insertedId);
				if (!$updQl) file_put_contents('kpcheckit.txt', "\n " . basename(__FILE__) . " " . __LINE__ . "Datenbank Error: " . mysql_error() . "  \n ", FILE_APPEND);
				echo "update Produkt ID" . $dbId . ", new Product Line" . $insertedId;
			}
		}
	}
}

function reini_debug($fehler = "")
{
	echo "<script> alert ('" . $fehler . "') </script>";
}

# DEP exportieren
function getReportDataExportProtocol($callFrom = false)
{
	if (!isset($_SESSION)) {
		session_start();
	}

	$tableCol = "dep.datum_zeit";
	$sqlDateWhere = getReportDateWhere($tableCol, 'reports');

	$dateWhere = $sqlDateWhere[0];
	$whereInfo = $sqlDateWhere[1];

	if (isset($_POST['reportTarget']) && $_POST['reportTarget'] != "")	$reportTarget = $_POST['reportTarget'];
	else if ($callFrom == 'backupRunDepToFile') {
		$reportTarget = 'backupRunDepToFile';
	} else $reportTarget = false;

	$belege_all = array();

	# den startbeleg auslesen

	$getStartbeleg = mysql_fetch_array(mysql_query("SELECT bon_id FROM abschluss_belege ORDER BY bon_id ASC LIMIT 1"));

	if (!$getStartbeleg['bon_id']) $getStartbeleg['bon_id'] = 0;

	$sigStartbeleg = $getStartbeleg['bon_id'];
	if ($dateWhere == '') $addWehre = 'WHERE beleg_nr >= ' . $getStartbeleg['bon_id'] . ' ';
	else  $addWehre = ' AND beleg_nr >= ' . $getStartbeleg['bon_id'] . ' ';

	$xQl = mysql_query("SELECT * FROM dep " . $dateWhere . $addWehre . " ORDER BY beleg_nr");

	while ($rowQl = mysql_fetch_array($xQl)) {
		$dDate = strtotime($rowQl['datum_zeit']);
		$depDate = date('Y-m-d', $dDate) . "T" . date('H:i', $dDate) . "_";
		$belegStr = $rowQl['kassen_id'] . "_" . $rowQl['beleg_nr'] . "_" . $depDate . $rowQl['betr_satz_norm'] . "_" . $rowQl['betr_satz_erm_1'] . "_" . $rowQl['betr_satz_erm_2'] . "_" . $rowQl['betr_satz_null'] . "_" . $rowQl['betr_satz_besonder'] . "_" . $rowQl['umsatz_zaehler'] . "_" . $rowQl['zertif_nr'] . "_" . $rowQl['signatur_vorigerbeleg'];

		if ($rowQl['signjws'] == "" || $rowQl['signjws'] == 'unsigniert') {
			array_push($belege_all, $belegStr);
		} else {
			array_push($belege_all, $rowQl['signjws']);
		}
	}

	$signaturZert = false;
	$zertifizierungsStellen = false;

	if (defined('SIGNATUR_MODUS') && strtolower(SIGNATUR_MODUS) == 'com' && defined('ZERTIFIKATS_NR') && ZERTIFIKATS_NR > 100) {
		$cardInfo = new COM('ATrustRegistrierkasseCom.Registrierkasse');
		$ret = $cardInfo->Initialize;

		$retInfo = $cardInfo->LoadInfo;

		$signaturZert = $cardInfo->Certificate;
		$zertifizierungsStellen = $cardInfo->IssuerCertificate;
	} else if (defined('SIGNATUR_MODUS') && strtolower(SIGNATUR_MODUS) != 'com' && defined('ZERTIFIKATS_NR') && ZERTIFIKATS_NR > 100) {
		$commandZert = "C:\sitpos\_rkExe\ATrustRegistrierkasseExe.exe --cardinfo";
		exec($commandZert, $outputZert, $error_codeZert);

		$cardInfo = explode(";", $outputZert[0]);
		$signaturZert = $cardInfo[2];
		$zertifizierungsStellen = array($cardInfo[3]);
	}

	$dData = array("Signaturzertifikat" => $signaturZert, "Zertifizierungsstellen" => $zertifizierungsStellen, "Belege-kompakt" => $belege_all);
	$dataRes = json_encode(array("Belege-Gruppe" => array($dData)));

	if ($reportTarget == 'screen') {
		$savePath = "docs/reports/depExport.json";
		file_put_contents($savePath, $dataRes);

		echo "<a href='" . $savePath . "' download='DEP Export " . date('Y-m-d H-i') . ".json'>
						<button  class='button_none_float button_gross orange kassenAbschlBut' style='display:block; margin:5px auto;'>Dep Speichern</button>
					</a><br /><br /><br />
					<hr /><input type='hidden' value=' display success' />"; // .$dataRes;
		echo "Anzahl der Belege :" . count($belege_all);
	} else if ($reportTarget == 'backupRunDepToFile') {

		# August 2020 geändert, file_put_contents scheint ein Datenmende Limit zu haben.
		# abgesehen vom Limit das dann einen Error erzeugt darf hier kein echo ausgeführt werden, das steht dann im DB Backup 
		# oben in der ersten Zeile !!! 
		$dataPath = urldecode("d:/test");
		$savePath = $dataPath . "depAutoBackup_" . date('Ymd_His') . ".json";
		$userInfo = $_SESSION["userName"] . "/" . $_SESSION["userId"];
		#	$savePath=$dataPath. "depBackup_".date('Ymd_His').".json";
		#	$savePath=__dir__ .$dataPath."depAutoBackup_".date('Ymd_His').".json";
		
		if (is_dir($dataPath)) {
			$file = fopen($savePath, "w");
			$writeDataMsg = fwrite($file, $dataRes);
			fclose($file);

			if ($writeDataMsg === false) {
				writeSitposLog(basename(__FILE__) . " " . __LINE__, "Benutzer/id: " . $userInfo . ", Automatisches DEP Backup, ausgeloest von DB Backup. ERROR !!! Path -> " . $savePath . "");
				write_to_file("Benutzer/id: " . $userInfo . ", Automatisches DEP Backup, ausgeloest von DB Backup. ERROR !!! Path -> " . $savePath . "");
			} else if (is_int($writeDataMsg) && $writeDataMsg  > 0) {
				writeSitposLog(basename(__FILE__) . " " . __LINE__, "Benutzer/id: " . $userInfo . ", Automatisches DEP Backup, ausgeloest von DB Backup erstellt. -> " . $savePath . ", File Size -> " . $writeDataMsg . "\n");
			}
		} else {
			writeSitposLog(basename(__FILE__) . " " . __LINE__, "Benutzer/id: " . $userInfo . ", Automatisches DEP Backup ERROR !!! " . $dataPath . " is_dir -> false !");
			write_to_file("Benutzer/id: " . $userInfo . ", Automatisches DEP Backup ERROR !!! " . $dataPath . " is_dir -> false !");
	
		}
	}
}
function write_to_file($message, $write = false)
{
	$datum = date("Y-m-d H:i:s");
	/*
		$file = __DIR__.'\backuperror.html';
		$current = file_get_contents($file);
		$current .= "<html>
		<head>
		<title>Error</title>
		
		</head>
		<body>
		<h3>Error</h3>
		<p>".$datum."</p>
		<p>Der Pfad $message wurde nicht gefunden</p>
		</body>
		</html>";
		// Schreibt den Inhalt in die Datei zurück
		file_put_contents($file, $current);
		if ($write)
		{
			//exec('start "" "C:\Program Files\Mozilla Firefox\Firefox.exe"  --new-window "'.$file.'"');
			//exec('start "" "C:\sitpos\Firefox\FirefoxPortable.exe" -height 200 -width 200 "'.$file.'"');
		}
		*/
}


	//define('BACKUP_PATH', '.\\docs\\auto_backup\\');
	//define('ANZAHL_BACKUPS', 2);

	// Funktion listet ein directory in umgekehrter reihenfolge
	function list_dir_reverse($dirname)
	{
		//echo "Dir: $dirname <br>";
		$old_dir=getcwd();
		chdir($dirname);
		$files = glob("*.sql");
		foreach ($files as $f){
		  $tmp[basename($f)] = filemtime($f);
		}
		arsort($tmp);
		$files = array_keys($tmp);
		chdir($old_dir);
		return($files);
	}
	
	//Löscht alle alten Datein und lässt x Stück stehen
	function delete_backup_files($dataPath, $files)
	{
		$i=0;
		foreach ($files as $file) 
		{
			$i++;
		   if ($i <= ANZAHL_BACKUPS) continue;
		   $datei="$dataPath"."$file";
		   //if (file_exists( $datei )) echo "jo die gibts";
		   echo "Lösche Backup:".$datei."\n";  
		   unlink ($datei);
		}
	}
	
	// Sucht alle Dateien und ruft dann das Löschen auf
	function delete_all_backup_files($dataPath)
	{
		if (defined('ANZAHL_BACKUPS') &&  ANZAHL_BACKUPS > 0)
		{
			$files=list_dir_reverse($dataPath);
			delete_backup_files($dataPath, $files);
			echo "<br>";
			print_r($files);
		}
	}
	
function run_auto_backup_command($callFrom = false)
{

	//debug_to_console("Backup wird durchgefuehrt ...");
	sitpos_welt_anzeigen("Backup wird durchgefuehrt ...");
	ini_set('max_execution_time', 0);
	$dataPath = urldecode(AUTOMATISCH_BACKUP_PFAD);

	if (preg_match("/^[a-z]:[\\ | \/]*/i", $dataPath)) {
		# erkennen hier externes Laufwerk, Stick, ....
		$filename = $dataPath . KASSA_ID . "_backup_" . date('Y_m_d_Hi') . ".sql";
	} else $filename = __dir__ . "/" . $dataPath . KASSA_ID . "_backup_" . date('Y_m_d_Hi') . ".sql";

	#	$checkLocation=getenv("HOMEPATH");
	#	if(preg_match("/users\\\kp_/i", $checkLocation)){
	#			$command="e:\\Programme\\xampp\\mysql\\bin\\mysqldump -u ".SQL_USER." -p".SQL_PW." ".SQL_DB." --add-drop-database >$filename";
	#	}
	#	else {
	
	if ( !file_exists($filename))
	{
		write_to_file($filename, true);
		/*
		//$pfad = writeSitposLog(false,false);
		$datum = date("Y-m-d H:i:s");
		$file = __DIR__.'\backuperror.html';
		$current = file_get_contents($file);
		$current .= "<html>
		<head>
		<title>Erorr</title>
		
		</head>
		<body>
		<h3>Error</h3>
		<p>".$datum."</p>
		<p>Der Pfad $filename wurde nicht gefunden</p>
		</body>
		</html>";
		// Schreibt den Inhalt in die Datei zurück
		file_put_contents($file, $current);
				
		exec('start "" "C:\Program Files\Mozilla Firefox\Firefox.exe" -new-window "'.$file.'"');
		*/
	}
	$command = "c:\\xampp\\mysql\\bin\\mysqldump -u " . SQL_USER . " -p" . SQL_PW . " " . SQL_DB . " --add-drop-database >$filename";
	#	}
	$output = array();

	// TODO Alex mehr als 5(konfigurierbar) backups löschen

	exec($command, $output, $error_code);

	// TODO Alex Fehler exec exit;

	if (defined('LAENDERKENNUNG_DE') && strtolower(LAENDERKENNUNG_DE) == 'a') {
		//require_once("ajax_funktionen_kp.php");
		$runDepToFile = getReportDataExportProtocol('backupRunDepToFile');
	}

	delete_all_backup_files($dataPath);
	if ($callFrom == 'kassenabschluss') {
		return json_encode(array($dataPath, $output, $error_code, $filename));
	} 
	else echo json_encode(array($dataPath, $output, $error_code, $filename));

	ini_set('max_execution_time', 30);
	
}


function a4_lieferschein_drucken($ls_nr)
{

	$printRes = lieferschein_ausdrucken_a4_pdf($ls_nr, false);
	if ($printRes[1] === 'printerPrint') $printResult = "Target: Printer nicht supported - Bildschirm Druck einstellen";
	else {
		$printResult = "Lieferschein Nr." . $printRes[3] . " erstellt." . $printRes[1] . $printRes[4];
		$filename = $printRes[4];

		echo "<script>window.open('" . $filename . "', '_blank')</script>";
	}
}

// Wen die Abholschein Nummer höher ist, dann zurücksetzen - Küchenbildschirm
function abholschein_nummer_zuruecksetzen()
{
	$nummer = false;
	$sql = "select abholschein_nr from fortlaufende_nummern WHERE id='1'";
	$sql_nummern = mysql_query($sql);
	if (!$sql_nummern) {
		echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	while ($row_nummern = mysql_fetch_assoc($sql_nummern)) {
		$abholschein_nr = $row_nummern['abholschein_nr'];
		if ($abholschein_nr >= intval(KUECHE_ABHOLSCHEIN_MAX_NUMMER)) {
			mysql_query("UPDATE fortlaufende_nummern SET abholschein_nr='1' WHERE id='1'");
		}
	}
	return ($abholschein_nr);
}

// Funktion liest das Betriebssystem aus und gibt den String zurück
function getOS()
{
	$user_agent     =   $_SERVER['HTTP_USER_AGENT'];
	$os_platform    =   "Unknown OS Platform";
	$os_array       =   array(
		'/windows nt 10/i'     =>  'Windows 10',
		'/windows nt 6.3/i'     =>  'Windows 8.1',
		'/windows nt 6.2/i'     =>  'Windows 8',
		'/windows nt 6.1/i'     =>  'Windows 7',
		'/windows nt 6.0/i'     =>  'Windows Vista',
		'/windows nt 5.2/i'     =>  'Windows Server 2003/XP x64',
		'/windows nt 5.1/i'     =>  'Windows XP',
		'/windows xp/i'         =>  'Windows XP',
		'/windows nt 5.0/i'     =>  'Windows 2000',
		'/windows me/i'         =>  'Windows ME',
		'/win98/i'              =>  'Windows 98',
		'/win95/i'              =>  'Windows 95',
		'/win16/i'              =>  'Windows 3.11',
		'/macintosh|mac os x/i' =>  'Mac OS X',
		'/mac_powerpc/i'        =>  'Mac OS 9',
		'/linux/i'              =>  'Linux',
		'/ubuntu/i'             =>  'Ubuntu',
		'/iphone/i'             =>  'iPhone',
		'/ipod/i'               =>  'iPod',
		'/ipad/i'               =>  'iPad',
		'/android/i'            =>  'Android',
		'/blackberry/i'         =>  'BlackBerry',
		'/webos/i'              =>  'Mobile'
	);
	foreach ($os_array as $regex => $value) {

		if (preg_match($regex, $user_agent)) {
			$os_platform    =   $value;
		}
	}
	return $os_platform;
}

// Funktion gibt bei Mobilen Geräten true zurück, ansonsten false
function is_mobile()
{
	$os_version = getOS();
	if ($os_version == "Android") return true;
	else return false;
}



function check_login($seiten_adminlevel = 0, $return_on_error = false, $pageType = false)
{
	#session_start();

	$checkLevel = mysql_fetch_array(mysql_query("SELECT wert FROM konfiguration WHERE name = '" . $pageType . "' "));

	#	return $checkLevel[0]." -- ".$pageType;
	/*
	$t=time();
	if (isset($_SESSION['logged']) && ($t - $_SESSION['logged'] > 90)) {
    	session_destroy();
    	session_unset();
    	$redirect_index = "http://" . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/') . "/index.php";
		echo("<script>location.href = '".$redirect_index."';</script>");
	}else {
    	$_SESSION['logged'] = time();
	} 
	<meta http-equiv="refresh" content="900;url=logout.php" />

	*/
	
	if (isset($_SESSION["userName"]) && $_SESSION["userName"] != '' && $_SESSION["userId"] > 0) {
		$currentUserName = $_SESSION["userName"];
		$currentUserId = $_SESSION["userId"];
		#	if(isset($_SESSION["ist_admin"]) && $_SESSION["ist_admin"] == true ){
		if ($_SESSION["userLevel"] >= $checkLevel[0]) {
			return true;
		} else if ($pageType == 'kassenabschluss') {
			if ($_SESSION["userLevel"] >= ENABLERKEY_KASSENABSCHLUSS) {
				return true;
			} else {
				session_destroy();
				$redirect_index = "http://" . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/') . "/index.php";
				echo("<script>location.href = '".$redirect_index."';</script>");
				//header('Location: http://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/') . '/index.php');
				die();
			}
		} else if ($pageType == 'standardUser') {
			return true;
		} else {
			session_destroy();
			$redirect_index = "http://" . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/') . "/index.php";
			echo("<script>location.href = '".$redirect_index."';</script>");
			//header('http://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/') . '/index.php');
			die();
		}
	} else {

		session_destroy();
		$redirect_index = "http://" . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/') . "/index.php";
		echo("<script>location.href = '".$redirect_index."';</script>");
		//header('Location: http://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/') . '/index.php');
		die();
	}

	
}



function get_name_for_room($id)
{
	$tisch_name = false;
	$sql = "select tischName from tische WHERE id='" . $id . "'";
	$sql_tische = mysql_query($sql);
	if (!$sql_tische) {
		echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	while ($row_tisch = mysql_fetch_assoc($sql_tische)) {
		$tisch_name = $row_tisch['tischName'];
	}
	return ($tisch_name);
}

function get_name_for_verkaufer_id($id)
{
	$benutzer_name = false;
	$sql = "select name from benutzer WHERE id='" . $id . "'";
	$sql_benutzer = mysql_query($sql);
	if (!$sql_benutzer) {
		echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	while ($row_benutzer = mysql_fetch_assoc($sql_benutzer)) {
		$benutzer_name = $row_benutzer['name'];
	}
	return ($benutzer_name);
}

function get_drucker_name_for_drucker_id($id)
{
	$drucker_name = false;
	$sql = "select funktion from drucker WHERE drucker_id='" . $id . "'";
	$sql_benutzer = mysql_query($sql);
	if (!$sql_benutzer) {
		echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	while ($row_benutzer = mysql_fetch_assoc($sql_benutzer)) {
		$drucker_name = $row_benutzer['funktion'];
	}
	return ($drucker_name);
}

// Funktion sucht die express zahlart aus dem Table heraus
function get_express_zahlart()
{
	$express_zahlart = false;
	$sql = "select Name from zahlungsart WHERE express_zahlart=TRUE";
	$sqlQ = mysql_query($sql);
	if (!$sqlQ) {
		echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	while ($rowQ = mysql_fetch_assoc($sqlQ)) {
		$express_zahlart = $rowQ['Name'];
	}
	return ($express_zahlart);
}

function menue_anzeigen($warenkorb_anzeigen = false)
{
	$displayMobile = false;

	if( is_null($_SESSION['userLevel']) || empty($_SESSION['userLevel']) || !isset($_SESSION['userLevel']))
		check_login();

	$uLevel = $_SESSION['userLevel'];

	if (isset($_SESSION['requested_resolution']) && ($_SESSION['requested_resolution'] == 'handy' || $_SESSION['requested_resolution'] == 'tablet')) {
		$displayMobile = true;
	}

	if (isset($_SESSION['userLevel']) && $_SESSION['userLevel'] >= 2) $ist_admin = true;
	else $ist_admin = false;

	if (defined('AUFTRAG_LIEFER_TERMIN_DRUCKEN') && strtolower(AUFTRAG_LIEFER_TERMIN_DRUCKEN) == 'ja') {
		echo "<script>auftragsLieferterminDrucken = 'ja';</script>";
	} else {
		echo "<script>auftragsLieferterminDrucken = false; </script>";
	}


	if (defined('FUNKTION_BUTTON_LIEFERSCHEIN') &&  strtolower(FUNKTION_BUTTON_LIEFERSCHEIN) == 'ja') {
		$getLieferscheinMenu = "<li><a href='lieferscheine.php'>Lieferscheine</a></li>";
	} else {
		$getLieferscheinMenu = "";
	}

	echo '<div id="menu" class="menue">';
	echo '<div id="menu_links_slider">
				<img id="menuReiterLinks" class="orange button" src="images/menuIcon.png" />
					<div id="menue_links_sliderCont" class="menue_links_sliderCont" >
						<ul id="menu-bar">';

	echo			'<li  class="active menuLeft"><a id="mainMenuLeftUser" href="#">Menü Benutzer</a>
								<ul>';
	if ($displayMobile == false) {
		if ($uLevel >= ENABLERKEY_EINAUSZAHLUNG) echo '<li id="menuLiEinAusZahl" class="active"><a href="ein_aus_zahlungen.php">Ein- Auszahlung buchen</a></li>';
		if ($uLevel >= ENABLERKEY_BONJORNAL) 	echo '<li id="menuLiBonjournal" class="active"><a href="bonjournal_bons.php">Bonjournal</a></li>';
		if ($uLevel >= ENABLERKEY_LIEFERSCHEINE)		echo $getLieferscheinMenu . '';
		if (defined('TELEFON_ANRUFE_ANZEIGEN') &&  strtolower(TELEFON_ANRUFE_ANZEIGEN) == 'ja') {
			echo '<li><a href="telefonanrufe_sITeditor.php">Telefon Anrufe</a></li>';
		}
		if ($uLevel >= ENABLERKEY_KASSENABSCHLUSS) echo '<li><a href="kassenabschluss.php">Kassenabschluss</a></li>';
		if ($uLevel >= ENABLERKEY_KASSENBERICHT) echo '<li><a href="kassenbericht.php">Kassenbericht</a></li>';
		if ($uLevel >= ENABLERKEY_BENUTZER_ABRECHNUNG) echo '<li><a href="kassenabrechnung_user.php">Benutzer Abrechnung</a></li>';
		if ($uLevel >= ENABLERKEY_BENUTZER_VERSCHIEBEN && strtolower(GASTRO_VERSION) == 'ja')
			echo '<li><a href="benutzer_verschieben.php">Benutzer Tische übergeben</a></li>';
		if ($uLevel >= ENABLERKEY_BENUTZER_MONATSBELEG && (defined('LAENDERKENNUNG_DE') && LAENDERKENNUNG_DE == 'A')) {
			echo '<li><a href="abschlussbeleg_erstellen.php">Abschluss Beleg erstellen</a></li>';
		}
		if ($uLevel >= ENABLERKEY_BENUTZER_FINANZEXPORT) echo '<li><a href="export_finanzdaten.php">Export Finanz Daten</a></li>';
		if ($uLevel >= ENABLERKEY_DATENSICHERUNG) echo '<li><a href="datensicherung.php">Datensicherung</a></li>';
		if ($uLevel >= ENABLERKEY_ARBEITSZEITEN_SCHREIBEN) echo '<li><a href="arbeitszeiten_schreiben.php">Arbeitszeiten</a></li>';
	}
	echo '<li><a class="logOffButton" href="user_logoff.php" >Logout </a></li>
								</ul>
							</li>';

	if (defined('BASIS_LIGHT_LIZENZ_VORHANDEN') && strtolower(BASIS_LIGHT_LIZENZ_VORHANDEN) == 'ja') {
		$konfN = "'ENABLERKEY_ADMIN_WARENGRUPPEN', 'ENABLERKEY_ADMIN_PRODUKTE', 
						'ENABLERKEY_ADMIN_UMST_SAETZE', 'ENABLERKEY_ADMIN_ZAHLUNGSARTEN', 'ENABLERKEY_ADMIN_STORNOGRUENDE', 
						'ENABLERKEY_ADMIN_BENUTZER', 'ENABLERKEY_ADMIN_KUNDEN', 'ENABLERKEY_ADMIN_AUSWERTUNGEN', 'ENABLERKEY_ADMIN_KONFIGURATION',
						'ENABLERKEY_ADMIN_DATEN_IMPORT', 'ENABLERKEY_ADMIN_GUTSCHEINE'";
	} else {
		if (defined('BASIS_LIZENZ_VORHANDEN') && strtolower(BASIS_LIZENZ_VORHANDEN)) {
			$konfN = "'ENABLERKEY_ADMIN_WARENGRUPPEN', 'ENABLERKEY_ADMIN_PRODUKTE', 'ENABLERKEY_ADMIN_ARTIKEL_ARTEN', 'ENABLERKEY_ADMIN_COMBIARTIKEL', 
						'ENABLERKEY_ADMIN_UMST_SAETZE', 'ENABLERKEY_ADMIN_ZAHLUNGSARTEN', 'ENABLERKEY_ADMIN_STORNOGRUENDE', 
						'ENABLERKEY_ADMIN_BENUTZER', 'ENABLERKEY_ADMIN_KUNDEN', 'ENABLERKEY_ADMIN_AUSWERTUNGEN', 'ENABLERKEY_ADMIN_KONFIGURATION',
						'ENABLERKEY_ADMIN_DATEN_IMPORT', 'ENABLERKEY_ADMIN_GUTSCHEINE', 'ENABLERKEY_ADMIN_HAPPYHOUR'";
		} else {
			// Keine Lizenz vorhanden
			$konfN = "'ENABLERKEY_ADMIN_WARENGRUPPEN', 'ENABLERKEY_ADMIN_PRODUKTE', 
						'ENABLERKEY_ADMIN_UMST_SAETZE', 'ENABLERKEY_ADMIN_ZAHLUNGSARTEN', 'ENABLERKEY_ADMIN_STORNOGRUENDE', 
						'ENABLERKEY_ADMIN_BENUTZER', 'ENABLERKEY_ADMIN_KUNDEN', 'ENABLERKEY_ADMIN_AUSWERTUNGEN', 'ENABLERKEY_ADMIN_KONFIGURATION',
						'ENABLERKEY_ADMIN_DATEN_IMPORT', 'ENABLERKEY_ADMIN_GUTSCHEINE'";
		}
	}
	$query = "SELECT wert FROM konfiguration WHERE name IN(" . $konfN . ") AND " . $uLevel . " >= wert";
	$query1 = "SELECT wert FROM konfiguration WHERE name IN AND " . $uLevel . " >= wert";
	$checkAdminRechte = mysql_query($query);

	if (
		defined('GUTSCHEIN_LIZENZ') && strtolower(GUTSCHEIN_LIZENZ) == 'ja' && defined('GUTSCHEIN_KARTE_FUNKTION')
		&& strtolower(GUTSCHEIN_KARTE_FUNKTION) == 'ja'
	) {
		$gutscheinFunktion = true;
	} else $gutscheinFunktion = false;

	$numberEnabled = mysql_num_rows($checkAdminRechte);

	# das admin menu wird nur angezeigt wenn min 1 adminMenu punkt für den jeweiligen user freigegeben ist, unabhängig ob der benutzer admin ist od nicht

	if ($numberEnabled > 0 && $displayMobile == false) {
		echo		'<li id="adminMenu" class="active menuRight"><a href="#">Menü Admin</a>
								<ul>';
		if (FILIALSYSTEM_IST_FILIALSYSTEM != "ja") {
			if ($uLevel >= ENABLERKEY_ADMIN_WARENGRUPPEN) echo '<li><a href="anlegen_categories.php">Warengruppen</a></li>';
			if ($uLevel >= ENABLERKEY_ADMIN_PRODUKTE) echo '<li><a href="anlegen_produkte.php">Produkte</a></li>';
			if (
				$uLevel >= ENABLERKEY_ADMIN_ARTIKEL_ARTEN && strtolower(GASTRO_VERSION) == 'ja' &&
				defined('BASIS_LIZENZ_VORHANDEN') && strtolower(BASIS_LIZENZ_VORHANDEN) == 'ja'
			) {
				echo '<li><a href="anlegen_artikel_arten.php">Speisen Gänge</a></li>';
			}
			if (
				$uLevel >= ENABLERKEY_ADMIN_COMBIARTIKEL && defined('BASIS_LIZENZ_VORHANDEN') &&
				strtolower(BASIS_LIZENZ_VORHANDEN) == 'ja'
			) {
				echo '<li><a href="anlegen_combiartikel.php">Kombinations Produkte</a></li>';
			}
		}
		//if($uLevel >= ENABLERKEY_ADMIN_UMST_SAETZE) echo '<li><a href="anlegen_steuern.php">Umsatzsteuersätze</a></li>';
		if ($uLevel >= ENABLERKEY_ADMIN_ZAHLUNGSARTEN) echo '<li><a href="anlegen_zahlungsart.php">Zahlungsarten</a></li>';
		if ($uLevel >= ENABLERKEY_ADMIN_ZAHLUNGSTERMINAL && defined('ECKARTE_LIZENZ')) echo '<li><a href="anlegen_ec_terminal.php">EC Karten Terminal</a></li>';
		if ($uLevel >= ENABLERKEY_ADMIN_STORNOGRUENDE) echo '<li><a href="anlegen_storno_grund.php">Stornogr&uuml;nde</a></li>';
		if ($uLevel >= ENABLERKEY_ADMIN_BENUTZER) echo '<li><a href="anlegen_benutzer.php">Benutzer</a></li>';
		if (
			$uLevel >= ENABLERKEY_ADMIN_KUNDEN && defined('BASIS_LIZENZ_VORHANDEN')
			&& strtolower(BASIS_LIZENZ_VORHANDEN) == 'ja'
		) {
			echo '<li><a href="anlegen_kunden_sITeditor.php">Kunden</a></li>';
		}

		if ($uLevel >= ENABLERKEY_ADMIN_AUSWERTUNGEN || $uLevel >= ENABLERKEY_BENUTZER_KASSENBUCH) {
			echo '<li><a href="auswertungen.php">Auswertungen</a></li>';
		}
		if ($uLevel >= ENABLERKEY_ADMIN_KONFIGURATION) echo '<li><a href="anlegen_konfiguration_gui.php">Konfiguration</a></li>';
		if ($uLevel >= ENABLERKEY_ADMIN_DATEN_IMPORT) echo '<li><a href="daten_import.php">Daten Import</a></li>';
		if (
			$uLevel >= ENABLERKEY_ADMIN_GUTSCHEINE && $gutscheinFunktion == true && defined('GUTSCHEIN_LIZENZ') &&
			strtolower(GUTSCHEIN_LIZENZ) == 'ja'
		) echo '<li><a href="anlegen_gutscheine.php">Gutschein Funktion</a></li>';
		if (defined('BASIS_LIZENZ_VORHANDEN') && strtolower(BASIS_LIZENZ_VORHANDEN) == 'ja') {
			if ($uLevel >= ENABLERKEY_ADMIN_HAPPYHOUR) echo '<li><a href="anlegen_happyhour.php">Zeitabhängige Preise Profil</a></li>';
		}

		echo '</ul>
							</li>';
	}
	# Aenderung august 2020 im Zuge Konfig Benutzerlevel für Filialsystem Menü setzen !
	if (
		$uLevel >= ENABLERKEY_FILIAL_SYNC || $uLevel >= ENABLERKEY_FILIAL_CATEGORY || $uLevel >= ENABLERKEY_FILIAL_PRODUCTS || $uLevel >= ENABLERKEY_FILIAL_INVENT ||
		$uLevel >= ENABLERKEY_FILIAL_STORE || $uLevel >= ENABLERKEY_FILIAL_PURCHASE || $uLevel >= ENABLERKEY_FILIAL_OFFER || $uLevel >= ENABLERKEY_FILIAL_ORDER ||
		$uLevel >= ENABLERKEY_FILIAL_SHIPNOTE || $uLevel >= ENABLERKEY_FILIAL_INVOICE
	) {

		if (defined('FILIALSYSTEM_IST_FILIALSYSTEM') && strtolower(FILIALSYSTEM_IST_FILIALSYSTEM) == 'ja') {
			echo	'<li id="adminMenu" class="active menuRight"><a href="#">Filialsystem</a>
										<ul>';
			if ($uLevel >= ENABLERKEY_FILIAL_SYNC) echo '<li><a href="import_xml.php">Synchronisieren</a></li>';
			if ($uLevel >= ENABLERKEY_FILIAL_CATEGORY) echo '<li><a href="anlegen_categories.php">Warengruppen</a></li>';
			if ($uLevel >= ENABLERKEY_FILIAL_PRODUCTS) echo '<li><a href="anlegen_produkte.php">Produkte</a></li>';
			if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja"  && FILIALSYSTEM_ERP_PROGRAMM == "sITPos")
			{

				if ($uLevel >= ENABLERKEY_FILIAL_INVENT) echo '<li><a href="anlegen_inventur.php">Inventur</a></li>';
				if ($uLevel >= ENABLERKEY_FILIAL_STORE) echo '<li><a href="anlegen_filialsystem_lagerstand.php">Lagerstand</a></li>';
				if ($uLevel >= ENABLERKEY_FILIAL_PURCHASE) echo '<li><a href="anlegen_filialsystem_einkauf.php">Einkauf</a></li>';
				if ($uLevel >= ENABLERKEY_FILIAL_OFFER) echo '<li><a href="anlegen_filialsystem_angebot.php">Angebot</a></li>';
				if ($uLevel >= ENABLERKEY_FILIAL_ORDER) echo '<li><a href="anlegen_filialsystem_auftrag.php">Auftrag</a></li>';
				if ($uLevel >= ENABLERKEY_FILIAL_SHIPNOTE) echo '<li><a href="anlegen_filialsystem_lieferschein.php">Lieferschein</a></li>';
				if ($uLevel >= ENABLERKEY_FILIAL_INVOICE) echo '<li><a href="anlegen_filialsystem_rechnung.php">Rechnung</a></li>';
			}

			echo			'</ul>
									</li>';
		}
	}


	if (strtolower(GASTRO_VERSION) == 'ja' && basename($_SERVER['PHP_SELF']) == "tische.php") {
		//	echo '<li id="salesMenuBut" class="active menuButSales"><a href="kassieren.php">bonieren</a></li>';
		//	<a href='kassieren.php'><button class='button_none_float menuCenterLayoutTischeBut orange'>Bonieren</button></a>
		$menuGastroCenterDiv = "<div class='menuGastroTischeCenter'>
								<div class='menuGastroTischeCenterInnerDiv'>
									<div class='menuGastroTischeCenterListDiv'>
										
										<div class='cclear'></div>
									</div>
								</div>
							</div>";
	} else {

		$menuGastroCenterDiv = "";

		if (basename($_SERVER['PHP_SELF']) != "kassieren.php" && strtolower(GASTRO_VERSION) != 'ja')
			echo '<li id="salesMenuBut" class="active menuButSales"><a href="kassieren.php">Verkauf</a></li>';
		else if (basename($_SERVER['PHP_SELF']) != "tische.php" && strtolower(GASTRO_VERSION) == 'ja')
			echo '<li id="salesMenuBut" class="active menuButSales"><a href="tische.php">Tisch Auswahl</a></li>';
	}

	echo	'</ul>';   # äusserstes menu list element ende 

	echo	'</div>
				
		</div>';	# menu  ende - Hier fangen spezialitäten für einzelne Seiten an!



	if (basename($_SERVER['PHP_SELF']) == "kassieren.php" && (strtolower(GASTRO_VERSION) != 'ja' && strtolower(WARENKOERBE_ABLEGEN) != 'ja')) {
		echo "<div id='menuDivLeft' class='menuDivLeft' >
									<div id='uhrzeit' class='bonierenAufDiv'></div>
									</div>";
		echo "<div id='menue_warenkoerbe' class='menu_warenkoerbe' >";
		if ($warenkorb_anzeigen) {
			zeige_warenkoerbe();
		}
		echo "</div>";
	} else echo "<div id='menuDivLeft' class='menuDivLeft' ></div>";


	if ((basename($_SERVER['PHP_SELF']) == "kassieren.php" || basename($_SERVER['PHP_SELF']) == "tische.php") && strtolower(GASTRO_VERSION) == 'ja' && ist_kassa_offen() > 0) {
		if (!isset($_SESSION['gastroTisch'])) {
			$tQl = mysql_fetch_array(mysql_query("SELECT MIN(id) FROM tische WHERE raum = (SELECT id FROM raum ORDER BY reihenfolge ASC LIMIT 1)"));
			$currentTable = $tQl[0];
			$_SESSION['gastroTisch'] = $currentTable;
		} else $currentTable = $_SESSION['gastroTisch'];

		echo "<div id='menuDivLeft' class='menuDivLeft' >
						<input id='currentTableId' type='hidden' value=" . $currentTable . " />";
		if ($displayMobile == false) {
			preg_match('/\d+px/', SCHRIFT_DEFAULT, $match);
			if ($match[0] == true) {
				$fontS = preg_replace('/\D+/', '', $match[0]);
				if ($fontS > 16 && $fontS <= 20) {
					$setFontH = 'style="font-size:' . .85 . 'em;  "';
				} else if ($fontS > 20) {
					$setFontH = 'style="font-size:' . .8 . 'em;  "';
				} else if ($fontS <= 16) {
					$setFontH = 'style="font-size:' . 1.1 . 'em;  "';
				} else $fontS = "";
			}

			echo	"<div " . $setFontH . " class='bonierenAufDiv'>
										<div>Aktueller Tisch:</div>
											<div>" . get_name_for_room($currentTable) . "</div>	
											<div id='uhrzeit'></div>
									</div>";
		}

		echo		"</div>";




		if (basename($_SERVER['PHP_SELF']) == "kassieren.php") {
			$buttonWidth = 'width:22%;';
			if (defined('BUTTON_ZUTISCHE_OHNE_DRUCKEN') && strtolower(BUTTON_ZUTISCHE_OHNE_DRUCKEN) == 'ja') {
				$toTableNoPrint = "<button id='' class='button_none_float menuGastroKassierenCenterButTischeNoPrint' style='" . $buttonWidth . "'
												onclick=\"printGastroSupply('', 'moveWithoutPrint')\">&nbsp;</button>";
			} else {
				$toTableNoPrint = "";
				$buttonWidth = 'width:30.5%;';
			}


			if ($displayMobile == true) $gastroTableDisplay = "<div class='menuGastroKassierenTableDisplay'>" . get_name_for_room($currentTable) . "</div>";
			else $gastroTableDisplay = "";
			echo	"<div class='menuGastroKassierenContainer' >
							<div class='menuGastroKassierenCenterInnerDiv'>
								<div class='menuGastroKassierenCenterListDiv' >
									<button id='' class='button_none_float menuGastroKassierenCenterButSplit' style='" . $buttonWidth . "'
										onclick='openSplitBon()' >&nbsp;</button>
									<button id='' class='button_none_float menuGastroKassierenCenterButTische' style='" . $buttonWidth . "'
												onclick=\"printGastroSupply('', '')\">&nbsp;</button>
									" . $toTableNoPrint . "
									<button id='' class='button_none_float menuGastroKassierenCenterButMove'  style='" . $buttonWidth . "'
										onclick='setMoveTableTo()' >&nbsp;</button>
									
								</div>
							</div>
						</div>
						" . $gastroTableDisplay . "";
			#		}
		}
	} else if ((basename($_SERVER['PHP_SELF']) == "kassieren.php" || basename($_SERVER['PHP_SELF']) == "wk_ablage.php") && strtolower(WARENKOERBE_ABLEGEN) == 'ja'
		&& strtolower(GASTRO_VERSION) != 'ja' && ist_kassa_offen() > 0
	) {

		$wkName = false;
		if (basename($_SERVER['PHP_SELF']) == "kassieren.php") {
			if (isset($_SESSION['ablageWarenkorb'])) {
				$wkId = $_SESSION['ablageWarenkorb'];
				$wkName = mysql_fetch_array(mysql_query("SELECT displayName FROM warenkoerbe WHERE id=" . $wkId . " "));
			} else {

				echo "<script> location.href='wk_ablage.php';</script>";
			}
			if ($wkName != false)
				$wkTxt = "<div class='aktuellerWarenkorbDisplay'>" . $wkName[0] . "</div>";
			else $wkTxt = "";

			echo	"<div class='menuGastroKassierenContainer' >
							<div class='menuGastroKassierenCenterInnerDiv'>
								<div class='menuGastroKassierenCenterListDiv' >
									" . $wkTxt . "
									<a href='wk_ablage.php'><button id='' class='button_none_float orange menuGastroKassierenCenterBut' >Warenkörbe wählen</button></a>
								</div>
							</div>
						</div>";
		}
	}

	# prüfen ob eine Expresszahlung nach Zahlart angelegt ist
	$exprZa = mysql_fetch_array(mysql_query("SELECT count(express_zahlart) AS exprZahlart FROM zahlungsart WHERE express_zahlart <> 0"));
	$exprZahl = false;
	if ($exprZa['exprZahlart'] == 1) $exprZahl = true;
	else if ($exprZa['exprZahlart'] == 0 || $exprZa['exprZahlart'] > 1) $exprZahl = false;

	$countFbutton = 0;

	if (defined('FUNKTION_BUTTON_LADEOEFFNEN') &&  strtolower(FUNKTION_BUTTON_LADEOEFFNEN) == 'ja') {
		$ladeOeffnen = "block";
		$countFbutton++;
	} else {
		$ladeOeffnen = 'none';
	}
	if (defined('FUNKTION_BUTTON_BEZAHLEN_EXPRESS') &&  strtolower(FUNKTION_BUTTON_BEZAHLEN_EXPRESS) == 'ja') {
		$bezahlenExpress = "block";
		$countFbutton++;
	} else {
		$bezahlenExpress = 'none';
	}
	if (defined('FUNKTION_BUTTON_BEZAHLEN_EXPRESS_ZAHLART') &&  strtolower(FUNKTION_BUTTON_BEZAHLEN_EXPRESS_ZAHLART) == 'ja' && $exprZahl == true) {
		$bezahlenExpressZahlart = "block";
		$countFbutton++;
	} else {
		$bezahlenExpressZahlart = 'none';
	}
	if (defined('FUNKTION_BUTTON_BON_REPRINT') &&  strtolower(FUNKTION_BUTTON_BON_REPRINT) == 'ja') {
		$bonReprint = "block";
		$countFbutton++;
	} else {
		$bonReprint = 'none';
	}
	if (defined('FUNKTION_BUTTON_EC_KARTE_REPRINT') &&  strtolower(FUNKTION_BUTTON_EC_KARTE_REPRINT) == 'ja') {
		$ecReprint = "block";
		$countFbutton++;
	} else {
		$ecReprint = 'none';
	}
	if (
		defined('FUNKTION_BUTTON_CHANGE_PAY') &&  strtolower(FUNKTION_BUTTON_CHANGE_PAY) == 'ja'
		&& (isset($_SESSION['userLevel']) && $_SESSION['userLevel'] >= ENABLERKEY_CHANGE_PAY)
	) {
		$zahlungChange = "block";
		$countFbutton++;
	} else {
		$zahlungChange = 'none';
	}
	if (
		defined('FUNKTION_BUTTON_CUSTOMER_TOBILL') &&  strtolower(FUNKTION_BUTTON_CUSTOMER_TOBILL) == 'ja'
		&& defined('BASIS_LIZENZ_VORHANDEN') && strtolower(BASIS_LIZENZ_VORHANDEN) == 'ja'
	) {
		$customerTobill = "block";
		$countFbutton++;
	} else {
		$customerTobill = 'none';
	}

	if (
		defined('FUNKTION_BUTTON_DELETE_BON') &&  strtolower(FUNKTION_BUTTON_DELETE_BON) == 'ja'
		&& (isset($_SESSION['userLevel']) && $_SESSION['userLevel'] >= ENABLERKEY_OFFENENBON_LOESCHEN)
	) {
		$delBonUse = "block";
		$countFbutton++;
	} else {
		$delBonUse = 'none';
	}

	if (defined('BON_ZUSATZ_TEXT_BUTTON') && strtolower(BON_ZUSATZ_TEXT_BUTTON) == 'ja') {
		$bonAddTxt = "block";
		$countFbutton++;
	} else {
		$bonAddTxt = "none";
	}
	if (defined('EDI_INTO_OFFENERBON_BUTTON') && strtolower(EDI_INTO_OFFENERBON_BUTTON) == 'ja') {
		$ediInportBut = "block";
		$countFbutton++;
	} else {
		$ediInportBut = "none";
	}


	if (defined('FUNKTION_BUTTON_ZIFFERNFELD_ANZEIGEN') &&  strtolower(FUNKTION_BUTTON_ZIFFERNFELD_ANZEIGEN) == 'ja') {
		$displayNumpad = "block";
		$countFbutton++;
	} else {
		$displayNumpad = 'none';
	}
	if (
		defined('FUNKTION_BUTTON_LIEFERSCHEIN') &&  strtolower(FUNKTION_BUTTON_LIEFERSCHEIN) == 'ja'
		&& defined('LIEFERSCHEIN_LIZENZ') && strtolower(LIEFERSCHEIN_LIZENZ) == 'ja'
	) {
		$displayLieferschein = "block";
		$countFbutton++;
	} else {
		$displayLieferschein = 'none';
	}
	if (defined('FUNKTION_BUTTON_RECHNUNGS_VORDRUCK') &&  strtolower(FUNKTION_BUTTON_RECHNUNGS_VORDRUCK) == 'ja') {
		$displayInvPreprint = "block";
		$countFbutton++;
	} else {
		$displayInvPreprint = 'none';
	}
	if ($gutscheinFunktion == true) {
		$displayGutschKarte = "block";
		$countFbutton++;
	} else {
		$displayGutschKarte = 'none';
	}


	$deleteBonTxt = "<p>Bestätigen Sie um den gesamten Bon zu löschen.<p>";
	if (basename($_SERVER['PHP_SELF']) == "kassieren.php") {
		#	if($countFbutton == 6 && $displayMobile==true ) $styleFbut="width:11%; height:65%; margin-top:1%;";
		if ($countFbutton == 6 && $displayMobile == true) $styleFbut = "width:15.5%; height:65%;  margin-top:1%; ";
		else if ($countFbutton == 5 && $displayMobile == true) $styleFbut = "width:19%; height:65%;  margin-top:1%; ";
		else if ($countFbutton == 4 && $displayMobile == true) $styleFbut = "width:23.5%; height:67%;  margin-top:1%; ";
		else if ($countFbutton == 3 && $displayMobile == true) $styleFbut = "width:30%; height:68%;  margin-top:1%; ";
		else if ($countFbutton == 2 && $displayMobile == true) $styleFbut = "width:30%; height:68%; margin-top:1%; ";
		else if ($countFbutton == 1 && $displayMobile == true) $styleFbut = "width:30%; height:68%; margin-top:1%; ";
		else if ($countFbutton == 7 && $displayMobile == true) $styleFbut = "width:13%; height:62%; margin-top:1%; ";
		else if ($countFbutton == 8 && $displayMobile == true) $styleFbut = "width:11%; height:62%; margin-top:1%; ";
		else if ($countFbutton > 8 && $displayMobile == true) $styleFbut = "width:" . (90 / $countFbutton) . "%; height:62%; ";

		else if ($countFbutton == 6 && $displayMobile == false) $styleFbut = "width:16%;";
		else if ($countFbutton == 7 && $displayMobile == false) $styleFbut = "width:13.5%;";
		else if ($countFbutton == 8 && $displayMobile == false) $styleFbut = "width:11.5%;";
		else if ($countFbutton > 8 && $displayMobile == false) $styleFbut = "width:" . (90 / $countFbutton) . "%;";
		else $styleFbut = "";

		#	writeLog(basename( __FILE__)." ". __LINE__ . "Anz But: ".$countFbutton.", ".$styleFbut." --- ".basename($_SERVER['PHP_SELF']));




		echo '<div id="menuDivRight" class="menuDivRight" >
					<button class="button orange funktionsButton displayEdiButton" style="' . $styleFbut . ' display:' . $ediInportBut . '" onclick="ediAusFileImport()"></button>
					<button class="button orange funktionsButton displayNumpadButton" style="' . $styleFbut . ' display:' . $displayNumpad . '" onclick="displayNumpad()"></button>
		';
		if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja" && FILIALSYSTEM_GUTSCHEINE_ZENTRALSYSTEM == "ja") {
			
				echo '<a href="anlegen_gutscheine.php">
							<button class="button orange funktionsButton gutschKarteButton" display:' . $displayGutschKarte . '></button>
						</a>';
		} else {
			echo '
						<button class="button orange funktionsButton gutschKarteButton" style="' . $styleFbut . ' display:' . $displayGutschKarte . '" onclick=\'gutscheinKarteBearbeiten("")\'></button>
						';
		}
		echo '	
					<button class="button orange funktionsButton kassenladeOeffnenButton" style="' . $styleFbut . ' display:' . $ladeOeffnen . '" onclick="kassenladeOeffnen()"></button>
					<button class="button orange funktionsButton lieferscheinButton" style="' . $styleFbut . ' display:' . $displayLieferschein . '" onclick="lieferscheinErstellen()"></button>
					<button class="button orange funktionsButton preprintInvButton" style="' . $styleFbut . ' display:' . $displayInvPreprint . '" onclick="rechnungsVordruck()"></button>
					<img id="zahlungDisableImg" src="images/flatGray.png" />
					<button id="zahlungAbgeschlExprBut" class="button orange funktionsButton bezahlenExpressButton" style="' . $styleFbut . ' display:' . $bezahlenExpress . '" onclick=\'zahlung_abgeschlossen("express")\'></button>';

		// Wenn das Schnellzahlen nach Zahlart eine Terminal zahlung ist, dann rufe ec karten zahlung auf
		$express_zahlart = get_express_zahlart();
		//echo $express_zahlart;
		if ($express_zahlart !== false && ist_zahlungsart_ec_terminal_enabled($express_zahlart)) {

			echo '<button id="bezahlenExpressZahlartButtonEc" class="button orange funktionsButton bezahlenExpressZahlartButton" style="' . $styleFbut . ' display:' . $bezahlenExpressZahlart . '" onclick=\'zahlung_abgeschlossen_ec("", "' . $express_zahlart . '", document.getElementById("zahlbetrag").value, true)\'></button>';
		} else {
			echo '<button id="bezahlenExpressZahlartButton" class="button orange funktionsButton bezahlenExpressZahlartButton" style="' . $styleFbut . ' display:' . $bezahlenExpressZahlart . '" onclick=\'zahlung_abgeschlossen("expressZahlart")\'></button>';
		}
		echo '<button class="button orange funktionsButton bonPrintButton" style="' . $styleFbut . ' display:' . $bonReprint . '" onclick="reprintBon()"></button>
				  <button class="button orange funktionsButton ecPrintButton" style="' . $styleFbut . ' display:' . $ecReprint . '" onclick="ec_reprintBon()"></button>
					<button class="button orange funktionsButton payChangeButton" style="' . $styleFbut . ' display:' . $zahlungChange . '" onclick="changePayment(\'\')"></button>
					<button class="button orange funktionsButton deleteBonButton" style="' . $styleFbut . ' display:' . $delBonUse . '"
								onclick=\'openGeneralDialog("stornoButton", "Gesamten Bon Löschen", "' . $deleteBonTxt . '", "wrapper")\' ></button>
					<button class="button orange funktionsButton addBonTxtButton" style="' . $styleFbut . ' display:' . $bonAddTxt . '"
								onclick=\'openAddTxtModal("oOpen")\' ></button>
					<button class="button orange funktionsButton customerPlusButton" style="' . $styleFbut . ' display:' . $customerTobill . '" onclick=\'openCutomerSearchDialog("optionSelect")\'></button>
				</div>	
				<div class="cclear"></div>';


		//	<div id="error_message" class="error_message" ></div>';   // wurde am unteren ende im product container gestellt
		// <button class="button" onclick="window.location.reload()">Reload Page</button>
		//	
		// <button class="button orange funktionsButton customerPlusButton" style="display:'.$customerTobill.'" 
		//	onclick=\'openGeneralDialog("billModalSearch", "Kundenname auf der Rechung vermerken.", "", "wrapper")\'></button>
	} else if (basename($_SERVER['PHP_SELF']) != "auswertungen.php") {
		$verrBut = "";
		$menuWidth = "";
		if (basename($_SERVER['PHP_SELF']) == "lieferscheine_verrechnen.php") {
			$zaQl = mysql_query("SELECT id, Name, standard FROM zahlungsart WHERE sichtbar = 1 ORDER BY reihenfolge");
			$zaSelect = "<select id='lsVerrZahlungsSelect' class='zaSelect orange floatR' >
							<option value='' >Zahlung</option>";
			$zaIx = 1;
			while ($zaRow = mysql_fetch_array($zaQl)) {

				$zaSelect .= "<option value='" . $zaIx . "' >" . $zaRow['Name'] . "</option>";
				$zaIx++;
			}
			$zaSelect .= "</select>";



			$verrBut = "<a href='lieferscheine.php'><button class='button_none_float orange floatR' style='margin:1% 15px 0 15px;' >Zurück zu Lieferscheine</button></a>
							" . $zaSelect . "
							<button onclick='lieferscheineVerrechnen()' class='button_none_float orange floatR' style='margin:1% 0 0 0;' >Lieferscheine Verrechnen</button>
							<div class='lsVerrA4Div floatR'>
								<label class='lsVerrA4CheckboxLabel' for='lsVerrA4Checkbox'> A4 Rech.</label><label class='cbLarge'><input type='checkbox' id='lsVerrA4Checkbox' /><span></span></label>
							</div>
							<button onclick='lieferscheineVerrechnenCheckAll()' class='button_none_float orange floatR' style='margin:1% 15px 0 0;' >Alle</button>";
			$menuWidth = "style='width:90%; background:#fff;' ";
		} else if (basename($_SERVER['PHP_SELF']) == "anlegen_kunden.php") {
			global $backLink;
			if ($backLink == true) {
				echo "<button class='button_none_float orange floatR ' style='margin:.5% 5% 0 0' onclick=\"location.href='kassieren.php'\">Zu Kassieren</button>";
			}
		}
		// Das hier dürfte der Standard sein, Menü ganz rechts für alle seiten, wo nichts anders definiert wurde
		echo '<div id="menuDivRight" class="menuDivRight" ' . $menuWidth . '  >
				' . $verrBut;

		echo '</div>';
	}

	if (basename($_SERVER['PHP_SELF']) == "lieferscheine.php") {
		echo "<div id='menuDivRight' class='menuDivRight' >
						<a href='lieferscheine_verrechnen.php'><button class='button_none_float orange' style='margin:2% 0 0 0;' >Lieferscheine Verrechnen</button></a>
					</div>";
	} else if (basename($_SERVER['PHP_SELF']) == "lieferscheine_verrechnen.php") {
		/*	echo "<div id='menuDivRight' class='menuDivRight' >
						<button onclick='lieferscheineVerrechnen()' class='button_none_float orange' style='margin:2% 0 0 0;' >Lieferscheine Verrechnen</button>
						<a href='lieferscheine.php'><button class='button_none_float orange' style='margin:2% 0 0 0;' >Zurück zu Lieferscheine</button></a>
					</div>";
		*/
	}


	/*	else if(basename($_SERVER['PHP_SELF'])=="tische.php" || basename($_SERVER['PHP_SELF'])=="bonjournal_bons.php"){
				echo '<div id="menuDivRight" class="menuDivRight" >
						</div>';
			
			}
		*/
	echo $menuGastroCenterDiv;
	echo '</div>';	# menu div ende

	echo "<div id='autologoffChecker'></div>";
}

// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($question)
{
	return (!isset($question) || trim($question) === '');
}

function print_fehler($str)
{
	echo '<script type="text/javascript">
			$( document ).ready(function() {
				$("#error_message").html("' . $str . '");
			});
		//	document.getElementById("error_message").innerHTML="' . $str . '";
			</script>';
}

function run_mysql_query($query, $erfolgsmeldung = "", $fehlermeldung = "")
{
	$sql = $query;
	//echo $sql;
	if (mysql_query($sql)) {
		if ($erfolgsmeldung == '') print_fehler("erfolgreich");
		else print_fehler($erfolgsmeldung);
		$id = mysql_insert_id();
		return ($id);
	} else {
		//echo "FEHLER: SQL Fehler $sql. " . mysql_error();
		if ($fehlermeldung !== '') print_fehler($fehlermeldung);
		print_fehler("FEHLER: SQL Fehler $sql. " . mysql_error());
		echo ("FEHLER: SQL Fehler $sql. " . mysql_error());
	}
}


function offenen_bon_anzeigen($aktueller_bon, $callFrom = false)
{
	$openBonLineToSelect = false;
	$returnValue = false;

	if (defined('SONDERPREIS_ENABLED') && strtolower(SONDERPREIS_ENABLED) == 'ja') {
		$returnValue = openBonSomaCalc();
		$openBonLineToSelect = $returnValue[1];
	}


	$bonContent = "";

	if ($callFrom == "splitBon") {
		$sql = "SELECT offener_bon.id, name, pricesell, tax_rate, printname, stueck, kunden_id, beilagen_aenderung_minus, beilagen_aenderung_plus, 
					article_art_id, has_childs, has_parent, aus_ls_nr, bon_text AS bonAddedTxt, beilagen_prod_orig_preis, beilagen_sum_netto,
					beilagen_sum_brutto, beilagen_basispreis_key, discountChild
					FROM offener_bon 
					LEFT JOIN bon_add_text ON offener_bon.bon_id = bon_add_text.offenerbon_id
					WHERE bon_id='" . $aktueller_bon . "' AND has_parent=0";
	} else $sql = "SELECT offener_bon.id, name, pricesell, tax_rate, printname, stueck, kunden_id, beilagen_aenderung_minus, beilagen_aenderung_plus, 
					article_art_id, has_childs, has_parent, aus_ls_nr, bon_text AS bonAddedTxt, beilagen_prod_orig_preis, beilagen_sum_netto,
					beilagen_sum_brutto, beilagen_basispreis_key, discountChild
					FROM offener_bon 
					LEFT JOIN bon_add_text ON offener_bon.bon_id = bon_add_text.offenerbon_id
					WHERE bon_id='" . $aktueller_bon . "' ";
					
	$sql_produkte = mysql_query($sql);
	if (!$sql_produkte) {
		$bonContent .= "SQL Fehler: " . mysql_error();
		exit(1);
	}

	$sql1 = "SELECT bon_text AS bonAddedTxt
					FROM bon_add_text 
					WHERE offenerbon_id='" . $aktueller_bon . "' ";
	$sql_produkte1 = mysql_query($sql1);
	if (!$sql_produkte1) {
		$bonContent .= "SQL Fehler: " . mysql_error();
		exit(1);
	}
	$bonZusatzText = false;
	# wird am ende der while schleife gesetzt !!
	while ($row_produkt1 = mysql_fetch_assoc($sql_produkte1)) {
		$bonZusatzText = $row_produkt1['bonAddedTxt'];
	}

	$gesamt_summe = 0;
	$gesamt_menge = 0;
	$split_gesamt_summe = 0;
	$move_gesamt_summe = 0;
	// hier stand ursprünglich der header

	$splitBonOp = "";
	$moveBonOp = "";
	if ($callFrom == "splitBon") {
		$idPrefix = 'split_';
		$splitArray = array();
		if (isset($_SESSION['splitBon' . $aktueller_bon])) {
			$_SESSION['splitBon' . $aktueller_bon] = array_values($_SESSION['splitBon' . $aktueller_bon]);
			for ($i = 0; $i < sizeof($_SESSION['splitBon' . $aktueller_bon]); $i++) {
				$lineId = $_SESSION['splitBon' . $aktueller_bon][$i][0];
				$splitQty = $_SESSION['splitBon' . $aktueller_bon][$i][1];
				$splitArray[$lineId]['splitQty'] = $splitQty;
			}
		} else $splitArray[0] = '';
		$splitBonActive = true;
		$moveBonActive = false;
	} else if ($callFrom == "moveTotable") {
		$idPrefix = 'move_';
		$moveArray = array();
		if (isset($_SESSION['moveBon' . $aktueller_bon])) {
			for ($i = 0; $i < sizeof($_SESSION['moveBon' . $aktueller_bon]); $i++) {
				$lineId = $_SESSION['moveBon' . $aktueller_bon][$i][0];
				$moveQty = $_SESSION['moveBon' . $aktueller_bon][$i][1];
				$movePrice = $_SESSION['moveBon' . $aktueller_bon][$i][2];
				$namePrice = $_SESSION['moveBon' . $aktueller_bon][$i][2];
				$moveArray[$lineId]['moveQty'] = $moveQty;
			}
		} else $moveArray[0] = '';
		$moveBonActive = true;
		$splitBonActive = false;
	} else {
		$idPrefix = '';
		$splitBonActive = false;
		$moveBonActive = false;
	}



	while ($row_produkt = mysql_fetch_assoc($sql_produkte)) {

		$summe = $row_produkt['pricesell'] * (1 + $row_produkt['tax_rate']);
		// RFR: runden ausgeschaltet am 20.11.2018
		$summe = $summe * $row_produkt['stueck'];
		//$summe=round($summe, 4)*$row_produkt['stueck'];
		if ($callFrom == "splitBon") {
			// geändert RFR 06.12.2019 weil bei Rabatt falsch berechnet wurde um eine Kommazahl beim runden
			//$gesamt_summe=$gesamt_summe+$summe;
			$gesamt_summe = $gesamt_summe + round($summe, 2);
			$gesamt_menge = $gesamt_menge + $row_produkt['stueck'];
		} else {
			// geändert RFR 06.12.2019 weil bei Rabatt falsch berechnet wurde um eine Kommazahl beim runden
			// if($row_produkt['has_childs'] != 1) $gesamt_summe=$gesamt_summe+$summe;
			if ($row_produkt['has_childs'] != 1) 
				$gesamt_summe = $gesamt_summe + round($summe, 2);		
				# wenn es childs gibt, combiartikel werden die summen der childes genommen, also die vom parent nicht
				$gesamt_menge = $gesamt_menge + $row_produkt['stueck'];
			}

		$anzeige_summe = number_format($summe, 2, ",", ".");

		$vk_preis = $row_produkt['pricesell'];

		if (EINZELPREIS_IM_BON_BRUTTO == strtolower('ja')) {
			// RFR: runden wieder weggenmommer am 20.11.2018
			//$vk_preis_anzeige=round($row_produkt['pricesell'], 4)*(1+$row_produkt['tax_rate']);
			$vk_preis_anzeige = $row_produkt['pricesell'] * (1 + $row_produkt['tax_rate']);
		} else {
			$vk_preis_anzeige = $row_produkt['pricesell'];
		}

		$vk_preis_anzeige = number_format($vk_preis_anzeige, 2, ",", ".");
		$stk_anzeige = number_format($row_produkt['stueck'], 2, ",", ".");
		$nummer = $row_produkt['id'];
		$produkt_name = $row_produkt['printname'];
		$parentIndicat = false;				# wird für das Kundendisplay verwendet
		if ($row_produkt['has_parent'] > 0) $parentIndicat = true;

		// vk_preis und vk_preis anzeige muss getrennt werden, da ansonsten rundungsfehler auftreten können mit nur 2 Nachkommas
		#	<div id='".$idPrefix."line".$nummer."' class='line_unselected' onclick='select_bon_line(\"line".$nummer."\")'>

		if ($splitBonActive == true) {
			$prodNummer = $row_produkt['id'];
			$splitLine = $idPrefix . "line" . $nummer;
			if (array_key_exists($splitLine, $splitArray)) {
				$splitQty = $splitArray[$splitLine]['splitQty'];
				if ($splitQty > $row_produkt['stueck']) {
					$splitQty = $row_produkt['stueck'];
					for ($i = 0; $i < sizeof($_SESSION['splitBon' . $aktueller_bon]); $i++) {
						if (preg_replace('/\D/', '', $_SESSION['splitBon' . $aktueller_bon][$i][0]) == $nummer) {
							$_SESSION['splitBon' . $aktueller_bon][$i][1] = $splitQty;
						}
					}
				}


				$row_produkt['stueck'] = $row_produkt['stueck'] - $splitQty;
				$splitSumme = ($row_produkt['pricesell'] * (1 + $row_produkt['tax_rate'])) * $splitQty;
				$split_gesamt_summe += $splitSumme;
				$split_anzeige_summe = number_format($splitSumme, 2, ",", ".");
				$splitQty_anzeige = number_format($splitQty, 2, ",", ".");

				$splitBonOp .= "<div id='splittedLine" . $nummer . "' class='line_unselected' onclick=\"select_bon_line(this.id)\">
								<div id='splitted_bon_summe" . $nummer . "' class='bon_summe class=line_unselected' >" . $split_anzeige_summe . "</div>
								<div id='splitted_bon_steuer" . $nummer . "' class=bon_steuer class=line_unselected>" . $row_produkt['tax_rate'] * 100 . "</div>
								<div id='splitted_bon_stk" . $nummer . "' class=bon_stk class='line_unselected'>" . $splitQty_anzeige . "</div>
								<div id='splitted_bon_einzelpreis'" . $nummer . " hidden class=bon_einzelpreis class=line_unselected>" . $vk_preis . "</div>
								<div id='splitted_bon_einzelpreis_anzeige" . $nummer . "' class=bon_einzelpreis class=line_unselected>" . $vk_preis_anzeige . "</div>
								<div id='splitted_bon_name" . $nummer . "' class=bon_name class='line_unselected'>" . ($row_produkt['printname']) . "</div>
							</div>";
			}



			if ($row_produkt['stueck'] == 0) continue;
			$stk_anzeige = number_format($row_produkt['stueck'], 1, ",", ".");
			$anzeige_summe = number_format(($row_produkt['pricesell'] * (1 + $row_produkt['tax_rate'])) * $row_produkt['stueck'], 2, ",", ".");
		} else if ($moveBonActive == true) {
			$prodNummer = $row_produkt['id'];
			$moveLine = $idPrefix . "line" . $nummer;
			if (array_key_exists($moveLine, $moveArray)) {
				$moveQty = $moveArray[$moveLine]['moveQty'];
				if ($moveQty > $row_produkt['stueck']) {
					$moveQty = $row_produkt['stueck'];
				}
				for ($i = 0; $i < sizeof($_SESSION['moveBon' . $aktueller_bon]); $i++) {
					if (preg_replace('/\D/', '', $_SESSION['moveBon' . $aktueller_bon][$i][0]) == $nummer) {
						$_SESSION['moveBon' . $aktueller_bon][$i][1] = $moveQty;
					}
				}

				$row_produkt['stueck'] = $row_produkt['stueck'] - $moveQty;
				$moveSumme = ($row_produkt['pricesell'] * (1 + $row_produkt['tax_rate'])) * $moveQty;
				$move_gesamt_summe += $moveSumme;
				$move_anzeige_summe = number_format($moveSumme, 2, ",", ".");
				$moveQty_anzeige = number_format($moveQty, 2, ",", ".");

				$moveBonOp .= "<div id='movedLine" . $nummer . "' class='line_unselected' onclick=\"select_bon_line(this.id)\">
									<div id='moved_bon_summe" . $nummer . "' class='bon_summe class=line_unselected' >" . $move_anzeige_summe . "</div>
									<div id='moved_bon_steuer" . $nummer . "' class=bon_steuer class=line_unselected>" . $row_produkt['tax_rate'] * 100 . "</div>
									<div id='moved_bon_stk" . $nummer . "' class=bon_stk class='line_unselected'>" . $moveQty_anzeige . "</div>
									<div id='moved_bon_einzelpreis'" . $nummer . " hidden class=bon_einzelpreis class=line_unselected>" . $vk_preis . "</div>
									<div id='moved_bon_einzelpreis_anzeige" . $nummer . "' class=bon_einzelpreis class=line_unselected>" . $vk_preis_anzeige . "</div>
									<div id='moved_bon_name" . $nummer . "' class=bon_name class='line_unselected'>" . ($row_produkt['printname']) . "</div>
								</div>";
			}

			if ($row_produkt['stueck'] == 0) continue;
			$stk_anzeige = number_format($row_produkt['stueck'], 1, ",", ".");
			$anzeige_summe = number_format(($row_produkt['pricesell'] * (1 + $row_produkt['tax_rate'])) * $row_produkt['stueck'], 2, ",", ".");
		}

		if ($row_produkt['has_parent'] > 0) $hideLine = "hidden";
		else $hideLine = "";
		// RFR: 03.03.2020
		// keine Ahnung, warum das auskommentiert war - 
		// aber jetzt wird die Class elemHasChildes gesetzt, wenn es ein Kombiprodukt ist.
		if ($row_produkt['has_childs'] == 1) {
			$parentIdentic = "<input type='hidden' id='" . $idPrefix . "parentIdenticator" . $nummer . "' value = " . true . " />";
			$parentIdenticClass = "elemHasChildes";
			if (strlen($row_produkt['printname']) > 1) $displayName = $row_produkt['printname'];
			else $displayName = $row_produkt['name'];
			$lastParentProdukt_name = $row_produkt['printname'];	# kundendisplay, der letzte Parent wir in der Variable gespeichert und ersetzt dann den last Child
			$lastParentProdukt_qty = $row_produkt['stueck'];
			$lastParentProdukt_price = $row_produkt['pricesell'];
		} else {
			$parentIdentic = "";
			$parentIdenticClass = "";
		}


		#file_put_contents('kpcheckit.txt', "\n".basename( __FILE__)." / ". __LINE__ .": bonLineId: -> ".$nummer." toSelect: -> ".$openBonLineToSelect." ", FILE_APPEND);

		$selectClass = 'line_unselected';
		if ($nummer == $openBonLineToSelect) {
			$selectClass = 'line_selected';
			#file_put_contents('kpcheckit.txt', "\n".basename( __FILE__)." / ". __LINE__ ." ACTION: ----> ".$openBonLineToSelect." ", FILE_APPEND);

		}

		if ($row_produkt['discountChild'] > 0) {
			# von Reinhold. select function in discount line weggenommen ! hier $selectClass='line_selected'; einbauen bringt nichts, wird später von einer js func überschr
			$bonContent .= "<div id='" . $idPrefix . "line" . $nummer . "' " . $hideLine . " class='line_unselected_rabatt " . $parentIdenticClass . "' >";
		} else {
			$bonContent .= "<div id='" . $idPrefix . "line" . $nummer . "' " . $hideLine . " class='" . $selectClass . " " . $parentIdenticClass . "' onclick=\"select_bon_line(this.id)\">";
		}
		$bonContent .= "<div id='" . $idPrefix . "bon_summe" . $nummer . "' class='bon_summe' >" . $anzeige_summe . "</div>
					<div id='" . $idPrefix . "bon_steuer" . $nummer . "' class='bon_steuer' >" . $row_produkt['tax_rate'] * 100 . "</div>
					<div id='" . $idPrefix . "bon_stk" . $nummer . "' class='bon_stk'  >" . $stk_anzeige . "</div>
					<div id='" . $idPrefix . "bon_einzelpreis" . $nummer . "' hidden class='bon_einzelpreis' >" . $vk_preis . "</div>
					<div id='" . $idPrefix . "bon_einzelpreis_anzeige" . $nummer . "' class='bon_einzelpreis' >" . $vk_preis_anzeige . "</div>
					<div id='" . $idPrefix . "bon_name" . $nummer . "' class='bon_name'  >" . $row_produkt['printname'] . "</div>
					<input type='hidden' id='" . $idPrefix . "hiddenBeilagenMinusField" . $nummer . "' value = '" . $row_produkt['beilagen_aenderung_minus'] . "' />
					<input type='hidden' id='" . $idPrefix . "hiddenBeilagenPlusField" . $nummer . "' value = '" . $row_produkt['beilagen_aenderung_plus'] . "' />
					
					<input type='hidden' id='" . $idPrefix . "hiddenBeilagenBasispreisKeyField" . $nummer . "' value = '" . $row_produkt['beilagen_basispreis_key'] . "' />
					
					<input type='hidden' id='" . $idPrefix . "hiddenArtikelArtField" . $nummer . "' value = '" . $row_produkt['article_art_id'] . "' />
					<input type='hidden' name='lsSourceField' id='" . $idPrefix . "hiddenLsField" . $nummer . "' value = '" . $row_produkt['aus_ls_nr'] . "' />
					" . $parentIdentic . "
					<input type='hidden' id='" . $idPrefix . "hiddenBeilagenOrigPr" . $nummer . "' value = '" . $row_produkt['beilagen_prod_orig_preis'] . "' />
					<input type='hidden' id='" . $idPrefix . "hiddenBeilagenNetSum" . $nummer . "' value = '" . $row_produkt['beilagen_sum_netto'] . "' />
					<input type='hidden' id='" . $idPrefix . "hiddenBeilagenBrutSum" . $nummer . "' value = '" . $row_produkt['beilagen_sum_brutto'] . "' />
				</div>";
		// Weil bei einem Gesamtrabatt kein Kunde dabei steht
		if ($row_produkt['kunden_id'] > 0) $customerId = $row_produkt['kunden_id'];
	}
	$gesamt_summe_anz = number_format($gesamt_summe, 8, ",", ".");
	$gesamt_summe_display = number_format($gesamt_summe, 2, ",", ".");
	
	if ($splitBonActive == true) {
		$splitOrigin_gesamt_summe = $gesamt_summe - $split_gesamt_summe;

		$gesamt_summe_anz = number_format($split_gesamt_summe, 2, ",", ".");
		$splitBonOp .= "<input type='hidden' id='hiddenOriginBonSum' value='" . number_format($splitOrigin_gesamt_summe, 2, ",", ".") . "' />
							<input type='hidden' id='hiddenSplitBonSum' value='" . number_format($split_gesamt_summe, 2, ",", ".") . "' />
							<input type='hidden' id='hiddenTestSplitBonSum' value='" . $gesamt_summe . " - " . $split_gesamt_summe . " --- " . $splitOrigin_gesamt_summe . "' />";
		$bonContent .= "-|-" . $splitBonOp;
	} else if ($moveBonActive == true) {

		$bonContent .= "-|-" . $moveBonOp;
	} else	$bonContent .= "<input id='hiddenSumField' type='hidden' value='" . $gesamt_summe_anz . "' />
							<input id='hiddenStkField' type='hidden' value='" . $gesamt_menge . "' />
								<input id='hiddenSumDisplayField' type='hidden' value='" . $gesamt_summe_display . "' />
								<input id='hiddenStkDisplayField' type='hidden' value='" . $gesamt_menge . "' />";
	// hier stand ursprünglich das summen Feld

	// Auf Kundendisplay anzeigen *********************
	if (!empty($produkt_name)) {
		# fwenn der letzte Eintrag aus dem offenen Bon einen Parent hat, also Child ist, wird der zuletzt ausgelesene Parent name genommen
		if ($parentIndicat == true) {
			$produkt_name = $lastParentProdukt_name;
			$stk_anzeige = number_format($lastParentProdukt_qty, 1, ",", ".");
			$anzeige_summe = number_format($lastParentProdukt_qty * $lastParentProdukt_price, 2, ",", ".");
		}
		kundenanzeige_ausgeben($produkt_name, $stk_anzeige, $anzeige_summe, $gesamt_summe_display);
	} else {
		$zeile1 = "";
		$zeile2 = "";
		if (NULL !== KUNDENANZEIGE_LEERLAUF_ZEILE1) $zeile1 = KUNDENANZEIGE_LEERLAUF_ZEILE1;
		if (NULL !== KUNDENANZEIGE_LEERLAUF_ZEILE2) $zeile2 = KUNDENANZEIGE_LEERLAUF_ZEILE2;
		kundenanzeige_ausgeben_text($zeile1, $zeile2);
	}
	$currentCart = $_SESSION['aktuellerWarenkorb'];

	if (isset($_SESSION['customerToEmptyBon'])) $customerId = $_SESSION['customerToEmptyBon'];
	if (isset($customerId) && $customerId > 0) {
		$custData = mysql_fetch_array(mysql_query("SELECT Firma, anrede, titel, vorname, nachname, plz, Ort, zone, id,kundennummer FROM kunden WHERE id = $customerId"));

		if (strlen($custData[1]) > 0) $cAnr = $custData[1] . " ";
		else $cAnr = "";
		if (strlen($custData[2]) > 0) $cTitel = $custData[2] . " ";
		else $cTitel = "";

		$cName = false;
		if (strlen($custData[3]) > 0 && strlen($custData[4]) > 0) $cName = $custData[4] . " " . $custData[3];
		else if (strlen($custData[3]) > 0 && strlen($custData[4]) == 0) $cName = $custData[3];
		else if (strlen($custData[3]) == 0 && strlen($custData[4]) > 0) $cName = $custData[4];
		else $cName = "";

		$cFirma = false;
		if (strlen($custData[0]) > 0 && (strlen($cAnr) > 0 ||	strlen($cTitel) > 0 || strlen($cName) > 0)) $cFirma = $custData[0] . ", ";
		else if (strlen($custData[0]) > 0 && strlen($cAnr) == 0 && strlen($cTitel) == 0 && strlen($cName) == 0) $cFirma = $custData[0];
		else $cFirma = "";

		$custPlz = '';
		if (strlen($custData[5]) > 2) $custPlz = " " . $custData[5];
		$custCity = '';
		if (strlen($custData[6]) > 2) $custCity = " " . $custData[6];
		$custZone = '';
		if (strlen($custData[7]) > 2) $custZone = " " . $custData[7];
		$db_id = '';
		if (strlen($custData[8]) > 0) $db_id = " " . $custData[8];


		if (defined('KUNDENANZEIGE_VERKAUFSMASKE') && strlen(KUNDENANZEIGE_VERKAUFSMASKE) > 1) {

			$samplStrCut = preg_replace('/[^FAVNNNPZOTIDKN;]/', '', strtoupper(KUNDENANZEIGE_VERKAUFSMASKE));
			$custAr = explode(";", $samplStrCut);
			for ($i = 0; $i < sizeof($custAr); $i++) {
				
				if ($custAr[$i] == 'FA') $custAr[$i] = $cFirma;
				else if ($custAr[$i] == 'VN') $custAr[$i] = $custData[3];
				else if ($custAr[$i] == 'NN') $custAr[$i] = $custData[4];
				else if ($custAr[$i] == 'PZ') $custAr[$i] = $custData[5];
				else if ($custAr[$i] == 'OT') $custAr[$i] = $custData[6];
				else if ($custAr[$i] == 'ZO') $custAr[$i] = $custData[7];
				else if ($custAr[$i] == 'ID') $custAr[$i] = $custData[8];
				else if ($custAr[$i] == 'KN') $custAr[$i] = $custData[9];
				else $custAr[$i] = "";
			}

			$customerData = implode(" ", $custAr);
		} else $customerData = $cFirma . $cName;
	} else $customerData = "";


	#$customerData = strlen($customerData) > 25 ? substr($customerData,0,25)."..." : $customerData;	
	# macht error wenn an 15 stelle grad ein umlaut (multibyte char) kommt. klumpat
	global $pattern, $replace;   //   stored in connect.php
	$customerData = preg_replace($pattern, $replace, $customerData);

	$bonContent .= "<script>
		
				document.getElementById('zahlbetrag').value='" . $gesamt_summe_anz . "';
				document.getElementById('zahlbetragDisplay').value='" . $gesamt_summe_display . "';
				zahlung_gedrueckt();
				
				$('#bon_sum_div_customer_name, #kundenNameFeld').html('" . $customerData . "').attr('title', '" . $customerData . "');
				$('#warenkorb" . $currentCart . "').each(function () {
					
					$(this).removeClass('line_unselected');
					$(this).addClass('line_selected');
				});
		
		
		</script>";

	# +/- Artikel bringt kein callFrom, daher rechnen wir das EK-Limit gegenüber Curr EK immer wenn Preisgruppen freigegeben werden
	$kdEinkaufsLimit = false;
	#$missingCustomer=false;

	if (defined('SONDERPREIS_ENABLED') && strtolower(SONDERPREIS_ENABLED) == 'ja') {

		if (isset($customerId) && $customerId > 0) {
			$checkCustLimit = mysql_fetch_array(mysql_query("SELECT offener_bon.ID, offener_bon.kunden_id AS kundenId, SUM((PRICESELL * stueck) * (1+tax_rate )) AS bonSum, 
							einkaufslimit, kunden_attribute.einkaufslimit_bisher_eingekauft AS usedLimit
						FROM offener_bon	
						LEFT JOIN kunden ON kunden.id = offener_bon.kunden_id
						LEFT JOIN kunden_attribute ON kunden_attribute.kunden_id = offener_bon.kunden_id
						WHERE bon_id = '" . $currentCart . "' LIMIT 1"));

			$kdEinkaufsLimit = $checkCustLimit['einkaufslimit'] - $checkCustLimit['usedLimit'] - $checkCustLimit['bonSum'];
			$kdEinkaufsLimit = number_format($kdEinkaufsLimit, '2', '.', '');

			#writeLog(basename( __FILE__)." ". __LINE__ , "EK Limit: ".$checkCustLimit['einkaufslimit']." - Used Limit: ".$checkCustLimit['usedLimit']." - current Bon: ".$checkCustLimit['bonSum']."\n");
		} else if (isset($customerId) === false) {
			#$kdEinkaufsLimit='missingSelectedCustomer';
			#$missingCustomer='missingSelectedCustomer';

		} else {
			#$kdEinkaufsLimit='missingSelectedCustomer';
			# kein kunde, somit keine EK Limits ...
			# noch unklar ob wir da eine Dialog Box öffnen ??-!!-??
		}


		#	writeLog(basename( __FILE__)." ". __LINE__ , "EK Limit: ".$checkOpenCart['einkaufslimit']." - Current Limit: ".$checkOpenCart['bonSum']." - current Bon: ".$checkOpenCart['bonSum']."\n");
	}

	//echo $bonContent;
	# $openBonLineToSelect wird für soma funktion verwendet
	$cartContent = zeige_warenkoerbe('bonAnzeigenFunction');
	if ($callFrom == 'bonieren_funktion') {
		return array($bonContent, $cartContent, $gesamt_summe_anz, $customerData, $currentCart, $gesamt_summe_display, $openBonLineToSelect, false);
	} else {

		# return Value -> kassieren.php ca 600 function bon_anzeigen  
		echo json_encode(array($bonContent, $cartContent, $bonZusatzText, $kdEinkaufsLimit, '', '', $openBonLineToSelect, false));
	}
}

function zeigeFavoritenProdukte()
{
	$getFav = mysql_query("SELECT products.id, products.name, bg_color, txt_color, color, text_color FROM products              
	LEFT JOIN categories on categories.id=products.category
	WHERE ist_favorit='1' AND sichtbar=TRUE AND products.geloescht=0 ORDER by categories.anzeige_reihenfolge, produktorder, NAME ASC");

	if (!$getFav) {
		echo "Datenbank Fehler. " . mysql_error();
	} else {
		#$checkX=mysql_num_rows($getFav);

		$favOutput = "";

		while ($getFavorit = mysql_fetch_array($getFav)) {
			if (isset($getFavorit['bg_color']) && strlen($getFavorit['bg_color']) > 3) $prodBgColor = $getFavorit['bg_color'];
			else $prodBgColor = $getFavorit['color'];
			if (isset($getFavorit['txt_color']) && strlen($getFavorit['txt_color']) > 3) $prodTxtColor = $getFavorit['txt_color'];
			else $prodTxtColor = $getFavorit['text_color'];

			$favOutput .= "<input type='button'  class='button produkt_button' style='background-color:" . $prodBgColor . "; color:" . $prodTxtColor . "' 
					value='" . $getFavorit['name'] . "' onclick='produkt_bonieren(" . $getFavorit['id'] . ")'/>";
		}
		echo $favOutput;
	}
}

// Funktion zeigt alle produkte einer Kategorie im Verkaufsfenster an
function zeige_produkte($kategorie_id)
{
	// Zeige zuerst die Sub Kategorien an
	$sql = "select id, name, color, text_color from categories WHERE PARENTID=$kategorie_id AND geloescht=0
					ORDER by anzeige_reihenfolge, name ASC";
	$sql_kategorien = mysql_query($sql);
	if (!$sql_kategorien) {
		echo "SQL Fehler: " . mysql_error();
		exit(1);
	}

	// Zeige die Kategorien an
	while ($row_kategorien = mysql_fetch_assoc($sql_kategorien)) {

		//echo mb_detect_encoding($row_kategorien['name']);
		echo "<input type='button'  class='button produkt_button' style='background-color:" . $row_kategorien['color'] . "; color:" . $row_kategorien['text_color'] . "' value='" . $row_kategorien['name'] . "' onclick='produkte_anzeigen(" . $row_kategorien['id'] .")'/>";
	}

	// und dann die Produkte anzeigen
	# bg_color u txt_color kommt aus dem products Table, color u text_color aus categories
	$sql = "SELECT products.id, products.name, bg_color, txt_color, color, text_color FROM products	
				LEFT JOIN categories on categories.id=products.category
				WHERE category='" . $kategorie_id . "' AND sichtbar=TRUE AND products.geloescht=0 ORDER by produktorder, NAME ASC";
	$sql_produkte = mysql_query($sql);
	if (!$sql_produkte) {
		echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	$i=0;
	while ($row_produkt = mysql_fetch_assoc($sql_produkte)) {
		if (isset($row_produkt['bg_color']) && strlen($row_produkt['bg_color']) > 3) $prodBgColor = $row_produkt['bg_color'];
		else $prodBgColor = $row_produkt['color'];
		if (isset($row_produkt['txt_color']) && strlen($row_produkt['txt_color']) > 3) $prodTxtColor = $row_produkt['txt_color'];
		else $prodTxtColor = $row_produkt['text_color'];

		echo "<input type='button'  class='button produkt_button' style='background-color:" . $prodBgColor . "; color:" . $prodTxtColor . "' 
				value='" . $row_produkt['name'] . "' onclick='produkt_bonieren(" . $row_produkt['id'] . ")'/>";
	}
}

function zeige_warenkoerbe($callFrom = false)
{
	$warenkoerbeCont = "";
	$max_warenkorb = 1;
	$sql = "select DISTINCT bon_id FROM offener_bon ORDER BY bon_id";
	$sql_produkte = mysql_query($sql);
	if (!$sql_produkte) {
		$warenkoerbeCont .= "SQL Fehler: " . mysql_error();
		exit(1);
	}
	// 2018-05-10	Abfrage Gastro version hinzugefügt - Wenn F5 gedrückt wurde wurde Warenkorb 1 verwendet - obwohl es den nicht gibt
	if (mysql_num_rows($sql_produkte) == 0 && strtolower(GASTRO_VERSION) !== 'ja') {
		//echo "keine Warenkörbe gefudnen";
		$max_warenkorb = 1;
		$_SESSION['aktuellerWarenkorb'] = $max_warenkorb;
		$warenkoerbeCont .= "<input type='button'  class='warenkorb_button warenkorb_selected' id='warenkorb1' value='1' onclick='warenkorb_waehlen(this)'/>
							<input id='max_warenkorb' class='cclear' value='" . $max_warenkorb . "' hidden disabled/>";
	} else {
		if (isset($_SESSION['aktuellerWarenkorb'])) $aktueller_bon = $_SESSION['aktuellerWarenkorb'];
		$existingCarts = "";
		$extraClass = "";
		while ($row_produkt = mysql_fetch_assoc($sql_produkte)) {
			$extraClass = "";
			$bon_id = $row_produkt['bon_id'];
			if ($aktueller_bon == $bon_id) $extraClass = "warenkorb_selected";
			$existingCarts .= "<input type='button'  class='warenkorb_button " . $extraClass . "' id='warenkorb" . $bon_id . "' value='" . $bon_id . "' onclick='warenkorb_waehlen(this)'/>";
			$max_warenkorb = $bon_id;
		}

		if ($aktueller_bon > $max_warenkorb) $existingCarts .= "<input type='button'  class='warenkorb_button " . $extraClass . "' id='warenkorb" . $aktueller_bon . "' 
								value='" . $aktueller_bon . "' onclick='warenkorb_waehlen(this)'/>";
		$warenkoerbeCont .= $existingCarts .= "<input type='button'  class='warenkorb_button' value='+' onclick='warenkorb_waehlen(\"add\")'/>
											<input id='max_warenkorb' class='cclear' value='" . $max_warenkorb . "' hidden disabled/>";
	}

	if ($callFrom == 'bonAnzeigenFunction') {
		return $warenkoerbeCont;
	} else echo $warenkoerbeCont;

	//	echo $max_warenkorb."<input id='max_warenkorb' value='".$max_warenkorb."' hidden disabled/>";
}

function ziffernblock_anzeigen($onclick_funktion, $callFrom = false)
{

	/*	echo "<input type='button'  class='button ziffernblock_button orange' value='Storno' onclick='fnOpenNormalDialog()'/>";
		echo "<input type='button'  class='button ziffernblock_button orange' value='Storno' 
										onclick=\"openGeneralDialog('stornoButton', 'Gesamten Bon Löschen', '".$stornoContent."', 'wrapper')\" />";		//	openGeneralDialog(callFrom=false, boxTitle, dialogContent=false)
	*/
	if (defined('CE_BUTTON_TEXT') && strlen(CE_BUTTON_TEXT) > 0) {
		$ceTxt = CE_BUTTON_TEXT;
	} else $ceTxt = 'CE';

	$enterBut = false;
	if ($callFrom == 'bonieren') {
		$ziffernClass = 'ziffernblock_button';
		#<input type='button'  class='button ".$ziffernClass." orange' value='".$ceTxt."' onclick='".$onclick_funktion."'/>
		$firstKeyRow = "<button class='button " . $ziffernClass . " orange' value='CE' onclick='" . $onclick_funktion . "'>" . $ceTxt . "</button>
				<input type='button'  class='button " . $ziffernClass . " orange' value='*' onclick='" . $onclick_funktion . "'/>
				<input type='button'  class='button " . $ziffernClass . " orange' value='Enter' onclick='" . $onclick_funktion . "'/>";
	} else if ($callFrom == 'gutscheinModal' || $callFrom == 'kassierenGutschModul') {
		if ($callFrom == 'kassierenGutschModul') $ziffernClass = 'ziffernblock_button';
		else $ziffernClass = 'ziffernblock_button_gutscheinmodal';
		$firstKeyRow = "<button  class='button " . $ziffernClass . " orange' value='CE' onclick='" . $onclick_funktion . "'>" . $ceTxt . "</button>
				<input type='button'  class='button " . $ziffernClass . " orange' value='-' onclick='" . $onclick_funktion . "'/>
				<input type='button'  class='button " . $ziffernClass . " orange' value='" . GS_PREFIX . "' onclick='" . $onclick_funktion . "'/>";
		$enterBut = "<input type='button'  class='button " . $ziffernClass . " orange' value='Enter' onclick='" . $onclick_funktion . "'/>
						<div class='cclear'></div>";
	}			#kassierenGutschModul

	else {
		$ziffernClass = 'ziffernblock_button';
		$firstKeyRow = "<button  class='button ziffernblock_button2 orange' value='CE' onclick='" . $onclick_funktion . "' >" . $ceTxt . "</button>
					<input type='button'  class='button " . $ziffernClass . " orange' value='*' onclick='" . $onclick_funktion . "'/>";
	}

	echo $firstKeyRow;
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='7' onclick='" . $onclick_funktion . "'/>";
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='8' onclick='" . $onclick_funktion . "'/>";
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='9' onclick='" . $onclick_funktion . "'/>";
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='4' onclick='" . $onclick_funktion . "'/>";
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='5' onclick='" . $onclick_funktion . "'/>";
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='6' onclick='" . $onclick_funktion . "'/>";
	echo "<br>";
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='1' onclick='" . $onclick_funktion . "'/>";
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='2' onclick='" . $onclick_funktion . "'/>";
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='3' onclick='" . $onclick_funktion . "'/>";
	echo "<br>";
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='0' onclick='" . $onclick_funktion . "'/>";
	echo "<input type='button'  class='button " . $ziffernClass . " orange' value='.' onclick='" . $onclick_funktion . "'/>";
	echo $enterBut;

	//echo "<input type='button'  style='background-color:".ZIFFERN_FARBE."; height:" . ZIFFERN_HOEHE . "; width:" . ZIFFERN_BREITE . "' value='.' onclick='".$onclick_funktion."'/>";
}

function steuerung_anzeigen()
{
	$uLevel = $_SESSION['userLevel'];
	echo "<div id='steuerung' >
				<div id='steuereungContent'>";
	echo "<input type='button'  class='button steuerung_button orange' value='+' onclick='funktionstaste_gedrueckt(this.value)'/>";
	echo "<input type='button'  class='button steuerung_button orange' value='-' onclick='funktionstaste_gedrueckt(this.value)'/>";
	if ($_SESSION["userLevel"] >= ENABLERKEY_BONZEILE_LOESCHEN) {
		echo "<input type='button'  class='button steuerung_button orange deleteButton' value='' onclick=\"funktionstaste_gedrueckt('Del')\"/>";
	}
	if (strtolower(EDIT_BUT_DISPLAY) == 'ja') {
		echo "<input type='button'  id='editieren_button_id' class='button steuerung_button orange editButton' value='' />";
	}
	if (strtolower(FUNKTION_BUTTON_EINZELRABATT_ANZEIGEN) == 'ja') {
		echo "<input type='button'  class='button steuerung_button orange' value='%' onclick='funktionstaste_gedrueckt(\"ER\")'/>";
	}
	$r1 = FUNKTION_BUTTON_EINZELFIXRABATT_1_VALUE;
	if (strtolower(FUNKTION_BUTTON_EINZELFIXRABATT_1_ANZEIGEN) == 'ja') {
		echo "<input type='button'  class='button steuerung_button orange' value='" . $r1 . "%' onclick='funktionstaste_gedrueckt(\"ER-1\")'/>";
	}
	$r2 = FUNKTION_BUTTON_EINZELFIXRABATT_2_VALUE;
	if (strtolower(FUNKTION_BUTTON_EINZELFIXRABATT_2_ANZEIGEN) == 'ja') {
		echo "<input type='button'  class='button steuerung_button orange' value='" . $r2 . "%' onclick='funktionstaste_gedrueckt(\"ER-2\")'/>";
	}
	if (strtolower(FUNKTION_BUTTON_GESAMTRABATT_ANZEIGEN) == 'ja') {
		echo "<input type='button'  class='button steuerung_button orange' value='%%' onclick='funktionstaste_gedrueckt(\"GR\")'/>";
	}

	echo "</div>
						</div>";
}

function ist_kassa_offen()
{
	$sql = "select id from kassa_abschluesse	WHERE kassa_offen=true";
	$sql_offen = mysql_query($sql);
	if (!$sql_offen) {
		echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	$numResults = mysql_num_rows($sql_offen);
	if ($numResults > 0) {
		$row = mysql_fetch_object($sql_offen);
		$kassa_offen_id = $row->id;
		return ($kassa_offen_id);
	} else return (false);
}

function eroeffne_kassa()
{
	$kp_contW = 99 - (int)str_replace("%", "", ZIFFERN_CONTAINER_BREITE) . "%;";

	echo "<style type='text/css'>						
						.selectRoomMenuDiv { display:none;}	
						.tischLayoutContainer  { display:none;}	
						.defineMobilePrinterDiv { display:none;}	
			</style>";

	if (isset($_SESSION['requested_resolution']) && $_SESSION['requested_resolution'] == true) {
		$kp_contW = 80 . "%";
		echo "<style type='text/css'>						
					.kassaOeffnenDiv{ margin:125px auto 0 auto; height:25% !important; padding:0 10%;		}	
					
			</style>";
		$ziffernBlockClass = "ziffernblock_mobile";
	} else $ziffernBlockClass = "ziffernblock";


	$abschlussStatus = monatsAbschlussStatus();

	$abschlussMsg = false;
	$abschlussMsgAdd = false;
	$abschlBonLink = false;
	//echo "Abschluss Status $abschlussStatus";
	if ($abschlussStatus != false && NULLBELEG_AUTOMATISCH_ERSTELLEN == 'nein') {
		$abschlussMsg = "<div class='kassaOeffnenAbschlWarningDiv'>
				<p style='font-weight:bold;'>" . $abschlussStatus . "</p>
				<button class='button_none_float button_gross orange kassaOeffnenBut' style='margin:0 0 2% 0;'
							onClick=\"document.location.href='abschlussbeleg_erstellen.php'\" >Abschluss Bon</button><br />
						</div>";

		$abschlussMsgAdd = "<span style='font-weight:bold; font-size:1.2em; color:#c00'> trotzdem </span>";
	} else if ($abschlussStatus != false) {
		// Das ist die Info, dass der Abschlussbeleg erstellt wurde
		$abschlussMsg = "<div class='kassaOeffnenAbschlWarningDiv'>
				<p style='font-weight:bold;'>" . $abschlussStatus . "</p>
				<br />
						</div>";

		$abschlussMsgAdd = "";
	}

	if (
		defined('KASSA_OFFNEN_FIXBETRAG_OPTION') && strtolower(KASSA_OFFNEN_FIXBETRAG_OPTION) == 'ja' &&
		defined('KASSA_OFFNEN_FIXBETRAG_BETRAG') && is_numeric(KASSA_OFFNEN_FIXBETRAG_BETRAG)
	) {
		$defaultWechselg = KASSA_OFFNEN_FIXBETRAG_BETRAG;
	} else {
		$lastA = mysql_fetch_array(mysql_query("SELECT id AS lastAbschl, wechselgeld FROM kassa_abschluesse 
											WHERE id=( SELECT max(id) FROM kassa_abschluesse) AND kassa_offen = 0"));
		$lastAbschl = $lastA['lastAbschl'];

		$revZ = mysql_fetch_array(mysql_query("SELECT SUM(zahlbetrag) AS gesBetragBon FROM abgeschlossener_bon_zahlung 
													LEFT JOIN abgeschlossener_bon ON abgeschlossener_bon_zahlung.bon_id=abgeschlossener_bon.bon_id
													LEFT JOIN zahlungsart ON abgeschlossener_bon_zahlung.name=zahlungsart.name
													WHERE kassa_abschluss_id = '" . $lastAbschl . "' AND kassastand_wirksam = 1"));
		$eaZ = mysql_fetch_array(mysql_query("SELECT SUM(gesamt_betrag) AS gesBetragEa FROM `ein_aus_zahlungen`
													WHERE kassa_abschluss_id = '" . $lastAbschl . "' "));
		$gsZ = mysql_fetch_array(mysql_query("SELECT SUM(betrag_geladen) AS gutschAusgest FROM gutschein_buchungen
												LEFT JOIN zahlungsart ON zahlungsart.id = gutschein_buchungen.zahlungsart_id
												WHERE kassa_abschluss_id = '" . $lastAbschl . "'AND LOWER(verkaufsArt) = 'gsverkauf' AND kassastand_wirksam = 1 "));

		$defaultWechselg = number_format($lastA['wechselgeld'] + $eaZ['gesBetragEa'] + $revZ['gesBetragBon'] + $gsZ['gutschAusgest'], 2, ".", "");
	}

	echo '<div class="bon kassaOeffnenDiv" style="width:' . $kp_contW . '" >';

	echo $abschlussMsg;

	echo '<form class="kassaOeffnenForm" action="ajax_funktionen.php">';
	echo "<h2>Kassa ist geschlossen</h2>
				<p>Wollen Sie die Kassa jetzt " . $abschlussMsgAdd . " eröffnen ?</p>";
	$date = date('d-m-Y H:i:s', time());
	echo "<p>Datum: $date</p>";
	echo '<p>Geben Sie das Wechselgeld ein : ';
	echo "<input type='text' name='wechselgeld' id='wechselgeld' class='schrift kassaOeffnenIp' value='" . $defaultWechselg . "' 
					onkeyup='formatNumberKp(this)'  maxlength='20'  />
				</p>";


	echo '<input type="hidden" name="funktion" value="kassa_oeffnen" />';

	echo "<input id='toggle' value='wechselgeld' type='hidden' disabled/>
				<div class='cclear'></div>";
	echo "<button type='submit' class='button_none_float button_gross orange kassaOeffnenBut' >Kassa &ouml;ffnen</button>";
	echo "</form>";
	echo '</div>';
	echo '<div class="' . $ziffernBlockClass . '" >';
	// Ziffernblock anzeigen, aber den * disablen
	ziffernblock_anzeigen("ziffer_gedrueckt(this.value, true)");
	echo '</div>
		<div class="cclear"></div>';
	// KPE Feb 2021			glaub das wird nicht verwendet ! ? !

	checkLicOnKassaOeffnen();
	$verifyStatus = checkLicenseLastVerify();
	#if($verifyStatus[3] === true){
	// hier fehlt noch das gesperrt !!!!!!!!!
	#	echo "globalFunction 2635, status -> abgelaufen<br>";
	#}
	echo '<div id="kassaOeffnenInfoDiv">' . $verifyStatus[0] . '</div>';
	echo '<script>	$("#menue_warenkoerbe, #menuDivRight").css({ "visibility":"hidden"	});	
							// kunstgriff damit der focus nach hinten kommt
						xGeld=$("#wechselgeld").val();
						$("#wechselgeld").val("");
						setTimeout(function () {$("#wechselgeld").focus().val(xGeld); }, 2);
			</script>';

	/*if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja" && FILIALSYSTEM_SYNCHRONISATION_KASSA_OEFFNEN == "ja") {
			$options = array(
				'http' => array (
					'header' => "Content-type: application/x-www-form-urlencoded\r\nConnection: close\r\n",
					'method' => "POST",
					'content' => http_build_query(array("funktion" => "upsync", "selVal" => "incr"))
				)
			);
			$context = stream_context_create($options);
			$result = file_get_contents("ajax_funktionen.php", false, $context);
			echo "<script>console.log('done')</script>";
		} else {
			echo "<script>console.log('not activated')</script>";
		}*/
}

function checkMobilerDrucker()
{
	if (defined('MOBILER_DRUCKER') && strtolower(MOBILER_DRUCKER) == 'ja') {
		if (isset($_SESSION['selectedMobilPrinterId']) && $_SESSION['selectedMobilPrinterId'] > 0) {
			return true;
		} else return false;
	} else {
		return true;
	}
}

function defineMobilenDrucker()
{
	$prQl = mysql_query("SELECT * FROM drucker");
	$printerSelect = "<select id='defineMobilePrinterSelect' class='defineMobilePrinterSelect'>
			<option >Mobilen Drucker wählen</option>";
	while ($prRow = mysql_fetch_array($prQl)) {
		$prId = $prRow['drucker_id'];
		$printerSelect .= "<option id=" . $prId . "  >" . $prRow['win_drucker_name'] . " / " . $prRow['funktion'] . "</option>";
	}

	echo '
			<script>
				function mobilePrinterSelectBut(){
					console.log("function mobile drucker aufgerufen");
				printerId=$("#defineMobilePrinterSelect option:selected").prop(\'id\');
				if(printerId >0 ){
					
					xmlhttp=GetXmlHttpObject();
					xmlhttp.open("POST", "ajax_funktionen_kp.php", false);
					xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
					sendCont="functionKey=setSession&selectMobilePrinter=true&mobilePrinterId="+printerId;
					
					xmlhttp.send(sendCont);
					resp=xmlhttp.responseText;
					
					if (resp.toLowerCase().indexOf(\'success\') !== -1){
						console.log("function mobile drucker aufgerufen response: "+resp);
						location.reload(); 
					}
				}
				else return false;
			}
			</script>';

	$printerSelect .= "</select>";

	echo "<style type='text/css'>						
						.selectRoomMenuDiv { display:none;}	
						#warenkoerbeLayoutContainer { display:none;}	
						.tischLayoutContainer  { display:none;}	
						.printerConfirmBut { position:relative; display:block; width:50%; line-height:1.5em;	margin:5% auto;		}
						</style>";

	echo "<div class='bon defineMobilePrinterDiv' style='' >
				<p>Auswahl mobilen Drucker</p>
				<p>" . $printerSelect . "</p>
				<button class='printerConfirmBut button_none_float orange' onclick='mobilePrinterSelectBut()' >Ausgew&auml;hlten Drucker bestigen</button>
				</div>";
}


function pdf_steuersaetze_ausgeben($bon_id, $pdf, $zoomF, $lineHeight)
{

	$sql_produkte = mysql_query("select tax_rate, gesamt_betrag from abgeschlossener_bon_steuern WHERE bon_id='" . $bon_id . "'");
	if (!$sql_produkte) {
		echo "<script>console.log('Datenbank Fehler: '" . mysql_error() . ")</script>";
		exit(1);
	}
	while ($row_produkt = mysql_fetch_assoc($sql_produkte)) {
		$steuersatz = $row_produkt["tax_rate"] * 100;
		$netto = $row_produkt["gesamt_betrag"];

		$steuer = $netto * $row_produkt["tax_rate"];
		$brutto = $netto + $steuer;
		$prtSteuer = round($brutto, 2) - round($netto, 2);
		$brutto = number_format($brutto, 2, ",", ".");
		$netto = number_format($netto, 2, ",", ".");
		#$steuer=number_format($steuer,2,",",".");
		$steuer = number_format($prtSteuer, 2, ",", ".");

		$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_SATZ) * $zoomF, $lineHeight, $steuersatz, 0, 0, 'R');
		$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_NETTO) * $zoomF, $lineHeight, $netto, 0, 0, 'R');
		$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_STEUER) * $zoomF, $lineHeight, $steuer, 0, 0, 'R');
		$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_BRUTTO) * $zoomF, $lineHeight, $brutto, 0, 1, 'R');
	}
	return ($pdf);
}

function bon_ausdrucken_pdf($bon_id = false, $bonHeight = false, $callFrom = false, $bedienerName = false, $targetPrinter = false, $qrDataStore = false)
{

	log_to_file("--------> bon_ausdrucken_pdf");

	if (isset($_POST['requestId']) && $_POST['requestId'] != "") $requestId = $_POST['requestId'];
	else $requestId = "";
	if (isset($_POST['requestFunktion']) && $_POST['requestFunktion'] != "") $requestFunktion = $_POST['requestFunktion'];
	else $requestFunktion = "";
	$printRequest = false;
	if (isset($_POST['printRequest']) && $_POST['printRequest'] != "") $printRequest = $_POST['printRequest'];

	if ($bonHeight == false) $bonHeight = AUSDRUCK_PDF_GESAMTE_HOEHE;

	#file_put_contents('kpcheckit.txt', "\n".basename( __FILE__)." / ". __LINE__ ."xxxxxxxxxxxx\n", FILE_APPEND);

	
		require_once('include/extended_fpdf.php');

	if ($bon_id == false) {
		$bon_id = $requestId;
		$ajaxRequest = true;
	}

	if ($requestFunktion == 'bonReprint') {
		$currentUserId = $_SESSION['userId'];
		$lastClosedBon = mysql_fetch_array(mysql_query("SELECT MAX(bon_id) FROM abgeschlossener_bon WHERE verkaufer_id = " . $currentUserId . ""));

		$bon_id = $lastClosedBon[0];
	}

	# Drucker auswahl nach Kriterien !!
	log_to_file("Drucker auswahl nach Kriterien.");
	$userIp = getUserIp();
	$selectPrinterByIp = false;
	$pridByIp = false;
	$checkPrByIp = mysql_fetch_array(mysql_query("SELECT win_drucker_name, drucker_margin_pdf, zoom_factor, druckbreite, drucker_id  
								FROM drucker WHERE ip_adressen LIKE '%" . $userIp . "%' LIMIT 1"));
	if ($checkPrByIp !== false) {
		$selectPrinterByIp = true;
		$pridByIp = $checkPrByIp['drucker_id'];
	}

	if (isset($_SESSION['selectedMobilPrinterId']) && $_SESSION['selectedMobilPrinterId'] > 0) {
		$prid = $_SESSION['selectedMobilPrinterId'];
		$printer = mysql_fetch_array(mysql_query("SELECT win_drucker_name, drucker_margin_pdf, zoom_factor, druckbreite  
							FROM drucker WHERE drucker_id = " . $prid . " "));
	} else if ($selectPrinterByIp == true && $pridByIp > 0) {
		# übernehme die oben schon ausgelesenen Werte.
		$printer = $checkPrByIp;
	} else if (isset($targetPrinter) && strlen($targetPrinter) > 2) {
		$targetPrinter = strtolower($targetPrinter);
		$printer = mysql_fetch_array(mysql_query("SELECT win_drucker_name, drucker_margin_pdf, zoom_factor, druckbreite  
					FROM drucker WHERE LOWER(funktion) = '" . $targetPrinter . "' "));
		if ($printer['win_drucker_name'] == false) {
			$printer = mysql_fetch_array(mysql_query("SELECT win_drucker_name, drucker_margin_pdf, zoom_factor, druckbreite  
					FROM drucker WHERE LOWER(ist_rechnungsdrucker) = 'ja' "));
		}
	} else {
		$printer = mysql_fetch_array(mysql_query("SELECT win_drucker_name, drucker_margin_pdf, zoom_factor, druckbreite  
					FROM drucker WHERE LOWER(ist_rechnungsdrucker) = 'ja' "));
	}

	#file_put_contents('kpcheckit.txt', "\n".basename( __FILE__)." / ". __LINE__ ."############ ausdruck pdf printer ->  ".$printer[0]."    \n", FILE_APPEND);

	

	if ($printer['druckbreite'] == true && $printer['druckbreite'] > 35) $bonWidth = $printer['druckbreite'];
	else $bonWidth = preg_replace('/[^\d]/', '', AUSDRUCK_GESAMTE_BREITE);

	$drucker = $printer[0];
	$margin = $printer[1];
	$margins = explode(",", $margin);


	if ($printer[2] >= .5) $zoomF = $printer[2];
	else $zoomF = 1;

	#$zoomF=$printer[2];
	$bonWidth *= $zoomF;


	if (isset($margins[2])) $marginLR = preg_replace('/\D/', '', $margins[2]);
	else $marginLR = 0;
	if (isset($margins[1])) $marginBottom = preg_replace('/\D/', '', $margins[1]);
	else $marginBottom = 0;
	if (isset($margins[0])) $marginTop = preg_replace('/\D/', '', $margins[0]);
	else $marginTop = 0;

	$pdf = new PDF_MemImage('P', 'mm', array($bonWidth, $bonHeight));
	$pdf->SetMargins($marginLR, $marginTop, 0);			// margin right (optional) set to 0, rest of pager width	
	$pdf->AddPage();

	$checkBankZahlung = mysql_fetch_array(mysql_query("SELECT id FROM abgeschlossener_bon_zahlung WHERE bon_id = $bon_id AND NAME = 'Bank' "));
	if ($checkBankZahlung[0] > 0) $kopfzeilenParm = "PrintBankdata";
	else $kopfzeilenParm = "";

	$fontConfig = SCHRIFT_AUSDRUCK_PDF;

	if (
		strpos(strtolower($fontConfig), 'arial') !== false  || strpos(strtolower($fontConfig), 'helvetica') !== false ||
		strpos(strtolower($fontConfig), 'sans serif') !== false
	) {
		$pdfFont = "Arial";
		$z = "Arial";
	} else if (
		strpos(strtolower($fontConfig), 'times') !== false  || strpos(strtolower($fontConfig), 'roman') !== false ||
		(strpos(strtolower($fontConfig), 'serif') !== false &&  strpos(strtolower($fontConfig), 'sans') == false)
	) {
		$pdfFont = "Times";
		$z = "Times";
	} else if (strpos(strtolower($fontConfig), 'courier') !== false) {
		$pdfFont = "Courier";
		$z = "Courir";
	} else {
		$pdfFont = "Arial";
		$z = "Default";
	}

	preg_match('/\d+px | \d+pt/', $fontConfig, $m);
	preg_match('/\d+/', $m[0], $match);
	$pdfFontSize = $match[0] * $zoomF;				#  stimmt nicht wirklich, fpdf verwendet hier pt und nciht px, pt ist auf inch bezogen, px auf sreen dott size.


	#aenderung August 2020 Error (undefined Varable $fontSize & $fontWeight) z.B ausdruck Sammelbeleg !!!
	if (!isset($fontSize)) {
		$fontSize = $pdfFontSize;
	}
	if (!isset($fontWeight)) {
		$fontWeight = "";
	}

	#	file_put_contents('kpcheckit.txt', "\n".basename( __FILE__)." / ". __LINE__ ." fontSize/fontWeight -> ".$fontSize." / ".$fontWeight."  ->  ".SCHRIFT_AUSDRUCK_PDF." \n", FILE_APPEND);

	

	if (defined('AUSDRUCK_LOGO_RECHNUNGSBON_PDF') && strtolower(AUSDRUCK_LOGO_RECHNUNGSBON_PDF) == 'ja') {
		$getImg = mysql_fetch_assoc(mysql_query("SELECT image, name, imgx, imgy FROM images WHERE name='bonlogo'"));
		log_to_file("AUSDRUCK_LOGO_RECHNUNGSBON_PDF");
		if ($getImg == true) {
			$printRes = 100;

			$imgWidth = ($getImg['imgx'] / $printRes) * 25.4;  # umrechnung von inch auf mm !!!
			$imgHeigth = ($getImg['imgy'] / $printRes) * 25.4;
			$imgWidth *= $zoomF;
			$imgHeigth *= $zoomF;
			if ($imgWidth <= $bonWidth) {
				$leftPos = ($bonWidth - $imgWidth) / 2;
				$leftPos += $marginLR;
				$pdf->MemImage($getImg['image'], $leftPos, $marginTop, $imgWidth, $imgHeigth);
			} else {
				$pdf->MemImage($getImg['image'], $marginLR, $marginTop, $bonWidth - $marginLR, 0);
				$scal = $bonWidth / ($imgWidth - $marginLR);
				$imgHeigth = $imgHeigth * $scal;
			}

			$pdf->Cell(0, $imgHeigth + 5, "", 0, 1, 'C');	# das bild wird absolute positioniert, diese zelle dienst um die text zellen entsprechend nach dem bild beginnen zu lassen
			# platzhalter 
		}
	}

	$lineHeight = $pdfFontSize / 2.5;

	$pdf->SetFont($pdfFont, '', $pdfFontSize);

	log_to_file("kopfzeile_ausdrucken");
	$headArray = kopfzeile_ausdrucken_mit_formatierung($kopfzeilenParm, 'printPdf');

	for ($i = 0; $i < sizeof($headArray); $i++) {
		
		$pdf->SetFont($pdfFont, $headArray[$i][1] , $pdfFontSize);
		$pdf->Cell($marginLR + ($bonWidth - ($marginLR * 2)), $lineHeight, iconv('UTF-8', 'windows-1252', strip_tags($headArray[$i][0])), 0, 1, 'C');
		$pdf->SetFont($pdfFont, '', $pdfFontSize);
	
	}

	//$pdf->SetLineWidth(0.6);
	if (defined('BON_SEPERATORLINES_DICKE')) $pdf->SetLineWidth(BON_SEPERATORLINES_DICKE);
	if (defined('DISABLE_BON_SEPERATORLINES') && strtolower(DISABLE_BON_SEPERATORLINES) == 'ja') {
		$pdf->Cell(0, 2, "", 0, 1, 'C');
	} else $pdf->Cell(0, 2, "", 'B', 1, 'C'); 	#  trennlinie unterhalb von Fa kopf

	$sql_produkte = mysql_query("SELECT kunden_id, verkaufer_id, gesamt_summe, retourgeld, bon_erstellt_datum, storno_datum, 
											kunden_id, gastro_tisch_id, qr_string, auftragsschein_nr, beleg_kennung, zusatztext AS zusatzTxt,
											ce_zahlung_data, ce_kunden_beleg, ce_zahlung_beleg, abholschein_nr
										FROM abgeschlossener_bon 
										LEFT JOIN dep ON abgeschlossener_bon.bon_id = dep.beleg_nr
										LEFT JOIN abschluss_belege ON abgeschlossener_bon.bon_id = abschluss_belege.bon_id
										WHERE abgeschlossener_bon.bon_id='" . $bon_id . "'");
									

								
	if (!$sql_produkte) {
		echo "<script>console.log('Datenbank Fehler: '" . mysql_error() . ")</script>";
		exit(1);
	}
	$belegKennung = false;
	$bonZusatzTxt = "";

	log_to_file("Produkte zuweisen");

	while ($row_produkt = mysql_fetch_assoc($sql_produkte)) {
		$invoiceSumRaw = $row_produkt["gesamt_summe"];
		$gesamtsumme_brutto = number_format($row_produkt["gesamt_summe"], 2, ",", ".");
		$datetime = $row_produkt["bon_erstellt_datum"];
		$stornoDatetime = $row_produkt["storno_datum"];
		$retourgeld = $row_produkt["retourgeld"];
		$kundenId = $row_produkt["kunden_id"];
		$verkauferId = $row_produkt["verkaufer_id"];
		$gastroTischId = $row_produkt["gastro_tisch_id"];
		$qr_string = $row_produkt["qr_string"];
		$auftragsscheinNr = $row_produkt["auftragsschein_nr"];
		$belegKennung = $row_produkt["beleg_kennung"];
		$bonZusatzTxt = $row_produkt["zusatzTxt"];
		$ceData = $row_produkt["ce_zahlung_data"];
		$ecKdBon = $row_produkt["ce_kunden_beleg"];
		$ceVendorBon = $row_produkt["ce_zahlung_beleg"];
		$abholschein_nr = $row_produkt["abholschein_nr"];
	}
	
	

	$dDate = strtotime($datetime);
	$datetime = date('j.n.Y H:i:s', $dDate);

	if (defined('CUSTOMER_PRINT_DISABLED') && strtolower(CUSTOMER_PRINT_DISABLED) != 'ja') $disableCustPrint = false;
	else $disableCustPrint = true;
	#   

	# file_put_contents('kpcheckit.txt', "\n".basename( __FILE__)." / ". __LINE__ ." cust Print disable.. ".CUSTOMER_PRINT_DISABLED." -> ".$disableCustPrint." \n", FILE_APPEND);


	if ($kundenId > 0 && $disableCustPrint == false) {
		log_to_file("Kunden ID: ".$kundenId);
		$kdData = mysql_fetch_array(mysql_query("SELECT * FROM kunden WHERE id = " . $kundenId . " "));
		if ($kdData['kundennummer'] != "") $kundennummer = $kdData['kundennummer'];
		else $kundennummer = "";
		$pdf->Cell(0, $lineHeight / 3, "", 0, 1, 'C');
		// Cashback Karten Nummer auf Bon Drucken:
		if ($kdData['loyality_card'] != "") $loyality_card = $kdData['loyality_card'];
		else $loyality_card = "";
		if ($loyality_card != "") $pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, "Cashback Karte Nr: " . iconv('UTF-8', 'windows-1252', $loyality_card), 0, 1, 'L');
		if ($kundennummer != "") {
			if (defined('BON_KUNDENNUMMER_DRUCKEN') && strtolower(BON_KUNDENNUMMER_DRUCKEN) == 'ja') {
				$pdf->SetFont('', 'B');
				$pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, "Kunden Nummer: " . iconv('UTF-8', 'windows-1252', $kundennummer), 0, 1, 'L');
				$pdf->SetFont('', '');
			}
		}

		if ($kdData['Firma'] != "") $pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, iconv('UTF-8', 'windows-1252', $kdData['Firma']), 0, 1, 'L');
		if ($kdData['anrede'] != "") $anrede = $kdData['anrede'] . " ";
		else $anrede = "";
		if ($kdData['titel'] != "") $titel = $kdData['titel'] . " ";
		else $titel = "";
		if ($kdData['vorname'] != "") $vorN = $kdData['vorname'] . " ";
		else $vorN = "";
		if ($kdData['nachname'] != "") $nachN = $kdData['nachname'];
		else $nachN = "";
		$nName = $anrede . $titel . $vorN . $nachN;
		if ($nName != "") $pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, iconv('UTF-8', 'windows-1252', $nName), 0, 1, 'L');
		if ($kdData['strasse1'] != "") $pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, iconv('UTF-8', 'windows-1252', $kdData['strasse1']), 0, 1, 'L');
		if ($kdData['strasse2'] != "") $pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, iconv('UTF-8', 'windows-1252', $kdData['strasse2']), 0, 1, 'L');
		if ($kdData['plz'] != "") $plz = $kdData['plz'] . " ";
		else $plz = "";
		if ($kdData['Ort'] != "") $ort = $kdData['Ort'];
		else $ort = "";
		if ($kdData['anmerkung'] != "") $anmerkung = $kdData['anmerkung'];
		else $anmerkung = "";

		$city = $plz . $ort;
		if ($city != "") $pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, iconv('UTF-8', 'windows-1252', $city), 0, 1, 'L');

		if (defined('CUSTOMER_PRINT_PHONE_DISABLED') && strtolower(CUSTOMER_PRINT_PHONE_DISABLED) != 'ja') {
			if (trim($kdData['telefon1']) != "") $pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, "Tel. " . $kdData['telefon1'], 0, 1, 'L');
			else if ($kdData['telefon2'] != "" && trim($kdData['telefon1']) == "") $pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, "Tel. " . $kdData['telefon2'], 0, 1, 'L');
			if (trim($kdData['mobil']) != "") $pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, "Mobil " . $kdData['mobil'], 0, 1, 'L');
		}

		if ($anmerkung != "") {
			if (defined('BON_KUNDEN_ANMERKUNG_DRUCKEN') && strtolower(BON_KUNDEN_ANMERKUNG_DRUCKEN) == 'ja') {
				$pdf->Cell(0, $lineHeight / 3, "", 0, 1, 'C');
				$pdf->MultiCell($bonWidth - $marginLR, $lineHeight, iconv('UTF-8', 'windows-1252', $anmerkung), 0, 'L', 0);
			}
		}
		if (defined('DISABLE_BON_SEPERATORLINES') && strtolower(DISABLE_BON_SEPERATORLINES) == 'ja') {
			$pdf->Cell(0, $lineHeight / 3, "", 0, 1, 'C');
		} else $pdf->Cell(0, $lineHeight / 3, "", "B", 1, 'C');
	}

	if (defined('BON_ZUSATZ_TEXT_RECHNUNG') && strtolower(BON_ZUSATZ_TEXT_RECHNUNG) === 'ja') {
		log_to_file("BON_ZUSATZ_TEXT_RECHNUNG");
		if (strlen(trim($bonZusatzTxt)) > 0) {
			$pdf->Cell(0, $lineHeight / 3, "", 0, 1, 'C');
			$pdf->MultiCell($bonWidth - $marginLR, $lineHeight, iconv('UTF-8', 'windows-1252', $bonZusatzTxt), 0, 'L', 0);
			if (defined('DISABLE_BON_SEPERATORLINES') && strtolower(DISABLE_BON_SEPERATORLINES) == 'ja') {
				$pdf->Cell(0, $lineHeight / 3, "", 0, 1, 'C');
			} else $pdf->Cell(0, $lineHeight / 3, "", "B", 1, 'C');
		}
	}

	$pdf->Cell(0, $lineHeight / 3, "", 0, 1, 'C');
	$txLineW = preg_replace('/[^\d]/', '', AUSDRUCK_BON_STK_CM) + preg_replace('/[^\d]/', '', AUSDRUCK_BON_NAME_CM) + preg_replace('/[^\d]/', '', AUSDRUCK_BON_EINZELPREIS_CM);
	$txLineW *= $zoomF;

	

	if ($callFrom == 'monatsbelegErstellen') {
		$belegBenennung = "Monats Abschluss Beleg, " . BELEG_BENENNUNG;
		$pdf->Cell(0, $lineHeight * 1.2, $belegBenennung . " " . $bon_id, 0, 1, 'L');
	} else if ($callFrom == 'reactivatSammelBelegErstellen' || ($belegKennung !== false && preg_match("/Sammelbeleg /i", $belegKennung))) {
		$pdf->Cell(0, $lineHeight * 1.2, $belegKennung, 0, 1, 'L');
		$pdf->Cell(0, $lineHeight * 1.2, BELEG_BENENNUNG . " " . $bon_id, 0, 1, 'L');
	} else {
		// Abholschein von Küchenbildschirm drucken
		if (defined('KUECHE_ABHOLSCHEIN_AUF_RECHUNUNG_DRUCKEN') && strtolower(KUECHE_ABHOLSCHEIN_AUF_RECHUNUNG_DRUCKEN) == 'ja') {
			$pdf->SetFont($pdfFont, 'B', KUECHE_ABHOLSCHEIN_SCHRIFT_GROESSE);
             //$pdf->Cell(($bonWidth - ($marginLR / 2)), $lineHeight * 2, $callFrom, 0, 1, 'C');
             $pdf->Cell(($bonWidth-($marginLR/2)), $lineHeight*2, $abholschein_nr, 0, 1, 'C');
             $pdf->SetFont($pdfFont, '', $pdfFontSize);
              $lineHeight = $pdfFontSize / 2.5;

		}

		$belegBenennung = BELEG_BENENNUNG;
		$pdf->Cell($txLineW, $lineHeight * 1.2, $belegBenennung . " " . $bon_id, 0, 0, 'L');
		$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_SUMME_CM) * $zoomF, $lineHeight * 1.2, "Kassenid: " . KASSA_ID, 0, 1, 'R');

		// Font von Auftragsschein setzen und dann drucken falls definiert
		if (defined('AUFTRAGSSCHEIN_NR_AUF_RECH_FETT') && strtolower(AUFTRAGSSCHEIN_NR_AUF_RECH_FETT) == 'ja') {
			$fontWeight = 'B';
		} else $fontWeight = '';
		if (defined('AUFTRAGSSCHEIN_NR_AUF_RECH_FONTSIZE') && AUFTRAGSSCHEIN_NR_AUF_RECH_FONTSIZE > 5) {
			$fontSize = AUFTRAGSSCHEIN_NR_AUF_RECH_FONTSIZE;
			$lineHeight = $fontSize / 2.5;
		} else $fontSize = $pdfFontSize;
		$pdf->SetFont($pdfFont, $fontWeight, $fontSize);

		if ($auftragsscheinNr > 0 && (defined('AUFTRAGSSCHEIN_NR_AUF_RECHNUNG') && strtolower(AUFTRAGSSCHEIN_NR_AUF_RECHNUNG) == 'ja')) {
			$pdf->Cell(($bonWidth - ($marginLR / 2)), $lineHeight * 1.2, AUFTRAGSSCHEIN_BENENNUNG . $auftragsscheinNr, 0, 1, 'L');
		}

		$pdf->SetFont($pdfFont, '', $pdfFontSize);
		$lineHeight = $pdfFontSize / 2.5;
	}



	if (defined("GASTRO_TISCHNAME_AUF_BON_DRUCKEN") && strtolower(GASTRO_VERSION) == 'ja' &&  strtolower(GASTRO_TISCHNAME_AUF_BON_DRUCKEN) == 'ja' && $gastroTischId > 0) {
		$tabQl = mysql_fetch_array(mysql_query("SELECT tischName FROM tische WHERE id = $gastroTischId "));
		if ($tabQl == true) $tableName = $tabQl[0];
		if (preg_match('/tisch/i', $tabQl[0])) $pdf->Cell(0, $lineHeight, iconv('UTF-8', 'windows-1252', $tabQl[0]), 0, 1, 'L');
		else  $pdf->Cell(0, $lineHeight, "Tisch: " . iconv('UTF-8', 'windows-1252', $tabQl[0]), 0, 1, 'L');
	}

	if (defined("VERKAEUFER_AUF_BON_DRUCKEN") && strtolower(VERKAEUFER_AUF_BON_DRUCKEN) == 'ja') {
		$userQl = mysql_fetch_array(mysql_query("SELECT name FROM benutzer WHERE id = $verkauferId "));
		if ($userQl == true && $callFrom != "xmlSchnittstelle")
			$pdf->Cell(0, $lineHeight, AUSDRUCK_VERKAUFER_AUF_BON_TEXT . " " . iconv('UTF-8', 'windows-1252', $userQl[0]), 0, 1, 'L');
		else if ($bedienerName == true && $bedienerName != "" && $callFrom == "xmlSchnittstelle")			# bedienerName ist ausschließlich für xmlSchnittstelle ausdruck !
			$pdf->Cell(0, $lineHeight, AUSDRUCK_VERKAUFER_AUF_BON_TEXT . " " . iconv('UTF-8', 'windows-1252', $bedienerName), 0, 1, 'L');
	}

	$pdf->Cell($txLineW, $lineHeight, "Datum: " . $datetime, '', 0, 'L');
	$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_SUMME_CM) * $zoomF, $lineHeight, "EUR", '', 1, 'R');

	if (defined('DISABLE_BON_SEPERATORLINES') && strtolower(DISABLE_BON_SEPERATORLINES) == 'ja') {
		$pdf->Cell(0, $lineHeight / 2, "", 0, 1, 'C');
	} else $pdf->Cell(0, $lineHeight / 2, "", "B", 1, 'C');
	$pdf->Cell(0, $lineHeight / 4, "", 0, 1, 'C');

	
	log_to_file("abgeschlossener_bon_produkte Select");
	$sql_produkte = mysql_query("SELECT abgeschlossener_bon_produkte.ID, produkt_id, tax_rate, REFERENCE, CODE, NAME, PRICEBUY, PRICESELL, CATEGORY, TAXCAT, tax_rate, DISPLAY, 
										VARPRICE, PRINTNAME, NEGATIVEPRICE, PRODUKTORDER, SICHTBAR, stueck, has_childs, parent_id, isparent_id, 
										childPrint, lsSource, lieferschein_id, lieferschein_erstellt_datum, beilagen_minus, beilagen_plus,
										IF (parent_id=0, isparent_id, parent_id) as reihenfolge
										FROM abgeschlossener_bon_produkte 
										LEFT JOIN lieferschein_referenz ON lsSource = lieferschein_referenz.id
										WHERE bon_id='" . $bon_id . "' 
										ORDER BY lieferschein_referenz.id ASC, reihenfolge, abgeschlossener_bon_produkte.ID ASC");

	if (!$sql_produkte) {
		echo "<script>console.log('Datenbank Fehler: '" . mysql_error() . ")</script>";
		exit(1);
	}

	$countProd = mysql_num_rows($sql_produkte);
	if (defined('BELEG_EINZELPREIS_KOMMASTELLEN') && is_numeric(BELEG_EINZELPREIS_KOMMASTELLEN)) {
		$ezKom = BELEG_EINZELPREIS_KOMMASTELLEN;
	} else $ezKom = 2;

	$lsGroup = false;		# für den gruppenwechsel, sammelrechnung aus lieferscheine		
	log_to_file("für den gruppenwechsel, sammelrechnung aus lieferscheine");
	while ($row_produkt = mysql_fetch_assoc($sql_produkte)) {
		$pdf->SetFont($pdfFont, $fontWeight, $pdfFontSize);
		$lineHeight = $pdfFontSize / 2.5;
		$einzel_preis = $row_produkt["PRICESELL"];
		$einzel_preis = $einzel_preis * (1 + $row_produkt["tax_rate"]);

		$summe = round($einzel_preis, 8) * $row_produkt["stueck"];
		
		$einzel_preis = number_format($einzel_preis, $ezKom, ",", ".");
		$stueck = $row_produkt["stueck"];
		# COMBI ARTIKEL !!!
		$ist_child = false;
		if ($row_produkt['has_childs'] == 1 && $row_produkt['isparent_id'] > 0) {
			$findChilds = mysql_fetch_array(mysql_query("SELECT SUM(PRICESELL* (1 + tax_rate)) AS combiEinzelPr FROM abgeschlossener_bon_produkte 
														WHERE parent_id = " . $row_produkt['ID'] . " "));

			$einzel_preis = number_format($findChilds['combiEinzelPr'], $ezKom, ",", ".");
			$summe = $findChilds['combiEinzelPr'] * $row_produkt["stueck"];
		}

log_to_file( "paren_id: ".$row_produkt['parent_id']);
log_to_file( "BEILAGENTEXT_AUF_RECHNUNG_DRUCKEN: ".BEILAGENTEXT_AUF_RECHNUNG_DRUCKEN);
log_to_file( "childPrint: ".$row_produkt['childPrint']);
		if ($row_produkt['parent_id'] > 0 && strtolower(BEILAGENTEXT_AUF_RECHNUNG_DRUCKEN) == 'ja' && $row_produkt['childPrint'] == 1) {
			$ist_child = true;
		} else if ($row_produkt['parent_id'] > 0 && $row_produkt['childPrint'] == 0) continue;

		// Checke ob Stueck nachkomma hat oder nicht wenn ja, dann 2 Nachkommastellen ansonsten keine
		if ((int) $stueck == $stueck) {
			$stueck_anzeige = number_format($stueck, 0, "", ".");
		} else $stueck_anzeige = number_format($stueck, 2, ",", ".");

		$summe = number_format($summe, 2, ",", ".");
		$printname = $row_produkt["PRINTNAME"];

		// Beilagen auf Bon andrucken?
		if ((strlen($row_produkt['beilagen_minus']) > 1 || strlen($row_produkt['beilagen_plus']) > 1) && strtolower(BEILAGENTEXT_AUF_RECHNUNG_DRUCKEN) == 'ja') {
			# $printname = $printname."\nSonderartikel";		# war als Überschrift gedacht, lassen wir weg
			if (strlen($row_produkt['beilagen_minus']) > 1) {
				$blTxtMin = false;
				$blTxtMin = preg_replace('/\;/', ',', $row_produkt['beilagen_minus']);
				$printname = $printname . "\n- " . $blTxtMin;
			}
			if (strlen($row_produkt['beilagen_plus']) > 1) {
				$blTxtPl = false;
				$blTxtPl = preg_replace('/\;/', ',', $row_produkt['beilagen_plus']);
				$printname = $printname . "\n+ " . $blTxtPl;
			}
		}
		// Ende Beilagen
		if ($row_produkt['parent_id'] > 0) {
			//
		} else
			if ($row_produkt['parent_id'] > 0 && $row_produkt['childPrint'] == 1) {
			$ortstaxe = number_format($stueck * $row_produkt["PRICESELL"], 2, ",", ".");
			$einzel_preis = '';
			$stueck_anzeige = '';
			$summe = '';

			$printname = preg_replace('/€\s*0[,\.]00/', '€ ' . $ortstaxe, $printname);
		}

		if (isset($row_produkt['lsSource']) && $row_produkt['lsSource'] > 0 && ($lsGroup != $row_produkt['lieferschein_id'])) {
			$headerTxt = "Liefersch: ";
			if (defined('LIEFERSCH_SAMMELRECHNUNG_GRUPPENHEADER')) $headerTxt = LIEFERSCH_SAMMELRECHNUNG_GRUPPENHEADER;

			$dDate = strtotime($row_produkt['lieferschein_erstellt_datum']);
			$dateTime = date('j.n.Y H:i', $dDate);
			$lsHeader = iconv('UTF-8', 'windows-1252', $headerTxt . $row_produkt['lieferschein_id'] . ", " . $dateTime);
			$headW = $pdf->getstringwidth($lsHeader);
			if ($lsGroup > 0) $pdf->Cell(0, $lineHeight / 2, '', 0, 1, 'C');
			$pdf->Cell(0, $lineHeight, $lsHeader, 0, 1, 'L');
			$pdf->Cell($headW, 1, '', 'T', 1, 'L');
		}

		if ($ist_child) {
			$pdf->SetFont($pdfFont, '', $pdfFontSize * 0.5);
			$lineHeight = $pdfFontSize / 5;
			$pdf->Cell(5 * $zoomF, $lineHeight, "", 0, 0, 'L');
		}
		$stueck_anzeige = $stueck_anzeige;
		$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_STK_CM) * $zoomF, $lineHeight, $stueck_anzeige, 0, 0, 'R');
		# Zeile Einzelrabatt bilden wenn Einzelrabatt ...
		$rabattLine = false;
		$origPr = false;
		# ist relevant wenn original Preis auf den Bon bzw Bon Vordruck gedruckt wird
		if (preg_match('/von\s€\s([0-9]+(,[0-9]+))/', $printname, $matchOrigPr)) {
			$origPr = $matchOrigPr[0];
			$printname = preg_replace('/' . $origPr . '/', '', $printname);
		}
		if (preg_match('/\d{1,},\d{1,}\%\sRabatt/', $printname, $matchRes)) {
			# Einzelrabatt Komma Zahl, steht mit "," im Produkt Table
			$rabattLine = true;
			$tmpPrintN = preg_split("/\d{1,},\d{1,}\%\sRabatt/", $printname);
			if (isset($tmpPrintN[1]) && strlen($tmpPrintN[1]) > 0) $tmpPrintNameEnd = "\n" . trim($tmpPrintN[1]);
			else $tmpPrintNameEnd = "";
			$printname = $tmpPrintN[0] . "\n" . trim($matchRes[0] . " " . $origPr . " inkludiert") . $tmpPrintNameEnd;
		} else if (preg_match('/\d{1,}%\sRabatt/', $printname, $matchRes)) {
			# Einzelrabatt gerade Zahl
			$rabattLine = true;
			$tmpPrintN = preg_split("/\d{1,}%\sRabatt/", $printname);
			if (isset($tmpPrintN[1]) && strlen($tmpPrintN[1]) > 0) $tmpPrintNameEnd = "\n" . trim($tmpPrintN[1]);
			else $tmpPrintNameEnd = "";
			$printname = $tmpPrintN[0] . "\n" . trim($matchRes[0] . " " . $origPr . " inkludiert") . $tmpPrintNameEnd;
		}

		if (
			$pdf->getstringwidth(iconv('UTF-8', 'windows-1252', $printname)) > preg_replace('/[^\d]/', '', AUSDRUCK_BON_NAME_CM) * $zoomF
			|| $rabattLine == true || preg_match("/\\n/", $printname)
		) {
			$posY = $pdf->GetY();
			$posX = ((preg_replace('/[^\d]/', '', AUSDRUCK_BON_NAME_CM) + preg_replace('/[^\d]/', '', AUSDRUCK_BON_STK_CM)) * $zoomF) + $marginLR;
			$pdf->MultiCell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_NAME_CM) * $zoomF, $lineHeight, iconv('UTF-8', 'windows-1252', $printname), 0, 'L', 0);
			$posY_2 = $pdf->GetY();
			$pdf->SetXY($posX, $posY);
			if ($ist_child) {
				$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_SUMME_CM) * $zoomF, $lineHeight, "", 0, 1, 'R');
			} else {
				$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_EINZELPREIS_CM) * $zoomF, $lineHeight, $einzel_preis, 0, 0, 'R');
				$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_SUMME_CM) * $zoomF, $lineHeight, $summe, 0, 1, 'R');
				$pdf->SetY($posY_2);
			}
		} else {
			$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_NAME_CM) * $zoomF, $lineHeight, iconv('UTF-8', 'windows-1252', $printname), 0, 0, 'L');
			if ($ist_child) {
				$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_SUMME_CM) * $zoomF, $lineHeight, "", 0, 1, 'R');
			} else {
				$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_EINZELPREIS_CM) * $zoomF, $lineHeight, $einzel_preis, 0, 0, 'R');
				$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_SUMME_CM) * $zoomF, $lineHeight, $summe, 0, 1, 'R');
			}
		}

		$lsGroup = $row_produkt['lieferschein_id'];
	}

	

	$pdf->SetFont($pdfFont, $fontWeight, $fontSize);
	$lineHeight = $pdfFontSize / 2.5;
	# Product while ende
	$checkPrintName = false;
	if (isset($printname)) $checkPrintName = preg_replace('/\s+/', '', $printname);

	if ($countProd == 1 && $gesamtsumme_brutto == 0 && (strpos($checkPrintName, 'natsAbschlussBeleg') != false || strpos($printname, 'tartbeleg') != false)) {
		$monatsAbschlBeleg = true;
		$rechnungssummeTxt = "Beleg Summe: ";
	} else {
		$monatsAbschlBeleg = false;
		$bonTxt = preg_replace(array('/:\s?$/', '/\.\s?$/', '/_\s?$/', '/-\s?$/', '/\s?$/'), '', BELEG_BENENNUNG);
		$rechnungssummeTxt = $bonTxt . " Summe: ";
	}

	if (defined('DISABLE_BON_SEPERATORLINES') && strtolower(DISABLE_BON_SEPERATORLINES) == 'ja') {
		$pdf->Cell(0, $lineHeight / 4, "", 0, 1, 'C');
	} else $pdf->Cell(0, $lineHeight / 4, "", "B", 1, 'C');
	$pdf->Cell(0, $lineHeight / 4, "", 0, 1, 'C');

	$sumFontSize = (preg_replace('/[^\d]/', '', RECHNUNGSSUMME_AUF_BON_SIZE) * .75) * $zoomF;		# grober umrechnungsfaktor von px auf pt
	$sumLineHeight = $sumFontSize / 2.5;
	$zW = preg_replace('/[^\d]/', '', AUSDRUCK_BON_STK_CM) + preg_replace('/[^\d]/', '', AUSDRUCK_BON_NAME_CM);
	$zW *= $zoomF;
	if (strtolower(RECHNUNGSSUMME_AUF_BON_FETT) == 'ja') $pdf->SetFont($pdfFont, 'B', $sumFontSize);
	else $pdf->SetFont($pdfFont, '', $sumFontSize);

	$pdf->Cell($zW, $sumLineHeight, $rechnungssummeTxt, 0, 0, 'L', 0);
	$pdf->Cell((preg_replace('/[^\d]/', '', AUSDRUCK_BON_SUMME_CM) + preg_replace('/[^\d]/', '', AUSDRUCK_BON_EINZELPREIS_CM)) * $zoomF, $sumLineHeight, $gesamtsumme_brutto, 0, 1, 'R', 0);
	$pdf->Cell(0, 1, "", '', 1, 'C'); 	#  seperator mit Trennlinie
	$pdf->SetFont($pdfFont, '', $pdfFontSize);

	if ($monatsAbschlBeleg == false) {
		// Kleinunternehmer USt Regelung
		$checkTax = mysql_fetch_array(mysql_query("SELECT SUM(tax_rate) AS taxRateSum FROM abgeschlossener_bon_steuern WHERE bon_id = '" . $bon_id . "'"));
		if (defined('KLEINUNTERNEHMER_UST') && strtolower(KLEINUNTERNEHMER_UST) == 'ja' && number_format($checkTax['taxRateSum'], 2, '.', '') == 0.00) {
			//    test only -> $pdf->Cell(0, 2, "## -Kleinuntern USt Regelung -##", 0, 1, 'C');
		} else {
			$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_SATZ) * $zoomF, $lineHeight, "Steuersatz", 0, 0, 'R');
			$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_NETTO) * $zoomF, $lineHeight, "Netto", 0, 0, 'R');
			$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_STEUER) * $zoomF, $lineHeight, "Steuer", 0, 0, 'R');
			$pdf->Cell(preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_BRUTTO) * $zoomF, $lineHeight, "Brutto", 0, 1, 'R');

			$pdf = pdf_steuersaetze_ausgeben($bon_id, $pdf, $zoomF, $lineHeight);
		}

		if (defined('DISABLE_BON_SEPERATORLINES') && strtolower(DISABLE_BON_SEPERATORLINES) == 'ja') {
			$pdf->Cell(0, $lineHeight / 4, "", 0, 1, 'C');
		} else $pdf->Cell(0, $lineHeight / 4, "", "B", 1, 'C');

		$pdf->Cell(0, $lineHeight / 4, "", 0, 1, 'C');

		$sql_produkte = mysql_query("select Name, zahlbetrag_tatsaechlich from abgeschlossener_bon_zahlung WHERE bon_id='" . $bon_id . "'");
		if (!$sql_produkte) {
			echo "<script>console.log('Datenbank Fehler: '" . mysql_error() . ")</script>";
			exit(1);
		}
		$summe_zahlbetrag = 0;
		$uFotList = "";
		while ($row_produkt = mysql_fetch_assoc($sql_produkte)) {
			$zahlbetrag = $row_produkt["zahlbetrag_tatsaechlich"];
			$summe_zahlbetrag += $zahlbetrag;
			$name = $row_produkt["Name"];
			$zahlbetrag = number_format($zahlbetrag, 2, ",", ".");

			$zahlTxtWidth = ((preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_SATZ) + preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_NETTO)) * $zoomF);

			if ($pdf->getstringwidth(iconv('UTF-8', 'windows-1252', $name)) > $zahlTxtWidth * $zoomF) {
				$posY = $pdf->GetY();
				$posX = $zahlTxtWidth + $marginLR;

				$pdf->MultiCell($zahlTxtWidth, $lineHeight, iconv('UTF-8', 'windows-1252', $name), 0, 'R', 0);
				$posY_2 = $pdf->GetY();
				$pdf->SetXY($posX, $posY);
				$pdf->Cell((preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_STEUER) * $zoomF) + 5, $lineHeight, $zahlbetrag, 0, 1, 'R');
				$pdf->SetY($posY_2);
			} else {
				$pdf->Cell($zahlTxtWidth, $lineHeight, iconv('UTF-8', 'windows-1252', $name), 0, 0, 'R');
				$pdf->Cell((preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_STEUER) * $zoomF) + 5, $lineHeight, $zahlbetrag, 0, 1, 'R');
			}

			$uFotList .= "'" . $name . "',";
		}

		$uFotList = preg_replace('/,$/', '', $uFotList);

		if ($retourgeld > 0) {
			$retourgeld = number_format($retourgeld, 2, ",", ".");
			$pdf->Cell($zahlTxtWidth, $lineHeight, "Retourgeld", 0, 0, 'R');
			$pdf->Cell((preg_replace('/[^\d]/', '', AUSDRUCK_BON_STEUER_STEUER) * $zoomF) + 5, $lineHeight, $retourgeld, 0, 1, 'R');
		}

		$pdf->Cell(0, 6, "", 0, 1, 'C'); 	#  seperator ohne Trennlinie / vor vielen Dank für ....

		if (defined('KUNDEN_UNTERSCHRIFT_FOOTER') && strtolower(KUNDEN_UNTERSCHRIFT_FOOTER) == 'ja') {

			$fotxQl = mysql_query("SELECT * FROM zahlungsart WHERE Name IN(" . $uFotList . ") ");
			$enableUnterschrFooter = false;
			while ($fotxRow = mysql_fetch_assoc($fotxQl)) {
				if ($fotxRow['zahlartFooter'] != "" && $fotxRow['zahlartFooter'] != "NULL") {
					$enableUnterschrFooter = true;
					$unterschrTx = $fotxRow['zahlartFooter'];
				}
			}

			if ($enableUnterschrFooter == true) {
				$unterschrTx = explode(";", $unterschrTx);
				if (sizeof($unterschrTx) == 1) {
					$pdf->Cell(0, $lineHeight, iconv('UTF-8', 'windows-1252', $unterschrTx[0] . "***"), 0, 1, 'L');
					$pdf->Cell(0, $lineHeight, "", "B", 1, 'L');
				} else {
					for ($i = 0; $i < sizeof($unterschrTx); $i++) {
						$pdf->Cell(0, $lineHeight, iconv('UTF-8', 'windows-1252', $unterschrTx[$i]), 0, 1, 'L');
					}
					if (defined('DISABLE_BON_SEPERATORLINES') && strtolower(DISABLE_BON_SEPERATORLINES) == 'ja') {
						$pdf->Cell(0, 1, "", 0, 1, 'L');
					} else $pdf->Cell(0, 1, "", "T", 1, 'L');
				}
			}
		}

		
		log_to_file("fusszeile_ausdrucken");
		$fotterSumArray = fusszeile_ausdrucken($invoiceSumRaw, 'printPdf');	#  wird für eventuelle footer % Kalkulationen "AUSRUCK_EXTRA_FUSSZEILEN" übergeben;
		
		$fotterArray = $fotterSumArray[0];
		$fotterArrayFormat = $fotterSumArray[2];
		for ($i = 0; $i < sizeof($fotterArray); $i++) {
			if ($fotterArrayFormat[$i] != "")$pdf->SetFont($pdfFont, $fotterArrayFormat[$i] , $pdfFontSize);
			if ($fotterArray[$i] != "") $pdf->Cell($marginLR + ($bonWidth - ($marginLR * 2)), $lineHeight, iconv('UTF-8', 'windows-1252', strip_tags($fotterArray[$i])), 0, 1, 'C');
			$pdf->SetFont($pdfFont, '' , $pdfFontSize);
		}
		
		$footerExtragTxt = $fotterSumArray[1];

		if ($footerExtragTxt != "") {
			$pdf->Cell(0, 4, "", 0, 1, 'C'); 	#   distanz schaffen
			$pdf->MultiCell(0, $lineHeight, iconv('UTF-8', 'windows-1252', $footerExtragTxt), 0, 'C', 0);
		}
		
	} 		# if monats beleg wird bis daher nicht gedruckt steuer, zahlung, retourgeld, fusszeile, ...

	# Default Werte
	$qrImgMarginTop = 10;
	$qrImgMarginBottom = 5;
	$qrImgSize = $bonWidth / 1.5;
	if (defined('QR_CODE_GROESSE') && QR_CODE_GROESSE >= 15) {
		$qrImgSize = QR_CODE_GROESSE;
		if ($qrImgSize >= 15 && $qrImgSize < 20) {
			$qrImgMarginTop = 3;
			$qrImgMarginBottom = 2;
		} else if ($qrImgSize >= 20 && $qrImgSize < 35) {
			$qrImgMarginTop = 6;
			$qrImgMarginBottom = 3;
		}
	}

	$qrImgPosL = (($bonWidth - $qrImgSize) / 2) + ($marginLR / 2);

	$imgY = $pdf->GetY() + $qrImgMarginTop;



	if (strlen($qr_string) > 55) {
		log_to_file("strlen > 55");
		$qrX = explode("_", $qr_string);
		$lastIndex = count($qrX) - 1;
		$sigData = base64_decode($qrX[$lastIndex]);
		if (strtolower($sigData) == 'sicherheitseinrichtung ausgefallen') {
			$pdf->Cell($bonWidth, $lineHeight * 2, "", 0, 1, "C");
			$sigData = str_replace("_", " ", $sigData);
			$pdf->SetFont($pdfFont, 'B', $pdfFontSize);
			$pdf->Cell($bonWidth, $lineHeight, $sigData, 0, 1, "C");
		} else {
			global $errorCorrectionLevel;
			global $matrixPointSize;
			global $qrMargin;
			global $qrImg_temp_dir;
			global $qrData_store_dir;

			if (strtolower($qrDataStore) == 'store') {
				$qrFilename = $qrData_store_dir . "qrImg_" . $bon_id . ".png";
				$qrStringFileName = $qrData_store_dir . "qrString_" . $bon_id . ".txt";
				file_put_contents($qrStringFileName, $qr_string);
				$matrixPointSize = 4;
				QRcode::png($qr_string, $qrFilename, $errorCorrectionLevel, $matrixPointSize, $qrMargin);
				$pdf->Image($qrFilename, $qrImgPosL, $imgY, $qrImgSize, 'PNG');
			} else {
				$qrFilename = $qrImg_temp_dir . $bon_id . ".png";
				log_to_file("QRCODE");
				QRcode::png($qr_string, $qrFilename, $errorCorrectionLevel, $matrixPointSize, $qrMargin);
				log_to_file("QRCODE 2");
				$pdf->Image($qrFilename, $qrImgPosL, $imgY, $qrImgSize, 'PNG');
				log_to_file("QRCODE 3");
				unlink($qrFilename);
			}

			$pdf->SetY($imgY + $qrImgSize + $qrImgMarginBottom);
		}
	}



	if ($requestFunktion == 'bonReprint' || $printRequest == 'bonjournalInvoicePrint' || $callFrom == 'changeZahlung') {
		$bonjournalP = "";
		if ($printRequest == 'bonjournalInvoicePrint') $bonjournalP = "Bonjournal ";
		$pdf->Cell(0, $lineHeight, "", 0, 1, 'C');
		if ($callFrom == 'changeZahlung') $pdf->Cell(0, $lineHeight, iconv('UTF-8', 'windows-1252', 'Zahlung geändert '), 0, 1, 'C');
		$pdf->Cell(0, $lineHeight, $bonjournalP . "Belegduplikat ", 0, 1, 'C');
	}

	// ****************************************
	// EC Kundenbeleg drucken (Unterschrift)	
	log_to_file("EC Kundenbeleg drucken (Unterschrift)");
	$ceFontSize = preg_replace('/[^0-9\.]+/i', '', EC_AUSDRUCK_FONTSIZE);
	$ec_lineHeight = $ceFontSize / 2.5;

	if ($ecKdBon != "") {


		$pdf->SetFont('Courier', 'B', $ceFontSize);


		$ecArray = explode("\n", $ecKdBon);
		$pdf->Cell($bonWidth, $lineHeight, '', 0, 1, 'C');

		for ($i = 0; $i < count($ecArray); $i++) {
			$pdf->Cell($bonWidth, $ec_lineHeight, iconv('UTF-8', 'windows-1252', $ecArray[$i]), 0, 1, 'L');
		}
	}


	# margin bottom Cell
	if ($marginBottom > 0) {
		$pdf->SetDrawColor(150);
		$pdf->Cell((($bonWidth - $marginLR) / 2) - 2, $marginBottom, "", 0, 0, 'R');
		$pdf->Cell(4, $marginBottom, "", "B", 1, 'C');
		$pdf->SetDrawColor(0);
	}

	$erlaubte_seiten = 1;
	// ****************************************
	// EC Händlerbeleg drucken (Unterschrift)
	log_to_file("EC Händlerbeleg drucken (Unterschrift)");
	if (!empty($ceVendorBon)) {
		$pos = strpos($ceVendorBon, '<PRINT_BELEG></PRINT_BELEG>');
		if ($pos !== false) {
			$ceVendorBon = substr($ceVendorBon, $pos + 27);
			$pdf->AddPage();
			$erlaubte_seiten = 2;
			$pdf->Cell(0, $lineHeight * 1.5, "", 0, 1, 'C');
			$ceFontSize = preg_replace('/[^0-9\.]+/i', '', EC_AUSDRUCK_FONTSIZE);
			$pdf->SetFont('Courier', 'B', $ceFontSize);
			$ceVendorBon = iconv('UTF-8', 'windows-1252//IGNORE', $ceVendorBon);
			$pdf->MultiCell(0, $ec_lineHeight, $ceVendorBon);

			# margin bottom Cell
			if ($marginBottom > 0) {
				$pdf->SetDrawColor(150);
				$pdf->Cell((($bonWidth - $marginLR) / 2) - 2, $marginBottom, "", 0, 0, 'R');
				$pdf->Cell(4, $marginBottom, "", "B", 1, 'C');
				$pdf->SetDrawColor(0);
			}
		}
	}

	$checkLicensing = check_base_licensing();
	if ($checkLicensing[0] == false || $checkLicensing[1] == false || $checkLicensing[2] == false) {
		$pdf->SetFont($pdfFont, 'B', 14);
		$pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight + 6, "UNLIZENZIERT", 0, 1, 'C');
		$pdf->SetFont($pdfFont, '', $pdfFontSize);
		$pdf->Cell($bonWidth - ($marginLR / 2), $lineHeight, "www.sitpos.at", 0, 1, 'C');
		#$pdf->Cell($bonWidth-($marginLR/2), $lineHeight, "www.sitpos.de", 0, 1, 'C');
	}


	// nochmal ausführen, wenn die Seitenanzahl überschritten wird.
	
	if ($pdf->PageNo() > $erlaubte_seiten) {
		log_to_file("bon_ausdrucken_pdf wurde nochmals aufgerugen das die Seitenanzahl überschritten wurde.");
		bon_ausdrucken_pdf($bon_id, $bonHeight * $pdf->PageNo(), $callFrom, $bedienerName, $targetPrinter, $qrDataStore);
		return false;
	}
	// ********** End EC Händlerbeleg

	$outputTarget = __DIR__ . "\docs\sIT_bon_" . $bon_id . "_" . date('d_m_H_i_s') . ".pdf";
	$command = "C:\sitpos\pdfxchange\App\PDFV_Portable\PDFXCview.exe /print:printer=\"$drucker\" \"$outputTarget\" ";

	log_to_file("PDF Output");
	$pdf->Output($outputTarget, "F");

	if (
		defined('ANZAHL_BON_PRINTS') && ANZAHL_BON_PRINTS > 1 && strtolower($requestFunktion) != 'bonreprint' &&
		strtolower($printRequest) != 'bonjournalinvoiceprint'
	) {
		for ($i = 0; $i < ANZAHL_BON_PRINTS; $i++) {
			log_to_file("seiteDrucken Anfang");
			$error_code = seiteDrucken($drucker, $outputTarget, "bon_Print_Multi");
			log_to_file("seiteDrucken ENDE");
		}
	} else {
		#KPE function seiteDr.. gibt nur den error_code zurück 
		log_to_file("global_function Zeile 3580");
		$error_code = seiteDrucken($drucker, $outputTarget, "bon_Print");
		log_to_file("Error: ".$error_code);

	}

	if ($callFrom == 'xmlSchnittstelle') {
		if ($error_code > 0) echo "Fehler beim verarbeiten von Bon Nr.: " . $bon_id . " aufgetreten.";
		else echo "Bon Nr.: " . $bon_id . " ausgeführt.";
	} else if ($callFrom == 'monatsbelegErstellen') {
		if ($error_code > 0) echo "Fehler beim drucken von Monatsbeleg Bon Nr.: " . $bon_id . " aufgetreten.";
		else echo "success Monatsbeleg mit der Bon Nr. " . $bon_id . " erstellt.";
	} else if ($callFrom == 'lieferscheineVerrechnung') {
		# hier funktionier leider kein return value, weil dieser beim page > 1 schon ausgeführt und somit verloren geht
		return false;
	} else echo json_encode(array($bon_id, $error_code));

	log_to_file("<-------- ENDE bon_ausdrucken_pdf");
}
function kopfzeile_ausdrucken_mit_formatierung($kopfzeilenParam = false, $callSource = false)
{
	
	$sql = "select name, wert from konfiguration WHERE name LIKE 'AUSRUCK_KOPFZEILE_%' AND name NOT LIKE 'AUSRUCK_KOPFZEILE_%_FORMAT' ORDER BY name";

	$sql_produkte = mysql_query($sql);
	if (!$sql_produkte) {
		if ($callSource != 'printPdf') echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	$pdfHeadData = array();
	while ($row_produkt = mysql_fetch_array($sql_produkte)) {
		if ($row_produkt["name"] == "AUSRUCK_KOPFZEILE_IBAN" && $kopfzeilenParam != "PrintBankdata") {
			continue;
		}
		$sql2 = "select wert from konfiguration WHERE name = '".$row_produkt["name"]."_FORMAT'";
		
		$sql_format = mysql_query($sql2);
		if (!$sql_format) {
			if ($callSource != 'printPdf') echo "SQL Fehler: " . mysql_error();
			exit(1);
		}
	
	
		$wert = $row_produkt["wert"];
		$strformat = "";
		$row   = mysql_fetch_row($sql_format);
		if ($row > 0) 
			$strformat = $row[0];
		
		if ($wert && $wert !== '') {
			array_push($pdfHeadData, array($wert,$strformat));
		
		}
		
	}
	return $pdfHeadData;
}
function kopfzeile_ausdrucken($kopfzeilenParam = false, $callSource = false)
{
	//	echo "<script>alert('ajaxfunction zeile 399 kopfzeile_ausdrucken')</script>";
	// Adresse etc. ausdrucken
	$sql = "select name, wert from konfiguration WHERE name LIKE 'AUSRUCK_KOPFZEILE_%' ORDER BY name";
	$sql_produkte = mysql_query($sql);
	if (!$sql_produkte) {
		if ($callSource != 'printPdf') echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	if ($callSource != 'printPdf') {
		echo "<div id='bonKopfzeile'>
						<center>";
	}
	$pdfHeadData = array();
	while ($row_produkt = mysql_fetch_array($sql_produkte)) {
		if ($row_produkt["name"] == "AUSRUCK_KOPFZEILE_IBAN" && $kopfzeilenParam != "PrintBankdata") {
			continue;
		}
		$wert = $row_produkt["wert"];
		if ($wert && $wert !== '') {
			if ($callSource != 'printPdf') echo $wert . "<br />";
			array_push($pdfHeadData, $wert);
		}
		//echo "Summe: $gesamtsumme_brutto Zeit: $timestamp";
	}
	if ($callSource != 'printPdf') {
		echo "<hr /></center>
					</div>";
	}
	return $pdfHeadData;
}


function fusszeile_ausdrucken($invoiceSum = false, $callSource = false, $qr_data = false, $requestFunktion = false)
{

	$sql = "select name, wert from konfiguration WHERE name LIKE 'AUSRUCK_FUSSZEILE_%' AND name NOT LIKE 'AUSRUCK_FUSSZEILE_%_FORMAT' ORDER BY name";
	$sql_produkte = mysql_query($sql);
	if (!$sql_produkte) {
		echo "SQL Fehler: " . mysql_error();
		exit(1);
	}
	$pdfFooterData = array();
	$pdfFooterDataFormat = array();
	if ($callSource != 'printPdf') {
		echo "<br>";
		echo "<div id='bonFusszeile'>
				<center>";
	}
	while ($row_produkt = mysql_fetch_assoc($sql_produkte)) {
		$wert = $row_produkt["wert"];
		//$wert = filter_var($row_produkt["wert"], FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_HIGH);
		//$wert = htmlentities($row_produkt["wert"], ENT_SUBSTITUTE, "UTF-8");
		//$wert = str_replace(array("\r", "\n"), '', $row_produkt["wert"]);
		if ($wert && $wert !== '') {
			if ($callSource != 'printPdf') echo $wert . "<br>";
		}
		array_push($pdfFooterData, $wert);
		
		$sql2 = "select wert from konfiguration WHERE name = '".$row_produkt["name"]."_FORMAT'";
		
		$sql_format = mysql_query($sql2);
		if (!$sql_format) {
			if ($callSource != 'printPdf') echo "SQL Fehler: " . mysql_error();
			exit(1);
		}
		$strformat = "";
		$row   = mysql_fetch_row($sql_format);
		if ($row > 0) 
			$strformat = $row[0];
		array_push($pdfFooterDataFormat, $strformat);
		//echo "Summe: $gesamtsumme_brutto Zeit: $timestamp";
	}
		//array_push($pdfFooterData, "das ist ein test");
	#	$extraFussTxtData=unserialize(AUSRUCK_EXTRA_FUSSZEILEN_FREIGEBEN);
	if (AUSRUCK_EXTRA_FUSSZEILEN_FREIGEBEN == 'ja' && $invoiceSum > 0) {
		$pdfFooterExtraData = "";
		$calcVal = AUSRUCK_EXTRA_FUSSZEILEN_WERT;
		$calcVal = ($calcVal * $invoiceSum / 100);

		$calcValTxt = "EUR " . number_format($calcVal, 2, ',', '.');
		$formNo = number_format($calcVal, 2, ',', '.');

		$fotterTx = AUSRUCK_EXTRA_FUSSZEILEN;
		if (preg_match("/x%/i", $fotterTx)) {
			$pattern = '/x%/';
			$replaceInExtraTxt = true;
		} else if (preg_match("/EUR\s[0-9]/i", $fotterTx)) {
			$pattern = '/EUR\s[0-9.]+/';
			$replaceInExtraTxt = true;
		} else {
			$replaceInExtraTxt = false;
		}
		$replacement = $calcValTxt;
		if ($replaceInExtraTxt == true) $fotterTx = preg_replace($pattern, $replacement, $fotterTx);
		$pdfFooterExtraData .= $fotterTx;
		$fotterTx = preg_replace('/\n/', '<br />', $fotterTx);
		$extraFooter = "<div><p>" . $fotterTx . "</p></div>";
	} else {
		$extraFooter = "";
		$pdfFooterExtraData = "";
	}

	$printerM = mysql_fetch_array(mysql_query("SELECT win_drucker_name, drucker_margin_html  FROM drucker WHERE LOWER(ist_rechnungsdrucker) = 'ja' "));
	$marginB = explode(",", $printerM[1]);
	if(!isset($marginB)){
	$marginBottom = $marginB[2];
	}else{
	$marginBottom = 0;
	}
	if ($callSource != 'printPdf') {
		$qrImg = false;

		if (strlen($qr_data[1]) > 55 && strtolower(AUSDRUCK_RECHNUNGSBON_PDF) != 'ja') {
			$bon_id = $qr_data[0];
			$qr_string = $qr_data[1];

			$qrX = explode("_", $qr_string);
			$lastIndex = count($qrX) - 1;
			$sigData = base64_decode($qrX[$lastIndex]);
			if (strtolower($sigData) == 'sicherheitseinrichtung ausgefallen') {
				$sigData = str_replace("_", " ", $sigData);
				$qrImg = "<div class='ausdruck_bon_gesamt_breite' style='font-weight:bold; margin-top:15px;' >
								" . $sigData . "
							</div>";
			} else {
				global $errorCorrectionLevel;
				global $matrixPointSize;
				global $qrMargin;
				global $qrImg_temp_dir;

				$qrFilename = "include/qr_lib/temp/" . $bon_id . ".png";

				QRcode::png($qr_string, $qrFilename, $errorCorrectionLevel, $matrixPointSize, $qrMargin);

				if (defined('QR_CODE_GROESSE') && QR_CODE_GROESSE >= 15) {
					$bonWidth = preg_replace('/[^\d]/', '', AUSDRUCK_GESAMTE_BREITE);
					$qrSize = (QR_CODE_GROESSE / $bonWidth) * 100; # errechnen den % wert aus zwei mm werten, ungenau aber ca
					$qrWidth = $qrSize . "%";
				} else $qrWidth = '66%';

				$qrImg = "<div class='ausdruck_bon_gesamt_breite' >
							<img src='" . $qrFilename . "' style=' display:block; width:" . $qrWidth . "; height:auto; margin:10px auto; ' />
							</div>";
			}
		}

		if ($requestFunktion == 'bonReprint' || $requestFunktion == 'bonjournalPrint') {
			$bonjournalP = "";
			if ($requestFunktion == 'bonjournalPrint') $bonjournalP = "Bonjournal ";
			$qrImg .= "<div class='ausdruck_bon_gesamt_breite'  >" . $bonjournalP . "Belegduplikat</div>";
		}
		if ($marginBottom == 0 || $marginBottom == false) $marginBottom = 5;
		echo $extraFooter . $qrImg .
			"</center>
					<div style='position:relative; float:left; width:" . ((preg_replace('/[^\d]/', '', AUSDRUCK_GESAMTE_BREITE) / 2) - 2) . "mm; height:" . $marginBottom . "mm;'>
						&nbsp;</div>
						<div style='position:relative; float:left; width:5mm; height:" . $marginBottom . "mm; border-bottom:1px solid #888; ' ></div>
						<div class='cclear'></div>
					</div>";
	}

	$pdfFooterSumData = array($pdfFooterData, $pdfFooterExtraData,$pdfFooterDataFormat);

	return $pdfFooterSumData;
}

function getLastDepData($currentBon, $cCount = 0)
{
	log_to_file("getLastDepData");
	log_to_file("currentBon: ".$currentBon);
	log_to_file("Count: ".$cCount);
	$getLastData = false;
	while ($getLastData == false && $cCount < 5) {
		$getLastData = mysql_fetch_array(mysql_query("SELECT umsatz_zaehler, zertif_nr, signjws, beleg_nr FROM dep WHERE beleg_nr = " . ($currentBon - 1) . " "));
		if (!$getLastData) sleep(1);
		$cCount++;
	}
log_to_file("Ende getLastDepData");
	return $getLastData;
}

function dep_table_schreiben($bon_id, $callFrom = false)
{
	#	$time_start = microtime(true);

//log_to_file("-----------> dep_table_schreiben");
	$depError = false;
	$errorContentArray = array();
	$revenueBefore = 0;		# wird für startbeleg bzw wenn letzter dep eintrag nicht gefunden wird genommen.
	$lastBonSig = "";  // V2.03 -30.03.2018 - RFR weil sonst fehler beim aktivieren der Signatur einheit kommt - keine Ahnung ob sonst eine Auswirkung hat

	if ($callFrom == 'startbeleg') {
		//log_to_file("startbeleg");
		$kId = mysql_fetch_array(mysql_query("SELECT wert FROM konfiguration_sitpos WHERE name='KASSA_ID' "));
		//log_to_file("KASSA ID: ".$kId);
		$lastSignJwsData = $kId['wert'];
		//log_to_file("lastSignJwsData: ".$lastSignJwsData);
	} else {
		//umsatz_zaehler, zertif_nr, signjws, beleg_nr
		//log_to_file("umsatz_zaehler, zertif_nr, signjws, beleg_nr");
		//log_to_file("BonID vor getLastDepData: ".$bon_id);
		$callDepData = getLastDepData($bon_id);

		// Letzer DEP eintrag konnte nicht gefunden werden
		if ($callDepData == false) {
			log_to_file("callDepData");
			$depError = true;
			$lastDepRevenue = mysql_fetch_array(mysql_query("SELECT umsatz_zaehler FROM `dep` ORDER BY dep_id DESC LIMIT 1"));
			$revenueBefore = $lastDepRevenue['umsatz_zaehler'];
			$lastSignJwsData = "Letzter Dep Eintrag konnte nicht gefunden werden.";
			array_push($errorContentArray, 'Letzter DEP Eintrag konnte nicht gefunden werden.');
		}
		// ansonsten wurde ein DEP eintrag gefunden - oder die Signatureinheit ist nicht aktiviert
		else {
			log_to_file("wurde ein DEP eintrag gefunden - oder die Signatureinheit ist nicht aktiviert");
			$revenueBefore = $callDepData[0];
			// signjws eintrag hier - aber wenn die Signatureinheit nicht aktiviert ist, dann gibt es auch keinen Punkt!
			$lastSignJwsData = $callDepData[2];
			$sigStr = explode(".", $callDepData[2]);
			if (count($sigStr) > 1) {
				$checkSig = base64_decode($sigStr[2]);
			} else $checkSig = "";
			if (strtolower($checkSig) == 'sicherheitseinrichtung ausgefallen') {
				$lastBonSig = 'unsig';
			} else {
				$lastBonSig = 'sig';
			}
		}
	}
//log_to_file('Alex 1: '.$bon_id);
	$bonData = mysql_query("SELECT abgeschlossener_bon.bon_id AS bonId, abgeschlossener_bon_steuern.bon_id AS bon_id,
								abgeschlossener_bon_steuern.tax_rate AS tax_rate, abgeschlossener_bon_steuern.gesamt_betrag, bon_erstellt_datum 
								FROM abgeschlossener_bon_steuern 
								LEFT JOIN abgeschlossener_bon ON abgeschlossener_bon_steuern.bon_id = abgeschlossener_bon.bon_id
								WHERE abgeschlossener_bon_steuern.bon_id = " . $bon_id . "");
//log_to_file('Alex 2');
	if (!$bonData) {
		$depError = true;
		log_to_file('Steuersätze für Bon Nr. ' . $bon_id . ' konnten nicht gelesen werden.');
		array_push($errorContentArray, 'Steuersätze für Bon Nr. ' . $bon_id . ' konnten nicht gelesen werden.');
	}

	$taxN = 0;
	$tax1 = 0;
	$tax2 = 0;
	$taxNull = 0;
	$taxB = 0;
	//log_to_file('Alex 3');
	while ($getTax = mysql_fetch_assoc($bonData)) {
		if ($getTax['tax_rate'] == 0.2) $taxN = $getTax['gesamt_betrag'] * (1 + $getTax['tax_rate']);
		else if ($getTax['tax_rate'] == 0.1) $tax1 = $getTax['gesamt_betrag'] * (1 + $getTax['tax_rate']);
		else if ($getTax['tax_rate'] == 0.13) $tax2 = $getTax['gesamt_betrag'] * (1 + $getTax['tax_rate']);
		else if ($getTax['tax_rate'] == 0.0) $taxNull += $getTax['gesamt_betrag'];
		else if ($getTax['tax_rate'] == 0.19) $taxB = $getTax['gesamt_betrag'] * (1 + $getTax['tax_rate']);
		else $taxNull += $getTax['gesamt_betrag'] * (1 + $getTax['tax_rate']); // Steuersatz 5 Prozent nach Corona Krise! - Auffangregel alles was nicht bekannt ist geht in den NULL Satz


		$bonDate = $getTax['bon_erstellt_datum'];
	}
	#	writeLog(basename( __FILE__)." ". __LINE__ . "bon date: ".$bonDate." bon Nr: ".$bon_id."\n");
	$bonUmsatz = $taxN + $tax1 + $tax2 + $taxNull + $taxB;
	$umsatzZaehler = number_format($revenueBefore + ($bonUmsatz * 100), 0, "", "");

	$taxN = number_format($taxN, 2, ",", "");
	$tax1 = number_format($tax1, 2, ",", "");
	$tax2 = number_format($tax2, 2, ",", "");
	$taxNull = number_format($taxNull, 2, ",", "");
	$taxB = number_format($taxB, 2, ",", "");

	$preFix = "_R1-";

	$xDate = strtotime($bonDate);
	$bDate = date('Y-m-d', $xDate);
	$bTime = date('H:i:s', $xDate);
	$sigDate = $bDate . "T" . $bTime;
//log_to_file('Alex 4');
	if (defined('ZERTIFIKATS_NR') && ZERTIFIKATS_NR > 1000 && $callFrom != 'startbeleg') $zertif_nrHex = dechex(ZERTIFIKATS_NR);
	else if ($callFrom == 'startbeleg') {
		$zertNo = mysql_fetch_array(mysql_query("SELECT wert FROM konfiguration_sitpos WHERE name='ZERTIFIKATS_NR' "));
		$zertif_nrHex = dechex($zertNo['wert']);
	} else $zertif_nrHex = false;

	# Reihenfolge entpsr dokument Detailfragen RKSV V1.1 Seite 11/12
	#	Prefix da nicht erw., Kassen-ID, Beleg Nr, Beleg Datum-Zeit, Beträge: normal-erm1-erm2-null-besonders, Umsatz-Zaehler-AES256-ICM, 
	#		Zertifikat-Seriennummer (Hex Codiert ?), Sig-Voriger-Beleg (bei startbeleg aus kassen-id bilden), 	

	# kommt von der Funktion getLastDepData() array Index 2

	$signatureError = false;
	# beginn signatureinheit aktiviert
	if ($zertif_nrHex != false) {
		if ($callFrom == 'startbeleg') {
			$aesK = mysql_fetch_array(mysql_query("SELECT wert FROM konfiguration_sitpos WHERE name='AES_KEY' "));
			$aesKey = $aesK['wert'];
			$kId = mysql_fetch_array(mysql_query("SELECT wert FROM konfiguration_sitpos WHERE name='KASSA_ID' "));
			$kassaId = $kId['wert'];
			$zId = mysql_fetch_array(mysql_query("SELECT wert FROM konfiguration_sitpos WHERE name='ZDA_ID' "));
			$zdaId = $zId['wert'];
		} else {
			$aesKey = AES_KEY;
			$kassaId = KASSA_ID;
			$zdaId = ZDA_ID;
		}

		if (defined('SIGNATUR_MODUS') && strtolower(SIGNATUR_MODUS) == 'com') {
			if (defined('INIT_SIG_UNIT_DEFAULT') && strtolower(INIT_SIG_UNIT_DEFAULT) == 'ja') {
				$sigcardData = new COM('ATrustRegistrierkasseCom.Registrierkasse');
				$fFin = $sigcardData->Finalize;

				if ($fFin != 0) {
					$iInit = $sigcardData->Initialize;
					$fFin = $sigcardData->Finalize;;
				}
			}

			try {
				$aesEncrypt = new COM('ATrustRegistrierkasseCom.AesIcm');
			} catch (Exception $e) {
				echo "Objekt konnte nicht erstllt werden; error = {$e->getMessage()}\n";
			}
			$revenueCoded = "";
			$retVal = $aesEncrypt->Encrypt($aesKey, $umsatzZaehler, $kassaId, $bon_id, $revenueCoded);
		}

//log_to_file('Alex 5');
		if ($callFrom == 'storniereBon') $revenueCodeToSign = base64_encode('STO'); #  aus RKSV Detailfragen Seite 24,  U1RP anstelle des Umsatzzählers.
		else $revenueCodeToSign = $revenueCoded;

		if (defined('SIGNATUR_MODUS') && strtolower(SIGNATUR_MODUS) == 'com') {
			$shaClass = new COM('ATrustRegistrierkasseCom.Sha256');
			$sigVorigerBeleg = "";
			$retVal = $shaClass->HashSigVorigerBeleg($lastSignJwsData, 8, $sigVorigerBeleg);

			if (strlen($sigVorigerBeleg) > 5) $error_code_sigVorig = 0;
			else $error_code_sigVorig = false;

			$strToSign = $preFix . $zdaId . "_" . $kassaId . "_" . $bon_id . "_" . $sigDate . "_" . $taxN . "_" . $tax1 . "_" . $tax2 . "_" . $taxNull . "_" . $taxB . "_" . $revenueCodeToSign . "_" . $zertif_nrHex . "_" . $sigVorigerBeleg;
			$karte = new COM('ATrustRegistrierkasseCom.Registrierkasse');
			$retVal = $karte->Initialize;


			$signature = "";
			$retVal = $karte->SignJWS($strToSign, $signature);
			if ($retVal != 0) $error_code_sign = 1; 				# das wird dann weiter unten verarbeitet !!!!
			else $error_code_sign = 0;
			$signString = $signature;
		}

		if ($sigVorigerBeleg == false || $error_code_sigVorig !== 0) {
			$signatureError = true;
			array_push($errorContentArray, 'Signatur Voriger Beleg konnte nicht aufgelöst oder gefunden werden.');
		}


		if ($error_code_sign !== 0) {		# entspricht signatureinheit ausgefallen
			$signatureError = true;
			if (defined('SIGNATUR_ERROR_BON_ROLLBACK') && strtolower(SIGNATUR_ERROR_BON_ROLLBACK) == 'ja') {
				array_push($errorContentArray, 'Signatur Fehlgeschlagen.');
			} else array_push($errorContentArray, 'Signatur Fehlgeschlagen. Der Bon wird mit Sicherheitseinrichtung ausgefallen signiert. ');

			# header base 64 Url codieren
			#$commandBase64UrlCodierenHeader='C:\sitpos\_rkExe\ATrustRegistrierkasseExe.exe --base64url_encode {"alg":"ES256"}';
			#exec($commandBase64UrlCodierenHeader, $outputCodingH, $error_code);
			#$jwsHeader=$outputCodingH[0];
			$jwsHeader = base64_encode('{"alg":"ES256"}');
			# payload base 64 Url codieren

			if (defined('SIGNATUR_MODUS') && strtolower(SIGNATUR_MODUS) == 'com') {

				$base64Cl = new COM("ATrustRegistrierkasseCom.Base64");

				$jwsPayLoad = "";
				$jwsSigAusgef = "";
				$retVal = $base64Cl->EncodeUrl($strToSign, 0, $jwsPayLoad);
				$retVal2 = $base64Cl->EncodeUrl("Sicherheitseinrichtung ausgefallen", 0, $jwsSigAusgef);
			}

			$rRetour = base64_decode($jwsSigAusgef);

			#	das wäre base64 aber nicht base64 url    möglicher php ansatz -> strtr(base64_encode($strToSign), '+/=', '-_,');
			#	$jwsHeader=base64_encode('{"alg":"ES256"}');
			#	$jwsPayLoad=base64_encode($strToSign);
			#	$jwsSigAusgef=base64_encode('Sicherheitseinrichtung ausgefallen');

			$signString = $jwsHeader . "." . $jwsPayLoad . "." . $jwsSigAusgef;
		} else if ($error_code_sign === 0 && (defined('DISPLAY_DEP_SIGN_ERROR') && strtolower(DISPLAY_DEP_SIGN_ERROR) == 'nein')) {
			mysql_query("UPDATE konfiguration SET wert = 'ja' WHERE name = 'DISPLAY_DEP_SIGN_ERROR'");
		}

		$getQrData = explode(".", $signString);
		# $qrString=base64_decode($getQrData[1]);

		if (defined('SIGNATUR_MODUS') && strtolower(SIGNATUR_MODUS) == 'com') {
			$base64Class = new COM("ATrustRegistrierkasseCom.Base64");
			# für QR-Code wird der signaturteil aus dem gesamten signaturstring (3. teil) von Base64 Url auf Base64 umcodiert. 
			$qr_3 = "";
			$retVal = $base64Class->ReencodeUrlToNormal($getQrData[2], $qr_3);

			# aus dem zweiten Teil des Signaturstrings wir ein Klartxt gemacht
			$qr_2 = "";
			$retVal1 = $base64Class->DecodeUrl($getQrData[1], $qr_2);

			$qrString = $qr_2 . "_" . $qr_3;
		}
	}			# ende signatureinheit aktiviert

	else {
		# signiereinheit nicht aktiviert im konfiguration_sitpos szeht keine signatur ser nr
		$sigVorigerBeleg = "unsigniert";
		$signString = "unsigniert";
		$revenueCoded = "";
		#$zertif_nrHex = 0;
		$lastZertifizierungsdata = $callDepData[1];
		$testZert = substr($lastZertifizierungsdata, -20) . md5(date("Y-m-d H:i"));
		$zertif_nrHex = $testZert;
		$qrString = "";
		$decryptCheckFail = false;
		$kassaId = KASSA_ID;
	}

//log_to_file('Alex 6');
	if ($depError == false) {
		$insQl = mysql_query("INSERT INTO dep SET kassen_id='" . $kassaId . "', beleg_nr = " . $bon_id . ",  datum_zeit='" . $bonDate . "', betr_satz_norm = '" . $taxN . "',
						betr_satz_erm_1 = '" . $tax1 . "', betr_satz_erm_2 = '" . $tax2 . "', betr_satz_null = '" . $taxNull . "', betr_satz_besonder = '" . $taxB . "', 
						umsatz_zaehler_aes = '" . $revenueCoded . "', umsatz_zaehler = " . $umsatzZaehler . ", zertif_nr = '" . $zertif_nrHex . "', 
						qr_string = '" . $qrString . "', signatur_vorigerbeleg = '" . $sigVorigerBeleg . "', signjws = '" . $signString . "'	");
		log_to_file("INSERT INTO dep SET kassen_id='" . $kassaId . "', beleg_nr = " . $bon_id . ",  datum_zeit='" . $bonDate . "', betr_satz_norm = '" . $taxN . "',
						betr_satz_erm_1 = '" . $tax1 . "', betr_satz_erm_2 = '" . $tax2 . "', betr_satz_null = '" . $taxNull . "', betr_satz_besonder = '" . $taxB . "', 
						umsatz_zaehler_aes = '" . $revenueCoded . "', umsatz_zaehler = " . $umsatzZaehler . ", zertif_nr = '" . $zertif_nrHex . "', 
						qr_string = '" . $qrString . "', signatur_vorigerbeleg = '" . $sigVorigerBeleg . "', signjws = '" . $signString . "'	");
		if (!$insQl) {
			$signatureError = true;
			log_to_file('Datenbank Error beim DEP schreiben. '. mysql_error());
			array_push($errorContentArray, 'Datenbank Error beim DEP schreiben. ' . mysql_error());
		}
	}
//log_to_file('signatureError: '.$signatureError);
//log_to_file('depError: '.$depError);
	if ($signatureError != false || $depError != false) {
//		log_to_file('Alex 7-');
		$errorCont = "";
		if ($depError == true && $signatureError == false) $errorCode = 'dep';
		else if ($depError == false && $signatureError == true) $errorCode = 'sig';
		else if ($depError == true && $signatureError == true) $errorCode = 'dep_sig';
		else  $errorCode = 'undefined';
		log_to_file('Alex 7--');
		for ($i = 0; $i < sizeof($errorContentArray); $i++) {
			$errorCont .= $errorContentArray[$i] . "<br />";
		}
		log_to_file('Alex: $errorCode');
		return array(false, $errorCont, $errorCode);
	} else {
		#	$time_end = microtime(true);
		#	$execution_time = ($time_end - $time_start)/60;
//log_to_file('Alex 7---');
		return array(true, '', false, $lastBonSig);
	}
	
}


function selectPrinter()
{
	$kp_contW = 99 - (int)str_replace("%", "", ZIFFERN_CONTAINER_BREITE) . "%";


	echo "<div class='bon kassaOeffnenDiv' style='width:" . $kp_contW . "' >";


	echo "</div>";
}



function importFromCsv($filename, $importType, $delimiter = ';', $option = false, $bruttoSwitch = false)
{
	$startT = date('h:i:s');

	if ($importType == "productsImport") {
		if (!file_exists($filename) || !is_readable($filename)) {
			return "Fehler beim lesen der Import Datei !!!<br />";
		} else {
			$header = null;
			$data = array();

			$returnMsg = "";
			$kpSqlString = " ";
			if (($handle = fopen($filename, 'r')) !== false) {
				$countUp = 0;
				$countIns = 0;
				$countInsCat = 0;
				$countContinue = 0;
				$kpMsg = "";

				$rowCount = 0;
				$sStrgRes = "";
				$sStrg = "";
				$addMsg = "";
				mysql_query("BEGIN");

				while (($row = fgetcsv($handle, 1000, $delimiter)) !== false) {
					$varPrice = false;
					$negPrice = false;
					if (!is_numeric($row[3]) && !is_numeric($row[4]) && !is_numeric($row[8]) && !is_numeric($row[10]) && !is_numeric($row[11]))   continue; //   ist dann der Header

					$row[2] = preg_replace('!\s+!', ' ', $row[2]);
					$row[5] = preg_replace('!\s+!', ' ', $row[5]);
					$row[7] = preg_replace('!\s+!', ' ', $row[7]);
					$row[9] = preg_replace('!\s+!', ' ', $row[9]);

					global $pattern, $replace;   //   stored in connect.php

					$row[2] = preg_replace($pattern, $replace, $row[2]);
					$row[5] = preg_replace($pattern, $replace, $row[5]);
					$row[7] = preg_replace($pattern, $replace, $row[7]);
					$row[9] = preg_replace($pattern, $replace, $row[9]);

					$row[2] = mb_ereg_replace("[à`á]", "a ", $row[2]);		# dieser hat beim saatgut import probleme gemacht deswegen wird das hier extra replaced

					$encodingCat =  mb_detect_encoding($row[5]);
					if ($encodingCat != 'UTF-8') $row[5] = mb_convert_encoding($row[5], 'UTF-8', $encodingCat);
					else $row[5] = iconv('UTF-8', 'UTF-8//IGNORE', $row[5]);


					$catId = mysql_fetch_array(mysql_query("SELECT ID, NAME FROM categories WHERE LOWER(NAME) = LOWER('$row[5]') "));
					if (isset($catId[0]) && $catId[0] > 0) {
						(int)$categorieId = $catId[0];
						$kpMsg .= "Cat Id = " . $categorieId;
					} else {
						$InsCatQl = mysql_query("INSERT INTO categories SET NAME = '$row[5]', IMAGE = '[BLOB - 0 B]', COLOR = '#f7ff0a', text_color = '#000000', anzeige_reihenfolge = '0' ");
						(int)$categorieId = mysql_insert_id();
						if (!$InsCatQl) $kpMsg .= "Error, Kategorie Insert." . mysql_error();
						$countInsCat++;
					}

					# einkauspreis
					if ($row[3] == '') {
						$row[3] = 0;
					} else if (preg_match("/^[-]?\d{1,3}(\.\d{3})+(,\d+)?$/", $row[3])) {
						# tausender zahl
						$row[3] = str_replace(',', '.', str_replace('.', '', $row[3]));
					} else if (preg_match("/^[-]?[0-9]*[,]{1}[0-9]{1,}$/", $row[3])) {
						# kommazahl (1x ",")
						$row[3] = str_replace(',', '.', $row[3]);
					}

					# verkauspreis
					if ($row[4] == '') {
						$row[4] = 0;
					} else if (preg_match("/^[-]?\d{1,3}(\.\d{3})+(,\d+)?$/", $row[4])) {
						# tausender zahl
						$row[4] = str_replace(',', '.', str_replace('.', '', $row[4]));
					} else if (preg_match("/^[-]?[0-9]*[,]{1}[0-9]{1,}$/", $row[4])) {
						# kommazahl (1x ",")
						$row[4] = str_replace(',', '.', $row[4]);
					}
					# Zeitpreise netto
					if (isset($row[13]) && $row[13] == '' || !isset($row[13])) {
						$row[13] = 0;
					} else if (isset($row[13]) && preg_match("/^[-]?\d{1,3}(\.\d{3})+(,\d+)?$/", $row[13])) {
						# tausender zahl
						$row[13] = str_replace(',', '.', str_replace('.', '', $row[13]));
					} else if (preg_match("/^[-]?[0-9]*[,]{1}[0-9]{1,}$/", $row[13])) {
						# kommazahl (1x ",")
						$row[13] = str_replace(',', '.', $row[13]);
					}
					# Zeitpreise brutto
					if (isset($row[14]) && $row[14] == '' || !isset($row[14])) {
						$row[14] = 0;
					} else if (isset($row[14]) && preg_match("/^[-]?\d{1,3}(\.\d{3})+(,\d+)?$/", $row[14])) {
						# tausender zahl
						$row[14] = str_replace(',', '.', str_replace('.', '', $row[14]));
					} else if (preg_match("/^[-]?[0-9]*[,]{1}[0-9]{1,}$/", $row[14])) {
						# kommazahl (1x ",")
						$row[14] = str_replace(',', '.', $row[14]);
					}



					# taxrate
					if (preg_match("/^[-]?[0-9]*[,]{1}[0-9]{1,}$/", $row[6])) {
						$row[6] = str_replace(',', '.', $row[6]);
					}

					if (isset($row[14]) && $row[14] != 0 && ($row[13] == 0 || !is_numeric($row[13]))) {
						$row[13] = $row[14] / (1 + $row[6]);
					}

					if (!is_numeric($row[3]) || !is_numeric($row[4])  || !is_numeric($row[6])) {
						$returnMsg .= "Zahlenformat Fehler in Spalte EK, VK od Tax Rate  - " . $row[2] . "\n";
						$countContinue++;
						continue;
					}
					if ((isset($row[13]) && !is_numeric($row[13])) || (isset($row[14]) && !is_numeric($row[14]))) {
						$returnMsg .= "Zahlenformat Fehler in Spalten Zeitpreise  - " . $row[2] . "\n";
						$countContinue++;
						continue;
					}

					if ($row[8] === 0 || $row[8] === 1 || $row[8] == '0' || $row[8] == '1') {
						if ($row[8] == 'z') $returnMsg .= " des is a z \n";
						$varPrice = $row[8];
					} else {
						if ($row[4] > 0) $varPrice = 0;
						else $varPrice = 1;
					}
					if ($row[10] === 0 || $row[10] === 1 || $row[10] == '0' || $row[10] == '1') {
						$negPrice = $row[10];
					} else {
						$negPrice = 0;
					}
					if ($row[11] === 0 || $row[11] === 1 || $row[11] == '0' || $row[11] == '1') {
						$prodOrder = $row[11];
					} else {
						$prodOrder = 99;
					}
					if ($row[12] === 0 || (int)$row[12] === 1 || $row[12] == '0' || $row[12] == '1') {
						$sichtbar = $row[12];
					} else {
						$sichtbar = 1;
					}
					if ($row[13] === 0 || (int)$row[13] === 1 || $row[13] == '0' || $row[13] == '1') {
						$ist_favorit = $row[13];
					} else {
						$ist_favorit = 0;
					}

					if ($bruttoSwitch == true) {
						$priceSell = number_format($row[4] / (1 + $row[6]), 8, '.', '');
						$priceBuy = number_format($row[3] / (1 + $row[6]), 8, '.', '');
					} else {
						$priceSell = number_format($row[4], 8, '.', '');
						$priceBuy = number_format($row[3], 8, '.', '');
					}

					$zeitPreisNetto = number_format($row[13], 8, ".", '');
					$zeitPreisBrutto = number_format($row[14], 8, ".", '');

					$taxC = mysql_fetch_array(mysql_query("SELECT ID FROM taxes WHERE RATE = '$row[6]' "));
					if (!$taxC[0]) $taxCat = 1;
					(int)$taxCat = $taxC[0];

					if ($row[7] == '') $row[7] = NULL;

					$encodingName =  mb_detect_encoding($row[2]);
					if ($encodingName != 'UTF-8') $row[2] = mb_convert_encoding($row[2], 'UTF-8', $encodingName);
					else $row[2] = iconv('UTF-8', 'UTF-8//IGNORE', $row[2]);

					$encodingPrName =  mb_detect_encoding($row[9]);
					if ($encodingPrName != 'UTF-8') $row[9] = mb_convert_encoding($row[9], 'UTF-8', $encodingPrName);
					else $row[9] = iconv('UTF-8', 'UTF-8//IGNORE', $row[9]);

					if ($option == true && strtolower($option) == 'reference' && strlen($row[0]) > 0) {
						# hauptsächlich für commandline import ausgelegt
						$prRef = mysql_fetch_array(mysql_query("SELECT ID, NAME FROM products WHERE REFERENCE = '" . $row[0] . "' LIMIT 1"));

						if ($row[7] == '') $row[7] = NULL;
						if ($prRef[0] > 0) {
							$queryStr = "UPDATE products SET CODE='" . $row[1] . "', NAME='" . $row[2] . "', PRICEBUY=" . $priceBuy . ", PRICESELL=" . $priceSell . ",
													CATEGORY=" . $categorieId . ", TAXCAT=" . $taxCat . ", DISPLAY='" . $row[7] . "', VARPRICE=" . $varPrice . ", PRINTNAME='" . $row[9] . "', 
													NEGATIVEPRICE=" . $negPrice . ", PRODUKTORDER=" . $prodOrder . ", SICHTBAR=" . $sichtbar . ", ist_favorit=" . $ist_favorit . ",
													zeitpreis_netto=" . $zeitPreisNetto . ", zeitpreis_brutto=" . $zeitPreisBrutto . "
													WHERE ID=" . $prRef[0] . " ";
							$upSq = mysql_query($queryStr);
							if (!$upSq) $returnMsg .= "Produkt(" . $row[2] . ") update Error:\n" . mysql_error() . "\n" . $queryStr . "\n";
							else $countUp++;
						} else {
							$queryStr = "INSERT INTO products SET REFERENCE='" . $row[0] . "', CODE='" . $row[1] . "', NAME='" . $row[2] . "', PRICEBUY=" . $priceBuy . ", 
													PRICESELL=" . $priceSell . ", CATEGORY=" . $categorieId . ", TAXCAT=" . $taxCat . ", DISPLAY='" . $row[7] . "', VARPRICE=" . $varPrice . ", 
													PRINTNAME='" . $row[9] . "', NEGATIVEPRICE=" . $negPrice . ", PRODUKTORDER=" . $prodOrder . ", SICHTBAR=" . $sichtbar . ", ist_favorit=" . $ist_favorit . ",
													zeitpreis_netto=" . $zeitPreisNetto . ", zeitpreis_brutto=" . $zeitPreisBrutto . " ";
							$insSq = mysql_query($queryStr);
							if (!$insSq) $returnMsg .= "Produkt(" . $row[2] . ") insert Error:\n" . mysql_error() . "\n" . $queryStr . "\n";
							else $countIns++;
						}
					} else {
						$prN = mysql_fetch_array(mysql_query("SELECT ID, NAME FROM products WHERE LOWER(NAME) = LOWER('$row[2]') 
																		AND LOWER(CODE) = LOWER('$row[1]') AND LOWER(REFERENCE) = LOWER('$row[0]') LIMIT 1"));

						if ($row[7] == '') $row[7] = NULL;
						if ($prN[1] == true) {

							$upSq = mysql_query("UPDATE products SET REFERENCE='$row[0]', CODE='$row[1]', NAME='$row[2]', PRICEBUY=$priceBuy, PRICESELL=$priceSell,
													CATEGORY=$categorieId, TAXCAT=$taxCat, DISPLAY='$row[7]', VARPRICE=$varPrice, PRINTNAME='$row[9]', 
													NEGATIVEPRICE=$negPrice, PRODUKTORDER=$prodOrder, SICHTBAR=$sichtbar, ist_favorit=" . $ist_favorit . ",
													zeitpreis_netto=" . $zeitPreisNetto . ", zeitpreis_brutto=" . $zeitPreisBrutto . "
													WHERE ID=" . $prN[0] . " ");

							if (!$upSq) $returnMsg .= "Error up " . mysql_error();
							else $countUp++;
						} else {
							$insSq = mysql_query("INSERT INTO products SET REFERENCE='$row[0]', CODE='$row[1]', NAME='$row[2]', PRICEBUY=$priceBuy, 
													PRICESELL=$priceSell, CATEGORY=$categorieId, TAXCAT=$taxCat, DISPLAY='$row[7]', VARPRICE=$varPrice, 
													PRINTNAME='$row[9]', NEGATIVEPRICE=$negPrice, PRODUKTORDER=$prodOrder, SICHTBAR=$sichtbar, ist_favorit=" . $ist_favorit . ",
													zeitpreis_netto=" . $zeitPreisNetto . ", zeitpreis_brutto=" . $zeitPreisBrutto . " ");

							if (!$insSq) $returnMsg .= "Error ins " . mysql_error();
							else $countIns++;
						}
					}
					$rowCount++;
				}

				mysql_query("COMMIT");
				fclose($handle);
			}

			if ($countContinue > 0) {
				if ($countContinue == 1) $x = "Datensatz";
				else $x = "Datensätze";
				$continueResultTxt = ", " . $countContinue . " Produkt " . $x . " übersprungen";
			} else $continueResultTxt = "";
			if ($countInsCat > 0) {
				if ($countInsCat == 1) $z = "Datensatz";
				else $z = "Datensätze";
				$categorieResultTxt = ", " . $countInsCat . " Warengruppen " . $z . " eingefügt";
			} else $categorieResultTxt = "";
			if ($countIns == 1) $y = "Datensatz";
			else $y = "Datensätze";
			if ($countUp == 1) $w = "Datensatz";
			else $w = "Datensätze";
			$returnMsg .= $countUp . " Produkt " . $w . " updated, " . $countIns . " Produkt " . $y . " eingefügt " . $categorieResultTxt . $continueResultTxt . ".\n";

			$checkQl = mysql_query("SELECT REFERENCE, NAME FROM products group by REFERENCE having count(*) >= 2");
			if (mysql_num_rows($checkQl)) $returnMsg .= "\n\n";
			while ($checkR = mysql_fetch_array($checkQl)) {
				$returnMsg .= "Mehrfach Eintrag in Spalte Reference gefunden: " . $checkR['NAME'] . " " . $checkR['REFERENCE'] . "\n";
			}

			$endT = date('h:i:s');
			$runT = strtotime($endT) - strtotime($startT);
			return $returnMsg . "<br />Execution time: " . $runT;
		}
	}
}

function importTimeoutError()
{
	$a = error_get_last();
	if ($a !== null) {
		if ($a['message'] == true && preg_match('/^maximum execution time/i', $a['message']) === 1) {
			echo "<p style='text-align:center; font-size:1em;'>" . $a['message'] . "<p>
					<button style=' width:200px; height:auto; min-height:28px; background:orange; margin:5px auto; border:1px solid silver; 
							color:#fff; font-weight:bold; font-size:1em; border-radius:3px; display:block; cursor:pointer;' 
						class='button_gross' onClick=\"document.location.href='daten_import.php'\">Zurück zu Daten importieren</button>";

			set_error_handler('count', 0);
		}
	}
}

function getReportWorkDateWhere($tableCol, $callSource = false)
{

	if (isset($_POST['startDate']) && $_POST['startDate'] != "") {
		$startDate = $_POST['startDate'];
		$startDatePost = true;

		#    scheint zwingend   " checkdate ( int $month , int $day , int $year ) "  in dieser reihenfolge zu sein !!!
		if (checkdate(date('m', strtotime($startDate)), date('d', strtotime($startDate)), date('Y', strtotime($startDate))) == true) $checkStartDate = true;
		else  	$checkStartDate = false;
	} else {
		$startDate = false;
		$checkStartDate = false;
	}

	if (isset($_POST['endDate']) && $_POST['endDate'] != "") {
		$endDate = $_POST['endDate'];
		$endDatePost = true;
		if (checkdate(date('m', strtotime($endDate)), date('d', strtotime($endDate)), date('Y', strtotime($endDate))) == true) $checkEndDate = true;
		else 	$checkEndDate = false;
	} else {
		$endDate = false;
		$checkEndDate = false;
	}
	if ($checkStartDate == true && $checkEndDate == true) 
	{
		$dateWhere = "WHERE " . $tableCol . " >= '" . $startDate . "' AND  " . $tableCol . " <= '" . $endDate . "'";
		$dDateSt = strtotime($startDate);
		$infoDst = date('j.n.Y H:i', $dDateSt);
		$dDateEnd = strtotime($endDate);
		$infoDend = date('j.n.Y H:i', $dDateEnd);
		$whereInfo = "<span >Von: <b>" . $infoDst . "</b> bis: <b>" . $infoDend . "</b></span>";
	}
		#writeLog(basename( __FILE__)." ". __LINE__ . "report date Where -> ".$dateWhere." -->>>> ".$startTime." / ".$endTime);

	$resultArray = array("WHERE 1=1 ", "");
	if (isset($dateWhere) && isset($whereInfo))
		$resultArray = array($dateWhere, $whereInfo);
	
	return $resultArray;
}

function getReportDateWhere($tableCol, $callSource = false)
{
	#  callSource noch nicht genützt !!!!
	$startTime = '00:00';
	$endTime = '23:59:59';
	if (isset($_POST['startTime']) && $_POST['startTime'] != "00:00") {
		$startTx = $_POST['startTime'];
		if (preg_match('/^(([0-1][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?)$/', $startTx)) $startTime = $startTx;
		else $startTime = '00:00:00';
	}
	if (isset($_POST['endTime'])) {
		$endTx = $_POST['endTime'];
		if ($endTx == '23:59') $endTx = '23:59:59';
		if (preg_match('/^(([0-1][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?)$/', $endTx)) $endTime = $endTx;
		else $endTime = '23:59:59';
	}
	if (isset($_POST['startDate']) && $_POST['startDate'] != "") {
		$startDate = $_POST['startDate'];
		$startDatePost = true;

		#    scheint zwingend   " checkdate ( int $month , int $day , int $year ) "  in dieser reihenfolge zu sein !!!
		if (checkdate(date('m', strtotime($startDate)), date('d', strtotime($startDate)), date('Y', strtotime($startDate))) == true) $checkStartDate = true;
		else  	$checkStartDate = false;
	} else {
		$startDate = false;
		$checkStartDate = false;
	}



	if (isset($_POST['endDate']) && $_POST['endDate'] != "") {
		$endDate = $_POST['endDate'];
		$endDatePost = true;
		if (checkdate(date('m', strtotime($endDate)), date('d', strtotime($endDate)), date('Y', strtotime($endDate))) == true) $checkEndDate = true;
		else 	$checkEndDate = false;
	} else {
		$endDate = false;
		$checkEndDate = false;
	}

	// weder start noch enddate gesetzt
	if ($checkStartDate == false && $checkEndDate == false) {
		$dateWhere = "";
		if ($callSource == 'GDPdU_export') $dateWhere = array(false, false);
		$whereInfo = "<span >Kein Datum gesetzt</span >";
	}
	//  start datum gesetzt end datum nicht -> select das Start datum als einen tag
	else if ($checkStartDate == true && $checkEndDate == false) {
		$dateWhere = "WHERE " . $tableCol . " >= '" . $startDate . " " . $startTime . "' AND  " . $tableCol . " < '" . $startDate . " " . $endTime . "'";
		if ($callSource == 'GDPdU_export') $dateWhere = array($startDate . " " . $startTime, $startDate . " " . $endTime);
		$dDate = strtotime($startDate . " " . $startTime);
		$infoD = date('j.n.Y H:i', $dDate);
		$whereInfo = "<span >Vom: <b>" . $infoD . "</span>";
	}
	//  start und end datum gestzt -> select between start und end datum 
	else if ($checkStartDate == true && $checkEndDate == true) {
		$dateWhere = "WHERE " . $tableCol . " >= '" . $startDate . " " . $startTime . "' AND " . $tableCol . " < '" . $endDate . " " . $endTime . "'";
		if ($callSource == 'GDPdU_export') $dateWhere = array($startDate . " " . $startTime, $endDate . " " . $endTime);
		$dDateSt = strtotime($startDate . " " . $startTime);
		$infoDst = date('j.n.Y H:i', $dDateSt);
		$dDateEnd = strtotime($endDate . " " . $endTime);
		$infoDend = date('j.n.Y H:i', $dDateEnd);
		$whereInfo = "<span >Von: <b>" . $infoDst . "</b> bis: <b>" . $infoDend . "</b></span>";
	}
	//  start nicht gesetzt end datum schon gestzt -> kein datums select, output ohne datums einschränkung
	else if ($checkStartDate == false && $checkEndDate == true) {
		$dateWhere = "";
		if ($callSource == 'GDPdU_export') $dateWhere = array(false, false);
		$whereInfo = "<span >Kein Datum gesetzt</span >";
	}
	#writeLog(basename( __FILE__)." ". __LINE__ . "report date Where -> ".$dateWhere." -->>>> ".$startTime." / ".$endTime);

	$resultArray = array($dateWhere, $whereInfo);

	return $resultArray;
}


function sitPosEncrypt($string, $key)
{
	$result = '';
	for ($i = 0; $i < strlen($string); $i++) {
		$char = substr($string, $i, 1);
		$keychar = substr($key, ($i % strlen($key)) - 1, 1);
		$char = chr(ord($char) + ord($keychar));
		$result .= $char;
	}

	return base64_encode($result);
}

function sitPosDecrypt($string, $key)
{
	$result = '';
	$string = base64_decode($string);

	for ($i = 0; $i < strlen($string); $i++) {
		$char = substr($string, $i, 1);
		$keychar = substr($key, ($i % strlen($key)) - 1, 1);
		$char = chr(ord($char) - ord($keychar));
		$result .= $char;
	}

	return $result;
}

function getMacAddresses()
{
	ob_start(); // Turn on output buffering
	system('getmac /fo csv'); //Execute external program to display output
	$mycom = ob_get_contents(); // Capture the output into a variable
	ob_clean(); // Clean (erase) the output buffer

	$myCom = explode(PHP_EOL, $mycom);
	$macAddrArray = array();

	for ($i = 0; $i < count($myCom); $i++) {
		$elem = explode(",", $myCom[$i]); # erstes element vor dem "," sollte die mac Adresse sein oder die header bzw letzte zeile
		$elem = str_replace(array('-', '"', "'"), "", $elem[0]);
		if (ctype_xdigit($elem)) array_push($macAddrArray, $elem);
	}

	return $macAddrArray;
}

function updateUserActive()
{
	$updateUserAct = mysql_query("UPDATE benutzer_aktiv SET last_active=NOW() WHERE session_id = '" . session_id() . "' ");
	if (!$updateUserAct) file_put_contents('kpcheckit.txt', "\n" . basename(__FILE__) . " / " . __LINE__ . " update benutzer aktiv DB: " . mysql_error() . " \n", FILE_APPEND);
}

function checkCurrentActiveUser()
{
	# Abfrage logik: zählt aktive ip's also wie viel Geräte (hardware) ist/bzw war im Zeitfenster (USER_ACTIVE_LIMIT) und hat sich nicht abgemeldet -> session id.
	# ZUsätzlich wird abgefragt wie jung/alt der letzte violation Eintrag ist, ist dieser innerhalb vom USER_ACTIVE_LIMIT wird kein weiterer Eintrag in den
	# violation Table gemacht, Verletzung ist schon eingetragen

	$activeUsers = mysql_fetch_array(mysql_query("SELECT COUNT(DISTINCT(user_ip)) AS anzIp 										
							FROM benutzer_aktiv
							WHERE ROUND(time_to_sec((TIMEDIFF(NOW(), last_active)))/60) < " . USER_ACTIVE_LIMIT . "
							AND LENGTH(session_id) > 10"));

	if (!$activeUsers) writeSitposLog(basename(__FILE__) . " " . __LINE__ . "Query Anzahl aktive Benutzer Fehler: " . mysql_error());

	$checkLastVio = mysql_fetch_array(mysql_query("SELECT MIN(ROUND(time_to_sec((TIMEDIFF(NOW(), license_violation.dtime)))/60)) AS vioTimeDif
													FROM license_violation"));
	if (!$checkLastVio) writeSitposLog(basename(__FILE__) . " " . __LINE__ . "Query Violation Eintrag im Zeitfenster Fehler: " . mysql_error());

	$checkInstDate = mysql_num_rows(mysql_query("SELECT bon_id FROM abgeschlossener_bon 
							WHERE  DATE(bon_erstellt_datum) < DATE(NOW() - INTERVAL " . LICENSE_GRACE_PERIOD . " DAY) LIMIT 1"));

	if (!$checkInstDate) writeSitposLog(basename(__FILE__) . " " . __LINE__ . "Query Installation älter als Grace Time Fehler: " . mysql_error());

	$insertVio = "";

	if ((!defined('BASIS_LIZENZ_VORHANDEN') || (defined('BASIS_LIZENZ_VORHANDEN') && strtolower(BASIS_LIZENZ_VORHANDEN) != 'ja'))
		&& $checkInstDate['bon_id'] > 0  && ($checkLastVio['vioTimeDif'] > USER_ACTIVE_LIMIT  || $checkLastVio['vioTimeDif'] == false)
	) {
		$insQl = mysql_query("INSERT INTO license_violation SET type = 'BASIS_LIZENZ', dtime = NOW(), detail= 'Basis Lizenz Fehlt'");
		if (!$insQl) writeSitposLog(basename(__FILE__) . " " . __LINE__ . "License Violation Basis Insert Fehler: " . mysql_error());
	}

	if ((!defined('ANZAHL_USER_LIZENZEN') || (defined('ANZAHL_USER_LIZENZEN') && ANZAHL_USER_LIZENZEN < $activeUsers['anzIp']))
		&& $checkInstDate['bon_id'] > 0  && ($checkLastVio['vioTimeDif'] > USER_ACTIVE_LIMIT || $checkLastVio['vioTimeDif'] == false)
	) {
		$insQl = mysql_query("INSERT INTO license_violation SET type = 'USERS_LIZENZ', dtime = NOW(), detail= 'Users Lizenz überschritten'");
		if (!$insQl) writeSitposLog(basename(__FILE__) . " " . __LINE__ . "License Violation User Insert Fehler: " . mysql_error());
	}

	return $activeUsers['anzIp'];
}

function checkLicenseViolations($calFrom = false, $printMode = false, $kassaAbschlId = false)
{

	#vergleich von lizenzkeys und lizenzeinträgen in konfiguration_sitpos. die funktion liest die werte
	#aus  Structurelicense_encrypted und macht ein update mit diesen werten auf konfiguration_sitpos

	$updateLicVal = check_license_on_kassenabschl();
	#writeLog(basename( __FILE__)." ". __LINE__ . "Function -> check_license_on_kassenabschl: ".$updateLicVal);

	if ($updateLicVal == 'Basislizenz Fehler') $basisLicEncrypt = 'fehlt';
	else $basisLicEncrypt = '';

	$abschlRunTime = mysql_fetch_array(mysql_query("SELECT datum_start, datum_ende FROM kassa_abschluesse 
							WHERE id = (SELECT MAX(id) FROM kassa_abschluesse)"));

	if (!$abschlRunTime) file_put_contents('kpcheckit.txt', "\n" . date('Y-m-d H:i') . " - " . basename(__FILE__) . " / " . __LINE__ . " Query Laufzeit Kassenabschl. Fehler: " . mysql_error() . "\n", FILE_APPEND);

	if (strtotime($abschlRunTime['datum_ende']) == 0) $endeDateTime = date('Y-m-d H:i:s');
	else $endeDateTime = $abschlRunTime['datum_ende'];

	$checkLic = mysql_query("SELECT type, dtime, detail FROM license_violation 
											WHERE dtime > '" . $abschlRunTime['datum_start'] . "' AND  dtime < '" . $endeDateTime . "' ");

	if (!$checkLic) file_put_contents('kpcheckit.txt', "\n" . date('Y-m-d H:i') . " - " . basename(__FILE__) . " / " . __LINE__ . " Query Verletzungen während letzten Kassenabschl. Fehler: " . mysql_error() . "\n", FILE_APPEND);

	$baseVio = 0;
	$userVio = 0;
	while ($checkLicRow = mysql_fetch_array($checkLic)) {
		if (strtolower($checkLicRow['type']) == 'basis_lizenz') {
			$baseVio++;
		} else if (strtolower($checkLicRow['type']) == 'users_lizenz') {
			$userVio++;
		}
	}

	if ($baseVio > 0 || $userVio > VIOLATION_TOLERANCE || $basisLicEncrypt == 'fehlt') {
		if ($baseVio > 0 || $basisLicEncrypt == 'fehlt') {
			$openLicenseViolationDialog = true;
			if ($calFrom == 'kassenabschluss' && $printMode == 'pdfPrint') $licenseViolationDialogTxt = "Prüfung der Lizenzierung fehlgeschlagen.\n\nBasis Lizenzierung ausständig.";
			else if ($calFrom == 'kassenabschluss' && $printMode == 'htmlPrint') $licenseViolationDialogTxt = "<p class=\'licenseDialogP\' >Prüfung der Lizenzierung fehlgeschlagen.</p><p class=\'licenseDialogP\' >Basis Lizenzierung ausständig.</p>";

			else $licenseViolationDialogTxt = "Basis Lizenzierung für dieses System ausständig.";
		} else if ($userVio > VIOLATION_TOLERANCE) {
			$openLicenseViolationDialog = true;
			if ($calFrom == 'kassenabschluss' && $printMode == 'pdfPrint')
				$licenseViolationDialogTxt = "Prüfung der Lizenzierung fehlgeschlagen.\n\nAnzahl Benutzer Lizenzen wurde mehrmals überschritten.";
			else if ($calFrom == 'kassenabschluss' && $printMode == 'htmlPrint')
				$licenseViolationDialogTxt = "<p class=\'licenseDialogP\' >Prüfung der Lizenzierung fehlgeschlagen.</p><p class=\'licenseDialogP\' >Anzahl Benutzer Lizenzen wurde mehrmals überschritten.</p>";
			else $licenseViolationDialogTxt = "Anzahl Benutzer Lizenzen wurde mehrmals überschritten.";
		}
	} else {
		$openLicenseViolationDialog = false;
		$licenseViolationDialogTxt = false;
	}

	return array($openLicenseViolationDialog, $licenseViolationDialogTxt);
}

function abschlussNullBelegErstellen($callFrom = "", $targetMonth = false)
{

	//print_r($_REQUEST);
	$functionTarget = false;			# das hier gilt wenn der aufruf von der funktion reactivateSignatureSammelbelegErstellen kommt, könnte auch von monatsbeleg erstellen kommen

	$bKennung = false;
	if (isset($_POST['functionTarget']) && strlen($_POST['functionTarget']) > 1) $functionTarget = $_POST['functionTarget'];
	$bonListe = false;
	if (isset($_POST['bonListe']) && strlen($_POST['bonListe']) > 3) {
		$bonListe = json_decode($_POST['bonListe']);
		$letzterEintrag = end($bonListe);
		$productName = "Sammelbeleg von Bon Nr: " . $bonListe[0][0] . " bis Bon Nr.: " . $letzterEintrag[0] . " ";
		$productPrintname = $productName;
	}

	$formMonth = date('Y-m-d');
	$printTarget = false;
	if ($functionTarget == true && $functionTarget == 'reactivateSammelbelegErstellen') {
		$printTarget = 'reactivatSammelBelegErstellen';
		$bKennung = 'Sammelbeleg zu Reaktivierung Signatur';
	}

	$callFrom = false;
	if ($callFrom == "") if (isset($_REQUEST['callFrom']) && strlen($_REQUEST['callFrom']) > 2) $callFrom = $_REQUEST['callFrom'];

	//echo "Monats Nullbeleg erstellen";
	if ($targetMonth != false || (isset($_REQUEST['abschlussMonat']) && strlen($_REQUEST['abschlussMonat']) > 1 && $callFrom != 'nullBelegManuell')) {

		if ($targetMonth == false) $targetMonth = $_REQUEST['abschlussMonat'];
		$productName = "Monats Abschluss Beleg " . $targetMonth;
		$productPrintname = $productName;
		$printTarget = 'monatsbelegErstellen';
		# für den eintrag in den table abschluss Belege
		$bKennung = "monats_beleg_" . $targetMonth;
		$formMonth = $targetMonth . "-01";
	} else if ($callFrom == 'nullBelegManuell') {
		if (isset($_POST['manuellBelegTxt']) && strlen($_POST['manuellBelegTxt']) > 2) $productName = $_POST['manuellBelegTxt'];
		else $productName = "Manueller Null Beleg";
		$productPrintname = $productName;
		$printTarget = 'manuellerNullBeleg';
		# für den eintrag in den tabel abschluss Belege
		$bKennung = "manueller_nullbeleg";
		$formMonth = date('Y-m-d');
	}

	$ignoreDepError = false;
	if (isset($_POST['ignoreError']) && strlen($_POST['ignoreError']) == 'ignoreDeppError') $ignoreDepError = true;

	$lastKassenabschl = mysql_fetch_array(mysql_query("SELECT MAX(id) AS LastKassenAbschl FROM kassa_abschluesse"));
	if (!$lastKassenabschl) {
		echo "Letzter Kassenabschluss konnte nicht gefunden werden. " . mysql_error();
		return false;
	}
	$kassa_abschluss_id = $lastKassenabschl['LastKassenAbschl'];
	$user = $_SESSION['userId'];

	mysql_query("ALTER TABLE abgeschlossener_bon AUTO_INCREMENT = 1");
	mysql_query("ALTER TABLE dep AUTO_INCREMENT = 1");
	mysql_query("START TRANSACTION");
	$abschlBelegError = false;
	$abschlBelegErrorMsg = "";

	$insQl = mysql_query("INSERT INTO abgeschlossener_bon SET gesamt_summe=0, verkaufer_id=" . $user . ", kassa_abschluss_id=" . $kassa_abschluss_id . ", 
											bon_erstellt_datum = NOW(), dep_nullbeleg = 1 ");
	if (!$insQl) {
		#echo "Datenbank Error, schreiben abgeschlossener Bon. ".mysql_error()."\n";
		#echo "Vorgang unvollständig oder gar nicht erfolgt."."\n";
		#return false;
		$abschlBelegError = true;
		$abschlBelegErrorMsg .= "Datenbank Error, schreiben abgeschlossener Bon. " . mysql_error() . "\n";
	} else {
		$inserted_bon_id = mysql_insert_id();

		$insBonStQl = mysql_query("INSERT INTO abgeschlossener_bon_steuern SET bon_id = " . $inserted_bon_id . ", tax_rate = 0.00, gesamt_betrag = 0.00 ");
		if (!$insBonStQl) {
			#echo "<h4>Datenbank Error, schreiben abgeschlossener Bon Steuern. ".mysql_error();
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon  WHERE bon_id = ".$inserted_bon_id." ");
			#return false;
			$abschlBelegError = true;
			$abschlBelegErrorMsg .= "Datenbank Error, schreiben abgeschlossener Bon Steuern. " . mysql_error() . "\n";
		}
		$taxId = mysql_fetch_array(mysql_query("SELECT ID FROM taxes WHERE RATE = 0.0000"));
		if ($taxId['ID'] == false || $taxId['ID'] <= 0) $tax_id = 1;
		else  $tax_id = $taxId['ID'];

		if ($printTarget == 'monatsbelegErstellen' || $printTarget == 'manuellerNullBeleg' || $printTarget == 'nullBelegNachKarteNeu') {
			$insBonPrQl = mysql_query("INSERT INTO abgeschlossener_bon_produkte SET bon_id = " . $inserted_bon_id . ", produkt_id = 0, PRICESELL = 0.00,
									PRICESELL_brutto=0, PRICESELL_brutto_gesamt=0, tax=0, tax_gesamt=0,
									NAME = '" . $productName . "', CATEGORY = 9999, TAXCAT = " . $tax_id . ", 
									PRINTNAME = '" . $productPrintname . "', tax_rate = 0.00 ");
			if (!$insBonPrQl) {
				#echo "<h4>Datenbank Error, schreiben abgeschlossener Bon Produkte. ".mysql_error();
				#$delQl=mysql_query("DELETE FROM abgeschlossener_bon  WHERE bon_id = ".$inserted_bon_id." ");
				#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_steuern  WHERE bon_id = ".$inserted_bon_id." ");
				#return false;
				$abschlBelegError = true;
				$abschlBelegErrorMsg .= "Datenbank Error, schreiben abgeschlossener Bon Produkte. " . mysql_error() . "\n";
			}
		} else if ($printTarget == 'reactivatSammelBelegErstellen') {
			if (is_array($bonListe) && count($bonListe) > 0) {
				$insertError = false;
				for ($i = 0; $i < sizeof($bonListe); $i++) {
					$insBonPrQl = mysql_query("INSERT INTO abgeschlossener_bon_produkte SET bon_id = " . $inserted_bon_id . ", produkt_id = 0, 
									PRICESELL = '" . $bonListe[$i][1] . "',
									PRICESELL_brutto=0, PRICESELL_brutto_gesamt=0, tax=0, tax_gesamt=0,
									NAME = 'Bon Nr. " . $bonListe[$i][0] . "', CATEGORY = 9999, TAXCAT = " . $tax_id . ", 
									PRINTNAME = 'Bon Nr. " . $bonListe[$i][0] . "', tax_rate = 0.00 ");
					if (!$insBonPrQl) $insertError = true;
				}
				if ($insertError == true) {
					#echo "<h4>Datenbank Error, schreiben abgeschlossener Bon Produkte. ".mysql_error();
					#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_produkte  WHERE bon_id = ".$inserted_bon_id." ");
					#$delQl=mysql_query("DELETE FROM abgeschlossener_bon  WHERE bon_id = ".$inserted_bon_id." ");
					#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_steuern  WHERE bon_id = ".$inserted_bon_id." ");
					#return false;
					$abschlBelegError = true;
					$abschlBelegErrorMsg .= "Datenbank Error, schreiben abgeschlossener Bon Produkte. " . mysql_error() . "\n";
				}
			} else {
				#echo "<h4>Error, Erstellung vom Nullbeleg fehlgeschlagen, es konnten keine Bondaten für den Sammelbeleg ausgelesen werden. ";
				#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_produkte  WHERE bon_id = ".$inserted_bon_id." ");
				#$delQl=mysql_query("DELETE FROM abgeschlossener_bon  WHERE bon_id = ".$inserted_bon_id." ");
				#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_steuern  WHERE bon_id = ".$inserted_bon_id." ");
				#return false;
				$abschlBelegError = true;
				$abschlBelegErrorMsg .= "Error, Erstellung vom Nullbeleg fehlgeschlagen, es konnten keine Bondaten für den Sammelbeleg ausgelesen werden.\n";
			}
		}

		$za = mysql_query("SELECT Name FROM zahlungsart WHERE standard = 1 ORDER BY reihenfolge DESC");
		while ($zaR = mysql_fetch_array($za)) {
			$zahlung = $zaR['Name'];
		}
		if (!isset($zahlung)) $zahlung = 'undefined';

		$insAbschlBelZa = mysql_query("INSERT INTO abgeschlossener_bon_zahlung SET bon_id = " . $inserted_bon_id . ", Name = '" . $zahlung . "', 
									zahlbetrag = 0.00, zahlbetrag_tatsaechlich = 0.00 ");
		if (!$insAbschlBelZa) {
			#echo "<h4>Datenbank Error, schreiben abgeschlossener Bon Zahlung. ".mysql_error();
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon  WHERE bon_id = ".$inserted_bon_id." ");
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_steuern  WHERE bon_id = ".$inserted_bon_id." ");
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_produkte  WHERE bon_id = ".$inserted_bon_id." ");
			#return false;
			$abschlBelegError = true;
			$abschlBelegErrorMsg .= "Datenbank Error, schreiben abgeschlossener Bon Zahlung. " . mysql_error() . "\n";
		}

		# die if -> welche Belege art und der entsprechenden Werte (monat und beleg kennung) wird oben gesetzt
		$insAbschlBel = mysql_query("INSERT INTO abschluss_belege SET bon_id = " . $inserted_bon_id . ", beleg_kennung = '" . $bKennung . "', 
											abschluss_monat = '" . $formMonth . "' ");
		if (!$insAbschlBel) {
			#echo "<h4>Datenbank Error, schreiben abschluss Belege. ".mysql_error();
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon  WHERE bon_id = ".$inserted_bon_id." ");
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_steuern  WHERE bon_id = ".$inserted_bon_id." ");
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_produkte  WHERE bon_id = ".$inserted_bon_id." ");
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_zahlung  WHERE bon_id = ".$inserted_bon_id." ");
			#return false;
			$abschlBelegError = true;
			$abschlBelegErrorMsg .= "Datenbank Error, schreiben abschluss Belege. " . mysql_error() . "\n";
		}

		$dep_table_write_result = dep_table_schreiben($inserted_bon_id, false);

		if ($dep_table_write_result[0] == false && $ignoreDepError == true) {
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon  WHERE bon_id = ".$inserted_bon_id." ");
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_steuern  WHERE bon_id = ".$inserted_bon_id." ");
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_produkte  WHERE bon_id = ".$inserted_bon_id." ");
			#$delQl=mysql_query("DELETE FROM abgeschlossener_bon_zahlung  WHERE bon_id = ".$inserted_bon_id." ");
			#$delQl=mysql_query("DELETE FROM abschluss_belege  WHERE bon_id = ".$inserted_bon_id." ");
			#$delQl=mysql_query("DELETE FROM dep  WHERE beleg_nr = ".$inserted_bon_id." ");						
			#echo "Dep Error: ".$dep_table_write_result[1];
			#return false;
			$abschlBelegError = true;
			if (preg_match("/signatur fehlgeschlagen/i", $dep_table_write_result[1])) {
				$abschlBelegErrorMsg = "Dep Error: Signatur Einheit konnte nicht gelesen werden.<br /><br />Null Beleg nicht erstellt.<br /><br />Prüfen Sie ob die Signatur Karte angesteckt ist, prüfen Sie die Signatureinheit durch \"Signatureinheit re-aktivieren\".<br /><br />Im Bedarfsfall Sammelbeleg erstellen !!!<br /><br />Wenn die Signatureinheit erfolgreich ausgelesen wurde, versuchen Sie erneut den Nullbeleg zu erstellen.";
			} else {
				$abschlBelegErrorMsg .= "Dep Error: Datenerfassungs Protokoll Error. " . $dep_table_write_result[1] . "\nNull Beleg nicht erstellt\n";
			}
		}

		if (strtolower(AUSDRUCK_RECHNUNGSBON_PDF) != 'ja') {
			# beim html print werden die qr-images nicht gleich gelöscht, älter als 1 Monat werden hier ausradiert !!!
			global $qrImg_temp_dir;
			$refDate = date("Y-m-d", strtotime("-1 months"));

			$xFiles = scandir($qrImg_temp_dir);
			foreach ($xFiles as $dFile) {
				$delFile = $qrImg_temp_dir . $dFile;
				$fileDate = date("Y-m-d H:i:s.", filemtime($delFile));
				if (is_file($delFile) && $fileDate <= $refDate) {
					unlink($delFile); // delete file
				}
			}
		}
	}

	if ($abschlBelegError == false) {
		mysql_query("COMMIT");
		bon_ausdrucken_pdf($inserted_bon_id, $bonHeight = false, $printTarget, $bedienerName = false);

		if ($printTarget == 'monatsbelegErstellen') echo "success <p></p>";		# keine ausgabe der success Txt kommt aus dem bon drucken !!!
		else if ($printTarget == 'reactivatSammelBelegErstellen') echo "success <p>Sammelbeleg und Dep Nullbeleg wurden automatisch erstellt.</p>"; // Sammelbeleg, Dep Nullbeleg erstellt.
		else if ($printTarget == 'manuellerNullBeleg') echo "success <p>Manueller Nullbeleg erstellt.</p>";
		else echo "success <p>Null Beleg erstellt</p>";
		# die success msg wird in bon_ausdrucken_pdf geschrieben konnte hier keinen return abfangen.
	} else {
		mysql_query("ROLLBACK");
		mysql_query("ALTER TABLE abgeschlossener_bon auto_increment = 1");
		mysql_query("ALTER TABLE dep auto_increment = 1");
		echo "<p>" . $abschlBelegErrorMsg . "</p>";
	}
	mysql_query("set autocommit=1");
}

function monatsAbschlussStatus()
{
	if (defined('ZERTIFIKATS_NR') && ZERTIFIKATS_NR > 1000) {
		$returnVal = "sig einheit enabled<br /> ";
		# heißt signatureinheit ist aktiv
		#$abschlLetztesMonat = date("Y-m", mktime(0, 0, 0, date("m")-1, date("d"),   date("Y")))."-01";   #funktioniert zb am 31.3.YYYY NICHT
		$abschlLetztesMonat = date('Y-m-01', strtotime(date('Ym01') . ' -1 months'));		# rechnen immer mit dem 1 tag im monat, so stehts auch in der DB
		#$getMonatsBeleg=mysql_fetch_array(mysql_query("SELECT * FROM abschluss_belege WHERE LOWER(beleg_kennung) LIKE '%monats_beleg%' ORDER BY abschluss_monat DESC LIMIT 1"));
		$getMonatsBeleg = mysql_fetch_array(mysql_query("SELECT * FROM abschluss_belege WHERE LOWER(beleg_kennung) LIKE 'monats_beleg%'
																AND abschluss_monat = '" . $abschlLetztesMonat . "' "));

		if ($getMonatsBeleg['abschluss_monat'] != $abschlLetztesMonat) {
			//echo "In Schleife, wo es keinen Monatsbeleg gibt";
			# exist kein abschlussbeleg des letzten monats ausnahme könnte sein, im dep tabel  steht der startbeleg in diesem monats
			# es kann noch keinen abschluss aus dem vorigen monat geben, signatur einheit erst diesen monat aktiviert.

			// RFR: auskommentiert, weil nicht der erste des Monats angeschaut wurde, sondern aktueller Tag -1 Monat
			//$getStartBeleg=mysql_query("SELECT * FROM abschluss_belege 
			//				WHERE beleg_kennung = 'signatur_start_beleg' AND abschluss_monat < date_add(now(), interval -1 month)");

			// RFR: Wenn der Abschluss beleg VOR dem ERSTEN dieses Monat erstellt wurde, dann wird der Monatsbeleg gemacht
			//      Ansonsten wird angenommen, dass der Startbeleg im aktuellen Monat gemacht wurde
			//      Ist zwar ein bisschen verkehrte Logik, aber sollte trotzdem passen.
			$getStartBeleg = mysql_query("SELECT * FROM abschluss_belege 
								WHERE beleg_kennung = 'signatur_start_beleg' AND abschluss_monat < date_add(date_add(LAST_DAY(NOW()),interval 1 DAY),interval -1 MONTH)");


			if (mysql_num_rows($getStartBeleg) > 0) {
				if (defined('NULLBELEG_AUTOMATISCH_ERSTELLEN') and NULLBELEG_AUTOMATISCH_ERSTELLEN == 'ja') {
					// bei $abschLetztesMonat ist hinten ein Tag angehängt 2018-04-01 - also die letzten 3 wegschneiden
					// Monats Null Beleg automatisch erstellen
					$monat_schliessen = substr($abschlLetztesMonat, 0, -3);
					abschlussNullBelegErstellen("abschlussBeleg", $monat_schliessen);
					return "Nullbeleg (Monatsabschluss) wurde automatisch erstellt !<br />";
				} else return "Kein Nullbeleg (Monatsabschluss) aus dem letzten Monat gefunden !<br />";
			} else {
				//echo "Kein Startbeleg im letzten Monat gefunden";
				return false;
			}
		}
	} else return false;
}


function check_license_on_kassenabschl()
{

	$checkLic = mysql_query("SELECT license FROM license_encrypted");
	$countUser = 0;
	$checkBais = false;
	$countCe = 0;
	while ($checkLicR = mysql_fetch_array($checkLic)) {

		$nNat = explode("-", sitPosDecrypt($checkLicR['license'], SITPOS_CRYPT));

		if (strtolower($nNat[0]) == 'basis' || strtolower($nNat[0]) == 'basis light' || strtolower($nNat[0]) == 'basis start') {
			$checkBais = true;
			$countUser += $nNat[2];
			$licVersion = $nNat[1];
		} else if (strtolower($nNat[0]) == 'user') {
			$countUser += $nNat[2];
		} else if (strtolower($nNat[0]) == 'cekarte') {
			$macArray = getMacAddresses();
			array_map('strtoupper', $macArray);
			# wenn die richtige host Id im lic Key steht, Anzahl dazuzählen
			if (in_array(strtoupper($nNat[4]), $macArray)) $countCe += $nNat[2];
			else {
				# wenn die Host Id nicht stimmt löschen wir den ganzen lizenzeintrag raus
				$licKey = $checkLicR['license'];
				$delLic = mysql_query("DELETE FROM license_encrypted WHERE license = '" . $licKey . "' ");

				writeLog(basename(__FILE__) . " " . __LINE__ . "lizenz CE löschen: " . $licKey . " -> " . mysql_error());
			}
		}
	}

	$getCeLic = mysql_fetch_array(mysql_query("SELECT wert FROM konfiguration_sitpos WHERE name ='CEKARTE_LIZENZ' LIMIT 1"));

	if ($getCeLic['wert'] && $countCe != $getCeLic['wert']) {
		$updLic = mysql_query("UPDATE konfiguration_sitpos SET wert = '" . $countCe . "' WHERE name = 'CEKARTE_LIZENZ'");
	}

	if ($checkBais == true) {
		$updUser = mysql_query("UPDATE konfiguration_sitpos SET wert = " . $countUser . " WHERE name = 'ANZAHL_USER_LIZENZEN' ");
		$updVer = mysql_query("UPDATE konfiguration_sitpos SET wert = '" . $licVersion . "' WHERE name = 'LIZENZ_VERSION' ");
		if ($updUser && $updVer) return "Lizenzkey Check true";
	} else {
		$updUser = mysql_query("DELETE FROM konfiguration_sitpos WHERE name = 'BASIS_LIZENZ_VORHANDEN' OR name = 'BASIS_LIGHT_LIZENZ_VORHANDEN' ");
		return "Basislizenz Fehler";
	}
}

function log_to_file($string, $logfile = false, $tee = false)
{
	//if ($tee) echo $string . PHP_EOL;

	if (!$logfile) {
		$logfile = "log/logfile.log";
		if (!file_exists("log")) mkdir("log");
	}
	$zeit = date("Y-m-d H:i:s");
	$myfile = file_put_contents($logfile, $zeit . "\t" . $string . PHP_EOL, FILE_APPEND | LOCK_EX);
}

function writeLog($xPos = false, $logStr = false)
{
	if (basename(__DIR__) == '') $pPath = '../';
	else $pPath = '';
	file_put_contents($pPath . 'kpcheckit.txt', $xPos . " " . date('Y-m-d H:i') . "---   " . basename(__DIR__) . " - " . $logStr . "\n", FILE_APPEND);
}


function writeSitposLog($xPos = false, $logStr = false)
{
	if (basename(__DIR__) == '') $pPath = '../';
	else $pPath = '';
	if (defined('BASIS_LIZENZ_VORHANDEN') && strtolower(BASIS_LIZENZ_VORHANDEN) == 'ja') $basisLizenz = BASIS_LIZENZ_VORHANDEN;
	else if (defined('BASIS_LIGHT_LIZENZ_VORHANDEN') && strtolower(BASIS_LIGHT_LIZENZ_VORHANDEN) == 'ja') $basisLizenz = "(light) " . BASIS_LIGHT_LIZENZ_VORHANDEN;
	else $basisLizenz = "nicht gefunden";
	file_put_contents($pPath . 'sitposLog.txt', $xPos . " " . date('Y-m-d H:i:s') . " " . KASSA_ID . " Basis Lizenz: " . $basisLizenz . "\n" . $logStr . "\n", FILE_APPEND);
	return $pPath;
}

function calculateCasbook($kassenabschlStartId, $kassenabschlEndeId, $opTarget = false)
{
	$cashbookResultArray = array();
	$dbError = false;
	$dbErrorMsg = "";
	$sumUst = 0;
	$sumVorst = 0;
	//define('KASSABUCH_DETAIL_TAGESLOSUNG', 'tageslosung');
	//define('KASSABUCH_DETAIL_TAGESLOSUNG', 'kategorien');
	//define('KASSABUCH_DETAIL_TAGESLOSUNG', 'steuern');
	if (KASSABUCH_DETAIL_TAGESLOSUNG === 'tageslosung') {
		$losungQl = mysql_query("SELECT abgeschlossener_bon.bon_id AS bonId, sum(zahlbetrag) as zahlung, 
				SUM(zahlbetrag - (SELECT SUM(gesamt_betrag) FROM abgeschlossener_bon_steuern WHERE bon_id = bonId )) AS taxBetr, 
				DATE_FORMAT(bon_erstellt_datum, '%Y-%m-%d') AS zahlungDay, bon_erstellt_datum,
				abgeschlossener_bon_zahlung.Name AS zahlungsArt, kassabuch_wirksam, kassa_abschluss_id
				FROM abgeschlossener_bon
				left join abgeschlossener_bon_zahlung ON abgeschlossener_bon_zahlung.bon_id = abgeschlossener_bon.bon_id
				LEFT JOIN zahlungsart ON zahlungsart.Name = abgeschlossener_bon_zahlung.Name
				WHERE kassa_abschluss_id >= " . $kassenabschlStartId . " AND kassa_abschluss_id <= " . $kassenabschlEndeId . "  AND kassabuch_wirksam = 1
				GROUP BY zahlungDay, zahlungsArt");

		if (!$losungQl) {
			$dbError = true;
			$dbErrorMsg .= mysql_error();
		} else {
			while ($losungRes = mysql_fetch_array($losungQl)) {
				$sumUst += $losungRes['taxBetr'];
				$xDate = $losungRes['zahlungDay'];
				$summeBetrag = $losungRes['zahlung'];
				$tmpArray = array(
					'datum' => $xDate, 'betrag' => $summeBetrag, 'ust' => $losungRes['taxBetr'],
					'vorst' => 0, 'zahlart' => $losungRes['zahlungsArt'],
					'titel' => "Tageslosung", 'bemerkung' => ""
				);
				array_push($cashbookResultArray, $tmpArray);
				$tmpArray = array();
			}
		}
	} else {
		if (KASSABUCH_DETAIL_TAGESLOSUNG === 'kategorien') {
			$sqlQ2 = "SELECT id, datum_start, datum_ende
								FROM kassa_abschluesse
								WHERE id >= " . $kassenabschlStartId . " AND 
								id <= " . $kassenabschlEndeId . " ";
			//echo $sqlQ2;
			$Q2 = mysql_query($sqlQ2);

			if (!$Q2) {
				$dbError = true;
				$dbErrorMsg .= mysql_error();
			}

			while ($row = mysql_fetch_assoc($Q2)) {
				$output = report_categorie(false, true, $row['id']);
				foreach ($output['body'] as $line) {
					$xDate = $row['datum_start'];
					$kassa_abschluss_id = $row['id'];
					$brutto = $line[3];
					$netto = $line[2];
					$kategorie = $line[0];
					$zahlart = "";
					$bemerkung = "aus Tageslosung";
					$steuer = $brutto - $netto;

					$tmpArray = array(
						'datum' => $xDate, 'betrag' => $brutto, 'ust' => $steuer,
						'vorst' => 0, 'zahlart' => $zahlart,
						'titel' => $kategorie, 'bemerkung' => $bemerkung
					);
					array_push($cashbookResultArray, $tmpArray);
				}
			}
		} else
				if (KASSABUCH_DETAIL_TAGESLOSUNG === 'steuern') {
			$sqlQ2 = "SELECT id, datum_start, datum_ende
								FROM kassa_abschluesse
								WHERE id >= " . $kassenabschlStartId . " AND 
								id <= " . $kassenabschlEndeId . " ";
			//echo $sqlQ2;
			$Q2 = mysql_query($sqlQ2);

			if (!$Q2) {
				$dbError = true;
				$dbErrorMsg .= mysql_error();
			}

			while ($row = mysql_fetch_assoc($Q2)) {
				// Steuern mit Zahlungsart kassabuch_wirksam
				$output = report_steuer(false, true, $row['id']);
				foreach ($output['body'] as $line) {
					$xDate = $row['datum_start'];
					$kassa_abschluss_id = $row['id'];
					$brutto = $line[3];
					$netto = $line[2];
					$kategorie = $line[0];
					$zahlart = "";
					$bemerkung = "aus Tageslosung";
					$steuer = $brutto - $netto;

					$tmpArray = array(
						'datum' => $xDate, 'betrag' => $brutto, 'ust' => $steuer,
						'vorst' => 0, 'zahlart' => $zahlart,
						'titel' => $kategorie, 'bemerkung' => $bemerkung
					);
					array_push($cashbookResultArray, $tmpArray);
				}
			}
		}
	}

	$eaZahlungQl = mysql_query("SELECT gesamt_betrag AS zahlung, enthalt_steuer_betrag AS steuer, Bemerkung,
					DAYOFYEAR(zahlung_erfolgt_datum) AS periode, 
					DATE_FORMAT(zahlung_erfolgt_datum,'%Y-%m-%d') AS zahlungDay, zahlung_erfolgt_datum, typ
					FROM ein_aus_zahlungen
					WHERE kassa_abschluss_id >= " . $kassenabschlStartId . " AND kassa_abschluss_id <= " . $kassenabschlEndeId . "
					ORDER BY zahlungDay, typ");
	if (!$eaZahlungQl) {
		$dbError = true;
		$dbErrorMsg .= mysql_error();
	} else {
		while ($eaZahlungRes = mysql_fetch_array($eaZahlungQl)) {
			$ust = 0;
			$vorst = 0;

			if (strtolower($eaZahlungRes['typ']) == 'ein') {
				$ust = $eaZahlungRes['steuer'];
				$eaType = "Einzahlung";
				$sumUst += $ust;
			} else if (strtolower($eaZahlungRes['typ']) == 'aus') {
				$vorst = $eaZahlungRes['steuer'];
				$eaType = "Auszahlung";
				$sumVorst += $vorst;
			}

			$xDate = $eaZahlungRes['zahlungDay'];
			$summeBetrag = $eaZahlungRes['zahlung'];

			# wenn für Excel ..			iconv('UTF-8', 'windows-1252', $pdfContentData[$i][5])
			if ($opTarget == 'exportExcelCSV') {
				$bemTxt = iconv('UTF-8', 'windows-1252', $eaZahlungRes['Bemerkung']);
			} else {
				$bemTxt = $eaZahlungRes['Bemerkung'];
			}

			$tmpArray = array(
				'datum' => $xDate, 'betrag' => $summeBetrag, 'ust' => $ust,
				'vorst' => $vorst,  'zahlart' => "", 'titel' => $eaType, 'bemerkung' => $bemTxt
			);
			array_push($cashbookResultArray, $tmpArray);
			$tmpArray = array();
		}

		$metaArray = array('elemA' => 'metaArray', 'ust' => $sumUst, 'vorst' => $sumVorst);
		array_unshift($cashbookResultArray, $metaArray);
	}

	$gutscheinAusstellenQl = mysql_query("SELECT SUM(betrag_geladen) AS zahlung, zahlungsart.Name AS zahlungsArt, sum(gs_ausstellen_tax) AS gsAustellenSteuer,
					DATE_FORMAT(datum_buchung,'%Y-%m-%d') AS zahlungDay
					FROM gutschein_buchungen
					LEFT JOIN zahlungsart ON zahlungsart.Name = gutschein_buchungen.zahlungsart_name
					WHERE kassa_abschluss_id >= " . $kassenabschlStartId . " AND kassa_abschluss_id <= " . $kassenabschlEndeId . " 
						AND verkaufsart = 'gsVerkauf' AND kassabuch_wirksam <> 0
					GROUP BY zahlungDay, zahlungsArt
					ORDER BY zahlungDay, Name");

	if (!$gutscheinAusstellenQl) {
		$dbError = true;
		$dbErrorMsg .= mysql_error();
	} else {
		while ($gutschRes = mysql_fetch_array($gutscheinAusstellenQl)) {
			$ust = $gutschRes['gsAustellenSteuer'];
			$vorst = 0;
			$xDate = $gutschRes['zahlungDay'];
			$summeBetrag = $gutschRes['zahlung'];
			$tmpArray = array(
				'datum' => $xDate, 'betrag' => $summeBetrag, 'ust' => $ust,
				'vorst' => $vorst, 'zahlart' => $gutschRes['zahlungsArt'],
				'titel' => "Gutschein Ausgabe", 'bemerkung' => ""
			);
			array_push($cashbookResultArray, $tmpArray);
			$tmpArray = array();
		}
	}
	if ($dbError == false) {
		if (count($cashbookResultArray) == 0) {
			$cashbookResultArray[0] = array(
				'datum' => date('Y-m-d H:i'), 'betrag' => 0, 'ust' => 0, 'vorst' => 0, 'zahlart' => '',
				'titel' => "Keine Buchung im Zeitraum", 'bemerkung' => ""
			);
		}
		return $cashbookResultArray;
	} else {
		return array("Error", $dbErrorMsg);
	}
}

/*		zahlungs Terminal ID's									
	---------------------------------	*/
// RFR: Meiner Meinung nach ist das falsch
// Wenn es zwei Terminals gibt, aber meine IP nicht eingetragen ist, dann wird undefinded zurückgegeben
// ausgetuascht durch Funktion get_my_bankomat_terminal_id
// CLEANUP !!!!!

/*
	function getZahlungsTermId(){
		$myIp=getUserIp();
		$zahlTerminalId='undefined';
		$zahlTerminalType='undefined';
		$zahlungsTermId=mysql_query("SELECT terminal_id, ip_adresse, terminal_type FROM zahlungsterminal");
		$numRows=mysql_num_rows($zahlungsTermId);
		if($numRows == 1){
				# gibt nur einen Eintrag, auch wenn hier mehrere IP's stehen würden, nur 1 terminal Id
			$termId=mysql_fetch_array($zahlungsTermId);
			$zahlTerminalId=preg_replace('/\s/', '', $termId['terminal_id']);
			$zahlTerminalType=$termId['terminal_type'];
				# gibt nur einen Eintrag mit mehreren IP's, somit nur 1 terminal Id

		}
		else if($numRows > 1){
			
			while($termId=mysql_fetch_array($zahlungsTermId)){
				$ipStrg=preg_replace('/\s/', '', $termId['ip_adresse']);
				if(strlen($ipStrg) > 2 && $myIp == $ipStrg && strpos($ipStrg, ';') === false){
						# gibt mehr als einen Eintrag in diesen steht nur eine IP, wenn diese übereinstimmt ->  terminal Id
					if($zahlTerminalId == 'undefined'){
						$zahlTerminalId=$termId['terminal_id'];
						$zahlTerminalType=$termId['terminal_type'];
					}

				}
				else if (strpos($ipStrg, ';') !== false) {
					$termIdArray=explode(";", $ipStrg);
					if (in_array($myIp , $termIdArray)) {
							# wird über array ermittelt, mehrere IP's müssen mit ";" getrennt sein
						if($zahlTerminalId == 'undefined'){
							$zahlTerminalId=$termId['terminal_id'];
							$zahlTerminalType=$termId['terminal_type'];
						}
					}
				}				
			}
		}
			# return Value is string, wird in js verwendet (kassieren.php ca 1300) und dort gesplittet
		return $zahlTerminalId.";".$zahlTerminalType;
	}
	*/

// RFR:
// sucht Anhand der IP Adresse des Clients das passende Terminal heraus
// wenn kein Terminal anhang der IP Adresse gefunden wid, dann wird das erste Terminal zurückgegeben
// hier gehört noch ein Default Terminal in der DB Angelegt
// Parameter: javascript: wenn true, dann werden wie werte mit ; getrennt zurückgegeben, ansonsten für php als array
function get_my_bankomat_terminal_id($javascript = false)
{
	$myIp = getUserIp();
	$zahlTerminalId = 'undefined';
	$zahlTerminalType = 'undefined';
	$sql = "SELECT terminal_id, ip_adresse, terminal_type FROM zahlungsterminal WHERE ip_adresse LIKE '%" . $myIp . "%' LIMIT 1";
	$zahlungsTermId = mysql_query($sql);
	$numRows = mysql_num_rows($zahlungsTermId);
	if ($numRows == 0) {
		$sql = "SELECT terminal_id, ip_adresse, terminal_type FROM zahlungsterminal LIMIT 1";
		$zahlungsTermId = mysql_query($sql);
		if (!$zahlungsTermId) echo "SQL Fehler: " . $mysql_error();
		$numRows = mysql_num_rows($zahlungsTermId);
		if ($numRows == 0) {
			echo "FEHLER: keine Zahlungsterminals definiert";
			echo "Fehler: $sql $numRows" . mysql_error();
			return (false);
		} else {
			$termId = mysql_fetch_array($zahlungsTermId);
			$zahlTerminalId = preg_replace('/\s/', '', $termId['terminal_id']);
			$zahlTerminalType = $termId['terminal_type'];
		}
	} else {
		// Der Eintrag von der IP Adresse wurde gefunden
		$termId = mysql_fetch_array($zahlungsTermId);
		$zahlTerminalId = preg_replace('/\s/', '', $termId['terminal_id']);
		$zahlTerminalType = $termId['terminal_type'];
	}
	if ($javascript) return $zahlTerminalId . ";" . $zahlTerminalType;
	else return (array($zahlTerminalId, $zahlTerminalType));
}

# KPE:
# funktion -> EDI Data split und schreibe in array

function ediDataIntoArray($ediString = false)
{

	# im File gibt es jede menge zeilenümbrüche, replace .. -> string.
	$ediString = preg_replace("/[\n\r]/", "", $ediString);
	# in den Test Import Files gibts event eine space nach dem ' dann funktioniert die Abfrage 'ARB+   nicht weil es ja dann ' ARB+ od so ist
	$ediString = preg_replace("/\'\s/", "'", $ediString);

	if ($ediString !== false && $ediString != "") {
		#writeLog(basename( __FILE__)." ". __LINE__ , "File String -> ".$ediString."\n");
		$resultArray = array();
		# reg filter    'UNH+ -> vor "jedem" Abschnittskenzzeichnung steht ein '   danach ein + (space)
		if (preg_match('/\'UNH\+(.*?)\'/', $ediString, $sitIp) == 1) {
			$resultArray['UNH'] = $sitIp[1];
		} else $resultArray['UNH'] = false;

		if (preg_match('/\'PAT\+(.*?)\'/', $ediString, $sitIp) == 1) {
			$resultArray['PAT'] = $sitIp[1];
			if (substr_count($resultArray['PAT'], "+") > 0) {
				$tmpArray = explode("+", $resultArray['PAT']);
				$resultArray['PAT'] = $tmpArray;
			} else {		# wird ein array mit einem eintrag							
				$resultArray['PAT'] = array($sitIp[1]);
			}
		} else $resultArray['PAT'] = false;

		if (preg_match('/\'KON\+(.*?)\'/', $ediString, $sitIp) == 1) {
			$resultArray['KON'] = $sitIp[1];
			$checkKon = $sitIp[1];
			if (substr_count($resultArray['KON'], "+") > 0) {

				$tmpArrayKon = explode("+", $resultArray['KON']);
				$resultArray['KON'] = $tmpArrayKon;
			} else {
				$resultArray['KON'] = array($sitIp[1]);
			}
		} else $resultArray['KON'][0] = '';


		if (preg_match('/\'ARB\+(.*?)\'/', $ediString, $sitIp) == 1) {
			$resultArray['ARB'] = $sitIp[1];
			if (substr_count($resultArray['ARB'], "+") > 0) {
				$tmpArray = explode("+", $resultArray['ARB']);
				$resultArray['ARB'] = $tmpArray;
			} else {
				$resultArray['ARB'] = array($sitIp[1]);
			}
		} else {
			$resultArray['ARB'][0] = "";
		}

		if (preg_match('/\'ANF(.*?)\'/', $ediString, $sitIp) == 1) {

			$resultArray['ANF'] = $sitIp[1];

			$numSpaces = preg_match_all('/\s/', $resultArray['ANF'], $matches);
			if ($numSpaces > 0) {
				# explode kann kein \s, nur " " ist mir zu unsicher
				$tmpArray = preg_split('/\s+/', $resultArray['ANF']);
				#$tmpArray=explode(" ", $resultArray['ANF']);
				$resultArray['ANF'] = $tmpArray;
			} else {
				#kein \s -> nur eine Teile Nr, Wenn keine drinnen steht -> ist das wie eine falsche, wird beim einfügen in den offener_bon ...
				$resultArray['ANF'] = array($sitIp[1]);
			}
		}

		return $resultArray;
	} else return (array('Fehler, EDI String leer oder ungültig !'));
}



//RFR:
//Funktion gibt Anhand des Terminal Types den command line zurück
function get_command_line_for_ce_terminal($terminalType, $zahlTerminalId = false)
{
	if (strtolower($terminalType) == 'six') {
		$command_line = "six_zahlen.exe";
	}
	if (strtolower($terminalType) == 'zvt') {
		$command_line = "zvt_zahlen.exe";
	}
	if (strtolower($terminalType) == 'hobex') {
		$command_line = $zahlTerminalId . "\\hobex_zahlen.exe";
	}
	return $command_line;
}

function write_audit_log($string)
{
	$insQl = mysql_query("INSERT INTO auditing SET benutzer = '" . $_SESSION["userName"] . "', konfigtitel = '" . $string . "',
										funktion = '" . $string . "', datumzeit = NOW()     ");
}

function get_terminal_process()
{
	
	log_to_file("get_terminal_process");
	list ($terminalId, $terminalType) = get_my_bankomat_terminal_id(); // in glboal_functions gibt das richtige Terminal für die IP zurück
	log_to_file("get_command_line_for_ce_terminal");
	$command_line=get_command_line_for_ce_terminal($terminalType, $terminalId);  // in global_functions gibt exe Datei für terminalType zurück
	$resp=false;
	$cCheck=false;
	$retVal = '';
	$output = 'false';
	//$command=' start /B wmic path win32_process WHERE Name="'.$command_line.'" get commandline, processid';	
	// Get-Process | Where-Object {$_.ProcessName -eq "six_zahlen.exe"}
	exec("tasklist | findstr /i ".$command_line, $get_exe, $retval_exec);
	
	log_to_file("retval_exec: ". $retval_exec);
	log_to_file("command_line: ". $command_line);
	//log_to_file("command_line: ". $output);
	//log_to_file(implode(implode(null,$get_exe)));
		
		if ($retval_exec)
			$retVal = false;
		else
			$retVal = true;

	
//echo $retVal;
//echo json_encode(array("is_in_process"=>$retVal));
	echo $retVal;
	
}

/*    Datum Wochentag Array */
$tage = array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa");
$wd = $tage[date('w')];
