<?php 

	header('Content-Type: text/html; charset=utf-8');
	header("Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, max-age=0, post-check=0");

	require_once("../global_functions.php");
	
	if(isset($_POST['functionKey']) && $_POST['functionKey'] != '') $functionKey=$_POST['functionKey'];

	switch ($functionKey){
		case "exeTest": exeTest(); break;
		case "serienNr": serienNr(); break;
		case "sigTest": sigTest(); break;
		case "sigTestNative": sigTestNative(); break;
		case "hashTest": hashTest(); break;
		case "hashVorigerBeleg": hashVorigerBeleg(); break;
		case "reactivateSignature": reactivateSignature(); break;
		
		

		default: echo "Error !!! Falscher Aufruf von ajax_funktionen, Funktion nicht bekannt";
	}
	

	function hashTest(){
		$testData=$_POST['testData'];
		$commandHash="C:\sitpos\_rkExe\ATrustRegistrierkasseExe.exe --hash_string ".$testData."";
		exec($commandHash, $outputHash, $error_code);
		
		
		
		echo "Karten Hash Nativ: ".$outputHash[0]."<br />PHP Hash: ".hash('sha256', $testData);
		

		
		echo "<hr /><hr />";
		echo base64_decode("UjEtQVQxX0RFTU8tQ0FTSC1CT1g0MjZfNzc2NzMwXzIwMTUtMTAtMTRUMTg6MjA6MjNfMCwwMF8wLDAwXzAsMDBfMCwwMF8wLDAwX1BUN1A2UEdEMktPUTI9PT1fOTY4OTM1MDA3NTkzMTYwNjI1X1BUN1A2UEdEMktPUTI9PT0");
	
	}
	
	function hashVorigerBeleg(){
		$testData=$_POST['testData'];
		$commandHash="C:\sitpos\_rkExe\ATrustRegistrierkasseExe.exe --hash_sig_voriger_beleg ".$testData."";
		exec($commandHash, $outputHash, $error_code);
		echo "Karten Hash Vorig: ".$outputHash[0]."<br />PHP Hash: ".hash('sha256', $testData);
	}
	
	function sigTestNative(){
		if(isset($_POST['testData']) && strlen($_POST['testData']) > 50) $testData=$_POST['testData'];
		else {
			echo "Missing valid Test Data !!!";
			exit (1);
		}
		
		$commandSignNativ="C:\sitpos\_rkExe\ATrustRegistrierkasseExe.exe --sign ".$testData."";
		exec($commandSignNativ, $outputSign, $error_code);
		
		echo "response ....".$outputSign[0];
	}

	function sigTest(){
		
		if(isset($_POST['testBonId']) && $_POST['testBonId'] > 1000) $bonId=$_POST['testBonId'];
		else {
			echo "Missing valid Bon Id !!!";
			exit (1);
		}
		
		
		$callDepData= getLastDepData($bonId);
		
		echo $callDepData[0]." / ".$callDepData[1];
		
		if($callDepData == false){			
			return array(false, 'Letzter DEP Eintrag konnte nicht gefunden werden.');
		}
		
		else {
			$revenueBefore= $callDepData[0];
			$lastZertifizierungsdata=$callDepData[1];
			$lastSignJwsData=$callDepData[2];
				
		}
		
		
		$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 = ".$bonId."");
												
		$taxN=0;
		$tax1=0;
		$tax2=0;
		$taxNull=0;
		$taxB=0;
		while($getTax=mysql_fetch_assoc($bonData)){
			if($getTax['tax_rate']==0.2) $taxN=$getTax['gesamt_betrag']*(1+$getTax['tax_rate']);
			if($getTax['tax_rate']==0.1) $tax1=$getTax['gesamt_betrag']*(1+$getTax['tax_rate']);
			if($getTax['tax_rate']==0.13) $tax2=$getTax['gesamt_betrag']*(1+$getTax['tax_rate']);
			if($getTax['tax_rate']==0.0) $taxNull=$getTax['gesamt_betrag'];
			if($getTax['tax_rate']==0.19) $taxB=$getTax['gesamt_betrag']*(1+$getTax['tax_rate']);
			
			$bonDate=$getTax['bon_erstellt_datum'];
		}
		
		
		$bonUmsatz=$taxN+$tax1+$tax2+$taxNull+$taxB;
		
		echo "<br />date: ".$bonDate."<br />";
		$umsatzZaehler=number_format($revenueBefore+($bonUmsatz*100), 0, "", "");
		$testZert=substr($lastZertifizierungsdata ,-20).md5(date("Y-m-d H:i"));
		
		$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, ",", "");
												
	#	_R1-AT1_1_1_2016-02-24T10:42:13     _0,00_0,00_0,00_0,00_0,00_wBuMAAdZM4c=_987234644_qdXooXdnO+I=
	
		$preFix="_R1-";
		
		$xDate = strtotime($bonDate);
		$bDate=date('Y-m-d', $xDate);
		$bTime=date('H:i:s', $xDate);
		$sigDate=$bDate."T".$bTime;
		
		$command='C:\sitpos\_rkExe\ATrustRegistrierkasseExe.exe --aes_encrypt --aes_key '.AES_KEY.'  --umsatz '.$umsatzZaehler.' --kassenid '.KASSA_ID.' --belegnummer '.$bonId.' ';
		
		exec($command, $output, $error_code);
		
		$revenueCoded=implode("", $output);
		
		$commandCheck='C:\sitpos\_rkExe\ATrustRegistrierkasseExe.exe --aes_decrypt --aes_key '.AES_KEY.'  --encrypted_data '.$revenueCoded.' --kassenid '.KASSA_ID.' --belegnummer '.$bonId.' ';
		exec($commandCheck, $outputCheck, $error_code);
		
		if(implode($outputCheck) != $umsatzZaehler	){
			echo "Beim Codieren des Umsatzzählers ist ein Fehler aufgetreten.<br />".implode($outputCheck);
			
			exit(1);
			
		}
		
		$zertif_nrHex=dechex(ZERTIFIKATS_NR);
		
		# 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
		
		$commandSigVorig="C:\sitpos\_rkExe\ATrustRegistrierkasseExe.exe --hash_sig_voriger_beleg ".$lastSignJwsData."";
		exec($commandSigVorig, $outputSigVorig, $error_code);
		
		$sigVorigerBeleg=$outputSigVorig[0];
	
		$strToSign=$preFix.ZDA_ID."_".KASSA_ID."_".$bonId."_".$sigDate."_".$taxN."_".$tax1."_".$tax2."_".$taxNull."_".$taxB."_".$revenueCoded."_".$zertif_nrHex."_".$sigVorigerBeleg;
	
		echo "sig test response<br />".$bonData['bon_id']." - ".$bonData['beleg_nr']."<br />".$strToSign;
		
		$commandSign="C:\sitpos\_rkExe\ATrustRegistrierkasseExe.exe --signjws ".$strToSign;
		
		exec($commandSign, $outputSign, $error_code);
		
		$updateDep=mysql_query("UPDATE dep SET signjws = '".$outputSign[0]."', signatur_vorigerbeleg = '".$sigVorigerBeleg."' WHERE beleg_nr = ".$bonId."");
		
		if($error_code == false){
			echo "<br />#######<br />".$outputSign[0]."<br />";
			$jwsData=$outputSign[0];
		}
		else echo "<br />Fehler beim signieren aufgetreten !!!".$error_code."<br />";

	
	}
	
	function reactivateSignature(){
	
		if(defined('SIGNATUR_MODUS') && strtolower(SIGNATUR_MODUS) == 'com'){
		
			$sigCard = new COM('ATrustRegistrierkasseCom.Registrierkasse');
			$checkSw=$sigCard->CheckSoftware;
			$initCard=$sigCard->Initialize;
			$checkCard=$sigCard->CheckCard;
			$loadInfo=$sigCard->LoadInfo;
			
			if($loadInfo != 0 || $checkCard != 0){
				$fFin=$sigCard->Finalize;
				$checkSw=$sigCard->CheckSoftware;
				$initCard=$sigCard->Initialize;
				$checkCard=$sigCard->CheckCard;
				$loadInfo=$sigCard->LoadInfo;
			}
			$getZdaid=$sigCard->ZdaId;
			$getSerNo=$sigCard->CertificateSerial;
			
			if(isset($checkSw) && $checkSw == 0 && isset($checkCard) && $checkCard == 0 && isset($loadInfo) && $loadInfo == 0 
					&& isset($getZdaid) && strlen($getZdaid) > 1 && isset($getSerNo) && $getSerNo > 1000){
				
				$strToSign="_R1-AT1_sITPOS5371_2001_2016-09-27T10:26:58_0,00_15,00_85,00_2,09_0,00_SRleqQ9MHG/X2UfdTtn1HQ==_1b7261_Zcmb+fbdx/M=";
				$jwsPayLoad="";
				$checkBase64= new COM("ATrustRegistrierkasseCom.Base64");
				$retVal=$checkBase64->EncodeUrl($strToSign, 0, $jwsPayLoad);
					$refValue="X1IxLUFUMV9zSVRQT1M1MzcxXzIwMDFfMjAxNi0wOS0yN1QxMDoyNjo1OF8wLDAwXzE1LDAwXzg1LDAwXzIsMDlfMCwwMF9TUmxlcVE5TUhHL1gyVWZkVHRuMUhRPT1fMWI3MjYxX1pjbWIrZmJkeC9NPQ";			
				$base64Error=false;
				if($jwsPayLoad != $refValue) $base64Error=true;
				
				if($base64Error==false){
					$signature="";
					$sigRef="eyJhbGciOiJFUzI1NiJ9.WDFJeExVRlVNVjl6U1ZSUVQxTTFNemN4WHpJd01ERmZNakF4Tmkwd09TMHlOMVF4TURveU5qbzFPRjh3TERBd1h6RTFMREF3WHpnMUxEQXdYeklzTURsZk1Dd3dNRjlUVW14bGNWRTVUVWhITDFneVZXWmtWSFJ1TVVoUlBUMWZNV0kzTWpZeFgxcGpiV0lyWm1Ka2VDOU5QUQ";
					$retVal=$sigCard->SignJWS($jwsPayLoad, $signature);
					
					$sigError = false;
					$checkSig=explode(".", $signature);
					if(count($checkSig) != 3)$sigError = true;
					if($checkSig[0].".".$checkSig[1] != $sigRef)$sigError = true;
					if(strlen($checkSig[2]) != 86)$sigError = true;		# event doch zu kritisch, ob die Signatur wirklich immer 86 zeichen lang ist.

				
				}
				
				if($getSerNo != ZERTIFIKATS_NR){
					# hier kommt die daten der neuen Karte in die DB eintragen und dann noch sicherstellen das ein Ausdruck
					# mit den neuen sigkarten Daten (serien Nr, AES Key ? und Prüfsumme ausgegeben wird !!!! 
					
					echo json_encode(array("newSerNo", "<p>Die verwendete Signaturkarte entspricht nicht der in der Registrierkasse eingetragenen Karte. Durch Click auf Signaturkarte aktivieren wird diese Karte in der Registrierkassa aktiviert.</p><p>Nach aktivieren einen neuen Signaturkarte muss die neue Karte dem Finanzamt gemeldet werden, wenn diese nicht schon gemeldet ist.</p>"));
					return false;
				
				}
				
				if($base64Error == false && $sigError == false){
					# finden der unsignierten bons von jetzt weg.
					# holen den letzten dep und schaun on der unsignirt ist
					$lastunsignedDep=mysql_fetch_array(mysql_query("SELECT signjws, beleg_nr FROM DEP ORDER BY beleg_nr DESC LIMIT 0, 1 "));
					# signatur string auftrennen, letzten teil (signatur) extrahieren und decodieren		U2ljaGVyaGVpdHNlaW5yaWNodHVuZ19hdXNnZWZhbGxlbg
					$sigStrg=explode(".", $lastunsignedDep['signjws']);
					$sigStrg=base64_decode($sigStrg[2]);
					
					$un_sigBonArray=array();
					
					if(strtolower($sigStrg) == 'sicherheitseinrichtung ausgefallen'){
						#echo "der letzte ist unsigniert !!!!!!!!!!!!!\n";
						$getUnsignedDep=mysql_query("SELECT signjws, beleg_nr, gesamt_summe FROM DEP 
													LEFT JOIN abgeschlossener_bon ON abgeschlossener_bon.bon_id = dep.beleg_nr
													ORDER BY beleg_nr DESC LIMIT 0, 20 ");
						while ($getUnsignedRow=mysql_fetch_array($getUnsignedDep)){
							$sigStrgTmp=explode(".", $getUnsignedRow['signjws']);
							$sigStrgDecoded=base64_decode($sigStrgTmp[2]);
							if(strtolower($sigStrgDecoded) == 'sicherheitseinrichtung ausgefallen'	){
								array_push($un_sigBonArray, array($getUnsignedRow['beleg_nr'], $getUnsignedRow['gesamt_summe']) ); 
							}
							else break;

						}
					}
					
					else if(strlen($sigStrg[2]) == 86){			# muss noch gecheckt werden !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
						echo json_encode(array("Der letzt Dep Eintrag ist nicht als Signatureinheit ausgefallen signiert"));
						#echo "Der letzt Dep Eintrag ist nicht als ausgefallen signiert\n\n";
					}
					
					$unsigBonArray = array_reverse($un_sigBonArray);
					$testOp="";
					for($i=0; $i < sizeof($unsigBonArray); $i++){
						$testOp.=$unsigBonArray[$i][0]." / ".$un_sigBonArray[$i][1]."\n";
					}
					if(count($unsigBonArray) > 0){
						$letzterEintrag=end($unsigBonArray);
						/*
						$outputTxt="<p>Es wurden ".count($unsigBonArray).", Bon Nr. ".$unsigBonArray[0][0]." bis ".$letzterEintrag[0].", 
									aufeinaderfolgende unsignierte Bons als zuletzt erfasst gefunden.</p>
									<p>Mit Click auf den nachfolgenden Button, Sammelbeleg Erstellen, wird ein Sammelbeleg mit den entsprechenend Enträgen erstellt, die Verknüpfungen im Daten Erfassungs Protokoll wiederhergestellt.</p>";
									*/
						$outputTxt="<p>Es wurden ".count($unsigBonArray).", Bon Nr. ".$unsigBonArray[0][0]." bis ".$letzterEintrag[0].", 
									aufeinaderfolgende unsignierte Bons als zuletzt erfasst gefunden.</p>
									<p>Sammelbelege werden automatisch erstellt.</p>";
						$listString=json_encode($unsigBonArray);
						echo json_encode(array("unsignedBonsDedected", count($unsigBonArray), $listString, $outputTxt  ));
					}
					else echo json_encode(array("<p>Der letzte Eintrag im Daten Erfassungs Protokoll wurde signiert.</p>
												<p>Wurde die Signaturkarte erneuert ist ein Nullbeleg zu erstellen und die Verwendung der neuen Karte dem Finanzamt zu melden.</p>"));					
					return false;
					
				
				
				}
				else{
					echo json_encode(array("Fehler beim Auslesen der Signaturkarte: base64 oder Signatur Funktion fehlerhaft."));
					#echo "Fehler beim Auslesen der Signaturkarte: base64 oder Signatur Funktion fehlerhaft.";					
					return false;
				}

			}
			
			else echo json_encode(array("Karte kann gar nicht od nur unvollständig ausgelesen werden."));
				
					#echo "Karte kann gar nicht od nur unvollständig ausgelesen werden.";
			
			

		
		}
		else {
			# kommen dann die .exe aufrude her !!!!!
		}
	
		echo json_encode(array("Response reactivateSignature."));
	}

?>