<?php
/*
    //VARIABLES GLOBALES
    $url = "http://sistemasbejerman.ddns.net:8085/Bejerman-SDK-WS/EFlexSDK_Service.svc?singleWsdl";
    $usuario = "ADMIN";
    $codEmpresa = "INTE";
    $ptoTrabajo = 2;
    $escenario = "INTE";
    $vista = "Fidelitas/*";
    $token = "090C0A000764787E78767D71717D107C7D7D7F787F79717979727F7C7D707C7F78";
*/


$connection = new PDO('dblib:host=' . $GLOBALS['DB_SQL_HOST'] . ';dbname=' . $GLOBALS['DB_SQL_DATABASE'] . ';charset=utf8', $GLOBALS['DB_SQL_USERNAME'], $GLOBALS['DB_SQL_PASSWORD']);
$queue = DB::select("select usuario, codEmpresa, ptoTrabajo, escenario, vista from Bejerman");

$queue->setFetchMode(PDO::FETCH_OBJ);

if ($queue) {
    $queue->execute();
    $registros = $queue->fetchAll();
    foreach ($registros as $key => $reg) {

        $getToken = getToken($reg->usuario, $reg->codEmpresa, $reg->ptoTrabajo, $reg->url);
        $respuesta = json_decode($getToken);
        if (isset($resp->err) || !isset($resp->token) || $resp->token == null) {
            // $mje_error = 'obtenerLoginRenaper - Cliente: ' . $client_id . ' - Usuario: ' . $user_id;
            // Aca hay que guardar trazabilidad token error
            continue;
        }

        // Aca hay que guardar trazabilidad token OK
        $getJson = getJson($respuesta->token, $reg->url, $reg->escenario, $reg->vista);
        $datos = json_decode($getJson);
        var_dump($datos);

    }
}

//ESTA FUNCION REGISTRA AL USUARIO Y LE DEVUELVE UN TOKEN
function getToken($usuario, $codEmpresa, $ptoTrabajo, $url) {

    $token = "";

    $data = <<<DATA
        <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
            <EFlexSDK_WSRegistro xmlns="http://localhost:57213/">
            <xUsuario>$usuario</xUsuario>
            <xClave></xClave>
            <xCodEmpresa>$codEmpresa</xCodEmpresa>
            <xPtoTrabajo>$ptoTrabajo</xPtoTrabajo>
            <xCodSucursal>string</xCodSucursal>
            </EFlexSDK_WSRegistro>
        </soap:Body>
        </soap:Envelope>
        DATA;

    $headers = array(
        "Content-Type: text/xml; charset=utf-8",
        "SOAPAction: http://localhost:57213/IEFlexSDK_Service/EFlexSDK_WSRegistro",
    );

    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "UTF-8",
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_HTTPHEADER => $headers,
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);

    if ($err) {
        return json_encode(['error' => "Curl ERR " . $err, 'err' => $err]);
    } else {
        $response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response);
        $response = str_replace('', '\'', $response);
        $xml = new \SimpleXMLElement($response);
        $array = json_decode(json_encode((array) $xml), TRUE);
        if (!isset($array['sBody']['EFlexSDK_WSRegistroResponse']['EFlexSDK_WSRegistroResult']['aToken'])) {
            $token = null;
            return json_encode(['error' => "No ha podido establecer la conexion", 'err' => $err]);
        }
        $token = $array['sBody']['EFlexSDK_WSRegistroResponse']['EFlexSDK_WSRegistroResult']['aToken'] ?? '';
        return json_encode(['token' => $token, 'response' => $response, 'err' => $err, 'error' => "OK"]);

    }
}



//ESTA FUNCION UTILIZA EL TOKEN OBTENIDO Y EJECUTA LA VISTA CON EL ESCENARIO
function getJson($token, $url, $escenario, $vista) {
    $data = <<<DATA
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:loc="http://localhost:57213/" xmlns:sb="http://schemas.datacontract.org/2004/07/SB.NET.eFlex.SDKWS" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <soapenv:Header/>
        <soapenv:Body>
            <loc:EFlexSDK_WSEjecutar>
                <loc:xRequest>
                        <sb:Circuito>QUERIES</sb:Circuito>
                        <sb:Operacion>ObtenerJsonQueryVista</sb:Operacion> 
                        <sb:ParametrosJson>
                ["$escenario","$vista"]
                </sb:ParametrosJson>
                    <sb:Token>$token</sb:Token>
                </loc:xRequest>
            </loc:EFlexSDK_WSEjecutar>
        </soapenv:Body>
        </soapenv:Envelope>
        DATA;

    $headers = array(
        "Content-Type: text/xml; charset=utf-8",
        "SOAPAction: http://localhost:57213/IEFlexSDK_Service/EFlexSDK_WSEjecutar",
    );

    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "UTF-8",
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_HTTPHEADER => $headers,
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);
    $datosJson = "";

    if ($err) {
        return json_encode(['error' => "Curl ERR " . $err, 'err' => $err]);
    } else {
        $response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response);
        $response = str_replace('', '\'', $response);
        $xml = new \SimpleXMLElement($response);
        $array = json_decode(json_encode((array) $xml), TRUE);
        if (!isset($array['sBody']['EFlexSDK_WSEjecutarResponse']['EFlexSDK_WSEjecutarResult']['aDatosJSON'])) {
            return json_encode(['error' => "No ha podido establecer la conexion", 'err' => $err]);
        }
        $datosJson = $array['sBody']['EFlexSDK_WSEjecutarResponse']['EFlexSDK_WSEjecutarResult']['aDatosJSON'] ?? '';

        //ELIMINO CARACTERES NO DESEADOS PARA FORMAR JSON
        $datosJson = str_replace("\\", "", $datosJson);
        $datosJson = preg_replace('/^"/', '', $datosJson);
        $datosJson = substr($datosJson, 0, -1);

        //SE PASA DE STRING A OBJETO JSON
        $datosJson = json_decode($datosJson);
        //var_dump($datosJson[12]->FIDELITAS_001CLI_RAZSOC);die();
    }
}


/*
//LLAMADA A LAS FUNCIONES
getToken($usuario, $codEmpresa, $ptoTrabajo, $url);
getJson($token, $url, $escenario, $vista);
*/