<?php

//Interfaz SOAP con generación de WSDL dinámico.
//Version: 1.0

//Incluye seguridad http básica mediante el envío del usuario y contraseña en la cabecera
//de la petición. Si el usuario y contraseña no coincide con el local. Se deniega la operación.
//Deshabilitada.

//(C) 2021 - Eduardo Arana para UveDiez Supply Chain, S.L. - earana@grupov10.com

//Historico de cambios:


require('ac_db.inc.php');
require('vd_phplog.php');
require_once __DIR__ . '/vendor/autoload.php';

//Tratamiento de errores PHP

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// permite peticiones desde cualquier origen
header('Access-Control-Allow-Origin: *');
// permite peticiones con métodos GET, PUT, POST, DELETE y OPTIONS
//header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
// permite los headers Content-Type y Authorization
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
header("Access-Control-Max-Age: 3600");

//Definicion del usuario y contraseña para la autenticación.

$usuario = "V10";
$password = "4PtfsrRgduNLbXDD";

//Requiere un header del tipo Autorization: Basic 
$passwords_validos = array ($usuario => $password);
$usuarios_validos = array_keys($passwords_validos);

$user = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] :'';
$pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] :'';

//Para interfaces de desarrollo se comenta la autenticación.

$validar = (in_array($user, $usuarios_validos)) && ($pass == $passwords_validos[$user]);

if (!$validar) {
  header('WWW-Authenticate: Basic realm="Mi Realm"');
  header('HTTP/1.0 401 Unauthorized');
  http_response_code(401);
  die ("Not Authorized to access this resource/api.");
}

$soapget = '<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="TestV10Soap" targetNamespace="https://sending.grupov10.com:5199/INTERFAZ/api.php"
	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
	xmlns:tns="https://sending.grupov10.com:5199/INTERFAZ/api.php">
	<xsd:annotation>
		<xsd:documentation xml:lang="en">V10Soap. Copyright 2021 UveDiez Supply Chain, S.L. All rights reserved.</xsd:documentation>
	</xsd:annotation>
	<wsdl:types>
		<xsd:schema targetNamespace="https://sending.grupov10.com:5199/INTERFAZ/api.php">

			<!--OrderWipes WIP-->
			<!-- wrapper element of the request message -->
			<xsd:element name="InboundOrdersInsertWipRequest" type="tns:OrderWip"/>
			<!-- wrapper element of the response message -->
			<xsd:element name="InboundOrdersInsertWipResponse" type="tns:InboundOrdersInsertWipResponse"/>
			<!-- wrapper element of the fault message -->
			<xsd:element name="InboundOrdersInsertWipFault" type="tns:InboundOrdersInsertWipFault"/>
			
			<xsd:complexType name="OrderWip">
				<xsd:sequence>
					<xsd:element name="Header">
						<xsd:complexType>
							<xsd:sequence>
								<xsd:element name="MessageId" type="xsd:string"/>
								<xsd:element name="Transaction_Type" type="xsd:string"/>
								<xsd:element name="Destination_Instance" type="xsd:string"/>
								<xsd:element name="WIP_Entity_Name" type="xsd:string"/>
								<xsd:element name="Job_Type" type="xsd:string"/>
								<xsd:element name="Class_Code" type="xsd:string"/>
								<xsd:element name="Organization_Code" type="xsd:string"/>
								<xsd:element name="Assembly_Item_Number" type="xsd:string"/>
								<xsd:element name="Assembly_Lot_Control" type="xsd:string"/>
								<xsd:element name="Assembly_Item_Description" type="xsd:string"/>
								<xsd:element name="BOM_Revision" type="xsd:string"/>
								<xsd:element name="BOM_Revision_Date" type="xsd:string"/>
								<xsd:element name="Start_Quantity" type="xsd:string"/>
								<xsd:element name="Scheduled_Start_Date" type="xsd:string"/>
								<xsd:element name="Scheduled_Completion_Date" type="xsd:string"/>
								<xsd:element name="Due_Date" type="xsd:string"/>
								<xsd:element name="LSP_Order_Priority" type="xsd:string"/>
								<xsd:element name="HMS_Order_Type" type="xsd:string"/>
								<xsd:element name="Lines">
									<xsd:complexType>
										<xsd:sequence>
											<xsd:element name="Comp_Item_Number" type="xsd:string"/>
											<xsd:element name="Comp_Item_Description" type="xsd:string"/>
											<xsd:element name="WIP_Supply_Type_Meaning" type="xsd:string"/>
											<xsd:element name="Quantity_Per_Assembly" type="xsd:string"/>
											<xsd:element name="Required_Quantity" type="xsd:string"/>
											<xsd:element name="Quantity_Open" type="xsd:string"/>
											<xsd:element name="Supply_Subinventory" type="xsd:string"/>
											<xsd:element name="Supply_Locator" type="xsd:string"/>
										</xsd:sequence>
									</xsd:complexType>
								</xsd:element>
							</xsd:sequence>
						</xsd:complexType>
					</xsd:element>
				</xsd:sequence>
			</xsd:complexType>
			<xsd:complexType name="InboundOrdersInsertWipResponse">
				<xsd:sequence>
					<xsd:element name="ResponseCode" type="xsd:int"/>
					<xsd:element name="ResponseStatus" type="xsd:string"/>
					<xsd:element name="ResponseDetail" type="xsd:string"/>
				</xsd:sequence>
			</xsd:complexType>
			<!-- Type referenced by the wrapper element of the fault message-->
			<xsd:complexType name="InboundOrdersInsertWipFault">
				<xsd:sequence>
					<xsd:element name="ResponseCode" type="xsd:int"/>
					<xsd:element name="ResponseStatus" type="xsd:string"/>
					<xsd:element name="ResponseDetail" type="xsd:string"/>
				</xsd:sequence>
			</xsd:complexType>
		</xsd:schema>
	</wsdl:types>
	<!-- Request message OrderWip -->
	<wsdl:message name="InboundOrdersInsertWipRequest">
		<wsdl:part name="inputParameters" element="tns:InboundOrdersInsertWipRequest"/>
	</wsdl:message>
	<!-- Response message OrderWip -->
	<wsdl:message name="InboundOrdersInsertWipResponse">
		<wsdl:part name="outputParameters" element="tns:InboundOrdersInsertWipResponse"/>
	</wsdl:message>
	<!-- fault message OrderWip -->
	<wsdl:message name="InboundOrdersInsertWipFault">
		<wsdl:part name="faultParameters" element="tns:InboundOrdersInsertWipFault"/>
	</wsdl:message>
	<!-- Port type OrderWip-->
	<wsdl:portType name="TestOrderWip">
		<!-- Operation -->
		<wsdl:operation name="InboundOrdersInsertWipRequest">
			<wsdl:input message="tns:InboundOrdersInsertWipRequest"/>
			<wsdl:output message="tns:InboundOrdersInsertWipResponse"/>
			<wsdl:fault message="tns:InboundOrdersInsertWipFault" name="InboundOrdersInsertWipFault"/>
		</wsdl:operation>
	</wsdl:portType>
	<!-- Binding (SOAP 1.1/ HTTP binding) -->
	<wsdl:binding name="V10SoapOrderWip" type="tns:TestOrderWip">
		<!-- document/literal/wrapped -->
		<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
		<!-- Operation order-->
		<wsdl:operation name="InboundOrdersInsertWipRequest">
			<soap:operation/>
			<wsdl:input>
				<soap:body use="literal"/>
			</wsdl:input>
			<wsdl:output>
				<soap:body use="literal"/>
			</wsdl:output>
			<wsdl:fault name="InboundOrdersInsertWipFault">
				<soap:fault name="InboundOrdersInsertWipFault" use="literal"/>
			</wsdl:fault>
		</wsdl:operation>
	</wsdl:binding>
	<!-- Service-->
	<wsdl:service name="TestV10Soap">
		<!-- Port order WIP-->
		<wsdl:port name="TestOrderWip" binding="tns:V10SoapOrderWip">
			<soap:address location="https://sending.grupov10.com:5199/INTERFAZ/InboundOrdersInsertWipRequest.php"/>
		</wsdl:port>
	</wsdl:service>
</wsdl:definitions>';

if (isset($_GET['wsdl'])) {
      header("Content-Type: text/xml");
      //echo "Single WSDL interface disabled, use main API WSDL.";
	  echo $soapget;
} else if ($_SERVER['REQUEST_METHOD'] == 'POST')
{

$entrada = file_get_contents('php://input');

//si la petición viene vacía mostramos el error 40X. 24-02-2020 EAG
if (!file_get_contents('php://input')) {
	        
			http_response_code(400);
            echo "Empty request or without content. Petición vacía o sin contenido";
			exit(); 
}

//$json = json_decode($entrada);

//establecemos la conexión con la bbdd
$db = new \Oracle\Db("V10SENDING", "TRATARORDENWIP");

$clob = oci_new_descriptor($db->conn, OCI_D_LOB);
							
$sql = 'begin
        HLINTERFAZWIP.TRATARORDEN(:xmlOrderWip,:resultado,:descresultado);
        end;';  
$sqlexec = oci_parse($db->conn,$sql);
oci_bind_by_name($sqlexec, ":xmlOrderWip",$clob, -1, OCI_B_CLOB);
oci_bind_by_name($sqlexec, ":resultado",$resultado,5,SQLT_CHR);
oci_bind_by_name($sqlexec, ":descresultado",$descresultado,100,SQLT_CHR);
$clob->writeTemporary($entrada);
oci_execute($sqlexec, OCI_DEFAULT);
oci_commit($db->conn);
$clob->free();
oci_free_statement($sqlexec);
	
   vdlog("TRATARORDENWIP", "Fichero entrada: " . $entrada . ' ');
   if($resultado == 0){                
		//si ha ido bien retornamos OK o 200.
        http_response_code(200);
		header("Content-Type: text/xml");
echo '<soapenv:Envelope
	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
	xmlns:tns="https://sending.grupov10.com:5199/INTERFAZ/api.php">
	<soapenv:Body>
		<tns:InboundOrdersInsertWipResponse>
			<ResponseCode>' .$resultado . '</ResponseCode>
			<ResponseStatus>SUCCESS</ResponseStatus>
			<ResponseDetail/>
		</tns:InboundOrdersInsertWipResponse>
	</soapenv:Body>
</soapenv:Envelope>';
		vdlog("TRATARORDENWIP", "Resultado: " . $resultado . ' ' . "Descripción: ".$descresultado);
   }
   else {
        //si existe algún error mostramos el error 40X.
		http_response_code(200);
		header("Content-Type: text/xml");
echo '<soapenv:Envelope
	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
	xmlns:tns="https://sending.grupov10.com:5199/INTERFAZ/api.php">
	<soapenv:Body>
		<tns:InboundOrdersInsertWipResponse>
			<ResponseCode>' .$resultado . '</ResponseCode>
			<ResponseStatus>ERROR</ResponseStatus>
			<ResponseDetail>' . $descresultado . '</ResponseDetail>
		</tns:InboundOrdersInsertWipResponse>
	</soapenv:Body>
</soapenv:Envelope>';
		vdlog("TRATARORDENWIP", "Resultado: " . $resultado . ' ' . "Descripción: ".$descresultado);
		exit(); 
   }
}
else{
	http_response_code(400);
    echo "Method ".$_SERVER['REQUEST_METHOD']." not accepted.";
	exit(); 	
}

?>