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

$email		 		= null;
$remains 			= true;
$newRemainsOrder 	= ''; //Almacenara el nuevo pedido de restos generado en Navision
$deliveryNoteCode	= ''; //Almacenara el nuevo numero de albarán del pedido
$invoiceCode		= ''; //Almacenara el nuevo numero de factura del pedido
$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"=>-2 , "text"=>"Los datos enviados no son validos"]);
}

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

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 facturar"]);
	die;
}
$lines=$data['lines'];

/**
 * ===============================================================================
 *                     PETICION DE FACTURADO A NAVISION
 * ===============================================================================
 */
$forceCodeUnit	= false;
$codfrascab		= null;
$code 			= '';

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 si no se ha obtenido aun (primera vuelta del bucle)
	// El codigo de pedido se pasa en cada linea pero siempre debe ser el mismo por que solo facturamos pedidos individualmente
	if(!$codfrascab){
		$sql='SELECT Cod_FrasCab FROM dbo.[Ind. Campollano Ferretería S.L$ICF_FrasCab] fc where fc.[CodFacturaTemp]=\''.$code.'\'';
// echo utf8_encode($sql)."<br>";		

		$stmtFrasCab = 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( $stmtFrasCab !== false) {
			if (!$rowFrasCab = sqlsrv_fetch_array( $stmtFrasCab, SQLSRV_FETCH_ASSOC)){			
				echo json_encode(["result"=>-6, "text"=>"No se pudo obtener el Cod_FrasCab"]);
				die;
			}
		}
		$codfrascab = $rowFrasCab['Cod_FrasCab'];
		$forceCodeUnit=true;
	}
	//Ya tenemos codFrasCab
	if ($codfrascab){			
		$sql = "UPDATE ".'dbo.[Ind. Campollano Ferretería S.L$ICF_FrasLinea]'." set [ProcesarFactura]=1, [CantidadAFacturar]=".$line['quantity'].", [CodAlmacen]='".$line['store']."' where [Cod_FrasCab]=".$codfrascab." and [Cod_NAV]='".$line['productcode']."'".(isset($line['variant'])?" and [Variante]='".$line['variant']."'":'').($line['linenum'] && intval($line['linenum'])!=0?" and [NlineaPedido]=".$line['linenum']:"");
// echo utf8_encode($sql)."<br>";				
		$stmt = sqlsrv_query( $connNavision, $sql );
		if( $stmt === false) {
			echo json_encode(["result"=>-7,"text"=>"Error al actualizar la lineas de FrasLinea"]);
			die;
		}	
	    // 2024-12-18 Si no coincide por el NlineaPedido se quita
		$rowsAffected = sqlsrv_rows_affected($stmt);
		if ($rowsAffected === false) {
			echo json_encode(["result"=>-7,"text"=>"Error al actualizar la lineas de FrasLinea. No se obtiene líneas afectada"]);
			die;
		} elseif ($rowsAffected === 0) {
			$sql = "UPDATE ".'dbo.[Ind. Campollano Ferretería S.L$ICF_FrasLinea]'." set [ProcesarFactura]=1, [CantidadAFacturar]=".$line['quantity'].", [CodAlmacen]='".$line['store']."' where [Cod_FrasCab]=".$codfrascab." and [Cod_NAV]='".$line['productcode']."' and [Cantidad]='".$line['saleorderqty']."'".(isset($line['variant'])?" and [Variante]='".$line['variant']."'":'');
			$stmt = sqlsrv_query( $connNavision, $sql );
			if( $stmt === false) {
				echo json_encode(["result"=>-7,"text"=>"Error al actualizar la lineas de FrasLinea quitando NlineaPedido"]);
				die;
			}
		} 
		
	}else{
		echo json_encode(["result"=>-8, "text"=>"Error, no se dispone de Cod_FrasCab"]);
		die;
	}
}

if(!$codfrascab){
	echo json_encode(["result"=>-9, "text"=>"Error, no se dispone de Cod_FrasCab tras analizar las lineas"]);
	die;
}

// Marcar la cabecera de FrasCab 
// Marcar las líneas restantes (con cantidad 0) del albarán con ProcesarFactura=1 y CantidadAFacturar=0
// fraslinea se pone cantidad a 0 para que cuando sea procesado 	
$sql = "UPDATE ".'dbo.[Ind. Campollano Ferretería S.L$ICF_FrasLinea]'." set [ProcesarFactura]=1, [CantidadAFacturar]=0 where [Cod_FrasCab]=".$codfrascab." and [ProcesarFactura]=0";
// echo utf8_encode($sql)."<br>";		
$stmtUpdateFrasLinea = sqlsrv_query( $connNavision, $sql );
if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
	echo json_encode(["result"=>-10, "text"=>"Error al actualizar las lineas restantes"]);
	die;
}
// Cabecera (se hace lo último para que no se ejecute el disparador de codeunit)
$sql = "UPDATE ".'dbo.[Ind. Campollano Ferretería S.L$ICF_FrasCab]'." set [AnularRestos]=0, [ProcesarFactura]=1, [codPreparacion]=isnull((select Code from ".'[Ind. Campollano Ferretería S.L$Salesperson_Purchaser]'." where [E-Mail] LIKE '".$email."'),'12') where [Cod_FrasCab]='".$codfrascab."'";
// echo utf8_encode($sql)."<br>";		
$stmtUpdateFrasCab = sqlsrv_query( $connNavision, $sql );
if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
	echo json_encode(["result"=>-11,"text"=>"Error al actualizar la cabecera"]);
	die;		
}
//********************************************************************************* */

/**
 * ===============================================================================
 *                            CREACION DE PEDIDO DE RESTOS
 * ===============================================================================
 */
 
// ABM 2024-11-14 Si no quedan líneas de restos aunque se indique no se crea
if ($remains){	
	$sql = 'SELECT * from dbo.[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"=>-3, "text"=>"1 Ocurrio un error en la consulta SQL de Navision: Lineas de Ventas"]);
		die;
	}
	$salelines=[];
	if( $stmt_saleline !== false) {
		while($saleline = sqlsrv_fetch_array( $stmt_saleline, SQLSRV_FETCH_ASSOC)){			
			if ($saleline['Cantidad']==null || $saleline['Cantidad']=='') $saleline['Cantidad']=0;
			if ($saleline['CantidadAFacturar']==null || $saleline['CantidadAFacturar']=='') $saleline['CantidadAFacturar']=0;
			$salelines[] = $saleline;
		}
	}
	$remains = false;
	foreach($salelines as $saleline){
		if ($saleline['Cantidad']!=0 && $saleline['Cantidad']>$saleline['CantidadAFacturar'])
			$remains = true;
	}
}
 
$Cod_FrasCab = null;
$lineremains = [];
if ($remains){	
	// Comprobar que no existe ya el pedido de restos en ICF_FrasCab para evitar duplicidades
	$remainsCodFrasCab=null;
	$sql='SELECT Cod_FrasCab FROM dbo.[Ind. Campollano Ferretería S.L$ICF_FrasCab] fc where fc.[CodClientePS]=\'0001\' and fc.[CodPedidoPS]=\''.$code.'\'';
// echo utf8_encode($sql)."<br>";			
	$stmtRemainsExist = sqlsrv_query( $connNavision, $sql);	
	if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
		echo json_encode(["result"=>-12, "text"=>"1 Ocurrio un error en la consulta SQL de Navision: ICF_FrasCab"]);
		die;
	}
	if( $stmtRemainsExist !== false) {
		if($rowRemainsExist = sqlsrv_fetch_array( $stmtRemainsExist, SQLSRV_FETCH_ASSOC)){			
			$remainsCodFrasCab=$rowRemainsExist["Cod_FrasCab"];
		}
	}
	//Si no hay ningun pedido de restos generado lo creamos
	//TODO: Posible mejora, modificar el pedido de restos si este no esta ya lanzado
	if(!$remainsCodFrasCab){
		$sql='SELECT * FROM dbo.[Ind. Campollano Ferretería S.L$ICF_FrasCab] fc where fc.[CodFacturaTemp]=\''.$code.'\'';
// echo utf8_encode($sql)."<br>";				
		$stmtOriginalOrder = sqlsrv_query( $connNavision, $sql);	
		if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
			echo json_encode(["result"=>-13, "text"=>"Ocurrio un error en la consulta SQL de Navision: ICF_FrasCab"]);
			die;
		}
		if($salefrascab = sqlsrv_fetch_array( $stmtOriginalOrder, SQLSRV_FETCH_ASSOC)){			
			//Insertamos cabecera del pedido en ICF_FrasCab	
			$sql = "INSERT INTO ".'dbo.[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 utf8_encode($sql)."<br>";			
			$stmt = sqlsrv_query( $connNavision, $sql );
			if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
				echo json_encode(["result"=>-14, "text"=>"Error al insertar lineas del pedido de restos"]);
				die;
			}
			//Obtener el id que se acaba de insertar
			$sql='SELECT MAX(Cod_FrasCab) Cod_FrasCab FROM dbo.[Ind. Campollano Ferretería S.L$ICF_FrasCab]';
// echo utf8_encode($sql)."<br>";					
			$stmt = sqlsrv_query( $connNavision, $sql );
			if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
				echo json_encode(["result"=>-15, "text"=>"Error al ejecutar sentencia para obtener el numero de FrasCab de cabecera"]);
				die;
			}
			if (!$row_max = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){
				echo json_encode(["result"=>-16, "text"=>"Error al obtener el numero de FrasCab de cabecera"]);
				die;
			}
			$Cod_FrasCab=$row_max["Cod_FrasCab"];			

			//Creamos las líneas del pedido
			$sql = 'SELECT * from dbo.[Ind. Campollano Ferretería S.L$ICF_FrasLinea] fl where fl.[Cod_FrasCab]=\''.$codfrascab.'\'';
// echo utf8_encode($sql)."<br>";					
			$stmt_saleline = sqlsrv_query( $connNavision, $sql);
			if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
				echo json_encode(["result"=>-17, "text"=>"1 Ocurrio un error en la consulta SQL de Navision: Lineas de Ventas"]);
				die;
			}
			$salelines=[];
			if( $stmt_saleline !== false) {
				while($saleline = sqlsrv_fetch_array( $stmt_saleline, SQLSRV_FETCH_ASSOC)){			
					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'];
				if($newqty<0) $newqty=0;
				$line++;
				$sql = "INSERT INTO ".'dbo.[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['Cod_NAV'])."',
					'".$newqty."',
					'".mssql_escape($saleline['Descripcion'])."',
					'".$saleline['PrecioVenta']."',
					'".$saleline['GrupoIva']."',
					'".$saleline['Descuento']."',
					'".($newqty*$saleline['PrecioVenta'])."',
					0,
					'".mssql_escape($saleline['Variante'])."',
					0,
					0,
					0,
					'".mssql_escape($saleline['CodAlmacen'])."',
					0,
					0,
					0,
					".$saleline['NlineaPedido']."
				);";
// echo utf8_encode($sql)."<br>";						
				$stmt = sqlsrv_query( $connNavision, $sql );
				if(sqlsrv_errors(SQLSRV_ERR_ERRORS)!==NULL) {
					echo json_encode(["result"=>-18,"text"=>"Error al insertar línea de restos"]);
					die;
				}
				$lineremain = [];
				$lineremain['productcode'] = $saleline['Cod_NAV'];
				$lineremain['productname'] = $saleline['Descripcion'].($saleline['Variante']&& $saleline['Variante']!=''?' - '.$saleline['Variante']:'');
				$lineremain['quantity']    = $newqty;
				$lineremains[] = $lineremain;					
				
			}			
		}
	}
}
//********************************************************************************* */

/**
 * ===============================================================================
 *                      PETICION DE EJECUCIÓN DE CODEUNIT
 * ===============================================================================
 */

//Si hemos solicitado la creacion de factura, forzamos la ejecucion del CodeUnit y el pedido de restos en su caso
$forceCodeUnit=true;
if($forceCodeUnit){	
	$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')";
	$stmt = sqlsrv_query( $connNavision, $sql );
	if( $stmt === false) {
		echo json_encode(["result"=>-19,"text"=>"Error al solicitar ejecucion de CodeUnit"]);
		die( print_r( sqlsrv_errors(), true) );
	}
	/*$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,50004,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"=>-20,"text"=>"Error al solicitar ejecucion de CodeUnit"]);
		die( print_r( sqlsrv_errors(), true) );
	}*/
}
//Esperar numeración de factura creado
$retries=0;
$found=false;
$error=false;
while($retries<120 && $found==false){
	$sql = 'SELECT fc.[NoAlbaran],fc.[CodFacturaReg], ih.[Hora registro], ih.[Document Date], fc.[Texto Error] as error
			FROM [dbo].[Ind. Campollano Ferretería S.L$ICF_FrasCab] fc
			LEFT JOIN [dbo].[Ind. Campollano Ferretería S.L$Sales Invoice Header] ih ON ih.[No.]=fc.[CodFacturaReg]
			WHERE [CodFacturaTemp]=\''.$code.'\'';
// echo utf8_encode($sql)."<br>";					
	$smtp=sqlsrv_query( $connNavision, $sql );
	if( $stmt !== false) {
		if($row = sqlsrv_fetch_array( $smtp, SQLSRV_FETCH_ASSOC)){
			if($row['NoAlbaran']!=null && $row['NoAlbaran']!=0 && $row['NoAlbaran']!='' && $row['CodFacturaReg']!=null && $row['CodFacturaReg']!=0 && $row['CodFacturaReg']!=''){
				$deliveryNoteCode=$row['NoAlbaran'];
				$invoiceCode=$row['CodFacturaReg'];
				$invoiceDate=$row['Document Date']->format('Y-m-d').' '.$row['Hora registro']->format('H:i:s');
				$found=true;
			}
			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"=>-210,"text"=>"Error factura FrasCab: ".$error]);
	die;
}else
if(!$found){
	echo json_encode(["result"=>-21,"text"=>"Error, no se pudo obtener la numeracion de la factura"]);
	die;
}

// Esperar numeración de pedido de venta con restos de Navision
if ($remains && $Cod_FrasCab){	
	$retries=0;
	$found=false;
	$error=false;
	while($retries<60 && $found==false && $error===false){
		$sql = 'SELECT CodFacturaTemp, [Texto Error] as error FROM [dbo].[Ind. Campollano Ferretería S.L$ICF_FrasCab] WHERE [Cod_FrasCab]=\''.$Cod_FrasCab.'\'';
// echo utf8_encode($sql)."<br>";				
		$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.'\'';
// echo utf8_encode($sql)."<br>";						
				$smtpOriginalOrder=sqlsrv_query( $connNavision, $sql );
				if($rowOriginalOrder = sqlsrv_fetch_array( $smtpOriginalOrder, SQLSRV_FETCH_ASSOC)){
					$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.]='".$newRemainsOrder."' and [Document Type]=1";
// echo utf8_encode($sql)."<br>";							
					$smtpSaveOrder=sqlsrv_query( $connNavision, $sql );
					if( $smtpSaveOrder === false) {
						echo json_encode(["result"=>-22,"text"=>"Error al actualizar la cabecera del pedido de restos"]);
						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.] = '".$newRemainsOrder."';";
// echo utf8_encode($sql)."<br>";									
					$smtpRemainsOrderLines=sqlsrv_query( $connNavision, $sql );
					if( $smtpRemainsOrderLines === false) {
						echo json_encode(["result"=>-23,"text"=>"Error al actualizar el campo descuento de las lineas"]);
						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
					/*$codenew = $code;
					$prefixcodenew = substr($codenew, 0, strrpos($codenew, '-'));
					$rest = substr($codenew, strrpos($codenew, '-')+1);
					$i = 0;
					if (strlen($rest)>1 && $rest[0]=='R')
						$i = intval(substr($rest,1));
					else
						$prefixcodenew = $codenew;
					$i++;
					$rest = '-R'.$i;
					$codenew = $prefixcodenew.$rest;
					
					$sql = "UPDATE ".'[dbo].[Ind. Campollano Ferretería S.L$ICF_FrasCab]'."
								SET [CodFacturaTemp] = '$codenew'
							WHERE [CodFacturaTemp] = '$newRemainsOrder'";
					$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.] = '$codenew'
							WHERE [No.] = '$newRemainsOrder'";
					$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.] = '$codenew'
							WHERE [Document No.] = '$newRemainsOrder'";
					$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]=\''.$newRemainsOrder.'\' 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] = '$newRemainsOrder' 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
					$newRemainsOrder = $codenew;*/


				}
				

				$found=true;				
			}
			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"=>-240,"text"=>"Error pedido restos FrasCab: ".$error]);
		die;
	}else
	if(!$found){
		echo json_encode(["result"=>-24,"text"=>"Error, no se pudo obtener la numeracion del pedido de restos"]);
		die;
	}
}

//********************************************************************************* */

/**
 * ===============================================================================
 *                    ANULACIÓN DE RESTOS DEL PEDIDO ORIGINAL
 * ===============================================================================
 */


$sql = "SELECT * FROM ".'[Ind. Campollano Ferretería S.L$Sales Line]'." WHERE [Document No.] = '".$code."'";
// echo utf8_encode($sql)."<br>";		
$smtpSaleLines=sqlsrv_query( $connNavision, $sql );
while($rowLines = sqlsrv_fetch_array( $smtpSaleLines, SQLSRV_FETCH_ASSOC)){			
	// Buscar en el subarray lines
	$found = null;
	foreach ($data['lines'] as $line) {
		if(isset($line['variant'])){
			if ($line['linenum'] == $rowLines["Line No."] && $line['productcode'] == $rowLines['No.'] && $line['variant'] == $rowLines["Variant Code"]) {
				$found = $line;
				break;
			}else{
				if ($line['productcode'] == $rowLines['No.'] && $line['variant'] == $rowLines["Variant Code"]) {
					$found = $line;
					break;
				}
			}			
		}else{
			if ($line['linenum'] == $rowLines["Line No."] && $line['productcode'] == $rowLines['No.']) {
				$found = $line;
				break;
			}else{
				if ($line['productcode'] == $rowLines['No.']) {
					$found = $line;
					break;
				}
			}				
		}
	}	
	
	$quantitysend=0;
	if ($found) {
		$quantitysend = $found["quantity"];
	}
	//Si la cantidad servida es distinta a la que tenia el pedido actualizamos el pedido original y nos aseguramos que la
	//cantidad resultante sea mayor o igual que 0 para evitar negativos como se generaban en los pedidos con restos anulados del FrasCab		
	if($quantitysend!=$rowLines["Quantity"] && $quantitysend>=0){
		$sql = 'UPDATE dbo.[Ind. Campollano Ferretería S.L$Sales Line]'." SET
			[Quantity]= ".$quantitysend.",
			[Outstanding Quantity]=0,
			[Outstanding Amount]=0,
			[Outstanding Amount (LCY)]=0,
			[Outstanding Qty. (Base)]=0,
			[Inv. Discount Amount]=0,
			[Qty. to Invoice]=0,
			[Qty. to Ship]=0,
			[Line Discount Amount]= ROUND(( ".$quantitysend." * [Unit Price]) * ([Line Discount %]/100),2),
			[Amount]=ROUND(( ".$quantitysend." * [Unit Price]) * ((100-[Line Discount %])/100),2),
			[Amount Including VAT]=ROUND((( ".$quantitysend." * [Unit Price]) * ((100-[Line Discount %])/100))*(([VAT %]+100)/100),2),
			[Qty. Shipped Not Invoiced]=  0,
			[Shipped Not Invoiced]=0,
			[Quantity Shipped]=".$quantitysend.",
			[Quantity Invoiced]=".$quantitysend.",
			[Shipped Not Invoiced (LCY)]=0,
			[VAT Base Amount]=ROUND(( ".$quantitysend." * [Unit Price]) * ((100-[Line Discount %])/100),2),
			[Line Amount]=ROUND(( ".$quantitysend." * [Unit Price]) * ((100-[Line Discount %])/100),2),			
			[Inv. Disc. Amount to Invoice]=0,
			[Quantity (Base)]= ".$quantitysend.",
			[Qty. to Invoice (Base)]= 0,
			[Qty. to Ship (Base)]=0,
			[Qty. Shipped Not Invd. (Base)]= 0,
			[Qty. Shipped (Base)]= ".$quantitysend.",
			[Qty. Invoiced (Base)]=".$quantitysend.",
			[Completely Shipped]=1,
			[Importe pendiente base]=0,
			[Importe pendiente base (DL)]=0,		
			[Unit Cost]=0,
			[Unit Cost (LCY)]=0,
			[Unit Price]=0,
			[Unit price UM precio]=0,
			[Unit Price TPV]=0,
			[Neto]=0,
			[Neto UM Precio]=0					
		WHERE [Document No.] = '".$code."'"." and [No.]='".$rowLines["No."]."' and [Variant Code]='".$rowLines["Variant Code"]."' AND [Line No.] = '".$rowLines["Line No."]."'";
// echo utf8_encode($sql)."<br>";				
		$stmt=sqlsrv_query( $connNavision, $sql );
		if( $stmt === false) {
			echo json_encode(["result"=>-25,"text"=>"Error al actualizar las lineas originales"]);
			die;
		}
	}

}

// ABM 2024-10-03 Mandar al histórico para que no lo tenga en cuenta el original ni lo muestre en pendiente para el cliente	
$sql = "UPDATE ".'dbo.[Ind. Campollano Ferretería S.L$Sales Header]'." SET [Historic]=1 WHERE [No.] = '".$code."';";
// echo utf8_encode($sql)."<br>";		
$smtp=sqlsrv_query( $connNavision, $sql );
if( $smtp === false) {
	echo json_encode(["result"=>-26,"text"=>"Error al actualizar cabecera pedido para pasar a historico"]);
	die;
}

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