<?php
//  V4.10   RFR 20230714    Dateiein für sitpos Filialsystem synchronisierung ausgelagert aus ajax_funktionen.php

require_once(__DIR__ ."/../config/connect.php");
//require_once(__DIR__ ."/backup_neu.php");
$debug_log = true;
// Diese Funktion transferiert die Tabelle von einem ERP System
// Entweder sITpos Filialsystem oder WeClapp
function transfer_table($url, $table_name, $table_key, $kassa_id)
{
	if (defined('FILIALSYSTEM_ERP_PROGRAMM') && FILIALSYSTEM_ERP_PROGRAMM == "WeClapp") {
		//echo "transfer_table($url, $table_name, $table_key, $kassa_id)";
		echo "Transferiere Table " . $table_name . " von WeClapp<br>";
		transfer_table_WeClapp($table_name, $kassa_id);
	}else if (defined('FILIALSYSTEM_ERP_PROGRAMM') && FILIALSYSTEM_ERP_PROGRAMM == "Shopify") {
		get_data_from_shopify();
	} else {

		transfer_table_sITpos($url, $table_name, $table_key, $kassa_id);
		echo "Transferiere Table " . $table_name . " von sITpos Filialsystem<br>";
	}
}
   
function get_table_from_host($url)
{

	global $incr;
	if ($incr === "TRUE") $CONDITION = "&incr=TRUE";
	else $CONDITION = "&incr=FALSE";
	//echo $url . $CONDITION;
	$context = stream_context_create(array('ssl' => array(
		'verify_peer' => false,
		"verify_peer_name" => false
	)));

	libxml_set_streams_context($context);
	//Timeout beim Kunden synchronisieren bei SOMA - RFR gesetzt
	set_time_limit(1200);
	ini_set('max_execution_time', 0);
	$xml = simplexml_load_file($url . $CONDITION);

	if (!$xml) {
		//echo "Keine Änderungen in: $url$CONDITION\n";
		foreach (libxml_get_errors() as $error) {
			echo "\t", $error->message . "\n";
		}
	}
	return ($xml);
}

function run_sql_insert($query)
{
	$sqlP = mysql_query($query);

	if (!$sqlP) {
		//log_to_file('ERROR: ' . mysql_error() . ' Kommando: ' . $query);
		die('ERROR: ' . mysql_error() . ' Kommando: ' . $query);
	} else {
		//file_put_contents('kpcheckit.txt', "\n " .basename(__FILE__) . " ". __LINE__ ." run insert/update sync -> ".$sqlP." affected Rows-> ".mysql_affected_rows()." \n".$query."\n ", FILE_APPEND);
		return (TRUE);
	}
}

function does_a_record_exist($query)
{
	$sqlP = mysql_query($query);
	if (!$sqlP) {
		die('ERROR: ' . mysql_error());
	}
	if (mysql_num_rows($sqlP) >= 1) {
		$row = mysql_fetch_assoc($sqlP);
		//echo var_dump($row);
		return (TRUE);
	} else return (FALSE);
}

function get_fields($table)
{
	$query = mysql_query("DESCRIBE $table;");
	$result = array();
	if ($query) {
		while ($row = mysql_fetch_assoc($query)) {
			$result[] = $row['Field'];
		}
	}
	return $result;
}

function transfer_table_sITpos($url, $table_name, $table_key, $kassa_id)
{
    global $debug_log;

	#file_put_contents('kpcheckit.txt', "\n " .basename(__FILE__) . " ". __LINE__ ."sync -> ".$url." - ".$table_name." - ".$table_key." - ".$kassa_id."  \n ", FILE_APPEND);
	$transMsg = "";
	global $incr;
	ini_set('memory_limit', '-1');
	$xml = get_table_from_host($url . "/export_xml.php?TABELLE=" . $table_name . "&KASSA=" . $kassa_id . "&INCR=" . $incr . "&token=" . FILIALSYSTEM_TOKEN);
	
	if (!$xml) {
		return true;
	}

	if (preg_match('/Fehler/', $xml, $mMatch) == 1) $transMsg .= $xml;
	else $transMsg .= 'DB Table vom Host geladen<br>';

	$fields = get_fields($table_name);
	$rows = 0;
	mysql_query("Start transaction");
	foreach ($xml->row as $reihe) {
		set_time_limit(60);
		$table_id = urldecode($reihe->$table_key);

		$time = strtotime(urldecode($reihe->ts));

		$sql_string_update = "";
		$sql_string_insert1 = "";
		$sql_string_insert2 = "";

		$array = get_object_vars($reihe);

		foreach ($array as $key => $value) {
			if (in_array($key, $fields)) {
				$value = urldecode($value);
				$value = addslashes($value);

				if (isset($sql_string_update) && !empty($sql_string_update)) $sql_string_update = $sql_string_update . ", " . $key . "='" . $value . "'";
				else $sql_string_update = " " . $key . "='" . $value . "'";

				if (isset($sql_string_insert1) && !empty($sql_string_insert1)) $sql_string_insert1 = $sql_string_insert1 . ", " . $key;
				else $sql_string_insert1 = " (" . $key;

				if (isset($sql_string_insert2) && !empty($sql_string_insert2)) $sql_string_insert2 = $sql_string_insert2 . ", '" . $value . "'";
				else $sql_string_insert2 = " ('" . $value . "'";
			}
		}

		$sql_string_update = "UPDATE $table_name SET " . $sql_string_update . " WHERE $table_key='" . $table_id . "'";
		$sql_string_insert = "INSERT INTO $table_name " . $sql_string_insert1 . ") VALUES " . $sql_string_insert2 . ")";

		$updRes = false;
		$insRes = false;

		//echo "SELECT $table_key FROM $table_name WHERE $table_key='" . $table_id . "'<br>";
		if (does_a_record_exist("SELECT $table_key FROM $table_name WHERE $table_key='" . $table_id . "'")) { //TODO: return ts
			//$ts = strtotime($ts);
			//if ($ts < $time) {
			//echo $sql_string_update."<br>";
			$updRes = run_sql_insert($sql_string_update);
			$rows++;
			//}
		} else {
			//echo $sql_string_insert."<br>";
			$insRes = run_sql_insert($sql_string_insert);
			$rows++;
		}
		unset($xml);
		//$rows++;
	}
	mysql_query("commit");

	echo "Datensätze in Tabelle $table_name eingefügt/geändert: " . $rows . "<br>" . $transMsg;
    log_to_file("Datensätze in Tabelle $table_name eingefügt/geändert: " . $rows );
	return;
}

// Kunden synchronisieren muss manchmal extra aufgerufen werden (z.b. vor dem Kunden auf Bon hinzufügen)
// Ansonsten wird es mit den Produkten mit synchronisiert
function sync_von_Zentralsystem($full=false)
{
	global $incr;
    global $debug_log;

	$debug_log=true;

	session_write_close();
	set_time_limit(0);                      //RFR geändert von 120 auf 0
	$time = -microtime(true);
	$url = FILIALSYSTEM_URL_ZENTRALSYSTEM;
	$url = $url . "/synchronize";

    if (isset($_POST['incremental']) && $_POST['incremental'] == "true") {
		$incr = "TRUE";
	}
    else if(isset($_POST['incremental'])) $incr = "FALSE";
    else {
        if ($full) $incr= "FALSE";
        else $incr="TRUE";
    }

    log_to_file("*** Start function sync_von_Zentralsystem - Inkrementell: $incr");

	$kassa_id = FILIALSYSTEM_KASSA_NAME;
	//ini_set('memory_limit', '555555M');
	if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja" && FILIALSYSTEM_SYNCHRONISATION_KUNDEN_BON == "ja") {
        if ($debug_log) log_to_file("Transferiere Kunden ...");
		transfer_table($url, 'kunden', 'id', $kassa_id);
        $time_output = $time + microtime(true);
        if ($debug_log) log_to_file("Dauer seit Start: " . $time_output);
		if (defined("FILIALSYSTEM_SYNCHRONISATION_KUNDENLIMITS") && strtolower(FILIALSYSTEM_SYNCHRONISATION_KUNDENLIMITS) == 'ja') {
            if ($debug_log) log_to_file("Transferiere Kunden Limits ...");
			transfer_table($url, 'kunden_attribute', 'kunden_id', $kassa_id);
            $time_output = $time + microtime(true);
            if ($debug_log) log_to_file("Dauer seit Start: " . $time_output);
		}
		if (defined("FILIALSYSTEM_SYNCHRONISATION_PRODUKTLIMITS") && strtolower(FILIALSYSTEM_SYNCHRONISATION_PRODUKTLIMITS) == 'ja') {
            //if ($debug_log) log_to_file("Transferiere Produkt Limits ...");
		//	transfer_table($url, 'kunden_produkte_verkaufslimit', 'produkt_verkaufslimit_id', $kassa_id);
            $time_output = $time + microtime(true);
            if ($debug_log) log_to_file("Dauer seit Start: " . $time_output);
		}
	}
	if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja" && strtolower(FILIALSYSTEM_GUTSCHEINE_ZENTRALSYSTEM) == 'ja') {
        if ($debug_log) log_to_file("Transferiere Gutscheine ...");
		transfer_table($url, 'gutscheine', 'gs_id', $kassa_id);
		transfer_table($url, 'gutscheine_buchungen', 'id', $kassa_id);
        $time_output = $time + microtime(true);
        if ($debug_log) log_to_file("Dauer seit Start: " . $time_output);
	}

	$time += microtime(true);
	echo "<br>Gesamte Sync Dauer: " . $time . "<br>";
    log_to_file("Gesamte Sync Dauer: " . $time);
	return;
}

// ******************************* Produkte **********************************
function syncProducts($full=false)
{
	global $incr;
    global $debug_log;
	session_write_close();
	set_time_limit(0);
	$time = -microtime(true);
	$url = FILIALSYSTEM_URL_ZENTRALSYSTEM;

	$url = $url . "/synchronize";

    if (isset($_POST['incremental']) && $_POST['incremental'] == "true") {
		$incr = "TRUE";
	}
    else if(isset($_POST['incremental'])) $incr = "FALSE";
    else {
        if ($full) $incr= "FALSE";
        else $incr="TRUE";
    }
    

    log_to_file("*** Start function syncProducts - Inkrementell: $incr");
	$kassa_id = FILIALSYSTEM_KASSA_NAME;

	#kassaId:ravel 	inc/total:TRUE 	URL: http://localhost/serviceit_1.15/synchronize

	// Kunden synchronisieren!
	// RFR - Kunden werden im syncProducts synchronisiert? mit ALA klären
	// sync_von_Zentralsystem();
	/*
		transfer_table($url, 'kunden', 'id', $kassa_id);
		if (defined("FILIALSYSTEM_SYNCHRONISATION_KUNDENLIMITS") && strtolower(FILIALSYSTEM_SYNCHRONISATION_KUNDENLIMITS) == 'ja') {
			transfer_table($url, 'kunden_attribute', 'kunden_id', $kassa_id);
		}
		if (defined("FILIALSYSTEM_SYNCHRONISATION_PRODUKTLIMITS") && strtolower(FILIALSYSTEM_SYNCHRONISATION_PRODUKTLIMITS) == 'ja') {
			transfer_table($url, 'kunden_produkte_verkaufslimit', 'produkt_verkaufslimit_id', $kassa_id);
		}
		*/


	//ini_set('memory_limit', '555555M');
	//echo 'test: ' . FILIALSYSTEM_IST_FILIALSYSTEM . '<br>';
	//echo 'test2: ' . FILIALSYSTEM_UEBERNEHMEN_ZENTRALSYSTEM . '<br>';
	if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja" && FILIALSYSTEM_UEBERNEHMEN_ZENTRALSYSTEM == "ja") {
		echo "categories<br>";
        if ($debug_log) log_to_file("Transferiere categories ...");
		transfer_table($url, 'categories', 'ID', $kassa_id);
        $time_output = $time + microtime(true);
        if ($debug_log) log_to_file("Dauer seit Start: " . $time_output);
        if ($debug_log) log_to_file("Transferiere combiartikel ...");
		echo "combiartikel<br>";
		transfer_table($url, 'combiartikel', 'id', $kassa_id);
        $time_output = $time + microtime(true);
        if ($debug_log) log_to_file("Dauer seit Start: " . $time_output);
		// Tabelle products immer als letzte synchronisieren - sonst könnte es ein Problem geben mit Zeit weil immer beim
		// Products Tabelle die synchronisiereungszeit geschrieben wird! AAlex
		echo "products<br>";
        if ($debug_log) log_to_file("Transferiere products ...");
		transfer_table($url, 'products', 'ID', $kassa_id);
        $time_output = $time + microtime(true);
        if ($debug_log) log_to_file("Dauer seit Start: " . $time_output);

		if ( WEBSHOP_TYPE == 'WooCommerce')
		{
            if ($debug_log) log_to_file("WooCommerce Webshop variations ...");
			echo "webshop_variations<br>";
			transfer_table($url, 'webshop_variations', 'ID', $kassa_id);
            $time_output = $time + microtime(true);
        if ($debug_log) log_to_file("Dauer seit Start: " . $time_output);
		}	
	}
	//transfer($url, 'products', 'ID', $kassa_id);
	$time += microtime(true);
	echo "<br>Dauer: " . $time . "<br>";
	log_to_file("Gesamte Sync Dauer: " . $time);
	return;
}

function syncKundenLimits($full=false)
{
	global $incr;
   	global $debug_log;
	session_write_close();
	set_time_limit(0);
	$time = -microtime(true);
	$url = FILIALSYSTEM_URL_ZENTRALSYSTEM;

	$url = $url . "/synchronize";

	if ($full)
	{
		log_to_file("Full sync: Lösche die Tabelle Verkaufslimit");
		mysql_query("TRUNCATE kunden_produkte_verkaufslimit;");
	}
	$incr = $full;
	

	log_to_file("*** Start function syncProducts - Inkrementell: $incr");
	$kassa_id = FILIALSYSTEM_KASSA_NAME;

	
	if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja" && FILIALSYSTEM_UEBERNEHMEN_ZENTRALSYSTEM == "ja") {
		
       		if ($debug_log) log_to_file("Transferiere Produkt Limits ...");
			transfer_table($url, 'kunden_produkte_verkaufslimit', 'produkt_verkaufslimit_id', $kassa_id);

	}
	//transfer($url, 'products', 'ID', $kassa_id);
	$time += microtime(true);
	echo "<br>Dauer: " . $time . "<br>";
	log_to_file("Gesamte Sync Dauer: " . $time);
	$incr = true;
	return;
}

function upsync_mysql_dump($full=false)
{
	try{
		$time = -microtime(true);
		require_once("backup_neu.php");

		log_to_file("run_mysqldump_command");
		$filename=run_mysqldump_command();
		log_to_file ($filename);
		upload_file($filename);


		$time += microtime(true);
		log_to_file("Gesamte Sync Dauer dump: " . $time);
	}
	catch(Exception $e)
	{
		echo 'Message: ' .$e->getMessage();
	}
	
}
// Synchronisiert die Tabellen in das Zentralsystem
function upsync($full=false, $bon_id=null)
{
    global $debug_log;
	session_write_close();

	if (defined('FILIALSYSTEM_IST_FILIALSYSTEM') && FILIALSYSTEM_IST_FILIALSYSTEM == "ja") 
	{
		if (isset($_POST['bon_id']))
			$bon_id = $_POST['bon_id'];
			
		if (isset($_POST['selVal'])) {
			$selVal = $_POST['selVal'];
		}
		else
		{
			if ($full) $selVal = "full";
			else $selVal = "incr";
		}

		$storno = "false";
		if (isset($_POST['storno'])) {
			$storno = $_POST['storno'];
		}

		$time = -microtime(true);
		log_to_file("*** Start function upsync - Inkrementell: $selVal Filialsystem:".FILIALSYSTEM_ERP_PROGRAMM);

		//log_to_file("FILIALSYSTEM_ERP_PROGRAMM: ".FILIALSYSTEM_ERP_PROGRAMM."<--");
		//RFR: keine Ahung - das wird nicht verwendet
		/*
			if (isset($_POST['origin'])) {
				$origin = $_POST['origin'];
			}*/

		// Wenn full oder incr und kein structure sync noch erfolgt ist, dann mache ein structure sync
		if (defined('FILIALSYSTEM_ERP_PROGRAMM') && FILIALSYSTEM_ERP_PROGRAMM == "WeClapp") {
			if ($debug_log) log_to_file("WeClapp warehouse stock movement ...");
			WeClapp_warehouse_stock_movement($full_sync = false);
			$time_output = $time + microtime(true);
			if ($debug_log) log_to_file("Dauer seit Start: " . $time_output);
		} 
		else if (defined('FILIALSYSTEM_ERP_PROGRAMM') && FILIALSYSTEM_ERP_PROGRAMM == "Shopify") {
		
			if($storno == "true")
			{
				if ($debug_log) log_to_file("Sende Storno Order zu shopify ...".$bon_id);
				//send_storno_order_to_shopify($bon_id);
			}
			else
			{
				if ($debug_log) log_to_file("Sende Order zu shopify ...");
				send_order_to_shopify();
			}
		}
		else  // sITPos Filialsystem upsync
		{
			if ($selVal !== "incr" && (FILIALSYSTEM_GUTSCHEINE_ZENTRALSYSTEM == 'ja' || FILIALSYSTEM_SYNCHRONISATION_BON == 'ja')) {
				if ($debug_log) log_to_file("Synchronisiere Database Struktur ...");
				include __DIR__ . '/../synchronize/sync_table_structure.php';
			} else if ($selVal == "incr" && (FILIALSYSTEM_GUTSCHEINE_ZENTRALSYSTEM == 'ja' || FILIALSYSTEM_SYNCHRONISATION_BON == 'ja')){
				$query = mysql_query("SELECT ID FROM sync_info WHERE wert='structure';");

				if (mysql_num_rows($query) == 0) {
					if ($debug_log) log_to_file("Synchronisiere Database Struktur erstmalig ...");
					include __DIR__ . '/../synchronize/sync_table_structure.php';
				}
			}
			// RFR: Beim upsync hat meiner Meinung nach ein downsync nichts verloren
			/*
			if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja" && FILIALSYSTEM_SYNCHRONISATION_PRODUKTE_KASSA_OEFFNEN == "ja") {
				$incr = "TRUE";
				syncProducts();
			}
			*/
			$kassa_id = FILIALSYSTEM_KASSA_NAME;
			$url='';
			/*
			if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja" && FILIALSYSTEM_SYNCHRONISATION_KUNDEN_BON == "ja") {
				$incr = "FALSE";
				transfer_table($url, 'kunden', 'id', $kassa_id);
			}
			if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja" && FILIALSYSTEM_SYNCHRONISATION_KUNDENLIMITS == "ja") {
				transfer_table($url, 'kunden_attribute', 'kunden_id', $kassa_id);
			}
			if (FILIALSYSTEM_IST_FILIALSYSTEM == "ja" && FILIALSYSTEM_SYNCHRONISATION_PRODUKTLIMITS == "ja") {
				transfer_table($url, 'kunden_produkte_verkaufslimit', 'produkt_verkaufslimit_id', $kassa_id);
			}
			*/
			// $incr = "TRUE"; RFR - das wird eh nicht abgefragt in sync_data
			if ($debug_log) log_to_file("Synchronisiere Daten ...");
			echo "<br>Synchronisiere Daten<br>";
			include __DIR__ . '/../synchronize/sync_data.php';
		}
		$time += microtime(true);
		log_to_file("Gesamte Sync Dauer: " . $time);
	}
}
