<?php 

//include_once('funciones-generales.php');

/////// 24-04-2024 se añaden condiciones para utilizar la libreria nativa SOAP de PHP por defecto, con PHP 8 ///////

if(!isset($soapNativo) || !$soapNativo) require_once($rutaPhp.$rutaHtml.'/librerias/customNusoap/lib/nusoap.php');

function isJson($string) {
    return ((is_string($string) &&
            (is_object(json_decode($string)) ||
            is_array(json_decode($string))))) ? true : false;
}

function AddWSSUsernameToken($client, $username, $password)
{
    $wssNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
    
    $username = new SoapVar($username, 
                            XSD_STRING, 
                            null, null, 
                            'Username', 
                            $wssNamespace);
                            
    $password = new SoapVar($password, 
                            XSD_STRING, 
                            null, null, 
                            'Password', 
                            $wssNamespace);
    
    $usernameToken = new SoapVar(array($username, $password), 
                                    SOAP_ENC_OBJECT, 
                                    null, null, 'UsernameToken', 
                                    $wssNamespace);
                            
    $usernameToken = new SoapVar(array($usernameToken), 
                            SOAP_ENC_OBJECT, 
                            null, null, null, 
                            $wssNamespace);
    
    $wssUsernameTokenHeader = new SoapHeader($wssNamespace, 'Security', $usernameToken);
    
    $client->__setSoapHeaders($wssUsernameTokenHeader); 
}

function obj2array($obj) {
  $out = array();
  if($obj != ""){
	  foreach ($obj as $key => $val) {
		switch(true) {
			case is_object($val):
			 $out[$key] = obj2array($val);
			 break;
		  case is_array($val):
			 $out[$key] = obj2array($val);
			 break;
		  default:
			$out[$key] = $val;
		}
	  }
  }
  return $out;
}

function arreglaArrayPXMobileProxiumResult($valor) {
	if(!is_null($valor) && $valor!='') {
		if( isset($valor['PXMobileProxiumResult']) && $valor['PXMobileProxiumResult'] && is_array($valor['PXMobileProxiumResult']) && key($valor['PXMobileProxiumResult'])=='0' ) return $valor['PXMobileProxiumResult'];
		else return $valor;
	}
	else return array();
}

function arreglaArrayClave($valor) {
	if(!is_null($valor) && $valor!='') {
		if(is_array($valor) && key($valor)!='0') return array($valor);
		else return $valor;
	}
	else return array();
}

function convierteXml($xml) {

	$array = json_decode(json_encode($xml), TRUE);

	if(is_array($array)) $cuantosIndices=count($array);
	else $cuantosIndices=0;
	
	$arrayFinal=array();
	
	if($cuantosIndices==1) {
		$claveInicial=key($array);
		$arrayFinal=$array[$claveInicial];
	}
	else $arrayFinal=$array;
	
	$arrayFinal=arreglaArrayClave($arrayFinal);
	
	$arrayFinalLimpio=reemplazaCaracteresEntidadesArray($arrayFinal);
	
	return $arrayFinalLimpio;

}


//24-05-2024 nuevo método principal, para enviar un fichero de firma
function ImprimirDocumento($USUARIO,$PWD,$EMPRESA,$PETICION,$ARCHIVOFIRMA) {
	
	global $soapNativo;
	global $urlServicioCache;
	global $client;
	global $cabeceraSoap;
	
	$parametros=array('Usuario'=>$USUARIO,'Pwd'=>$PWD,'Empresa'=>$EMPRESA,'CadenaPeticionDocumento'=>$PETICION,'ArchivoFirma'=>$ARCHIVOFIRMA);
	
	if($soapNativo) {
	
		$result = $client->ImprimirDocumento($parametros);
		$respuesta=obj2array($result);
	
	}
	else {
		
		$respuesta = $client->call('ImprimirDocumento',$parametros,'','',$cabeceraSoap);
	
	}
	
	if($respuesta['faultcode']) {
		//ERROR
	}
	else {
		$resultado=$respuesta['ImprimirDocumentoResult']['PXMobileProxiumResult']; //Aqui puede venir [Error]
	}
	
	return $resultado;

}

function PedirDatosSOAP($USUARIO,$PWD,$EMPRESA,$PETICION) {

	global $depuradoWS_SOAP_vs_REST;
	global $depuradoWS_SOAP_vs_REST_comparador;
	
	global $soapNativo;
	global $urlServicioCache;
	global $client;
	global $cabeceraSoap;
	
	if($depuradoWS_SOAP_vs_REST) grabaLog($PETICION.' - INICIO SOAP');

	$parametros=array('Usuario'=>$USUARIO,'Pwd'=>$PWD,'Empresa'=>$EMPRESA,'CadenaPeticion'=>$PETICION);
	
	if($soapNativo) {
	
		$result = $client->PedirDatos($parametros);
		
		$respuesta=obj2array($result);
	
	}
	else {
		
		$respuesta = $client->call('PedirDatos',$parametros,'','',$cabeceraSoap);
	
	}
	

	if(isset($respuesta['faultcode']) && $respuesta['faultcode']) {
		if($_GET['traza']=='si') echo "<p class='error'>".$respuesta['detail']['error']['text']."</p>";
	}
	else {
		if(isset($respuesta['PedirDatosResult']) && isset($respuesta['PedirDatosResult']['PXMobileProxiumResult'])) {
			$resultado=$respuesta['PedirDatosResult']['PXMobileProxiumResult'];
			if(is_array($resultado) && key($resultado)!='0') $resultado=array($resultado);
		}
		else $resultado=NULL;
	}
	
	if(isset($depuradoWS_SOAP_vs_REST) && $depuradoWS_SOAP_vs_REST) grabaLog($PETICION.' - FIN SOAP');
	
	if(isset($depuradoWS_SOAP_vs_REST_comparador) && $depuradoWS_SOAP_vs_REST_comparador) grabaLogRespuesta($PETICION,$resultado,'SOAP');
	
	return $resultado;
	
}







///////////////////////////// 13-05-2025 Error con los CDATA detectado tras primer prototipo con ID Logistic

function sanitizeXML($xml_content, $xml_followdepth=true){

	if (preg_match_all('%<((\w+)\s?.*?)>(.+?)</\2>%si', $xml_content, $xmlElements, PREG_SET_ORDER)) {

		$xmlSafeContent = '';

		foreach($xmlElements as $xmlElem){
			$xmlSafeContent .= '<'.$xmlElem['1'].'>';
			if (preg_match('%<((\w+)\s?.*?)>(.+?)</\2>%si', $xmlElem['3'])) {
				$xmlSafeContent .= sanitizeXML($xmlElem['3'], false);
			}else{
				$xmlSafeContent .= htmlspecialchars($xmlElem['3'],ENT_NOQUOTES);
			}
			$xmlSafeContent .= '</'.$xmlElem['2'].'>';
		}

		return $xmlSafeContent;

	} else {
		return htmlspecialchars($xml_content,ENT_NOQUOTES);
	}

}

function reemplazaCData($cadena) {
	$cadena=str_replace('><![CDATA[','>',$cadena);
	$cadena=str_replace(']]><','<',$cadena);
	//$cadena=(string)$cadena;
	//$cadena=str_replace('><![CDATA[','>',$cadena);
	//$cadena=str_replace(']]></','<~$~',$cadena);
	//$cadena=str_replace('~$~','/',$cadena);
	return $cadena;
}


function limpiaParaXML($contenido,$primeraCoincidencia,$segundaCoincidencia) {

	//$primeraCoincidencia='<![CDATA[';
	//$segundaCoincidencia=']]>';

	if( strpos($contenido,$primeraCoincidencia) > 0 ) {
	
		$primeraPosicion=strpos($contenido,$primeraCoincidencia);
		//echo '<p>Primera posicion: '.$primeraPosicion.'</p>';
		
		$restoContenido=substr($contenido,$primeraPosicion,strlen($contenido));
		//echo '<p>restoContenido: '.$restoContenido.'</p>';

		$segundaPosicion=strpos($restoContenido,$segundaCoincidencia);
		//echo '<p>segundaPosicion: '.$segundaPosicion.'</p>';
		
		$contenidoLimpiar=substr($restoContenido,strlen($primeraCoincidencia),$segundaPosicion-strlen($primeraCoincidencia));

		$contenidoLimpio=htmlspecialchars($contenidoLimpiar);

		
		//echo '<p>Contenido limpio: '.$contenido.'</p>';
		
		$primeraParteContenido=substr($contenido,0,$primeraPosicion);
		$segundaParteContenido=substr($restoContenido,$segundaPosicion+strlen($segundaCoincidencia),strlen($restoContenido));
		
		$devolucion=$primeraParteContenido.$contenidoLimpio.limpiaParaXML($segundaParteContenido,$primeraCoincidencia,$segundaCoincidencia);
	
		return $devolucion;
	
	}
	else return $contenido;
	
}

////////////////////////////////




//////// METODO BASICO PARA PETICIONES AL PROXY //////////

function peticionProxy($peticion,$parametros) {

	global $rest_ws_url;
	global $rest_ws_id;
	
	$curl = curl_init();

	//echo '<p>'.$rest_ws_url.'/'.$peticion.'</p>';
	
	curl_setopt($curl, CURLOPT_URL, $rest_ws_url.'/'.$peticion);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $parametros);

	$respuesta_curl = curl_exec($curl);

	//echo '<p>Respuesta CURL</p>';
	//print_r($respuesta_curl);

	
	curl_close($curl);

	if(isJson($respuesta_curl)) {
	
		$resultado=json_decode($respuesta_curl);
		
		return $resultado;
	
	}
	else return false;


}

/////////////////////////////////////////////////////////







function PedirDatosREST($usuario,$pwd,$empresa,$peticion,$urlServicioCache=NULL) {

	global $depuradoWS_SOAP_vs_REST;
	global $depuradoWS_SOAP_vs_REST_comparador;
	
	global $rest_ws_proxyLocal;

	if($depuradoWS_SOAP_vs_REST) grabaLog($peticion.' - INICIO REST');

	global $rest_ws_url;
	global $rest_ws_id;
	
	$parametros=array(
		'id'=>$rest_ws_id,
		'empresa'=>$empresa,
		'usuario'=>$usuario,
		'password'=>$pwd,
		'peticion'=>$peticion
	);
	
	if($urlServicioCache) $parametros[]=$urlServicioCache;
	
	if($rest_ws_proxyLocal) {
	
		$respuestaRestLocal = peticionRestBasica2($parametros,true);
        
        //grabaLog('RESPUESTA DEL NO-CURL peticionRESTBasica');
        //grabaLog($respuestaRestLocal);
		
		//$respuesta = json_decode($respuestaRestLocal);
		$respuesta = $respuestaRestLocal;
		
	}
	else {
	
		$curl = curl_init();
		
		//grabaLog('---------------------');
		//grabaLog('URL peticion al proxy: '.$rest_ws_url.'/pedirDatos');
		//grabaLog($parametros);
		
		curl_setopt($curl, CURLOPT_URL, $rest_ws_url.'/pedirDatos');
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_POST, true);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $parametros);
	
		$respuesta = curl_exec($curl);
		
		//grabaLog('Respuesta proxy:');
		//grabaLog($respuesta_curl );
		//grabaLog('---------------------');
		
		curl_close($curl);
		
	}
	
	
	if(isJson($respuesta)) {
	
		$resultado=json_decode($respuesta);
		
		if($resultado->valor==1) {
			
			$data=$resultado->data;

			$data=base64_decode($data->resultado);

			//12-11-2025 Detectado en un listado de stock de normadat, en la descripcion del producto hay un &
			//ALGUNOS XML QUE LLEGAN CON CDATA POR CULPA DE LOS AMPERSANDS
        	//$data=str_replace('<![CDATA[','',$data);
        	//$data=str_replace(']]>','',$data);
        	//$data=str_replace('&','&amp;',$data);
			
			//17-04-2026 hacemos un recorte más controlado, porque tambien hay caracteres < y > incluidos
			$dataFinal='';
			$bloquesData=explode('<![CDATA[',$data);
			foreach($bloquesData as $bloque) {
				//Controlamos si contiene fin de CDATA, por si fuera el primer bloque
				//if(str_contains($bloque,']]>')) { ESTO SOLO FUNCIONA EN PHP 8
				if(strpos($bloque,']]>') !== false) {
					$subBloquesData=explode(']]>',$bloque);
					
					//$dataInicial=$subBloquesData[0];
					//$dataLimpio=str_replace('&','&amp;',$dataInicial);
					//$dataLimpio=str_replace('<','&lt;',$dataLimpio);
					//$dataLimpio=str_replace('>','&gt;',$dataLimpio);
					$dataLimpio=reemplazaCaracteresEntidades($subBloquesData[0]);
					
					
					$dataLimpio.=$subBloquesData[1];
				}
				else $dataLimpio=$bloque;
				
				$dataFinal.=$dataLimpio; //No se incluyen ni <![CDATA[ ni ]]>
			}
			$data=$dataFinal;
        
        	//$log=fopen($rutaPhp.$rutaHtml.'/logs/log.txt','a');
        	//fwrite($log,$temp3);
        	//fclose($log);
			
			//$data=utf8_encode($data); //Deprecated en php 8
			$data=mb_convert_encoding($data,'UTF-8','ISO-8859-1');		
				
			$xmlFinal = simplexml_load_string($data);
			
			$arrayFinal=convierteXml($xmlFinal);
			
			if($depuradoWS_SOAP_vs_REST) grabaLog($peticion.' - FIN REST');
			
			if($depuradoWS_SOAP_vs_REST_comparador && $arrayFinal) grabaLogRespuesta($peticion,$arrayFinal,'REST');
			
			return $arrayFinal;
			

			
		}
		else {
			//error
			$arrayFinal=convierteXml($respuesta_curl);
	
		}
	
	}
	else {
	
		if(isset($_GET['traza']) && $_GET['traza']=='si') $arrayFinal="<p class='error'>".$respuesta_curl."</p>";
		
	}

	return $arrayFinal;
	
	

}

function EnviarDatosSOAP($USUARIO,$PWD,$ARCHIVO){

	global $soapNativo;
	global $urlServicioCache;
	global $client;
	global $cabeceraSoap;
	
	global $noCodificarEnvioDatos;
	
	if($noCodificarEnvioDatos) $ARCHIVO=base64_decode($ARCHIVO);

	$parametros=array('Usuario'=>$USUARIO,'Pwd'=>$PWD,'Archivo'=>$ARCHIVO);
	
	
	if($soapNativo) {
	
		$result = $client->EnviarDatos($parametros);
		
		$respuesta=obj2array($result);
	
	}
	else {
	
		$respuesta = $client->call('EnviarDatos',$parametros,'','',$cabeceraSoap);
		
	}
	
	return $respuesta;
}

function EnviarDatosREST($usuario,$pwd,$empresa,$peticion) {
	
	global $rest_ws_url;
	global $rest_ws_id;
	
	$parametros=array(
		'id'=>$rest_ws_id,
		'empresa'=>$empresa,
		'usuario'=>$usuario,
		'password'=>$pwd,
		'peticion'=>$peticion //La peticion ya llega codificada en base64 desde los scripts del SGA que envian
	);
	
	$curl = curl_init();
	
	curl_setopt($curl, CURLOPT_URL, $rest_ws_url.'/enviarDatos');
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $parametros);

	$respuesta_curl = curl_exec($curl);
	
	curl_close($curl);
	
	$resultado=json_decode($respuesta_curl);
	
	$arrayFinal=array();
	if($resultado->valor==1) {
	
		$data=$resultado->data;
		
		//$data=utf8_encode($data->resultado);
		//$data=mb_convert_encoding($data,'ISO-8859-1','UTF-8');
		$data=$data->resultado;
		
		$arrayFinal['EnviarDatosResult']=$data;
		
	}
	else {
		//error
		$arrayFinal['EnviarDatosResult']='0#'.$resultado->errores[0]->valor;

	}

	return $arrayFinal;

}

function PedirDatos($usuario,$pwd,$empresa,$peticion,$urlServicioCache=NULL) {

	global $rest_ws_url;
	global $depuradoWS_SOAP_vs_REST;
	
	if($depuradoWS_SOAP_vs_REST) {
		$resultado=PedirDatosSOAP($usuario,$pwd,$empresa,$peticion);
		$resultado=PedirDatosREST($usuario,$pwd,$empresa,$peticion);
		
	}
	else {
		if($rest_ws_url) $resultado=PedirDatosREST($usuario,$pwd,$empresa,$peticion);
		else $resultado=PedirDatosSOAP($usuario,$pwd,$empresa,$peticion);
	}
	
	return $resultado;

}

function EnviarDatos($usuario,$pwd,$peticion,$empresa=NULL) {

	global $rest_ws_url;
	
	if($rest_ws_url) $resultado=EnviarDatosREST($usuario,$pwd,$_SESSION['empresa'],$peticion);
	else $resultado=EnviarDatosSOAP($usuario,$pwd,$peticion);
	
	return $resultado;

}
	
	
	
//18-11-2024 nueva API REST

if(!isset($rest_ws_url) || (isset($depuradoWS_SOAP_vs_REST) && $depuradoWS_SOAP_vs_REST)) {
	
	// Conexion en el caso que no sea SOAP nativo y para versiones de PHP 7 o inferior, utilizando la libreria nuSoap
	
	if(isset($soapNativo) && $soapNativo) {
	
		$options = array(
		  'login' => $user_ws,
		  'password' => $pass_ws,
		  'trace' => 1,
		  'exceptions' => 0,
		);
	
		$client = new SoapClient($urlServicioCache, $options);
	
		//esto es lo añadido el 24-04-2023 para las cabeceras con la libreria nativa SOAP de PGP
		AddWSSUsernameToken($client, $user_ws, $pass_ws);
	
	}
	else {
	
		try {  
			global $client;
			global $urlServicioCache;
			$client=new nusoap_client($urlServicioCache,true);  
			
			$client->setCredentials($user_ws,$pass_ws,"basic");
			
			$client->soap_defencoding='UTF-8';
			$client->decode_utf8=false;
			
			$client->setDebugLevel(1); //18-01-2024 a raiz de un desbordamiento de datos en stock de Intercontainer clientes, MIR consigue reducir la memoria que utiliza la libreria Nusoap anulando el debug
			
			
			
		} catch (Exception $e) {  
			echo $e->getMessage(); 
		}
	
	}

}



?>