<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
date_default_timezone_set('Europe/Madrid');

// Parámetros
$serverName 	= "localhost";
$connectionInfo = array( "Database"=>"ICF", "UID"=>"VAIO", "PWD"=>"VAIO", "ConnectionPooling" => "1" ,"MultipleActiveResultSets"=>'1', "TraceOn"=>"0");
$scriptPath = 'do-NAVISION-sendDiscordMessage.php';
//$sDiscordChannel= "1075385202303586324"; // Antonio, pruebas
$sDiscordChannel= "806434577437556776"; // Dpto. Compras

// Conexión con Navision
$connNavision=false;
$retries=0;
while(!$connNavision && $retries<3){
	$connNavision = sqlsrv_connect( $serverName, $connectionInfo);
	$retries++;
}

if( $connNavision ) {
	 //echo "Conexion establecida con Navision.\r\n";
}else{
	  echo json_encode(["result"=>-1 , "text"=>"No se pudo conectar con Navision"]);
	  die;
}

function mssql_escape($str){
    if(get_magic_quotes_gpc()){
        $str= stripslashes($str);
    }
    return str_replace("'", "''", $str);
}


$json = file_get_contents('php://input');

$data = json_decode($json, true);


if (json_last_error() !== JSON_ERROR_NONE) {
    // JSON no es válido
	echo json_encode(["result"=>-2 , "text"=>"Los datos enviados no son validos"]);
	die;
}

if (!isset($data['code']) || $data['code']=='') {
	echo json_encode(["result" => -3, "text" => "No se ha indicado pedido para crear pedido de venta en ICF_FrasCab"]);
	die;
}

if (!isset($data['header']) || !is_array($data['header']) || count($data['header']) == 0) {
	echo json_encode(["result" => -4, "text" => "No se ha indicado cabecera para crear pedido de venta en ICF_FrasLinea"]);
	die;
}
$header = $data['header'];

if (!isset($data['lines']) || !is_array($data['lines']) || count($data['lines']) == 0) {
	echo json_encode(["result" => -4, "text" => "No se ha indicado líneas para crear pedido de venta en ICF_FrasLinea"]);
	die;
}

$code 			= $data['code'];
$agent_email 	= $data['agent_email'];

// Comprobar que no existe ya el pedido de venta en ICF_FrasCab para evitar duplicidades
$Cod_FrasCab=null;
$saleOrderCode=$code;
$sql='SELECT Cod_FrasCab, CodFacturaTemp FROM dbo.[Ind. Campollano Ferretería S.L$ICF_FrasCab] fc where fc.[CodClientePS]=\'0001\' and fc.[CodPedidoPS]=\''.$code.'\'';

$stmNewExist = sqlsrv_query( $connNavision, $sql);	
if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
	echo json_encode(["result"=>-2, "text"=>"1 Ocurrio un error en la consulta SQL de Navision: ICF_FrasCab"]);
	die;
}
if( $stmNewExist !== false) {
	if($rowNewExist = sqlsrv_fetch_array( $stmNewExist, SQLSRV_FETCH_ASSOC)){			
		$Cod_FrasCab=$rowNewExist["Cod_FrasCab"];
		$saleOrderCode=$rowNewExist["CodFacturaTemp"];
	}
}

//Si no hay ningun pedido de venta generado lo creamos
if($Cod_FrasCab==null){
	
	// Comprobar que no existe ya el pedido de venta en ICF_FrasCab para evitar duplicidades
	$payment_term_code		='';
	$payment_method_code	='';
	$sql='SELECT [Payment Terms Code] as payment_term_code, [Payment Method Code] as payment_method_code FROM dbo.[Ind. Campollano Ferretería S.L$Customer] where [No.]=\''.$header['customer_code'].'\'';
// echo $sql;	

	$stmCustomer = sqlsrv_query( $connNavision, $sql);	
	if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
		echo json_encode(["result"=>-22, "text"=>"Ocurrio un error en la consulta SQL de Navision: Customers"]);
		die;
	}
	if( $stmCustomer !== false) {
		if($rowCustomer = sqlsrv_fetch_array( $stmCustomer, SQLSRV_FETCH_ASSOC)){			
			$payment_term_code=$rowCustomer["payment_term_code"];
			$payment_method_code=$rowCustomer["payment_method_code"];
		}
	}
	$header['payment_term_code']=$payment_term_code;		
	$header['payment_method_code']=$payment_method_code;
	
	$header = array_map(function($value) {
		return iconv("UTF-8", "Windows-1252",mssql_escape($value));
	}, $header);	
	
	// Insertamos cabecera del pedido en ICF_FrasCab	si no existia
	$Cod_FrasCab='';
	$sql = "INSERT INTO ".'[Ind. Campollano Ferretería S.L$ICF_FrasCab]'."(
	FechaModificacion,
	HoraModificacion,
	CodClientePS,
	Nombre,
	Apellido1,
	Apellido2,
	Direccion1,
	Direccion2,
	CP,
	Poblacion,
	Provincia,
	Contacto,
	TerminosPago,
	FormaPago,
	FechaRegistro,
	FechaVencimiento,
	TextoRegistro,
	DNI,
	Telefono,
	CodClientePagadorPS,
	NombrePagador,
	Apellido1Pagagor,
	Apellido2Pagagor,
	CodFacturaTemp,
	Procesado,
	ConceptoGastoEnvio,
	Direccion1Envio,
	Direccion2Envio,
	CPEnvio,
	PoblacionEnvio,
	ProvinciaEnvio,
	CodPedidoPS,
	Observaciones,
	CodCliente,
	RefPedidoPS,
	EmpresaPagador,
	EmpresaEnvios,
	Email,
	[Texto Error],
	Solucionado,
	Error,
	ProcesarAlbaran,
	NoAlbaran,
	codPreparacion,
	ProcesarFactura,
	CodFacturaReg,
	AnularRestos
	) VALUES (
	'".date("d-m-Y", strtotime($header['odate']))."',
	'".date("1754-01-01 H:i:s.000", strtotime($header['odate']))."',
	'0001',
	'".strtoupper(mssql_escape($header['customer_name']))."',
	'',
	'',
	'".mssql_escape($header['address1'])."',
	'".mssql_escape($header['address2'])."',
	'".mssql_escape($header['cp'])."',
	'".mssql_escape($header['town'])."',
	'".mssql_escape($header['province'])."',
	'".mssql_escape($header['contact'])."',
	'".mssql_escape($header['payment_term_code'])."',
	'".mssql_escape($header['payment_method_code'])."',
	'".date("d-m-Y", strtotime($header['odate']))."',
	'".date("d-m-Y", strtotime($header['odate']))."',
	'',
	'".mssql_escape($header['customer_vat'])."',
	'".mssql_escape($header['phone'])."',
	'',
	'".strtoupper(mssql_escape($header['customer_name']))."',
	'',
	'',
	'',
	0,
	'',
	'".mssql_escape($header['address1'])."',
	'".mssql_escape($header['address2'])."',
	'".mssql_escape($header['cp'])."',
	'".mssql_escape($header['town'])."',
	'".mssql_escape($header['province'])."',
	'".$code."',
	'',
	'".strtoupper(mssql_escape($header['customer_code']))."',
	'".strtoupper(mssql_escape($header['code2']))."',
	'',
	'',
	'".strtoupper(mssql_escape($header['email']))."',
	'',
	0,
	0,
	0,
	0,
	'',
	0,
	'',
	0);";
// echo $sql;	
	//// echo $sql;
	$stmt = sqlsrv_query( $connNavision, $sql );
	if( $stmt === false) {
		echo json_encode(["result"=>-6, "text"=>"Ocurrio un error al insertar el pedido en ICF_FrasCab"]);
		print_r(sqlsrv_errors(SQLSRV_ERR_ERRORS));
		die;
	}
	// Obtener el id que se acaba de insertar
	$sql="SELECT MAX(Cod_FrasCab) Cod_FrasCab FROM ".'[Ind. Campollano Ferretería S.L$ICF_FrasCab]';
// echo $sql;	
	$stmt = sqlsrv_query( $connNavision, $sql );
	if( $stmt === false) {
		die( print_r( sqlsrv_errors(), true) );
	}
	$row_max = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC);
	$Cod_FrasCab=$row_max["Cod_FrasCab"];
	
	// ----------------- Líneas -----------------------
	if ($Cod_FrasCab){
		$line = 0;
		foreach($data['lines'] as $saleline){
			
			$saleline = array_map(function($value) {
				return iconv("UTF-8", "Windows-1252",mssql_escape($value));
			}, $saleline);
			
			$line++;
			$sql = "INSERT INTO ".'[Ind. Campollano Ferretería S.L$ICF_FrasLinea]'."(
			Cod_FrasCab,
			NLinea,
			Cod_NAV,
			Cantidad,
			Descripcion,
			PrecioVenta,
			GrupoIva,
			Descuento,
			ImporteLinea,
			Procesado,
			Variante,
			ProcesaAlbaran,
			CantidadAProcesar,
			CantidadProcesada,
			CodAlmacen,
			ProcesarFactura,
			CantidadAFacturar,
			CantidadFacturada,
			NlineaPedido					
			) VALUES (
				".$Cod_FrasCab.",
				".$line.",
				'".mssql_escape($saleline['product_code'])."',
				'".$saleline['quantity']."',
				'".mssql_escape($saleline['product_name'])."',
				'".$saleline['pricebase']."',
				'".$saleline['taxperc']."',
				'".$saleline['discountperc']."',
				'".$saleline['pricetotal']."',
				0,
				'".mssql_escape($saleline['variant_code'])."',
				0,
				0,
				0,
				'".mssql_escape($saleline['store_code'])."',
				0,
				0,
				0,
				'".(isset($saleline['linenum_navision']) && $saleline['linenum_navision']?$saleline['linenum_navision']:'')."'
			);";
// echo $sql;			
			$stmt = sqlsrv_query( $connNavision, $sql );
			if( $stmt === false) {
				echo json_encode(["result"=>-7, "text"=>"Ocurrio un error al insertar las lineas de pedido en ICF_FrasLinea"]);
				print_r(sqlsrv_errors(SQLSRV_ERR_ERRORS));
				die;
			}
		}				
		
		
		// -------------- Lanzar CODE UNIT --------------------
		$sql = "INSERT INTO ".'dbo.[Ind. Campollano Ferretería S.L$Job Queue Entry]'." ([ID],[User ID], [Last Modified Date_Time], [Expiration Date_Time], [Earliest Start Date_Time], [Object Type to Run],[Object ID to Run],[Response Required],[Maximum No. of Attempts to Run],[No. of Attempts to Run],[Status],[Priority],[Record ID to Process],[Parameter String],[Recurring Job],[No. of Minutes between Runs],[Run on Mondays],[Run on Tuesdays],[Run on Wednesdays],[Run on Thursdays],[Run on Fridays],[Run on Saturdays],[Run on Sundays],[Starting Time],[Ending Time])
			   VALUES(NEWID(),'jag',GETDATE(),'1753-01-01 00:00:00.000',DATEADD(HOUR, -2, GETDATE()),5,50003,0,3,3,0,0,CONVERT(varbinary(max), ''),'',0,0,0,0,0,0,0,1,1,'1754-01-01 21:00:00.000','1753-01-01 00:00:00.000')";
// echo $sql;			   
		$stmt = sqlsrv_query( $connNavision, $sql );
		if( $stmt === false) {
			echo json_encode(["result"=>-8,"text"=>"Error al solicitar ejecucion de CodeUnit"]);
			die( print_r( sqlsrv_errors(), true) );
		}
		
		// -------------- Obtener número código de pedido -----
		//Esperar numeración de factura creado
		$retries=0;
		$found=false;
		$error=false;
		while($retries<120 && $found==false && $error===false){
			$sql = 'SELECT fc.[CodFacturaTemp] as CodFacturaTemp, [Texto Error] as error
					FROM [dbo].[Ind. Campollano Ferretería S.L$ICF_FrasCab] fc
					WHERE fc.[CodClientePS]=\'0001\' and fc.[CodPedidoPS]=\''.$code.'\'';
// echo $sql;					
			$smtp=sqlsrv_query( $connNavision, $sql );
			if( $stmt !== false) {
				if($row = sqlsrv_fetch_array( $smtp, SQLSRV_FETCH_ASSOC)){
					if($row['CodFacturaTemp']!=null && $row['CodFacturaTemp']!=0 && $row['CodFacturaTemp']!=''){
						$saleOrderCode=$row['CodFacturaTemp'];
						$found=true;
															
						//Cabecera
						/*
						$sql = "UPDATE ".'dbo.[Ind. Campollano Ferretería S.L$Sales Header]'." SET 
						[Estado Oferta]=0, 
						[Bill-to Customer No.]='".mssql_escape($rowOriginalOrder["Bill-to Customer No."])."',
						[Bill-to Name]='".mssql_escape($rowOriginalOrder["Bill-to Name"])."',
						[Bill-to Name 2]='".mssql_escape($rowOriginalOrder["Bill-to Name 2"])."',
						[Bill-to Address]='".mssql_escape($rowOriginalOrder["Bill-to Address"])."',
						[Bill-to Address 2]='".mssql_escape($rowOriginalOrder["Bill-to Address 2"])."',
						[Bill-to City]='".mssql_escape($rowOriginalOrder["Bill-to City"])."',
						[Bill-to Contact]='".mssql_escape($rowOriginalOrder["Bill-to Contact"])."',
						[Ship-to Code]='".mssql_escape($rowOriginalOrder["Ship-to Code"])."',
						[Ship-to Name]='".mssql_escape($rowOriginalOrder["Ship-to Name"])."',
						[Ship-to Name 2]='".mssql_escape($rowOriginalOrder["Ship-to Name 2"])."',
						[Ship-to Address]='".mssql_escape($rowOriginalOrder["Ship-to Address"])."',
						[Ship-to Address 2]='".mssql_escape($rowOriginalOrder["Ship-to Address 2"])."',
						[Ship-to City]='".mssql_escape($rowOriginalOrder["Ship-to City"])."',
						[Ship-to Contact]='".mssql_escape($rowOriginalOrder["Ship-to Contact"])."',
						[Sell-to Customer Name]='".mssql_escape($rowOriginalOrder["Sell-to Customer Name"])."',
						[Sell-to Customer Name 2]='".mssql_escape($rowOriginalOrder["Sell-to Customer Name 2"])."',
						[Sell-to Address]='".mssql_escape($rowOriginalOrder["Sell-to Address"])."',
						[Sell-to Address 2]='".mssql_escape($rowOriginalOrder["Sell-to Address 2"])."',
						[Sell-to City]='".mssql_escape($rowOriginalOrder["Sell-to City"])."',
						[Sell-to Contact]='".mssql_escape($rowOriginalOrder["Sell-to Contact"])."',
						[Payment Terms Code]='".mssql_escape($rowOriginalOrder["Payment Terms Code"])."',
						[Shipment Method Code]='".mssql_escape($rowOriginalOrder["Shipment Method Code"])."',
						[Ship]='".mssql_escape($rowOriginalOrder["Ship"])."',
						[Invoice]='".mssql_escape($rowOriginalOrder["Invoice"])."',
						[Salesperson Code]='".mssql_escape($rowOriginalOrder["Salesperson Code"])."',
						[Payment Method Code]='".mssql_escape($rowOriginalOrder["Payment Method Code"])."',
						[Shipping Agent Code]='".mssql_escape($rowOriginalOrder["Shipping Agent Code"])."',
						[Invoice Discount Calculation]='".mssql_escape($rowOriginalOrder["Invoice Discount Calculation"])."',
						[Assigned User ID]='".mssql_escape($rowOriginalOrder["Assigned User ID"])."',
						[Creation user]='".mssql_escape($rowOriginalOrder["Creation user"])."',
						[Pedido WEB]='".mssql_escape($rowOriginalOrder["Pedido WEB"])."',
						[External Document No.]='".mssql_escape($rowOriginalOrder["External Document No."])."',		
						[Package Tracking No.]='".$code."'		
						where [No.]='".$saleOrderCode."' and [Document Type]=1";
						$smtpSaveOrder=sqlsrv_query( $connNavision, $sql );
						if( $smtpSaveOrder === false) {
							echo json_encode(["result"=>-9,"text"=>"Error al actualizar la cabecera del pedido TPV"]);
							die;
						}
						//Actualizamos el campo de descuento de las lineas para que se visualice bien en Navision
						$sql = "UPDATE ".'dbo.[Ind. Campollano Ferretería S.L$Sales Line]'."
									SET [% Descuento 1] = (
										SELECT TOP 1 fl.[Descuento]
										FROM ".'[Ind. Campollano Ferretería S.L$ICF_FrasLinea]'." fl
										LEFT JOIN ".'[Ind. Campollano Ferretería S.L$ICF_FrasCab]'." fc ON fc.Cod_FrasCab = fl.Cod_FrasCab
										WHERE fc.CodFacturaTemp = ".'[Ind. Campollano Ferretería S.L$Sales Line]'.".[Document No.] 
										AND fl.NlineaPedido = ".'[Ind. Campollano Ferretería S.L$Sales Line]'.".[Line No.]
									)
								WHERE [Document No.] = '".$saleOrderCode."'";
						$smtpRemainsOrderLines=sqlsrv_query( $connNavision, $sql );
						if( $smtpRemainsOrderLines === false) {
							echo json_encode(["result"=>-10,"text"=>"Error al actualizar el campo descuento de las lineas"]);
							die;
						}*/
						
						// Cliente
						$sql = 'SELECT [Name], [Name 2], [Address], [Address 2], [City], [Contact]
							FROM [dbo].[Ind. Campollano Ferretería S.L$Customer] 
							WHERE [No.]=\''.$header['customer_code'].'\'';
					
						$smtp=sqlsrv_query( $connNavision, $sql );
						if( $stmt !== false) {
							if($row = sqlsrv_fetch_array( $smtp, SQLSRV_FETCH_ASSOC)){
								
								$salesperson = '';
								$sqlSalesPerson='SELECT [Code] from dbo.[Ind. Campollano Ferretería S.L$Salesperson_Purchaser] where [E-Mail]=\''.$agent_email.'\'';
								$smtpSalesPerson=sqlsrv_query( $connNavision, $sqlSalesPerson );								
								$salesperson='';
								if($rowsp = sqlsrv_fetch_array( $smtpSalesPerson, SQLSRV_FETCH_ASSOC)){
									$salesperson=$rowsp["Code"];
								}
								$assignuserid = '';
								$sqlAgent='SELECT [User ID] from dbo.[Ind. Campollano Ferretería S.L$User Setup] where [E-Mail]=\''.$agent_email.'\'';
								$smtpAssignUserId=sqlsrv_query( $connNavision, $sqlAgent );								
								if($rowaui = sqlsrv_fetch_array( $smtpAssignUserId, SQLSRV_FETCH_ASSOC)){
									$assignuserid=$rowaui["Code"];
								}
								// Se quita de pedido web para que no se lance en Navision
								$sql = "UPDATE ".'dbo.[Ind. Campollano Ferretería S.L$Sales Header]'." SET 
								[Bill-to Name]='".mssql_escape($row["Name"])."',
								[Bill-to Name 2]='".mssql_escape($row["Name 2"])."',
								[Bill-to Address]='".mssql_escape($row["Address"])."',
								[Bill-to Address 2]='".mssql_escape($row["Address 2"])."',
								[Bill-to City]='".mssql_escape($row["City"])."',
								[Bill-to Contact]='".mssql_escape($row["Contact"])."',						
								[Sell-to Customer Name]='".mssql_escape($row["Name"])."',
								[Sell-to Customer Name 2]='".mssql_escape($row["Name 2"])."',
								[Sell-to Address]='".mssql_escape($row["Address"])."',
								[Sell-to Address 2]='".mssql_escape($row["Address 2"])."',
								[Sell-to City]='".mssql_escape($row["City"])."',
								[Sell-to Contact]='".mssql_escape($row["Contact"])."',
								[Salesperson Code]='".mssql_escape($salesperson)."',
								[Assigned User ID]='".mssql_escape($assignuserid)."',
								[Creation user]='".mssql_escape($assignuserid)."',
								[Estado Oferta]=0,
								[Pedido WEB]=0												
								WHERE [No.]='".$saleOrderCode."' and [Document Type]=1";
								$smtpSaveOrder=sqlsrv_query( $connNavision, $sql );
								if( $smtpSaveOrder === false) {
									echo json_encode(["result"=>-9,"text"=>"Error al actualizar la cabecera del pedido TPV"]);
									die;
								}	
							}
						}							
						
						// Se reemplaza en Navision el código de pedido generado por el original y se recupera ese código para ser usado por otro pedido
						// Tablas afectadas: ICF_FrasCab, Sales Header, Sales Line
						$sql = "UPDATE ".'[dbo].[Ind. Campollano Ferretería S.L$ICF_FrasCab]'."
									SET [CodFacturaTemp] = '$code'
								WHERE [CodFacturaTemp] = '$saleOrderCode'";
						$smtpOriginalCode=sqlsrv_query( $connNavision, $sql );
						if( $smtpOriginalCode === false) {
							echo json_encode(["result"=>-11,"text"=>"Error al actualizar el campo CodFacturaTemp con el codigo original en la tabla ICF_FrasCab"]);
							die;
						}
						$sql = "UPDATE ".'[dbo].[Ind. Campollano Ferretería S.L$Sales Header]'."
									SET [No.] = '$code'
								WHERE [No.] = '$saleOrderCode'";
	
						$smtpOriginalCode=sqlsrv_query( $connNavision, $sql );
						if( $smtpOriginalCode === false) {						
							echo json_encode(["result"=>-12,"text"=>"Error al actualizar el campo [No.] con el codigo original en la tabla Sales Header"]);
							die;
						}		
						$sql = "UPDATE ".'[dbo].[Ind. Campollano Ferretería S.L$Sales Line]'."
									SET [Document No.] = '$code'
								WHERE [Document No.] = '$saleOrderCode'";
						$smtpOriginalCode=sqlsrv_query( $connNavision, $sql );
						if( $smtpOriginalCode === false) {
							echo json_encode(["result"=>-13,"text"=>"Error al actualizar el campo [Document No.] con el codigo original en la tabla Sales Line"]);
							die;
						}
						// Reutilizar el código para otro pedido
						// Tabla No. Series Line
						$sql='SELECT [Last No. Used] FROM dbo.[Ind. Campollano Ferretería S.L$No. Series Line] sl where sl.[Last No. Used]=\''.$saleOrderCode.'\' AND [Open]=1';
						$stmt_searchMaxNo=sqlsrv_query( $connNavision, $sql );										
						if( $stmt_searchMaxNo !== false) {
							if ($row_searchMaxNo = sqlsrv_fetch_array( $stmt_searchMaxNo, SQLSRV_FETCH_ASSOC)){
								$orderNo = $row_searchMaxNo["Last No. Used"];
								$prefix = substr($orderNo,0,4);
								$suffix = intval(substr($orderNo,4));
								$suffix--;
								$suffix = str_pad($suffix,strlen(substr($orderNo,4)),'0',STR_PAD_LEFT);
								$orderNew = $prefix.$suffix;
								$sql = "UPDATE ".'[dbo].[Ind. Campollano Ferretería S.L$No. Series Line]'."
											SET [Last No. Used] = '$orderNew'
										WHERE [Last No. Used] = '$saleOrderCode' AND [Open]=1";
								$smtpCode=sqlsrv_query( $connNavision, $sql );
								if( $smtpCode === false) {
									echo json_encode(["result"=>-14,"text"=>"Error al actualizar el campo [Last No. Used] con el codigo original en la tabla No. Series Line"]);
									die;
								}
							}
						}
						

						// Se devuelve el código de pedido original ya que se sustituido en Navision
						$saleOrderCode = $code;
					}
					if($row['error']!=null && $row['error']!=''){
						$error=$row['error'];
					}					
				}
			}
			usleep(500000);
			$retries++;
		}
		if($error!==false){
			$error = iconv("UTF-8", "Windows-1252",mb_strtoupper($error, "UTF-8"));	
			echo json_encode(["result"=>-160,"text"=>"Error pedido restos FrasCab: ".$error]);
			die;
		}else
		if(!$found){
			echo json_encode(["result"=>-15,"text"=>"Error, no se pudo obtener la numeracion de pedido de venta"]);
			die;
		}
				
	}
		
}


echo json_encode(["result"=>1, "data"=>["saleOrderCode"=>$saleOrderCode, "text"=>"Pedido de venta creado correctamente"]]);
?>
