<?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");
$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);
}

$email 		= null;
$remains 	= true;
$newRemainsOrder 	= ''; //Almacenara el nuevo pedido de restos generado en Navision
$lines 		= [];

$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"=>-1 , "text"=>"Los datos enviados no son validos"]);
}

if (isset($data['email']))
	$email = $data['email'];
else{
	echo json_encode(["result"=>-1 , "text"=>"No se ha indicado usuario de preparación"]);
	die;
}
	
if (isset($data['remains']))
	$remains = $data['remains'];

if (isset($data['lines']) && count($data['lines'])>0)
	$lines = $data['lines'];
else{
	echo json_encode(["result"=>-1 , "text"=>"No se ha indicado líneas para facturar"]);
	die;
}
$forceCodeUnit=false;
foreach($lines as $line){
	$code = $line['saleorder'];
	if (strtoupper($code[0]) === 'N') {
		// Elimina la primera letra
		$code = substr($code, 1);
	}
	// Identificar el id del FrasCab
	$sql='SELECT Cod_FrasCab FROM dbo.[Ind. Campollano Ferretería S.L$ICF_FrasCab] fc where fc.[CodFacturaTemp]=\''.$code.'\'';

	$stmt_sale = 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. SQL:".$sql]);
		var_dump(sqlsrv_errors(SQLSRV_ERR_ERRORS));
		die;
	}
	if( $stmt_sale !== false) {
		if ($row2 = sqlsrv_fetch_array( $stmt_sale, SQLSRV_FETCH_ASSOC)){			
			$codfrabcab = $row2['Cod_FrasCab'];
			$afrascab['F'.$codfrabcab]=1; // Pedidos distintos
			if ($codfrabcab){
				$forceCodeUnit=true;
				//$sql = "UPDATE ".'[Ind. Campollano Ferretería S.L$ICF_FrasLinea]'." set [ProcesarFactura]=1, [CantidadAFacturar]=".$line['quantity'].", [CodAlmacen]='".$line['store']."' where [Cod_FrasCab]=".$codfrabcab." and [Cod_NAV]='".$line['productcode']."'".($line['variant']?" and [Variante]='".$line['variant']."'":'');
				$sql = "UPDATE ".'[Ind. Campollano Ferretería S.L$ICF_FrasLinea]'." set [ProcesarFactura]=1, [CantidadAFacturar]=".$line['quantity'].", [CodAlmacen]='".$line['store']."' where [Cod_FrasCab]=".$codfrabcab." and [Cod_NAV]='".$line['productcode']."'".($line['variant']?" and [Variante]='".$line['variant']."'":'').($line['linenum'] && intval($line['linenum'])!=0?" and [NlineaPedido]=".$line['linenum']:"");
				$stmt = sqlsrv_query( $connNavision, $sql );
				if( $stmt === false) {
					echo json_encode(["result"=>-3,"text"=>"Error al actualizar las lineas"]);
					die( print_r( sqlsrv_errors(), true) );
				}									
			}
		}
	}
}

// Marcar cabeceraws de pedidos
// Marcar las líneas restantes del albarán con ProcesarAlbaran=1 y CantidadAProcesar=0
foreach($afrascab as $codfrabcab=>$value){
	$codfrabcab = substr($codfrabcab, 1);
	// Cabecera
	$sql = "UPDATE ".'[Ind. Campollano Ferretería S.L$ICF_FrasCab]'." set [AnularRestos]=1, [ProcesarFactura]=1, [codPreparacion]=isnull((select Code from ".'[Ind. Campollano Ferretería S.L$Salesperson_Purchaser]'." where [E-Mail] LIKE '".$email."'),'12') where [Cod_FrasCab]='".$codfrabcab."'";
	$stmt = sqlsrv_query( $connNavision, $sql );
	if( $stmt === false) {
		echo json_encode(["result"=>-4,"text"=>"Error al actualizar la cabecera"]);
		die( print_r( sqlsrv_errors(), true) );		
	}	
	// Líneas restantes
	$sql = "UPDATE ".'[Ind. Campollano Ferretería S.L$ICF_FrasLinea]'." set [ProcesarFactura]=1, [CantidadAFacturar]=0 where [Cod_FrasCab]=".$codfrabcab." and [ProcesarFactura]=0";
	$stmt = sqlsrv_query( $connNavision, $sql );
	if( $stmt === false) {
		echo json_encode(["result"=>-5,"text"=>"Error al actualizar las lineas restantes"]);
		die( print_r( sqlsrv_errors(), true) );
	}	
}

// Crear pedido con los restos
$Cod_FrasCab = null;
$lineremains = [];
if ($remains){	
	// Comprobar que no existe en ICF_FrasCab
	$sql='SELECT count(*) as ncount FROM dbo.[Ind. Campollano Ferretería S.L$ICF_FrasCab] fc where fc.[CodClientePS]=\'0001\' and fc.[CodPedidoPS]=\''.$code.'\'';
	//echo $sql;
	$stmt_sale = sqlsrv_query( $connNavision, $sql);	
	if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
		echo json_encode(["result"=>-5, "text"=>"1 Ocurrio un error en la consulta SQL de Navision: ICF_FrasCab"]);
		die;
	}
	if( $stmt_sale !== false) {
		$salefrascab=[];
		while($row2 = sqlsrv_fetch_array( $stmt_sale, SQLSRV_FETCH_ASSOC)){			
			foreach($row2 as $key=>$object){
				$salefrascab[$key]=!is_object($object)?utf8_encode($object):$object;
			}			
		}
		if (isset($salefrascab['ncount']) && $salefrascab['ncount']!='' && intval($salefrascab['ncount'])==0){
			// Comprobar que si existe en ICF_FrasCab y este albaranado
			$sql='SELECT * FROM dbo.[Ind. Campollano Ferretería S.L$ICF_FrasCab] fc where fc.[CodFacturaTemp]=\''.$code.'\' and fc.[NoAlbaran] is not null and ltrim(fc.[NoAlbaran])<>\'\'';
			//echo $sql;
			$stmt_sale = sqlsrv_query( $connNavision, $sql);	
			if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
				echo json_encode(["result"=>-6, "text"=>"Ocurrio un error en la consulta SQL de Navision: ICF_FrasCab"]);
				die;
			}
			if( $stmt_sale !== false) {
				$salefrascab=[];
				while($row2 = sqlsrv_fetch_array( $stmt_sale, SQLSRV_FETCH_ASSOC)){			
					foreach($row2 as $key=>$object){
						$salefrascab[$key]=!is_object($object)?$object:$object;
					}			
				}	

				$codfrascab = $salefrascab['Cod_FrasCab'];
				//echo '<pre>'.print_r($salefrascab,true).'</pre>';
				//Insertamos cabecera del pedido en ICF_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")."',
				'".date("1754-01-01 00:00:00.000")."',
				'0001',
				'".mssql_escape($salefrascab['Nombre'])."',
				'".mssql_escape($salefrascab['Apellido1'])."',
				'".mssql_escape($salefrascab['Apellido2'])."',
				'".mssql_escape($salefrascab['Direccion1'])."',
				'".mssql_escape($salefrascab['Direccion2'])."',
				'".mssql_escape($salefrascab['CP'])."',
				'".mssql_escape($salefrascab['Poblacion'])."',
				'".mssql_escape($salefrascab['Provincia'])."',
				'".mssql_escape($salefrascab['Contacto'])."',
				'".mssql_escape($salefrascab['TerminosPago'])."',
				'".mssql_escape($salefrascab['FormaPago'])."',
				'".date("d-m-Y")."',
				'".date("d-m-Y")."',
				'".mssql_escape($salefrascab['TextoRegistro'])."',
				'".mssql_escape($salefrascab['DNI'])."',
				'".mssql_escape($salefrascab['Telefono'])."',
				'".mssql_escape($salefrascab['CodClientePagadorPS'])."',
				'".mssql_escape($salefrascab['NombrePagador'])."',
				'".mssql_escape($salefrascab['Apellido1Pagagor'])."',
				'".mssql_escape($salefrascab['Apellido2Pagagor'])."',
				' ',
				0,
				'',
				'".mssql_escape($salefrascab['Direccion1Envio'])."',
				'".mssql_escape($salefrascab['Direccion2Envio'])."',
				'".mssql_escape($salefrascab['CPEnvio'])."',
				'".mssql_escape($salefrascab['PoblacionEnvio'])."',
				'".mssql_escape($salefrascab['ProvinciaEnvio'])."',
				'".mssql_escape($code)."',
				'".mssql_escape($salefrascab['Observaciones'])."',
				'".mssql_escape($salefrascab['CodCliente'])."',
				'".mssql_escape($salefrascab['RefPedidoPS'])."',
				'".mssql_escape($salefrascab['EmpresaPagador'])."',
				'".mssql_escape($salefrascab['EmpresaEnvios'])."',
				'".mssql_escape($salefrascab['Email'])."',
				'',
				0,
				0,
				0,
				0,
				' ',
				0,
				' ',
				0);";
							
				//echo $sql;
				$stmt = sqlsrv_query( $connNavision, $sql );
				if( $stmt === false) {
					die( print_r( sqlsrv_errors(), true) );
				}
				//Obtener el id que se acaba de insertar
				$sql='SELECT MAX(Cod_FrasCab) Cod_FrasCab FROM [Ind. Campollano Ferretería S.L$ICF_FrasCab]';
				$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"];
									
				//Creamos las líneas del pedido
				$sql = 'SELECT * from [Ind. Campollano Ferretería S.L$ICF_FrasLinea] fl where fl.[Cod_FrasCab]=\''.$codfrascab.'\'';
				$stmt_saleline = sqlsrv_query( $connNavision, $sql);
				if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
					echo json_encode(["result"=>-7, "text"=>"1 Ocurrio un error en la consulta SQL de Navision: Lineas de Ventas"]);
					print_r(sqlsrv_errors(SQLSRV_ERR_ERRORS));
					die;
				}
				$salelines=[];
				if( $stmt_saleline !== false) {
					while($row3 = sqlsrv_fetch_array( $stmt_saleline, SQLSRV_FETCH_ASSOC)){			
						$saleline=[];
						foreach($row3 as $key=>$object){
							//$saleline[$key]=!is_object($object)?utf8_encode($object):$object;
							$saleline[$key]=!is_object($object)?$object:$object;
						}
						if ($saleline['Cantidad']==null || $saleline['Cantidad']=='') $saleline['Cantidad']=0;
						if ($saleline['CantidadAFacturar']==null || $saleline['CantidadAFacturar']=='') $saleline['CantidadAFacturar']=0;
						$salelines[] = $saleline;
					}
				}				
				
				//var_dump($salelines);
				$line = 0;
				foreach($salelines as $saleline){
					if ($saleline['Cantidad']==0 || $saleline['Cantidad']==$saleline['CantidadAFacturar'])
						continue;
					$newqty = $saleline['Cantidad']-$saleline['CantidadAFacturar'];
					$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."',
						'".$saleline['Cod_NAV']."',
						'".$newqty."',
						'".$saleline['Descripcion']."',
						'".$saleline['PrecioVenta']."',
						'".$saleline['GrupoIva']."',
						'".$saleline['Descuento']."',
						'".($newqty*$saleline['PrecioVenta'])."',
						0,
						'".$saleline['Variante']."',
						0,
						0,
						0,
						'".$saleline['CodAlmacen']."',
						0,
						0,
						0,
						".$saleline['NlineaPedido']."
					);";
					
					$stmt = sqlsrv_query( $connNavision, $sql );
					//echo $sql."<br>";
					if( $stmt === false) {
						die( print_r( sqlsrv_errors(), true) );
					}
					$lineremain = [];
					$lineremain['productcode'] = $saleline['Cod_NAV'];
					$lineremain['productname'] = $saleline['Descripcion'].($saleline['Variante']&& $saleline['Variante']!=''?' - '.$saleline['Variante']:'');
					$lineremain['quantity']    = $newqty;
					$lineremains[] = $lineremain;					
				}				
			}
		}
	}
}
	

//Si hemos solicitado la creacion de factura, forzamos la ejecucion del CodeUnit y el pedido de restos en su caso
if($forceCodeUnit){	
	$sql = "INSERT INTO ".'[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')";
		
	$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) );
	}
}


// Esperar cod. pedido de restos de Navision
if ($remains && $Cod_FrasCab){	
	$retries=0;
	$found=false;
	while($retries<60 && $found==false){
		$sql = 'SELECT CodFacturaTemp FROM [dbo].[Ind. Campollano Ferretería S.L$ICF_FrasCab] WHERE [Cod_FrasCab]=\''.$Cod_FrasCab.'\'';
		$smtp=sqlsrv_query( $connNavision, $sql );
		if($row = sqlsrv_fetch_array( $smtp, SQLSRV_FETCH_ASSOC)){
			if($row['CodFacturaTemp']!=null && $row['CodFacturaTemp']!=0){
				$newRemainsOrder = $row['CodFacturaTemp'];
				// Cabecera
				//Modificamos el pedido generado de restos para ajustar los datos de cabecera con el pedido original
				
				$sql = 'SELECT * FROM [dbo].[Ind. Campollano Ferretería S.L$Sales Header] WHERE [No.]=\''.$code.'\'';
				$smtpOriginalOrder=sqlsrv_query( $connNavision, $sql );
				if($rowOriginalOrder = sqlsrv_fetch_array( $smtpOriginalOrder, SQLSRV_FETCH_ASSOC)){
					$sql = "UPDATE ".'[Ind. Campollano Ferretería S.L$Sales Header]'." SET 
					[Estado Oferta]=0, 
					[Bill-to Customer No.]='".$rowOriginalOrder["Bill-to Customer No."]."',
					[Bill-to Name]='".$rowOriginalOrder["Bill-to Name"]."',
					[Bill-to Name 2]='".$rowOriginalOrder["Bill-to Name 2"]."',
					[Bill-to Address]='".$rowOriginalOrder["Bill-to Address"]."',
					[Bill-to Address 2]='".$rowOriginalOrder["Bill-to Address 2"]."',
					[Bill-to City]='".$rowOriginalOrder["Bill-to City"]."',
					[Bill-to Contact]='".$rowOriginalOrder["Bill-to Contact"]."',
					[Ship-to Code]='".$rowOriginalOrder["Ship-to Code"]."',
					[Ship-to Name]='".$rowOriginalOrder["Ship-to Name"]."',
					[Ship-to Name 2]='".$rowOriginalOrder["Ship-to Name 2"]."',
					[Ship-to Address]='".$rowOriginalOrder["Ship-to Address"]."',
					[Ship-to Address 2]='".$rowOriginalOrder["Ship-to Address 2"]."',
					[Ship-to City]='".$rowOriginalOrder["Ship-to City"]."',
					[Ship-to Contact]='".$rowOriginalOrder["Ship-to Contact"]."',
					[Sell-to Customer Name]='".$rowOriginalOrder["Sell-to Customer Name"]."',
					[Sell-to Customer Name 2]='".$rowOriginalOrder["Sell-to Customer Name 2"]."',
					[Sell-to Address]='".$rowOriginalOrder["Sell-to Address"]."',
					[Sell-to Address 2]='".$rowOriginalOrder["Sell-to Address 2"]."',
					[Sell-to City]='".$rowOriginalOrder["Sell-to City"]."',
					[Sell-to Contact]='".$rowOriginalOrder["Sell-to Contact"]."',
					[Payment Terms Code]='".$rowOriginalOrder["Payment Terms Code"]."',
					[Shipment Method Code]='".$rowOriginalOrder["Shipment Method Code"]."',
					[Ship]='".$rowOriginalOrder["Ship"]."',
					[Invoice]='".$rowOriginalOrder["Invoice"]."',
					[Salesperson Code]='".$rowOriginalOrder["Salesperson Code"]."',
					[Payment Method Code]='".$rowOriginalOrder["Payment Method Code"]."',
					[Shipping Agent Code]='".$rowOriginalOrder["Shipping Agent Code"]."',
					[Invoice Discount Calculation]='".$rowOriginalOrder["Invoice Discount Calculation"]."',
					[Assigned User ID]='".$rowOriginalOrder["Assigned User ID"]."',
					[Creation user]='".$rowOriginalOrder["Creation user"]."',
					[Pedido WEB]='".$rowOriginalOrder["Pedido WEB"]."',
					[External Document No.]='".$rowOriginalOrder["External Document No."]."',		
					[Package Tracking No.]='".$code."'		
					where [No.]='".$newRemainsOrder."' and [Document Type]=1";
					$smtpSaveOrder=sqlsrv_query( $connNavision, $sql );
					if( $smtpSaveOrder === false) {
						echo json_encode(["result"=>-14,"text"=>"Error al actualizar la cabecera del pedido de restos"]);
						die( print_r( sqlsrv_errors(), true) );
					}
					//Actualizamos el campo de descuento de las lineas para que se visualice bien en Navision
					$sql = "UPDATE ".'[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.] = '".$newRemainsOrder."';";
					$smtpRemainsOrderLines=sqlsrv_query( $connNavision, $sql );
					if( $smtpRemainsOrderLines === false) {
						echo json_encode(["result"=>-15,"text"=>"Error al actualizar la el campo descuento de las lineas"]);
						die( print_r( sqlsrv_errors(), true) );
					}
					
					
				}
				/*
				$sql = "UPDATE ".'[Ind. Campollano Ferretería S.L$Sales Header]'." set [Estado Oferta]=0, [Status]=1 where [No.]='".$row['CodFacturaTemp']."' and [Document Type]=1";
				$stmt = sqlsrv_query( $connNavision, $sql );
				if( $stmt === false) {
					echo json_encode(["result"=>-9,"text"=>"Error al actualizar la cabecera"]);
					die( print_r( sqlsrv_errors(), true) );
				}*/		
				$found=true;
			}		
		}
		usleep(500000);
		$retries++;
		
	}
}
/*
if ($remains && count($lineremains)>0){
	$messages = [];
	$messages[] = "***FALTAS EN EL PEDIDO ".$code."***";
	foreach($lineremains as $lineremain){
	  $messages[] = '- ('.$lineremain['productcode'].') '.$lineremain['productname'].' ^| Cantidad: '.$lineremain['quantity'];
	}
	$discordmessage = [];
	$discordmessage['channel'] = $sDiscordChannel;
	$discordmessage['messages']= $messages;
	$command = 'start php "' . addslashes($scriptPath) . '" "' . addslashes(json_encode($discordmessage)).'"';
    // Ejecutar el comando
    pclose(popen($command, 'r'));
}*/

echo json_encode(["result"=>1, "data"=>["remainsOrder"=>$newRemainsOrder], "text"=>"Factura creada correctamente"]);
?>
