<?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">

			<!--MemberOrderProcessRequest-->
			<!-- wrapper element of the request message -->
			<xsd:element name="MemberOrderProcessRequest" type="tns:MemberOrderProcess"/>
			<!-- wrapper element of the response message -->
			<xsd:element name="MemberOrderProcessResponse" type="tns:MemberOrderProcessResponse"/>
			<!-- wrapper element of the fault message -->
			<xsd:element name="MemberOrderProcessFault" type="tns:MemberOrderProcessFault"/>
			
			<xsd:complexType name="MemberOrderProcess">
				<xsd:sequence>
					<xsd:element name="Header">
						<xsd:complexType>
							<xsd:sequence>
								<xsd:element name="WCS_Event_Id" type="xsd:string"/>
                                <xsd:element name="Source_Computer" type="xsd:string"/>
                                <xsd:element name="Ship_From_WHSE" type="xsd:string"/>
                                <xsd:element name="Order_Number" type="xsd:string"/>
                                <xsd:element name="Customer_Name" type="xsd:string"/>
                                <xsd:element name="Customber_Number" type="xsd:string"/>
                                <xsd:element name="Ordered_Date" type="xsd:string"/>
                                <xsd:element name="Ship_To_Address1" type="xsd:string"/>
                                <xsd:element name="Ship_To_Address2" type="xsd:string"/>
                                <xsd:element name="Ship_To_Address3" type="xsd:string"/>
                                <xsd:element name="Ship_To_Address4" type="xsd:string"/>
                                <xsd:element name="Ship_To_Address5" type="xsd:string"/>
                                <xsd:element name="Postal_Code" type="xsd:string"/>
                                <xsd:element name="Ship_To_City" type="xsd:string"/>
                                <xsd:element name="Telephone" type="xsd:string"/>
                                <xsd:element name="Country_Code" type="xsd:string"/>
                                <xsd:element name="Ship_Method_Code" type="xsd:string"/>
                                <xsd:element name="Audit_Flag" type="xsd:string"/>
                                <xsd:element name="Manifest_Flag" type="xsd:string"/>
                                <xsd:element name="HMS_Order_Number" type="xsd:string"/>
                                <xsd:element name="GOC_Order_Number" type="xsd:string"/>
                                <xsd:element name="WCS_Order_Number" type="xsd:string"/>
                                <xsd:element name="Booked_Date" type="xsd:string"/>
                                <xsd:element name="Paid_Date" type="xsd:string"/>
                                <xsd:element name="Print_Date" type="xsd:string"/>
                                <xsd:element name="Released_Date_Actual" type="xsd:string"/>
                                <xsd:element name="Latest_Dispatch_Date" type="xsd:string"/>
                                <xsd:element name="HMS_Order_Type" type="xsd:string"/>
                                <xsd:element name="WCS_Order_Priority" type="xsd:string"/>
                                <xsd:element name="Email_Address" type="xsd:string"/>
                                <xsd:element name="WCS_Ship_To_Address1" type="xsd:string"/>
                                <xsd:element name="WCS_Ship_To_Address2" type="xsd:string"/>
                                <xsd:element name="WCS_Ship_To_Address3" type="xsd:string"/>
                                <xsd:element name="WCS_Ship_To_Address4" type="xsd:string"/>
                                <xsd:element name="WCS_Ship_To_Address5" type="xsd:string"/>
                                <xsd:element name="WCS_Postal_Code" type="xsd:string"/>
                                <xsd:element name="WCS_Ship_To_City" type="xsd:string"/>
                                <xsd:element name="WCS_Telephone" type="xsd:string"/>
                                <xsd:element name="WCS_Country_Code" type="xsd:string"/>
                                <xsd:element name="WCS_Carrier_Code" type="xsd:string"/>
                                <xsd:element name="WCS_Carrier_Service_Level" type="xsd:string"/>
                                <xsd:element name="WCS_Dispatch_Lane" type="xsd:string"/>
                                <xsd:element name="Retail_Total" type="xsd:string"/>
                                <xsd:element name="Discounted_Retail" type="xsd:string"/>
                                <xsd:element name="Val_Needed_Flag" type="xsd:string"/>
                                <xsd:element name="Request_Date" type="xsd:string"/>
                                <xsd:element name="Caps_Invoice_Delivery" type="xsd:string"/>
                                <xsd:element name="WCS_Ticket_Number" type="xsd:string"/>
                                <xsd:element name="Shipping_Instructions" type="xsd:string"/>
                                <xsd:element name="Pickup_Location_Id" type="xsd:string"/>
                                <xsd:element name="WCS_Ship_To_Email" type="xsd:string"/>
                                <xsd:element name="Attribute1" type="xsd:string"/>
                                <xsd:element name="Attribute2" type="xsd:string"/>
                                <xsd:element name="Attribute3" type="xsd:string"/>
                                <xsd:element name="Attribute4" type="xsd:string"/>
                                <xsd:element name="Attribute5" type="xsd:string"/>
                                <xsd:element name="Attribute6" type="xsd:string"/>
                                <xsd:element name="Attribute7" type="xsd:string"/>
                                <xsd:element name="Attribute8" type="xsd:string"/>
                                <xsd:element name="Attribute9" type="xsd:string"/>
                                <xsd:element name="Attribute10" type="xsd:string"/>
							</xsd:sequence>
						</xsd:complexType>
					</xsd:element>
								<xsd:element name="Lines">
									<xsd:complexType>
										<xsd:sequence>
                                         <xsd:element name="Ordered_Quantity" type="xsd:string"/>
                                         <xsd:element name="Released_Quantity" type="xsd:string"/>
                                         <xsd:element name="Item_Number" type="xsd:string"/>
                                         <xsd:element name="Segment1" type="xsd:string"/>
                                         <xsd:element name="Line_Number" type="xsd:string"/>
                                         <xsd:element name="UN_Number" type="xsd:string"/>
                                         <xsd:element name="Barcode_Scan" type="xsd:string"/>
                                         <xsd:element name="Pick_Locator" type="xsd:string"/>
                                         <xsd:element name="Xref_Qty" type="xsd:string"/>
                                         <xsd:element name="Ordered_Qty_UOM" type="xsd:string"/>
                                         <xsd:element name="Ugly_Item_Flag" type="xsd:string"/>
                                         <xsd:element name="Fragile_Item_Flag" type="xsd:string"/>
                                         <xsd:element name="Promise_Date" type="xsd:string"/>
                                         <xsd:element name="Schedule_Ship_Date" type="xsd:string"/>
                                         <xsd:element name="Actual_Shipment_Date" type="xsd:string"/>
                                         <xsd:element name="Actual_Arrival_Date" type="xsd:string"/>
                                         <xsd:element name="Earliest_Acceptable_Date" type="xsd:string"/>
                                         <xsd:element name="Latest_Acceptable_Date" type="xsd:string"/>
                                         <xsd:element name="Schedule_Arrival_Date" type="xsd:string"/>
                                         <xsd:element name="Earliest_Ship_Date" type="xsd:string"/>										
									</xsd:sequence>
									</xsd:complexType>
								</xsd:element>
				</xsd:sequence>
			</xsd:complexType>
			<xsd:complexType name="MemberOrderProcessResponse">
				<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="MemberOrderProcessFault">
				<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 MemberOrderProcess -->
	<wsdl:message name="MemberOrderProcessRequest">
		<wsdl:part name="inputParameters" element="tns:MemberOrderProcessRequest"/>
	</wsdl:message>
	<!-- Response message MemberOrderProcess -->
	<wsdl:message name="MemberOrderProcessResponse">
		<wsdl:part name="outputParameters" element="tns:MemberOrderProcessResponse"/>
	</wsdl:message>
	<!-- fault message MemberOrderProcess -->
	<wsdl:message name="MemberOrderProcessFault">
		<wsdl:part name="faultParameters" element="tns:MemberOrderProcessFault"/>
	</wsdl:message>
	<!-- Port type MemberOrderProcess-->
	<wsdl:portType name="TestMemberOrderProcess">
		<!-- Operation -->
		<wsdl:operation name="MemberOrderProcessRequest">
			<wsdl:input message="tns:MemberOrderProcessRequest"/>
			<wsdl:output message="tns:MemberOrderProcessResponse"/>
			<wsdl:fault message="tns:MemberOrderProcessFault" name="MemberOrderProcessFault"/>
		</wsdl:operation>
	</wsdl:portType>
	<!-- Binding (SOAP 1.1/ HTTP binding) -->
	<wsdl:binding name="V10SoapMemberOrderProcess" type="tns:TestMemberOrderProcess">
		<!-- document/literal/wrapped -->
		<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
		<!-- Operation order-->
		<wsdl:operation name="MemberOrderProcessRequest">
			<soap:operation/>
			<wsdl:input>
				<soap:body use="literal"/>
			</wsdl:input>
			<wsdl:output>
				<soap:body use="literal"/>
			</wsdl:output>
			<wsdl:fault name="MemberOrderProcessFault">
				<soap:fault name="MemberOrderProcessFault" use="literal"/>
			</wsdl:fault>
		</wsdl:operation>
	</wsdl:binding>
	<!-- Service-->
	<wsdl:service name="TestV10Soap">
		<!-- Port order OrderProcess-->
		<wsdl:port name="TestMemberOrderProcess" binding="tns:V10SoapMemberOrderProcess">
			<soap:address location="https://sending.grupov10.com:5199/INTERFAZ/MemberOrderProcessRequest.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", "TRATARORDENPROCESS");

$clob = oci_new_descriptor($db->conn, OCI_D_LOB);
							
$sql = 'begin
        HLINTERFAZPEDIDOS.TRATAPEDIDOS(:xmlMemberOrderProcess,:resultado,:descresultado);
        end;';  
$sqlexec = oci_parse($db->conn,$sql);
oci_bind_by_name($sqlexec, ":xmlMemberOrderProcess",$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("TRATARORDENPROCESS", "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:MemberOrderProcessResponse>
			<ResponseCode>' .$resultado . '</ResponseCode>
			<ResponseStatus>SUCCESS</ResponseStatus>
			<ResponseDetail/>
		</tns:MemberOrderProcessResponse>
	</soapenv:Body>
</soapenv:Envelope>';
		vdlog("TRATARORDENPROCESS", "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:MemberOrderProcessResponse>
			<ResponseCode>' .$resultado . '</ResponseCode>
			<ResponseStatus>ERROR</ResponseStatus>
			<ResponseDetail>' . $descresultado . '</ResponseDetail>
		</tns:MemberOrderProcessResponse>
	</soapenv:Body>
</soapenv:Envelope>';
		vdlog("TRATARORDENPROCESS", "Resultado: " . $resultado . ' ' . "Descripción: ".$descresultado);
		exit(); 
   }
}
else{
	http_response_code(400);
    echo "Method ".$_SERVER['REQUEST_METHOD']." not accepted.";
	exit(); 	
}

?>