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

require_once(__DIR__ ."/../config/connect.php");

// 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;

	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;
}

// Synchronisiert die Tabellen in das Zentralsystem
function upsync($full=false, $bon_id=null)
{
    global $debug_log;
	session_write_close();

    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") {
            if ($debug_log) log_to_file("Synchronisiere Database Struktur ...");
			include __DIR__ . '/../synchronize/sync_table_structure.php';
		} else {
			$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);
}

//sync_von_Zentralsystem(false);
//syncProducts();
// upsync(false);

?>