<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Session;

use App\Custom\SQLConnection;
use App\Custom\Misc;

use App\Models\Mailer;

use DateTime;

class RenaperController extends Controller
{
    public static $tiempo_curl = 0;
    public static $proveedor_curl = 'noCurl';
    //  FUNCION SOLO PARA LA API soloRenaper
    
    // Las funciones obtenerUltimoEjemplarCompleto_v3 y obtenerUltimoEjemplarUno: NO TIENEN AUN LAS MEDICIONES DE TIEMPO_CURL
    
    public static function obtenerUltimoEjemplarCompleto($dni = null, $sexo = null, $llamada_interna = 0)
    {
        $llamada_interna = 1;
        $cuit_padron = $dni;
        /*
        self::$tiempo_curl = 0;
        self::$proveedor_curl = 'Renaper'; 
        */

        /* $producto = session('usuario.producto');
        $client_id = session('usuario.cliente.client_id');
        $user_id = session('usuario.user_id'); */

        $respuesta = SQLConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $sexo), 'selectOne');        

        // Se agrega el control de carta de ciudadania
        // Se consulta un dni pero renaper nos devuelve que es otro
        // "DNI Invalido por Carta de Ciudadania, su DNI es: 12345678" 
        if (!empty($respuesta) && isset($respuesta->codigoError) && $respuesta->codigoError == 11 ) {            
            return json_encode(['Status' => '407', 'Message' => 'cartaCiudadania', 'Response' => $respuesta->descripcionError, 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
        }

        if (!empty($respuesta) && isset($respuesta->codigoError) && $respuesta->codigoError == 12 ) {            
            return json_encode(['Status' => 'NE', 'Message' => 'NO ENCONTRADO', 'Response' => [], 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
        }

        //------
        /*
        if(!empty($respuesta) && ((trim($respuesta->nombres) != '' && trim($respuesta->nacionalidad) != '')) {
          $cuit = $respuesta->cuil ?? $cuit_padron; 
          //---
          if ($llamada_interna == 0){
              ApiControllerV1::consumir_servicio($cuit,$producto); 
          }

          return json_encode(['Status'=>'OK','Message'=>'OK','Response'=>$respuesta]);
        }
        */

        if (! empty($respuesta)) {
            $cuit = $respuesta->cuil ?? $cuit_padron;

            if ($llamada_interna == 0) {
                ApiControllerV1::consumir_servicio($cuit, $producto);
            }

            if ((trim($respuesta->nombres) == '' && trim($respuesta->nacionalidad) == '')) {


                return json_encode(['Status' => 'NE', 'Message' => 'NO ENCONTRADO', 'Response' => [], 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
            } else {

                return json_encode(['Status' => 'OK', 'Message' => 'OK', 'Response' => $respuesta, 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
            }
        }

        $forzar_login = 'N';
        $datos = self::obtenerDatosLogin(env('RENAPER_SERVICIO'), $forzar_login);

        if (isset($datos->error)) {
            return json_encode(['Status' => 'ERROR', 'Message' => 'La consulta no puede realizarse en este momento.', 'Response' => [], 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$provproveedor_curleedor]);
        }

        if (isset($datos->token)) {
            
            $respuesta = self::obtenerDatosRenaper($dni, $sexo, $datos->token);                        
            if (empty($respuesta) || $respuesta == null) {
                $mje_error = 'obtenerUltimoEjemplarUno - Cliente: ' . $client_id . ' - DNI: ' . $dni . ' - Sexo: ' . $sexo . ' - Usuario: ' . $user_id;
                self::mail_error('', '', '500', $mje_error);
                return json_encode(['Status' => 'ERROR', 'Message' => 'La consulta no puede realizarse en este momento.', 'Response' => [], 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
            }

            if (isset(json_decode($respuesta)->message) && json_decode($respuesta)->message  == 'Internal server error') {
                $mje_error = 'obtenerUltimoEjemplarUno - Cliente: ' . $client_id . ' - DNI: ' . $dni . ' - Sexo: ' . $sexo . ' - Usuario: ' . $user_id;
                self::mail_error('', '', '307', $mje_error);                
                return json_encode(['Status' => 'ERROR', 'Message' => 'La consulta no puede realizarse en este momento.', 'Response' => [], 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
                
            }

            if (isset(json_decode($respuesta)->error)) {
                $mje_error = 'obtenerUltimoEjemplarUno - Cliente: ' . $client_id . ' - DNI: ' . $dni . ' - Sexo: ' . $sexo . ' - Usuario: ' . $user_id;
                self::mail_error('', '', $respuesta->error, $mje_error);
                return json_encode(['Status' => 'ERROR', 'Message' => 'La consulta no puede realizarse en este momento.', 'Response' => [], 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
            }

            $respuesta = json_decode($respuesta);

            if ( !isset($respuesta->codigo) ){
                return json_encode(['Status'=>'307','Message' => 'La consulta no puede realizarse en este momento.','Response'=>[], 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
            }

            $resp = new \stdClass();
            //
            if ($respuesta->codigo !== 99) {
                //--- EN CASO QUE LA LLAMADA NO DEVUELVA DATOS O QUE DEVUELVA ERROR
                if ($llamada_interna == 0) {
                    ApiControllerV1::consumir_servicio($dni, $producto);
                }
                // 07/01/2022: Antes si daba error no guardaba la consulta en Renaper_Info, a partir de ahora si
                $insertar = SqlConnection::backendStoreProcedure(
                    'RENAPER_INSERTAR',
                    array(
                        $respuesta->id_tramite_principal ?? null,
                        $respuesta->id_tramite_tarjeta_reimpresa ?? null,
                        $respuesta->ejemplar ?? null,
                        $respuesta->vencimiento ?? null,
                        $respuesta->emision ?? null,
                        $respuesta->apellido ?? null,
                        $respuesta->nombres ?? null,
                        $respuesta->fecha_nacimiento ?? null,
                        $respuesta->cuil ?? null,
                        $respuesta->calle ?? null,
                        $respuesta->numero ?? null,
                        $respuesta->piso ?? null,
                        $respuesta->departamento ?? null,
                        $respuesta->codigo_postal ?? null, // cpostal
                        $respuesta->barrio ?? null,
                        $respuesta->monoblock ?? null,
                        $respuesta->ciudad ?? null,
                        $respuesta->municipio ?? null,
                        $respuesta->provincia ?? null,
                        $respuesta->pais ?? null,
                        $respuesta->codigo, // codigoError
                        $respuesta->codigo_fallecido ?? null, // codigof
                        $respuesta->mensaje_fallecido ?? null, // mensaf
                        '', // origenF
                        $respuesta->fecha_fallecimiento ?? '', // fechaf
                        $respuesta->id_ciudadano ?? null,
                        $respuesta->nacionalidad ?? null,
                        '', // lugar_nacimiento
                        $respuesta->codigo, // nroError
                        $respuesta->mensaje ?? null, // descripcionError
                        $respuesta->cuil ?? null, // identificacion 
                        $sexo,
                        $dni
                    )
                );

                $resp = $respuesta->mensaje;
                return json_encode(['Status' => 'ERROR', 'Message' => $resp, 'Response' => [], 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
            }

            //-- EN CASO QUE LA LLAMADA DEVUELVE UNA RESPUESTA
            if (! empty($respuesta)) {

                $insertar = SqlConnection::backendStoreProcedure(
                    'RENAPER_INSERTAR',
                    array(
                        $respuesta->id_tramite_principal ?? null,
                        $respuesta->id_tramite_tarjeta_reimpresa ?? null,
                        $respuesta->ejemplar ?? null,
                        $respuesta->vencimiento ?? null,
                        $respuesta->emision ?? null,
                        $respuesta->apellido ?? null,
                        $respuesta->nombres ?? null,
                        $respuesta->fecha_nacimiento ?? null,
                        $respuesta->cuil ?? null,
                        $respuesta->calle ?? null,
                        $respuesta->numero ?? null,
                        $respuesta->piso ?? null,
                        $respuesta->departamento ?? null,
                        $respuesta->codigo_postal ?? null, // cpostal
                        $respuesta->barrio ?? null,
                        $respuesta->monoblock ?? null,
                        $respuesta->ciudad ?? null,
                        $respuesta->municipio ?? null,
                        $respuesta->provincia ?? null,
                        $respuesta->pais ?? null,
                        $respuesta->codigo, // codigoError
                        $respuesta->codigo_fallecido ?? null, // codigof
                        $respuesta->mensaje_fallecido ?? null, // mensaf
                        '', // origenF
                        $respuesta->fecha_fallecimiento ?? '', // fechaf
                        $respuesta->id_ciudadano ?? null,
                        $respuesta->nacionalidad ?? null,
                        '', // lugar_nacimiento
                        $respuesta->codigo, // nroError
                        $respuesta->mensaje ?? null, // descripcionError
                        $respuesta->cuil ?? null, // identificacion 
                        $sexo,
                        $dni
                    )
                );

                $resp->apellido = $respuesta->apellido ?? '';
                $resp->nombres = $respuesta->nombres ?? '';
                $resp->fechaNacimiento = $respuesta->fecha_nacimiento ?? '';
                $resp->mensaf = $respuesta->mensaje_fallecido ?? '';
                $resp->fechaf = $respuesta->fecha_fallecimiento ?? '';
                $resp->nacionalidad = $respuesta->nacionalidad ?? '';
                $resp->lugar_nacimiento = '';
                /* Si Renaper nos devolvio un cuit de 11 posiciones tomamos ese, sino el que buscamos nosotros en el SP */
                if (strlen($respuesta->cuil) == 11) {
                    $resp->cuil = $respuesta->cuil; // el que devolvio Renaper
                } else {
                    $resp->cuil = $insertar->cuil ?? $cuit_padron; // el que devolvio RENAPER_INSERTAR, si no esta el que encotramos antes
                }

                $cuit = $resp->cuil ?? $dni;
                if ($llamada_interna == 0) {
                    ApiControllerV1::consumir_servicio($cuit, $producto);
                }

                if (trim($resp->nombres) == '' && trim($resp->nacionalidad) == '') {
                    return json_encode(['Status' => 'NE', 'Message' => 'NO ENCONTRADO', 'Response' => [], 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
                }
                $respuesta = SqlConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $sexo), 'selectOne');

                return json_encode(['Status' => 'OK', 'Message' => 'OK', 'Response' => $respuesta, 'tiempo_curl' => self::$tiempo_curl, 'proveedor' => self::$proveedor_curl]);
            }

            return json_encode($respuesta);
        }
    }

    /*  De aca para abajo es de Agosto 2020, cuando Renaper cambió su servicio, 
        ahora requiere pedir token que dura hasta las 23:59:59 del día solicitado, 
        y después se consulta con dni y sexo, usando ese token. 
        Cambiaron un poco los datos que devuelven:
    */
    /*
    23/07/2021: se le agregan parametros para poder llamado internamente
    */
    public static function obtenerUltimoEjemplarUno($dni = null, $sexo = null, $llamada_interna = 0)
    {
        if ($llamada_interna == 0) {
            $llamada_interna = Request::input('llamada_interna') ?? 0;
        }
        $client_id = 0;
        $user_id = 0;
        if ($llamada_interna == 1) {
            $dni = $dni ?? Request::input('dni');
            $sexo = $sexo ?? Request::input('sexo');
            $cuit_padron = $dni;
        }
        if ($llamada_interna == 0) {
            $dni = Request::input('dni');
            $sexo = Request::input('sexo');
            $usuario = Session::get('usuario');
            $user_id = $usuario->user_id;
            $client_id = $usuario->cliente['client_id'];
            //SQLConnection::consumirServicio($user_id,$client_id,68);
            //$producto       = $usuario->producto ?? 70;
            $producto = $usuario->producto ?? Request::input('producto');

            $cuits = SQLConnection::backendStoreProcedure('dni_buscar_cuit_segun_dni', array($dni));
            //---- SE BUSCA EN EL PADRON PARA OBTENER EL CUIL DE LA IDENTIFICACION
            $cuit_padron = null;
            foreach ($cuits as $key => $value) {
                if ($value->genero == $sexo) {
                    $cuit_padron = $value->cuit;
                    break;
                }
                continue;
            }
            //
            if (! isset($cuit_padron) && ! empty($cuits)) {
                $cuit_padron = $cuits[0]->cuit;
            }
            //
            if (! isset($cuit_padron)) {
                $cuit_padron = $dni;
            }

            $respuesta = [];
            if (! $sexo || ! $dni || strlen($dni) != 8) {
                /* Si mandaron un dni incorrecto, guarda el consumos con ese dni inexistente */
                ApiControllerV1::consumir_servicio($dni, $producto);
            }

            if (! $sexo) {
                return json_encode([
                    'Status' => 'ERROR',
                    'Message' => 'El campo sexo no puede estar vacío',
                    'Response' => []
                ]);
            }
            if (! $dni) {
                return json_encode([
                    'Status' => 'ERROR',
                    'Message' => 'El campo dni no puede estar vacío',
                    'Response' => []
                ]);
            }
            if (strlen($dni) != 8) {
                return json_encode([
                    'Status' => 'ERROR',
                    'Message' => 'El campo dni debe tener exactamente 8 números',
                    'Response' => []
                ]);
            }
        }

        $respuesta = SqlConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $sexo), 'selectOne');
        //------
        if (! empty($respuesta)) {

            if ((trim($respuesta->nombres) == '' && trim($respuesta->nacionalidad) == '') || $respuesta->nroError == 12 /* NO ENCONTRO INFORMACION */) {

                return json_encode([
                    'Status' => 'NE',
                    'Message' => 'NO ENCONTRADO',
                    'Response' => []
                ]);
            }
            //---
            $cuit = $respuesta->cuil ?? $cuit_padron;
            //---
            if ($llamada_interna == 0) {
                ApiControllerV1::consumir_servicio($cuit, $producto);
            }

            return json_encode([
                'Status' => 'OK',
                'Message' => 'OK',
                'Response' => $respuesta
            ]);
        }

        $forzar_login = 'N';
        $datos = self::obtenerDatosLogin(env('RENAPER_SERVICIO'), $forzar_login);
        if (isset($datos->error)) {
            return json_encode([
                'Status' => 'ERROR',
                'Message' => 'La consulta no puede realizarse en este momento.',
                'Response' => []
            ]);
        }
        if (isset($datos->token)) {
            $respuesta = self::obtenerDatosRenaper($dni, $sexo, $datos->token);
            //echo $datos->token; 
            //echo "\r\nConsulta renaper dni sexo"; 
            //if (isset($respuesta->error)) 
            if (isset(json_decode($respuesta)->error)) {
                $mje_error = 'obtenerUltimoEjemplarUno - Cliente: ' . $client_id . ' - DNI: ' . $dni .
                    ' - Sexo: ' . $sexo . ' - Usuario: ' . $user_id;
                if (! app()->environment('testing')) {
                    self::mail_error('', '', $respuesta->error, $mje_error);
                }
                return json_encode([
                    'Status' => 'ERROR',
                    'Message' => 'La consulta no puede realizarse en este momento.',
                    'Response' => []
                ]);
            }
            $respuesta = json_decode($respuesta);
            //var_dump($respuesta); die(); 
            $resp = new \stdClass();
            //var_dump($respuesta); die(); 
            //if($respuesta->codigo==12 || $respuesta->codigo==4) 
            if ($respuesta->codigo !== 99) {
                //--- EN CASO QUE LA LLAMADA NO DEVUELVA DATOS O QUE DEVUELVA ERROR
                if ($llamada_interna == 0) {
                    ApiControllerV1::consumir_servicio($dni, $producto);
                }
                // 07/01/2022: Antes si daba error no guardaba la consulta en Renaper_Info, a partir de ahora si
                $insertar = SqlConnection::backendStoreProcedure(
                    'RENAPER_INSERTAR',
                    array(
                        $respuesta->id_tramite_principal ?? null,
                        $respuesta->id_tramite_tarjeta_reimpresa ?? null,
                        $respuesta->ejemplar ?? null,
                        $respuesta->vencimiento ?? null,
                        $respuesta->emision ?? null,
                        $respuesta->apellido ?? null,
                        $respuesta->nombres ?? null,
                        $respuesta->fecha_nacimiento ?? null,
                        $respuesta->cuil ?? null,
                        $respuesta->calle ?? null,
                        $respuesta->numero ?? null,
                        $respuesta->piso ?? null,
                        $respuesta->departamento ?? null,
                        $respuesta->codigo_postal ?? null, // cpostal
                        $respuesta->barrio ?? null,
                        $respuesta->monoblock ?? null,
                        $respuesta->ciudad ?? null,
                        $respuesta->municipio ?? null,
                        $respuesta->provincia ?? null,
                        $respuesta->pais ?? null,
                        $respuesta->codigo, // codigoError
                        $respuesta->codigo_fallecido ?? null, // codigof
                        $respuesta->mensaje_fallecido ?? null, // mensaf
                        '', // origenF
                        $respuesta->fecha_fallecimiento ?? '', // fechaf
                        $respuesta->id_ciudadano ?? null,
                        $respuesta->nacionalidad ?? null,
                        '', // lugar_nacimiento
                        $respuesta->codigo, // nroError
                        $respuesta->mensaje ?? null, // descripcionError
                        $respuesta->cuil ?? null, // identificacion 
                        $sexo,
                        $dni
                    )
                );

                $resp = $respuesta->mensaje;
                return json_encode([
                    'Status' => 'ERROR',
                    'Message' => $resp,
                    'Response' => []
                ]);
            }

            //var_dump($respuesta->fecha_nacimiento); die(); 
            //-- EN CASO QUE LA LLAMADA DEVUELVE UNA RESPUESTA

            if (! empty($respuesta)) {
                /* ANTES 
                SqlConnection::backendStoreProcedure('RENAPER_INSERTAR',array(
              $respuesta->ID_TRAMITE_PRINCIPAL,$respuesta->ID_TRAMITE_TARJETA_REIMPRESA,$respuesta->EJEMPLAR,$respuesta->VENCIMIENTO,$respuesta->EMISION,$respuesta->apellido,$respuesta->nombres,$respuesta->fechaNacimiento,$respuesta->cuil,$respuesta->calle,$respuesta->numero,$respuesta->piso,$respuesta->departamento,$respuesta->cpostal,$respuesta->barrio,$respuesta->monoblock,$respuesta->ciudad,$respuesta->municipio,$respuesta->provincia,$respuesta->pais,$respuesta->codigoError,$respuesta->codigof,$respuesta->mensaf,$respuesta->origenf,$respuesta->fechaf,$respuesta->idciudadano,$respuesta->nacionalidad,$respuesta->lugar_nacimiento,$respuesta->nroError,$respuesta->descripcionError,'---',$sexo,$dni));*/


                /* Renaper a partir de Agosto 2020, devuelve:
                          object(stdClass)#679 (26) {
                          ["id_tramite_principal"]=>
                          string(7) "8893859"
                          ["id_tramite_tarjeta_reimpresa"]=>
                          string(7) "8893859"
                          ["ejemplar"]=>
                          string(1) "A"
                          ["vencimiento"]=>
                          string(10) "04/06/2025"
                          ["emision"]=>
                          string(10) "04/06/2010"
                          ["apellido"]=>
                          string(15) "DE LA VEGA DIAZ"
                          ["nombres"]=>
                          string(14) "Antonio Amalio"
                          ["fecha_nacimiento"]=>
                          string(10) "10/07/1926"
                          ["cuil"]=>
                          string(0) ""
                          ["calle"]=>
                          string(16) "AV JUAN DE GARAY"
                          ["numero"]=>
                          string(3) "358"
                          ["piso"]=>
                          string(0) ""
                          ["departamento"]=>
                          string(0) ""
                          ["codigo_postal"]=>
                          string(0) ""
                          ["barrio"]=>
                          string(1) "0"
                          ["monoblock"]=>
                          string(0) ""
                          ["ciudad"]=>
                          string(12) "SIN INFORMAR"
                          ["municipio"]=>
                          string(22) "CIUDAD DE BUENOS AIRES"
                          ["provincia"]=>
                          string(22) "CIUDAD DE BUENOS AIRES"
                          ["pais"]=>
                          string(9) "ARGENTINA"
                          ["nacionalidad"]=>
                          string(9) "ESPAñOLA"
                          ["codigo_fallecido"]=>
                          int(1)
                          ["mensaje_fallecido"]=>
                          string(9) "FALLECIDO"
                          ["id_ciudadano"]=>
                          string(8) "44834674"
                          ["codigo"]=>
                          int(99)
                          ["mensaje"]=>
                          string(15) "DNI/PAS Firmado"
                        }

                */
                //var_dump($respuesta); die(); 

                /*if (isset($respuesta->id_tramite_principal))
                {
                $insertar = SqlConnection::backendStoreProcedure('RENAPER_INSERTAR',
                  array($respuesta->id_tramite_principal,$respuesta->id_tramite_tarjeta_reimpresa,$respuesta->ejemplar,$respuesta->vencimiento,$respuesta->emision,$respuesta->apellido,$respuesta->nombres,$respuesta->fecha_nacimiento,$respuesta->cuil,$respuesta->calle,$respuesta->numero,$respuesta->piso,$respuesta->departamento,$respuesta->codigo_postal,$respuesta->barrio,$respuesta->monoblock,$respuesta->ciudad,$respuesta->municipio,$respuesta->provincia,$respuesta->pais,$respuesta->codigo,$respuesta->codigo_fallecido,$respuesta->mensaje_fallecido,'',$respuesta->fecha_fallecimiento ?? '',$respuesta->id_ciudadano,$respuesta->nacionalidad,'','','',$respuesta->cuil,$sexo,$dni));

                }*/
                /* 07/01/2022: Antes solo gaurdabe en Renaper_Info si habia devuelto datos completos, 
                   a partir de ahora guarda siempre, y el campo nroError le pone lo que renaper devuelve 
                   en el campo codigo */
                $insertar = SqlConnection::backendStoreProcedure(
                    'RENAPER_INSERTAR',
                    array(
                        $respuesta->id_tramite_principal ?? null,
                        $respuesta->id_tramite_tarjeta_reimpresa ?? null,
                        $respuesta->ejemplar ?? null,
                        $respuesta->vencimiento ?? null,
                        $respuesta->emision ?? null,
                        $respuesta->apellido ?? null,
                        $respuesta->nombres ?? null,
                        $respuesta->fecha_nacimiento ?? null,
                        $respuesta->cuil ?? null,
                        $respuesta->calle ?? null,
                        $respuesta->numero ?? null,
                        $respuesta->piso ?? null,
                        $respuesta->departamento ?? null,
                        $respuesta->codigo_postal ?? null, // cpostal
                        $respuesta->barrio ?? null,
                        $respuesta->monoblock ?? null,
                        $respuesta->ciudad ?? null,
                        $respuesta->municipio ?? null,
                        $respuesta->provincia ?? null,
                        $respuesta->pais ?? null,
                        $respuesta->codigo, // codigoError
                        $respuesta->codigo_fallecido ?? null, // codigof
                        $respuesta->mensaje_fallecido ?? null, // mensaf
                        '', // origenF
                        $respuesta->fecha_fallecimiento ?? '', // fechaf
                        $respuesta->id_ciudadano ?? null,
                        $respuesta->nacionalidad ?? null,
                        '', // lugar_nacimiento
                        $respuesta->codigo, // nroError
                        $respuesta->mensaje ?? null, // descripcionError
                        $respuesta->cuil ?? null, // identificacion 
                        $sexo,
                        $dni
                    )
                );

                $resp->apellido = $respuesta->apellido ?? '';
                $resp->nombres = $respuesta->nombres ?? '';
                $resp->fechaNacimiento = $respuesta->fecha_nacimiento ?? '';
                $resp->mensaf = $respuesta->mensaje_fallecido ?? '';
                $resp->fechaf = $respuesta->fecha_fallecimiento ?? '';
                $resp->nacionalidad = $respuesta->nacionalidad ?? '';
                $resp->lugar_nacimiento = '';
                /* Si Renaper nos devolvio un cuit de 11 posiciones tomamos ese, sino el que buscamos nosotros en el SP */
                if (strlen($respuesta->cuil) == 11) {
                    $resp->cuil = $respuesta->cuil; // el que devolvio Renaper
                } else {
                    $resp->cuil = $insertar->cuil ?? $cuit_padron; // el que devolvio RENAPER_INSERTAR, si no esta el que encotramos antes
                }

                $cuit = $resp->cuil ?? $dni;
                if ($llamada_interna == 0) {
                    ApiControllerV1::consumir_servicio($cuit, $producto);
                }

                if (trim($resp->nombres) == '' && trim($resp->nacionalidad) == '') {
                    return json_encode([
                        'Status' => 'NE',
                        'Message' => 'NO ENCONTRADO',
                        'Response' => []
                    ]);

                }
                $respuesta = SqlConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $sexo), 'selectOne');
                return json_encode([
                    'Status' => 'OK',
                    'Message' => 'OK',
                    'Response' => $respuesta
                    /* antes devolvia solo $resp que tiene menos campos. Ahora devuelve $respuesta completa */
                ]);

            }

            return json_encode($respuesta);
        }
    }

    #Funcion con modificaciones en el caso que renaper
    #devuelva errores al dni consultado - TB 07062024
    public static function obtenerUltimoEjemplarCompleto_v3($dni = null, $sexo = null, $llamada_interna = 0)
    {
        /* $producto = session(key: 'usuario.producto');
        $client_id = session('usuario.cliente.client_id');
        $user_id = session('usuario.user_id'); */

        $llamada_interna = 1;
        $cuit_padron = $dni;

        $respuesta = SqlConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $sexo), 'selectOne');

        if (! empty($respuesta) && $respuesta->nroError != 99) {
            return json_encode(['Status' => 'ERROR', 'Message' => $respuesta->descripcionError, 'Response' => $respuesta]);
        }
        //------
        /*
        if(!empty($respuesta) && ((trim($respuesta->nombres) != '' && trim($respuesta->nacionalidad) != '')) {
          $cuit = $respuesta->cuil ?? $cuit_padron; 
          //---
          if ($llamada_interna == 0){
              ApiControllerV1::consumir_servicio($cuit,$producto); 
          }

          return json_encode(['Status'=>'OK','Message'=>'OK','Response'=>$respuesta]);
        }
        */
        if (! empty($respuesta)) {
            $cuit = $respuesta->cuil ?? $cuit_padron;
            //---
            if ($llamada_interna == 0) {
                ApiControllerV1::consumir_servicio($cuit, $producto);
            }
            if ((trim($respuesta->nombres) == '' && trim($respuesta->nacionalidad) == '') || $respuesta->nroError == 12 /* NO ENCONTRO INFORMACION */) {
                return json_encode(['Status' => 'NE', 'Message' => 'NO ENCONTRADO', 'Response' => []]);
            } else {
                return json_encode(['Status' => 'OK', 'Message' => 'OK', 'Response' => $respuesta]);
            }
        }

        $forzar_login = 'N';
        $datos = self::obtenerDatosLogin(env('RENAPER_SERVICIO'), $forzar_login);
        if (isset($datos->error)) {
            return json_encode(['Status' => 'ERROR', 'Message' => 'La consulta no puede realizarse en este momento.', 'Response' => []]);
        }

        if (isset($datos->token)) {
            $respuesta = self::obtenerDatosRenaper($dni, $sexo, $datos->token);
            if (isset(json_decode($respuesta)->error)) {
                $mje_error = 'obtenerUltimoEjemplarUno - Cliente: ' . $client_id . ' - DNI: ' . $dni . ' - Sexo: ' . $sexo . ' - Usuario: ' . $user_id;
                self::mail_error('', '', $respuesta->error, $mje_error);
                return json_encode(['Status' => 'ERROR', 'Message' => 'La consulta no puede realizarse en este momento.', 'Response' => []]);
            }
            $respuesta = json_decode($respuesta);
            $resp = new \stdClass();
            //
            if ($respuesta->codigo !== 99) {
                //--- EN CASO QUE LA LLAMADA NO DEVUELVA DATOS O QUE DEVUELVA ERROR
                if ($llamada_interna == 0) {
                    ApiControllerV1::consumir_servicio($dni, $producto);
                }
                // 07/01/2022: Antes si daba error no guardaba la consulta en Renaper_Info, a partir de ahora si
                $insertar = SqlConnection::backendStoreProcedure(
                    'RENAPER_INSERTAR',
                    array(
                        $respuesta->id_tramite_principal ?? null,
                        $respuesta->id_tramite_tarjeta_reimpresa ?? null,
                        $respuesta->ejemplar ?? null,
                        $respuesta->vencimiento ?? null,
                        $respuesta->emision ?? null,
                        $respuesta->apellido ?? null,
                        $respuesta->nombres ?? null,
                        $respuesta->fecha_nacimiento ?? null,
                        $respuesta->cuil ?? null,
                        $respuesta->calle ?? null,
                        $respuesta->numero ?? null,
                        $respuesta->piso ?? null,
                        $respuesta->departamento ?? null,
                        $respuesta->codigo_postal ?? null, // cpostal
                        $respuesta->barrio ?? null,
                        $respuesta->monoblock ?? null,
                        $respuesta->ciudad ?? null,
                        $respuesta->municipio ?? null,
                        $respuesta->provincia ?? null,
                        $respuesta->pais ?? null,
                        $respuesta->codigo, // codigoError
                        $respuesta->codigo_fallecido ?? null, // codigof
                        $respuesta->mensaje_fallecido ?? null, // mensaf
                        '', // origenF
                        $respuesta->fecha_fallecimiento ?? '', // fechaf
                        $respuesta->id_ciudadano ?? null,
                        $respuesta->nacionalidad ?? null,
                        '', // lugar_nacimiento
                        $respuesta->codigo, // nroError
                        $respuesta->mensaje ?? null, // descripcionError
                        $respuesta->cuil ?? null, // identificacion 
                        $sexo,
                        $dni
                    )
                );

                $resp = $respuesta->mensaje;
                return json_encode(['Status' => 'ERROR', 'Message' => $resp, 'Response' => []]);
            }

            //-- EN CASO QUE LA LLAMADA DEVUELVE UNA RESPUESTA
            if (! empty($respuesta)) {

                $insertar = SqlConnection::backendStoreProcedure(
                    'RENAPER_INSERTAR',
                    array(
                        $respuesta->id_tramite_principal ?? null,
                        $respuesta->id_tramite_tarjeta_reimpresa ?? null,
                        $respuesta->ejemplar ?? null,
                        $respuesta->vencimiento ?? null,
                        $respuesta->emision ?? null,
                        $respuesta->apellido ?? null,
                        $respuesta->nombres ?? null,
                        $respuesta->fecha_nacimiento ?? null,
                        $respuesta->cuil ?? null,
                        $respuesta->calle ?? null,
                        $respuesta->numero ?? null,
                        $respuesta->piso ?? null,
                        $respuesta->departamento ?? null,
                        $respuesta->codigo_postal ?? null, // cpostal
                        $respuesta->barrio ?? null,
                        $respuesta->monoblock ?? null,
                        $respuesta->ciudad ?? null,
                        $respuesta->municipio ?? null,
                        $respuesta->provincia ?? null,
                        $respuesta->pais ?? null,
                        $respuesta->codigo, // codigoError
                        $respuesta->codigo_fallecido ?? null, // codigof
                        $respuesta->mensaje_fallecido ?? null, // mensaf
                        '', // origenF
                        $respuesta->fecha_fallecimiento ?? '', // fechaf
                        $respuesta->id_ciudadano ?? null,
                        $respuesta->nacionalidad ?? null,
                        '', // lugar_nacimiento
                        $respuesta->codigo, // nroError
                        $respuesta->mensaje ?? null, // descripcionError
                        $respuesta->cuil ?? null, // identificacion 
                        $sexo,
                        $dni
                    )
                );

                $resp->apellido = $respuesta->apellido ?? '';
                $resp->nombres = $respuesta->nombres ?? '';
                $resp->fechaNacimiento = $respuesta->fecha_nacimiento ?? '';
                $resp->mensaf = $respuesta->mensaje_fallecido ?? '';
                $resp->fechaf = $respuesta->fecha_fallecimiento ?? '';
                $resp->nacionalidad = $respuesta->nacionalidad ?? '';
                $resp->lugar_nacimiento = '';
                /* Si Renaper nos devolvio un cuit de 11 posiciones tomamos ese, sino el que buscamos nosotros en el SP */
                if (strlen($respuesta->cuil) == 11) {
                    $resp->cuil = $respuesta->cuil; // el que devolvio Renaper
                } else {
                    $resp->cuil = $insertar->cuil ?? $cuit_padron; // el que devolvio RENAPER_INSERTAR, si no esta el que encotramos antes
                }

                $cuit = $resp->cuil ?? $dni;
                if ($llamada_interna == 0) {
                    ApiControllerV1::consumir_servicio($cuit, $producto);
                }

                if (trim($resp->nombres) == '' && trim($resp->nacionalidad) == '') {
                    return json_encode(['Status' => 'NE', 'Message' => 'NO ENCONTRADO', 'Response' => []]);
                }
                $respuesta = SqlConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $sexo), 'selectOne');

                return json_encode(['Status' => 'OK', 'Message' => 'OK', 'Response' => $respuesta]);
            }
            return json_encode($respuesta);
        }
    }

    /**
     * Api con servicio de renaper Facematch para validacion de identidad
     * 
     * Esta funcion utiliza la api de facematch de renaper
     * Se realiza la busqueda de la persona en base a los parametros de entrada
     * IMPORTANTE:
     *  - Si el dni consultado es un menor de edad, se termina la consulta
     *  - Si el genero enviado por parametro difiere del genero original del dni, no se encuentran datos
     *  -
     * 
     */
    /**
     * Api con servicio de renaper Facematch para validacion de identidad
     * 
     * Esta funcion utiliza la api de facematch de renaper
     * Se realiza la busqueda de la persona en base a los parametros de entrada
     * IMPORTANTE:
     *  - Si el dni consultado es un menor de edad, se termina la consulta
     *  - Si el genero enviado por parametro difiere del genero original del dni, no se encuentran datos
     *  -
     * 
     */
    public static function obtenerFaceMatch_v3(){  

        /*self::$tiempo_curl = 0;
        self::$proveedor_curl = 'FaceMatch'; */

        $selfie_image  = Request::input('selfie_image');
        $nationalid    = Request::input('national_id') ?? Request::input('nationalid');
        $gender        = Request::input('gender');
        $usuario       = Session::get('usuario');
        $user_id       = $usuario->user_id;
        $client_id     = $usuario->cliente['client_id'];  
        $producto       = $usuario->producto ?? 86;
        
        $sexos = array('M','m','F','f','X','x');
    
        $respuesta = [];
        $id_consumo = '';
        $fecha_consumo = '';
    
        $id_consumo = null; 
        if(!empty($nationalid))
        {
          $consumo = ApiControllerV1::consumir_servicio($nationalid,$producto);
          $id_consumo = $consumo->transaction_id;
          $fecha_consumo = $consumo->transaction_date;
        }
    
        // Se valida que el dni no este vacio y tenga la longitud de 7-8 
        if(empty($nationalid) || Misc::noEsPosibleDni($nationalid)) {  
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo,json_encode(['Parameters'=>$nationalid,'Status'=>'300','Message'=>Misc::error_query('300'),'Response'=>[]]),"300",Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                     
        
          return json_encode(['Parameters'=>$nationalid,'Status'=>'300','Message'=>Misc::error_query('300'),'Response'=>[]]);
          
        }
    
        if(!$selfie_image){   
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo,json_encode(['Status'=>'303','Message'=>Misc::error_query('303'),'Response'=>[]]),"303",Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                         
    
          return json_encode(['Status'=>'303','Message'=>Misc::error_query('303'),'Response'=>[]]);
        }
    
        if (!in_array($gender, $sexos)) {   
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo,json_encode(['Status'=>'304','Message'=>Misc::error_query('304'),'Response'=>[],'Transaction_id'=>$id_consumo]),"304",Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                           
          return json_encode(['Status'=>'304','Message'=>Misc::error_query('304'),'Response'=>[],'Transaction_id'=>$id_consumo]);
        }
        
        // Si el dni tiene una longitud de 7, se le agrega un 0
        $nationalid = (strlen($nationalid) == 7) ? '0'.$nationalid : $nationalid; 
        
        $persona = [];
        $persona = SQLConnection::backendStoreProcedure('api_padrones', array($nationalid, null, 'AR'));
        
        if (empty($persona)) {
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '401', 'Message' => Misc::error_query('401'),'Response'=>[],'Transaction_id' => $id_consumo]),"401",Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                          
          return json_encode(['Parameters' => $nationalid, 'Status' => '401', 'Message' => Misc::error_query('401'),'Response'=>[],'Transaction_id' => $id_consumo]);
        }
        
        $busquedaPadron = json_decode(ApiControllerV1::BusquedaPadron($nationalid,'AR', null, null));    
        
        $DOD = $persona[0]->fecha_defuncion;   
        // Calculamos la edad de la persona a la cual se esta consultando
        $edad = "";
        if (!empty($persona) && isset($persona[0]->fecha_nacimiento)) {
          $fecha_nacimiento = $persona[0]->fecha_nacimiento;      
          $fecha_nacimiento_dt = new DateTime($fecha_nacimiento);     
          $fecha_actual_dt = new DateTime();
    
          // Calcular la diferencia entre las dos fechas
          $diferencia = $fecha_actual_dt->diff($fecha_nacimiento_dt);       
          
          // Obtener la edad en años
          $edad = $diferencia->y;                             
        }       
    
        // Verificamos que sea mayor de edad, en el caso que no lo sea, se termina la consulta
        if (is_numeric($edad) && $edad < 18) {
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Response'=>[],'Transaction_id' => $id_consumo]),"313",Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                             
          return json_encode(['Parameters' => $nationalid, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        }
        
        if (empty($busquedaPadron) || !isset($busquedaPadron->Response) || empty($busquedaPadron->Response)) { 
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '301', 'Message' => Misc::error_query('301'), 'Response'=>[],'Transaction_id' => $id_consumo]),"301",Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                                  
          return json_encode(['Parameters' => $nationalid, 'Status' => '301', 'Message' => Misc::error_query('301'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        }
        
        $datosDniConsultado = $busquedaPadron->Response;  
        $otroSexo = '0';
    
        // Llamamos a las siguientes funciones que contienen la llamada a las api de renaper
        $res_renaper = ApiControllerV1::tratamientoSoloRenaper($nationalid, $gender);
        // El tiempo de todo lo que hace lo va sumando en self::$tiempo_curl. 
        // Pero si va a Renaper me cambia el self::$proveedor_curl a Renaper, por eso lo volvemos a poner
        self::$proveedor_curl = 'FaceMatch';
        $res_renaper = $res_renaper->Response;
        
        if (empty($res_renaper)) {   
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '301', 'Message' => Misc::error_query('301'), 'Response'=>[],'Transaction_id' => $id_consumo]),"301",Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                   
          return json_encode(['Parameters' => $nationalid, 'Status' => '301', 'Message' => Misc::error_query('301'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        }  

        if (isset($res_renaper->Status) && $res_renaper->Status == 307 ) {
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '307', 'Message' => Misc::error_query('307'), 'Response'=>[],'Transaction_id' => $id_consumo]),"307",Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                   
            return json_encode(['Parameters' => $nationalid, 'Status' => '307', 'Message' => Misc::error_query('307'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        }

        if (isset($res_renaper->Status) && $res_renaper->Status == 407 ) {
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '407', 'Message' => $res_renaper->Response, 'Response'=>[],'Transaction_id' => $id_consumo]),"407",Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                     
            return json_encode(['Parameters' => $nationalid, 'Status' => '407', 'Message' => $res_renaper->Response, 'Response'=>[],'Transaction_id' => $id_consumo]);
        }
        
        //Devolvemos error si no obtenemos resultados de la busqueda
        if (isset($res_renaper->codigoError) && $res_renaper->codigoError == 12) {
          $status = '305';
          $message = Misc::error_query($status);
          $response = ['Transaction_id' => $consumo->transaction_id];
    
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid,'Status' => $status,'Message' => $message,'Response' => $response]),$status,Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                             
          return json_encode(['Parameters' => $nationalid,'Status' => $status,'Message' => $message,'Response' => $response]);
        }
    
        $datos_persona = SQLConnection::backendStoreProcedure('api_get_govcheck_2024',array($persona[0]->identificacion),'select');
        
        if (!$datos_persona) {    
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '305', 'Message' => Misc::error_query('305'), 'Response'=>[],'Transaction_id' => $id_consumo]),'305',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                             
          return json_encode(['Parameters' => $nationalid, 'Status' => '305', 'Message' => Misc::error_query('305'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        }
    
        $tax_id_type = (!empty($datos_persona) && isset($datos_persona[0]->tipo_clave)) ? $datos_persona[0]->tipo_clave : '';
        $tax_id = (!empty($datos_persona) && isset($datos_persona[0]->identificacion)) ? $datos_persona[0]->identificacion : '';        
    
        #Ultima situacion 1
        $antiguedad_situacion_1 = "";
        if(!empty($datos_persona) && isset($datos_persona[0]->identificacion)){
          $antiguedad_situacion_1 = SQLConnection::backendStoreProcedure('obtener_cendeu_sit1_desde', array($datos_persona[0]->identificacion),true);
          $antiguedad_situacion_1 = !empty($antiguedad_situacion_1) ? $antiguedad_situacion_1->fecha_desde : "";
          if(!empty($antiguedad_situacion_1)){                                
            $date = DateTime::createFromFormat('m/Y', $antiguedad_situacion_1);
            $antiguedad_situacion_1 = $date->format('Y-m');               
          }
        }else {
          $antiguedad_situacion_1 = SQLConnection::backendStoreProcedure('obtener_cendeu_sit1_desde', array($nationalid),true);
          $antiguedad_situacion_1 = !empty($antiguedad_situacion_1) ? $antiguedad_situacion_1->fecha_desde : "";
          if(!empty($antiguedad_situacion_1)){                                
            $date = DateTime::createFromFormat('m/Y', $antiguedad_situacion_1);
            $antiguedad_situacion_1 = $date->format('Y-m');               
          }             
        }
        
        $chequesRechazados = 'No informa';
        $ultima_formateada = 'No informa';
        $maxima_formateada = 'No informa';
        $cantidadBancosUnicos = '0';
        
        $card_status_bancario = SQLConnection::obtenerStatusBancario($res_renaper->cuil);

        if (isset($card_status_bancario)) {
            if (isset($card_status_bancario->cheques_rechazados)) {
                $chequesRechazados = ($card_status_bancario->cheques_rechazados > 0) ? 'SI' : 'NO';
            }
            if (isset($card_status_bancario->ultima_posicion) && $card_status_bancario->ultima_posicion > 0) {
                $ultima_formateada = '$ ' . number_format($card_status_bancario->ultima_posicion, 0, ',', ' ');
            }
            if (isset($card_status_bancario->maxima_posicion) && $card_status_bancario->maxima_posicion > 0) {
                $maxima_formateada = '$ ' . number_format($card_status_bancario->maxima_posicion, 0, ',', ' ');
            }
        }

        $obtenerBancos = SQLConnection::obtenerBancos($res_renaper->cuil);

        if (!empty($obtenerBancos)) {
            $nombresBancos = array_map(function($banco) {
                return trim($banco->nombre);
            }, $obtenerBancos);

            $nombresUnicos = array_unique($nombresBancos);
            $cantidadBancosUnicos = strval(count($nombresUnicos));
        }                   
    
        // $busca_persona = $datos_persona[0];
        // $nombres_persona = $busca_persona->nombres;
        // $apellidos_persona = $busca_persona->apellidos;
        // $cuit_persona = $busca_persona->identificacion; 
    
        $forzar_login = 'N'; 
        $datos = self::obtenerDatosLoginFace(env('RENAPER_FACE_SERVICIO'),$forzar_login);  


        
        
        if (isset($datos->error)) {
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '306', 'Message' => Misc::error_query('306'), 'Response'=>[],'Transaction_id' => $id_consumo]),'306',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                                
          return json_encode(['Parameters' => $nationalid, 'Status' => '306', 'Message' => Misc::error_query('306'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        } 
    
        $iError=0;
        if (isset($datos->token)) {
            $respuesta = self::obtenerDatosRenaperFace($selfie_image,$nationalid,$gender,$datos->token);                        
                
            if (isset(json_decode($respuesta)->error)) {      
                
                $mje_error = 'obtenerFaceMatch 0 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
                self::mail_error('','', 'La consulta no puede realizarse en este momento.', $mje_error); 
        
                //$numeroTransaccionRF = $data->notificacion->transactionControlNumber;        
        
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '306', 'Message' => Misc::error_query('306'), 'Response'=>[],'Transaction_id' => $id_consumo]),'306',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl); 
        
                return json_encode(['Parameters' => $nationalid, 'Status' => '306', 'Message' => Misc::error_query('306'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        
            }
        
            $data = json_decode($respuesta)->data;    
            
            if (isset($data->notificacion) && isset($data->notificacion->errorArray)) {
                if (!empty($data->notificacion) && !empty($data->notificacion->errorArray)) {              
                    $error_recibido = $data->notificacion->errorArray[0];
                    
                    $mje_error = 'obtenerFaceMatch  - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;                       
                    
                    self::mail_error('',$data->codigo, $data->mensaje, $mje_error); 
                    
                    //$numeroTransaccionRF = $data->notificacion->transactionControlNumber;                 
                    ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'401','Message'=>$error_recibido->description,'Response'=>[],'Transaction_id'=>$id_consumo]),'401',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                             
                    return json_encode(['Status'=>'401','Message'=>Misc::error_query('401') . $error_recibido->description,'Response'=>[],'Transaction_id'=>$id_consumo]);                   
                } 
            }
           

            if (isset($data->codigo) && $data->codigo == 400) {
                $mje_error = 'obtenerFaceMatch 1 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
                self::mail_error('',$data->codigo, $data->mensaje, $mje_error); 
                
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>Misc::error_query('405'),'Response'=>[],'Transaction_id'=>$id_consumo]),'405',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                                   
                return json_encode(['Status'=>'405','Message'=>Misc::error_query('405'),'Response'=>[],'Transaction_id'=>$id_consumo]);
            } 
              
              
            if (isset($data->codigo) && $data->codigo !== 200) {
                $mje_error = 'obtenerFaceMatch 1 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
                self::mail_error('',$data->codigo, $data->mensaje, $mje_error); 
                
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>$data->mensaje,'Response'=>[],'Transaction_id'=>$id_consumo]),'ERROR',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                               
                return json_encode(['Status'=>'ERROR','Message'=>$data->mensaje,'Response'=>[],'Transaction_id'=>$id_consumo]);
            } 
          
            if (count($persona) > 1) {
                $resultados = array_filter($persona, function($persona) use ($gender) {
                    return $persona->sexo === $gender;
                });

                if (empty($resultados)) {                
                    $resultados = array_filter($persona, function($persona) use ($gender) {
                        return $persona->sexo != NULL;
                    });
                    $persona = array(reset($resultados));
                }else {
                    $persona = array(reset($resultados));
                }            
            }

            $busca_persona = $persona[0];
            $nombres_persona = $busca_persona->nombres;
            $apellidos_persona = $busca_persona->apellidos;
            $cuit_persona = $busca_persona->identificacion; 
          
            /* if (isset($data->codigo) && $data->codigo == 400) {
                $mje_error = 'obtenerFaceMatch 1 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
                self::mail_error('',$data->codigo, $data->mensaje, $mje_error); 
                
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>Misc::error_query('405'),'Response'=>[],'Transaction_id'=>$id_consumo]),'405',Misc::medirTiempoRespuesta());                              
                return json_encode(['Status'=>'405','Message'=>Misc::error_query('405'),'Response'=>[],'Transaction_id'=>$id_consumo]);
            } 
          
    
          if (isset($data->codigo) && $data->codigo !== 200) {
            $mje_error = 'obtenerFaceMatch 1 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
            self::mail_error('',$data->codigo, $data->mensaje, $mje_error); 
            
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>$data->mensaje,'Response'=>[],'Transaction_id'=>$id_consumo]),'ERROR',Misc::medirTiempoRespuesta());                              
            return json_encode(['Status'=>'ERROR','Message'=>$data->mensaje,'Response'=>[],'Transaction_id'=>$id_consumo]);
          }  */
          
          $respuesta = json_decode($respuesta);
    
          $resp = new \stdClass();
    
          // Error especificado en el campo $respuesta->mensaje
          if($respuesta->codigo_http!==200){  
            $resp = $respuesta->mensaje_http; 
            $resp = str_replace('ERROR INTERNO','RENAPER INFORMA ERROR INTERNO',$resp);
            
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]),'ERROR',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                            
            return json_encode(['Status'=>'ERROR','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]);
          }
    
          
          $notificacion =  $data->notificacion;
          $notificacion_1 =  $data->notificacion;
          $errorArray = $notificacion->errorArray; 
          $errorArray_1 = $notificacion->errorArray;    
              
          $id = SqlConnection::backendStoreProcedure('RENAPER_FACE_INSERTAR',array(
            $nationalid, 
            $gender, 
            $respuesta->codigo_http??null,
            $respuesta->mensaje_http??null,
            $data->codigo??null, 
            $data->mensaje??null, 
            $notificacion->transactionControlNumber??null, 
            $notificacion->typeOfTransaction??null, 
            $notificacion->dateOfTransaction??null, 
            $errorArray[0]->code??null, 
            $errorArray[0]->description??null, 
            $errorArray[0]->name??null, 
            null
          ),'selectOne');
    
          if (isset($id->transaccion)) {
              $final = self::obtenerDatosRenaperFaceFinal($id->transaccion,$datos->token);
              
              if (isset(json_decode($final)->error)) {
                $mje_error = 'obtenerFaceMatch 2 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id; 
                self::mail_error('','', 'La consulta no puede realizarse en este momento.',$mje_error);    
    
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'306','Message'=>Misc::error_query('306'),'Response'=>[],'Transaction_id'=>$id_consumo]),'306',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);  
                return json_encode(['Status'=>'306','Message'=>Misc::error_query('306'),'Response'=>[],'Transaction_id'=>$id_consumo]); 
              } 
    
              $data = json_decode($final)->data;
              
              if (isset($data->codigo) && $data->codigo !== 0) {
                $mensaje_error  = $errorArray_1[0]->description ?? $data->mensaje;
                $mensaje_error = str_replace('ERROR INTERNO','RENAPER INFORMA ERROR INTERNO',$mensaje_error);
                $response = [];
                $response[0] = new \stdClass();
                $nuevaRespuesta[0] = new \stdClass();

                $response[0]->tcnid  = $notificacion_1->transactionControlNumber ?? '';
                $response[0]->status = '';
                $response[0]->score  =  ''; 
                $response[0]->face_match_datetime = $fecha_consumo ?? '';           
                $response[0]->national_id   = $nationalid;
                $response[0]->facematch_id = $notificacion_1->transactionControlNumber  ?? '';
                
                $nuevaRespuesta[0]->name         = '';
                $nuevaRespuesta[0]->surname      = '';
                $nuevaRespuesta[0]->tax_id_type = $tax_id_type;
                $nuevaRespuesta[0]->tax_id = $tax_id ?? '';                      

                $nuevaRespuesta[0]->sit_1_since = $antiguedad_situacion_1;
                $nuevaRespuesta[0]->banks = "";            
                $nuevaRespuesta[0]->last_position = "";
                $nuevaRespuesta[0]->highest_position = "";
                $nuevaRespuesta[0]->rejected_checks = "";    
                  
                $nuevaRespuesta[0]->DOD = $DOD ?? '';            
    
                  $formateoFinal = [$response, $nuevaRespuesta];         
                  
                  ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>$mensaje_error,'Response'=>$formateoFinal,'Transaction_id'=>$id_consumo]),'ERROR',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                                 
                  return json_encode(['Status'=>'ERROR','Message'=>$mensaje_error,'Response'=>$formateoFinal,'Transaction_id'=>$id_consumo]);
              } 
    
        
              $respuesta = json_decode($final);
              
              $resp = new \stdClass();
              
              // Error especificado en el campo $respuesta->mensaje
              if($respuesta->codigo_http!==200){  
                $resp = $respuesta->mensaje_http;
    
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]),'ERROR',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl); 
                return json_encode(['Status'=>'ERROR','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]);
              }        
    
              $notificacion =  $data->notificacion;        
              $fechor = $notificacion->fechanoti ?? '';
              $fechor .= ' ';
              $fechor .= $notificacion->horanoti ?? ''; 
    
              $ok = SqlConnection::backendStoreProcedure('RENAPER_FACE_INSERTAR_FINAL',
                array($id->id, 
                      $respuesta->codigo_http??null,
                      $respuesta->mensaje_http??null,
                      $notificacion->TCN??null,
                      $notificacion->status??null,
                      $notificacion->score??null,
                      $notificacion->matchtype??null,
                      $notificacion->comments??null,
                      $notificacion->fechanoti??null,
                      $notificacion->horanoti??null,
                      $data->codigo??null,
                      $data->mensaje??null
                    ),
                  'selectOne'
                );
              
              $response = [];
              $response[0] = new \stdClass();
              $nuevaRespuesta[0] = new \stdClass(); 
              $response[0]->tcnid  = $notificacion->TCN       ?? '';
              $response[0]->status = $notificacion->status    ?? '';
              //$response[0]->score  = $notificacion->score     ?? '';
    
              $score = $notificacion->score ?? '';
              if (is_numeric($score))
              {
                $score = intdiv($score, 100);
                $score = strval($score);
              }
    
              
              /* Agregado 09/11/2023: Si Renaper devolvio score vacio, responde error */
              if($score=='') {
                $resp = Misc::error_query('406');
                
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'406','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]),'406',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);                            
                return json_encode(['Status'=>'406','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]);
              }          
    
              $response[0]->score  =  $score; 
              $response[0]->face_match_datetime = $fecha_consumo ?? '';
              #$response[0]->name         = '';#$nombres_persona   ?? '';
              #$response[0]->surname      = '';#$apellidos_persona ?? '';
              $response[0]->national_id   = $nationalid;
              $response[0]->facematch_id = $id->transaccion;
              
              $nuevaRespuesta[0]->name         = $nombres_persona   ?? '';
              $nuevaRespuesta[0]->surname      = $apellidos_persona ?? '';
              $nuevaRespuesta[0]->tax_id_type = $tax_id_type ?? '';
              $nuevaRespuesta[0]->tax_id = $tax_id ?? '';                  
              $nuevaRespuesta[0]->sit_1_since = $antiguedad_situacion_1 ?? '';

              $nuevaRespuesta[0]->banks = isset($cantidadBancosUnicos) ? $cantidadBancosUnicos : "";
              $nuevaRespuesta[0]->last_position = isset($ultima_formateada) ? $ultima_formateada : "";
              $nuevaRespuesta[0]->highest_position = isset($maxima_formateada) ? $maxima_formateada : "";
              $nuevaRespuesta[0]->rejected_checks = isset($chequesRechazados) ? $chequesRechazados : "";      

              $nuevaRespuesta[0]->DOD = $DOD ?? '';
              
              $formateoFinal = [$response, $nuevaRespuesta];
              ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'OK','Message'=>'OK','Response'=>$formateoFinal,'Transaction_id'=>$id_consumo]),'200',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl); 
              return json_encode(['Status'=>'OK','Message'=>'OK','Response'=>$formateoFinal,'Transaction_id'=>$id_consumo]);
        
          }else{
            $mje_error = 'obtenerFaceMatch 4 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . 
                        ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id; 
            self::mail_error('','', 'La consulta no puede realizarse en este momento.',$mje_error);        
            
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'306','Message'=>Misc::error_query('306'),'Response'=>[],'Transaction_id'=>$id_consumo]),'306',Misc::medirTiempoRespuesta(), self::$proveedor_curl, self::$tiempo_curl);  
            return json_encode(['Status'=>'306','Message'=>Misc::error_query('306'),'Response'=>[],'Transaction_id'=>$id_consumo]);
          } 
        }
    }

    /**
     * Api con servicio de renaper Facematch para validacion de identidad
     * 
     * Esta funcion utiliza la api de facematch de renaper
     * Se realiza la busqueda de la persona en base a los parametros de entrada
     * IMPORTANTE:
     *  - Si el dni consultado es un menor de edad, se termina la consulta
     *  - Si el genero enviado por parametro difiere del genero original del dni, no se encuentran datos
     *  -
     * 
     */
    public static function obtenerFaceMatch_v3_stresstest(){  

        $selfie_image  = Request::input('selfie_image');
        $nationalid    = Request::input('national_id') ?? Request::input('nationalid');
        $gender        = Request::input('gender');
        $usuario       = Session::get('usuario');
        $user_id       = $usuario->user_id;
        $client_id     = $usuario->cliente['client_id'];  
        $producto       = $usuario->producto ?? 86;
        
        $sexos = array('M','m','F','f','X','x');        
    
        $respuesta = [];
        $id_consumo = '';
        $fecha_consumo = '';
    
        $id_consumo = null; 
        if(!empty($nationalid))
        {
          $consumo = ApiControllerV1::consumir_servicio($nationalid,$producto);
          $id_consumo = $consumo->transaction_id;
          $fecha_consumo = $consumo->transaction_date;
        }
    
        // Se valida que el dni no este vacio y tenga la longitud de 7-8 
        if(empty($nationalid) || Misc::noEsPosibleDni($nationalid)) {  
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo,json_encode(['Parameters'=>$nationalid,'Status'=>'300','Message'=>Misc::error_query('300'),'Response'=>[]]),"300");         
        
          return json_encode(['Parameters'=>$nationalid,'Status'=>'300','Message'=>Misc::error_query('300'),'Response'=>[]]);
          
        }
    
        if(!$selfie_image){   
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo,json_encode(['Status'=>'303','Message'=>Misc::error_query('303'),'Response'=>[]]),"303");           
    
          return json_encode(['Status'=>'303','Message'=>Misc::error_query('303'),'Response'=>[]]);
        }
    
        if (!in_array($gender, $sexos)) {   
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo,json_encode(['Status'=>'304','Message'=>Misc::error_query('304'),'Response'=>[],'Transaction_id'=>$id_consumo]),"304");         
          return json_encode(['Status'=>'304','Message'=>Misc::error_query('304'),'Response'=>[],'Transaction_id'=>$id_consumo]);
        }
        
        // Si el dni tiene una longitud de 7, se le agrega un 0
        $nationalid = (strlen($nationalid) == 7) ? '0'.$nationalid : $nationalid; 
        
        $persona = [];
        $persona = SQLConnection::backendStoreProcedure('api_padrones', array($nationalid, null, 'AR'));
        
        if (empty($persona)) {
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '401', 'Message' => Misc::error_query('401'),'Response'=>[],'Transaction_id' => $id_consumo]),"401");            
          return json_encode(['Parameters' => $nationalid, 'Status' => '401', 'Message' => Misc::error_query('401'),'Response'=>[],'Transaction_id' => $id_consumo]);
        }
        
        $busquedaPadron = json_decode(ApiControllerV1::BusquedaPadron($nationalid,'AR', null, null));    
        
        $DOD = $persona[0]->fecha_defuncion;   
        // Calculamos la edad de la persona a la cual se esta consultando
        $edad = "";
        $fecha_nacimiento = "";
        if (!empty($persona) && isset($persona[0]->fecha_nacimiento)) {
          $fecha_nacimiento = $persona[0]->fecha_nacimiento;      
          $fecha_nacimiento_dt = new DateTime($fecha_nacimiento);     
          $fecha_actual_dt = new DateTime();
    
          // Calcular la diferencia entre las dos fechas
          $diferencia = $fecha_actual_dt->diff($fecha_nacimiento_dt);       
          
          // Obtener la edad en años
          $edad = $diferencia->y;                             
        }       
    
        // Verificamos que sea mayor de edad, en el caso que no lo sea, se termina la consulta
        if (is_numeric($edad) && $edad < 18) {
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Response'=>[],'Transaction_id' => $id_consumo]),"313");           
          return json_encode(['Parameters' => $nationalid, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        }
        
        if (empty($busquedaPadron) || !isset($busquedaPadron->Response) || empty($busquedaPadron->Response)) { 
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '301', 'Message' => Misc::error_query('301'), 'Response'=>[],'Transaction_id' => $id_consumo]),"301");                
          return json_encode(['Parameters' => $nationalid, 'Status' => '301', 'Message' => Misc::error_query('301'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        }
        
        $datosDniConsultado = $busquedaPadron->Response;  
        $otroSexo = '0';
    
        // Llamamos a las siguientes funciones que contienen la llamada a las api de renaper
        $res_renaper = ApiControllerV1::tratamientoSoloRenaper($nationalid, $gender);
        
        if (empty($res_renaper)) {   
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '301', 'Message' => Misc::error_query('301'), 'Response'=>[],'Transaction_id' => $id_consumo]),"301");                     
          return json_encode(['Parameters' => $nationalid, 'Status' => '301', 'Message' => Misc::error_query('301'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        }  
        
        //Devolvemos error si no obtenemos resultados de la busqueda
        if (isset($res_renaper->codigoError) && $res_renaper->codigoError == 12) {
          $status = '305';
          $message = Misc::error_query($status);
          $response = ['Transaction_id' => $consumo->transaction_id];
    
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid,'Status' => $status,'Message' => $message,'Response' => $response]),$status);                         
          return json_encode(['Parameters' => $nationalid,'Status' => $status,'Message' => $message,'Response' => $response]);
        }
    
        $datos_persona = SQLConnection::backendStoreProcedure('api_get_govcheck_2024',array($persona[0]->identificacion),'select');
        
        if (!$datos_persona) {    
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '305', 'Message' => Misc::error_query('305'), 'Response'=>[],'Transaction_id' => $id_consumo]),'305');                           
          return json_encode(['Parameters' => $nationalid, 'Status' => '305', 'Message' => Misc::error_query('305'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        }
    
        $tax_id_type = (!empty($datos_persona) && isset($datos_persona[0]->tipo_clave)) ? $datos_persona[0]->tipo_clave : '';
        $tax_id = (!empty($datos_persona) && isset($datos_persona[0]->identificacion)) ? $datos_persona[0]->identificacion : '';        
    
        #Ultima situacion 1
        $antiguedad_situacion_1 = "";
        if(!empty($datos_persona) && isset($datos_persona[0]->identificacion)){
          $antiguedad_situacion_1 = SQLConnection::backendStoreProcedure('obtener_cendeu_sit1_desde', array($datos_persona[0]->identificacion),true);
          $antiguedad_situacion_1 = !empty($antiguedad_situacion_1) ? $antiguedad_situacion_1->fecha_desde : "";
          if(!empty($antiguedad_situacion_1)){                                
            $date = DateTime::createFromFormat('m/Y', $antiguedad_situacion_1);
            $antiguedad_situacion_1 = $date->format('Y-m');               
          }
        }else {
          $antiguedad_situacion_1 = SQLConnection::backendStoreProcedure('obtener_cendeu_sit1_desde', array($nationalid),true);
          $antiguedad_situacion_1 = !empty($antiguedad_situacion_1) ? $antiguedad_situacion_1->fecha_desde : "";
          if(!empty($antiguedad_situacion_1)){                                
            $date = DateTime::createFromFormat('m/Y', $antiguedad_situacion_1);
            $antiguedad_situacion_1 = $date->format('Y-m');               
          }             
        }
        
        $chequesRechazados = 'No informa';
        $ultima_formateada = 'No informa';
        $maxima_formateada = 'No informa';
        $cantidadBancosUnicos = '0';
        
        $card_status_bancario = SQLConnection::obtenerStatusBancario($res_renaper->cuil);

        if (isset($card_status_bancario)) {
            if (isset($card_status_bancario->cheques_rechazados)) {
                $chequesRechazados = ($card_status_bancario->cheques_rechazados > 0) ? 'SI' : 'NO';
            }
            if (isset($card_status_bancario->ultima_posicion) && $card_status_bancario->ultima_posicion > 0) {
                $ultima_formateada = '$ ' . number_format($card_status_bancario->ultima_posicion, 0, ',', ' ');
            }
            if (isset($card_status_bancario->maxima_posicion) && $card_status_bancario->maxima_posicion > 0) {
                $maxima_formateada = '$ ' . number_format($card_status_bancario->maxima_posicion, 0, ',', ' ');
            }
        }

        $obtenerBancos = SQLConnection::obtenerBancos($res_renaper->cuil);

        if (!empty($obtenerBancos)) {
            $nombresBancos = array_map(function($banco) {
                return trim($banco->nombre);
            }, $obtenerBancos);

            $nombresUnicos = array_unique($nombresBancos);
            $cantidadBancosUnicos = strval(count($nombresUnicos));
        }                   
    
        $busca_persona = $datos_persona[0];
        $nombres_persona = $busca_persona->nombres;
        $apellidos_persona = $busca_persona->apellidos;
        $cuit_persona = $busca_persona->identificacion; 
    
        $forzar_login = 'N'; 
        $datos = self::obtenerDatosLoginFace(env('RENAPER_FACE_SERVICIO'),$forzar_login);  
        
        if (isset($datos->error)) {
          ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '306', 'Message' => Misc::error_query('306'), 'Response'=>[],'Transaction_id' => $id_consumo]),'306');                              
          return json_encode(['Parameters' => $nationalid, 'Status' => '306', 'Message' => Misc::error_query('306'), 'Response'=>[],'Transaction_id' => $id_consumo]);
        } 
    
        $iError=0;
        if (isset($datos->token)) {
          $respuesta = self::obtenerDatosRenaperFace($selfie_image,$nationalid,$gender,$datos->token);                        
            
          if (isset(json_decode($respuesta)->error)) {      
            
            $mje_error = 'obtenerFaceMatch 0 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
            self::mail_error('','', 'La consulta no puede realizarse en este momento.', $mje_error); 
    
            //$numeroTransaccionRF = $data->notificacion->transactionControlNumber;        
    
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Parameters' => $nationalid, 'Status' => '306', 'Message' => Misc::error_query('306'), 'Response'=>[],'Transaction_id' => $id_consumo]),'306');                            
    
            return json_encode(['Parameters' => $nationalid, 'Status' => '306', 'Message' => Misc::error_query('306'), 'Response'=>[],'Transaction_id' => $id_consumo]);
    
          }
          
          if (isset(json_decode($respuesta)->data)) {
            $data = json_decode($respuesta)->data;                      
          
            if (!empty($data->notificacion) && !empty($data->notificacion->errorArray)) {              
              $error_recibido = $data->notificacion->errorArray[0];
              $mje_error = 'obtenerFaceMatch  - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;                       
              
              self::mail_error('',$data->codigo, $data->mensaje, $mje_error); 
              
              //$numeroTransaccionRF = $data->notificacion->transactionControlNumber;                 
              ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>$error_recibido->code,'Message'=>$error_recibido->description,'Response'=>[],'Transaction_id'=>$id_consumo]),$error_recibido->code);                               
              return json_encode(['Status'=>$error_recibido->code,'Message'=>$error_recibido->description,'Response'=>[],'Transaction_id'=>$id_consumo]);                   
            }           
            
          
                      
            if (isset($data->codigo) && $data->codigo == 400) {
              $mje_error = 'obtenerFaceMatch 1 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
              self::mail_error('',$data->codigo, $data->mensaje, $mje_error); 
              
              ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>Misc::error_query('405'),'Response'=>[],'Transaction_id'=>$id_consumo]),'405');                             
              return json_encode(['Status'=>'405','Message'=>Misc::error_query('405'),'Response'=>[],'Transaction_id'=>$id_consumo]);
            } 
            
            
            if (isset($data->codigo) && $data->codigo !== 200) {
              $mje_error = 'obtenerFaceMatch 1 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
              self::mail_error('',$data->codigo, $data->mensaje, $mje_error); 
              
              ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>$data->mensaje,'Response'=>[],'Transaction_id'=>$id_consumo]),'ERROR');                             
              return json_encode(['Status'=>'ERROR','Message'=>$data->mensaje,'Response'=>[],'Transaction_id'=>$id_consumo]);
            } 

          }
          
          
                       
             
          
          $respuesta = json_decode($respuesta);
    
          $resp = new \stdClass();
    
          // Error especificado en el campo $respuesta->mensaje
          if($respuesta->codigo_http!==200){  
            $resp = $respuesta->mensaje_http; 
            $resp = str_replace('ERROR INTERNO','RENAPER INFORMA ERROR INTERNO',$resp);
            
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]),'ERROR');                            
            return json_encode(['Status'=>'ERROR','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]);
          }
    
          
          $notificacion =  $data->notificacion;
          $notificacion_1 =  $data->notificacion;
          $errorArray = $notificacion->errorArray; 
          $errorArray_1 = $notificacion->errorArray;    
              
          $id = SqlConnection::backendStoreProcedure('RENAPER_FACE_INSERTAR',array(
            $nationalid, 
            $gender, 
            $respuesta->codigo_http??null,
            $respuesta->mensaje_http??null,
            $data->codigo??null, 
            $data->mensaje??null, 
            $notificacion->transactionControlNumber??null, 
            $notificacion->typeOfTransaction??null, 
            $notificacion->dateOfTransaction??null, 
            $errorArray[0]->code??null, 
            $errorArray[0]->description??null, 
            $errorArray[0]->name??null, 
            null
          ),'selectOne');
    
          if (isset($id->transaccion)) {
              $final = self::obtenerDatosRenaperFaceFinal($id->transaccion,$datos->token);
              
              if (isset(json_decode($final)->error)) {
                $mje_error = 'obtenerFaceMatch 2 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id; 
                self::mail_error('','', 'La consulta no puede realizarse en este momento.',$mje_error);    
    
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'306','Message'=>Misc::error_query('306'),'Response'=>[],'Transaction_id'=>$id_consumo]),'306');                             
                return json_encode(['Status'=>'306','Message'=>Misc::error_query('306'),'Response'=>[],'Transaction_id'=>$id_consumo]); 
              } 
    
              $data = json_decode($final)->data;
              
              if (isset($data->codigo) && $data->codigo !== 0) {
                $mensaje_error  = $errorArray_1[0]->description ?? $data->mensaje;
                $mensaje_error = str_replace('ERROR INTERNO','RENAPER INFORMA ERROR INTERNO',$mensaje_error);
                $response = [];
                $response[0] = new \stdClass();
                $nuevaRespuesta[0] = new \stdClass();

                $response[0]->tcnid  = $notificacion_1->transactionControlNumber ?? '';
                $response[0]->status = '';
                $response[0]->score  =  ''; 
                $response[0]->face_match_datetime = $fecha_consumo ?? '';           
                $response[0]->national_id   = $nationalid;
                $response[0]->facematch_id = $notificacion_1->transactionControlNumber  ?? '';
                
                $nuevaRespuesta[0]->name         = '';
                $nuevaRespuesta[0]->surname      = '';
                $nuevaRespuesta[0]->tax_id_type = $tax_id_type;
                $nuevaRespuesta[0]->tax_id = $tax_id ?? '';                      

                $nuevaRespuesta[0]->sit_1_since = $antiguedad_situacion_1;
                $nuevaRespuesta[0]->banks = "";            
                $nuevaRespuesta[0]->last_position = "";
                $nuevaRespuesta[0]->highest_position = "";
                $nuevaRespuesta[0]->rejected_checks = "";    
                  
                $nuevaRespuesta[0]->DOD = $DOD ?? '';
                $nuevaRespuesta[0]->DOB = $fecha_nacimiento ?? '';           
    
                $formateoFinal = [$response, $nuevaRespuesta];         
                
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>$mensaje_error,'Response'=>$formateoFinal,'Transaction_id'=>$id_consumo]),'ERROR');                               
                return json_encode(['Status'=>'ERROR','Message'=>$mensaje_error,'Response'=>$formateoFinal,'Transaction_id'=>$id_consumo]);
              } 
    
        
              $respuesta = json_decode($final);
              
              $resp = new \stdClass();
              
              // Error especificado en el campo $respuesta->mensaje
              if($respuesta->codigo_http!==200){  
                $resp = $respuesta->mensaje_http;
    
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'ERROR','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]),'ERROR');                            
                return json_encode(['Status'=>'ERROR','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]);
              }        
    
              $notificacion =  $data->notificacion;        
              $fechor = $notificacion->fechanoti ?? '';
              $fechor .= ' ';
              $fechor .= $notificacion->horanoti ?? ''; 
    
              $ok = SqlConnection::backendStoreProcedure('RENAPER_FACE_INSERTAR_FINAL',
                array($id->id, 
                      $respuesta->codigo_http??null,
                      $respuesta->mensaje_http??null,
                      $notificacion->TCN??null,
                      $notificacion->status??null,
                      $notificacion->score??null,
                      $notificacion->matchtype??null,
                      $notificacion->comments??null,
                      $notificacion->fechanoti??null,
                      $notificacion->horanoti??null,
                      $data->codigo??null,
                      $data->mensaje??null
                    ),
                  'selectOne'
                );
              
              $response = [];
              $response[0] = new \stdClass();
              $nuevaRespuesta[0] = new \stdClass(); 
              $response[0]->tcnid  = $notificacion->TCN       ?? '';
              $response[0]->status = $notificacion->status    ?? '';
              //$response[0]->score  = $notificacion->score     ?? '';
    
              $score = $notificacion->score ?? '';
              if (is_numeric($score))
              {
                $score = intdiv($score, 100);
                $score = strval($score);
              }
    
              
              /* Agregado 09/11/2023: Si Renaper devolvio score vacio, responde error */
              if($score=='') {
                $resp = Misc::error_query('406');
                
                ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'406','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]),'406');                            
                return json_encode(['Status'=>'406','Message'=>$resp,'Response'=>[],'Transaction_id'=>$id_consumo]);
              }          
    
              $response[0]->score  =  $score; 
              $response[0]->face_match_datetime = $fecha_consumo ?? '';
              #$response[0]->name         = '';#$nombres_persona   ?? '';
              #$response[0]->surname      = '';#$apellidos_persona ?? '';
              $response[0]->national_id   = $nationalid;
              $response[0]->facematch_id = $id->transaccion;
              
              $nuevaRespuesta[0]->name         = $nombres_persona   ?? '';
              $nuevaRespuesta[0]->surname      = $apellidos_persona ?? '';
              $nuevaRespuesta[0]->tax_id_type = $tax_id_type ?? '';
              $nuevaRespuesta[0]->tax_id = $tax_id ?? '';                  
              $nuevaRespuesta[0]->sit_1_since = $antiguedad_situacion_1 ?? '';

              $nuevaRespuesta[0]->banks = isset($cantidadBancosUnicos) ? $cantidadBancosUnicos : "";
              $nuevaRespuesta[0]->last_position = isset($ultima_formateada) ? $ultima_formateada : "";
              $nuevaRespuesta[0]->highest_position = isset($maxima_formateada) ? $maxima_formateada : "";
              $nuevaRespuesta[0]->rejected_checks = isset($chequesRechazados) ? $chequesRechazados : "";      

              $nuevaRespuesta[0]->DOD = $DOD ?? '';
              $nuevaRespuesta[0]->DOB = $fecha_nacimiento ?? '';           
              
              $formateoFinal = [$response, $nuevaRespuesta];
              ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'OK','Message'=>'OK','Response'=>$formateoFinal,'Transaction_id'=>$id_consumo]),'200');
              return json_encode(['Status'=>'OK','Message'=>'OK','Response'=>$formateoFinal,'Transaction_id'=>$id_consumo]);
        
          }else{
            $mje_error = 'obtenerFaceMatch 4 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . 
                        ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id; 
            self::mail_error('','', 'La consulta no puede realizarse en este momento.',$mje_error);        
            
            ApiControllerV1::Guardar_resultado_api($user_id, $producto, $nationalid, $gender, $id_consumo, json_encode(['Status'=>'306','Message'=>Misc::error_query('306'),'Response'=>[],'Transaction_id'=>$id_consumo]),'306');                             
            return json_encode(['Status'=>'306','Message'=>Misc::error_query('306'),'Response'=>[],'Transaction_id'=>$id_consumo]);
          } 
        }
    }

    /* -- Consulta Parte 1 -- */

    private static function obtenerDatosRenaperFace($selfie, $dni, $sexo, $token)
    {
        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => env("RENAPER_FACE_TCN_WSDL"),
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => '',
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => 'POST',
            //CURLOPT_POSTFIELDS => array('imagen' => $selfie,'dni' => $dni, 'sexo' => $sexo),
            CURLOPT_POSTFIELDS => '{"imagen":"' . $selfie . '","dni":"' . $dni . '","sexo":"' . $sexo . '"}',
            CURLOPT_HTTPHEADER => array(
                'Content-Type: text/plain',
                'Authorization: Bearer ' . $token
            ),
        ));

        $start_time = microtime(true);
        $response = curl_exec($curl);
        $end_time = microtime(true);
        $duracion = $end_time - $start_time;
        self::$tiempo_curl += $duracion; 
        self::$proveedor_curl = 'FaceMatch'; 

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

        /*
        $response = json_decode($response, true);
        $dataArrayIso = array_map(function ($value) {
          dd($value);
          $current_encoding = mb_detect_encoding($value, 'auto');
          if ($current_encoding == "UTF-8") {
            $campo = [];
            $campo = [iconv('UTF-8', 'ISO-8859-1', $value)];
            $valido = json_encode($campo);
            if (false == $valido) {
              return $value;
            }else {
              return $campo[0];
            }
          }
          return $value;
        }, $response);

        $response = json_encode($dataArrayIso);
        */

        if ($err) {                        
            Misc::guardarLogTxt($err, Session::get('usuario'), Session::get('usuario')->producto, $dni . '_' . $sexo);
            return json_encode(["error" => $err]);
        } else {
            Misc::guardarLogTxt($response, Session::get('usuario'), Session::get('usuario')->producto, $dni . '_' . $sexo);
            return $response;
        }
    }

    /* -- Consulta Parte 2 -- */

    private static function obtenerDatosRenaperFaceFinal($id, $token)
    {
        $curl = curl_init();
        sleep(1);
        curl_setopt_array($curl, array(
            CURLOPT_URL => "https://apirenaper.idear.gov.ar/CHUTROFINAL/API_ABIS/resultadoTCN.php?id=" . $id,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
        ));

        $authorization = "Authorization: Bearer " . $token; // Prepare the authorisation token
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: text/plain', $authorization)); // Inject the token into the header



        $start_time = microtime(true);
        $response = curl_exec($curl);
        $end_time = microtime(true);
        $duracion = $end_time - $start_time;
        self::$proveedor_curl = 'FaceMatch'; 

    
        self::$tiempo_curl += $duracion;         
        $err = curl_error($curl);

        curl_close($curl);
        /* SACARLOOOOO!!!  Es para mostrar que devuelve Renaper antes de la respuesta, en desarrollo */
        /*        var_dump("Función obtenerDatosRenaperFaceFinal");
                var_dump($response);
                var_dump("\r\n\r\n");
                //var_dump($err); 
        */
        /**/
        if ($err) {
            return json_encode(["error" => $err]);
        } else {
            return $response;
        }
    }

    /* -- Login Face match-- */
    private static function obtenerDatosLoginFace($metodo, $forzar_login)
    {

        if ($forzar_login == "N") {
            $datos = SQLConnection::backendStoreProcedure('renaper_face_obtener_datos_login', array(), 'selectOne');
        }
        if (! empty($datos) && $forzar_login == "N") {
            session::put($metodo, $datos);
            return $datos;
        } else {
            $login = self::obtenerLoginRenaperFace($metodo);
            if ($login == true) {
                $datos = SQLConnection::backendStoreProcedure('renaper_face_obtener_datos_login', array(), 'selectOne');
                session::put($metodo, $datos);
            } else {
                $datos = new \stdClass();
                $datos->error = "No ha podido establecer la conexion con Renaper";
            }
            return $datos;
        }
    }

    private static function obtenerLoginRenaperFace($metodo)
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $client_id = $usuario->cliente['client_id'];

        $respuesta = self::RenaperFaceCall();
        $resp = json_decode($respuesta);
        if (isset($resp->token) && isset($resp->codigo) && isset($resp->mensaje)) {
            $ok = SQLConnection::backendStoreProcedure('Renaper_Face_guardar_autenticacion', array($resp->codigo, $resp->mensaje, $resp->token));
            return true;
        } else {
            $mje_error = 'obtenerLoginRenaperFace - Cliente: ' . $client_id . ' - Usuario: ' . $user_id;
            // self::mail_error($resp->response, $resp->err, '', $mje_error);
        }
        return false;
    }

    private static function RenaperFaceCall()
    {
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => env("RENAPER_FACE_LOGIN_WSDL"),
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => array('username' => env("RENAPER_FACE_USERNAME"), 'password' => env("RENAPER_FACE_PASSWORD")),
        ));

        $start_time = microtime(true);
        $response = curl_exec($curl);
        $end_time = microtime(true);
        $duracion = $end_time - $start_time;
        self::$tiempo_curl += $duracion; 
        self::$proveedor_curl = 'FaceMatch'; 

        $err = curl_error($curl);
        //var_dump($response); 
        //var_dump($err); die();  
        curl_close($curl);
        $array = json_decode($response);
        // Rami prueba
        if ( is_object($array) ){
            $codigo = $array->data->codigo;
            $mensaje = $array->data->mensaje;
            $token = $array->data->token;
        } elseif (sizeof($array) > 0) {
            foreach ($array as $key => $resp) {
                if ($key == 'data') {
                    $codigo = $resp->codigo;
                    $mensaje = $resp->mensaje;
                    $token = $resp->token;
                }
            }
        }
        //
        if ($err) {
            return json_encode(["error" => $err]);
        } else {
            return json_encode(['codigo' => $codigo, 'mensaje' => $mensaje, 'token' => $token, 'response' => $response, 'err' => $err]);
        }
    }

    /* RENAPER - face-match */
    public static function obtenerFaceMatch()
    {
        $selfie_image = Request::input('selfie_image');
        $nationalid = Request::input('nationalid');
        $gender = Request::input('gender');
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $client_id = $usuario->cliente['client_id'];

        $producto = $usuario->producto ?? 86;

        /* 02/12/2024: Cuando no anda Renaper */
        json_encode(['Parameters'=>$nationalid,'Status'=>'404','Message'=>'The service is currently unavailable due to maintenance.','Response'=>[]]);
        /**/
        $sexos = array('M', 'm', 'F', 'f');

        $respuesta = [];
        $id_consumo = '';
        $fecha_consumo = '';

        //Denegamos el acceso para usar esta api a clientes que ya tengan la version de esta api V3 -TB
        if (in_array($client_id, ['4501395', '5300349'])) {
            return json_encode(['Status' => '503', 'Message' => Misc::error_query(503)]);
        }

        // En caso de error en los parametros guarda el consumo por lo enviado en nationalID
        if (! $selfie_image || strlen($nationalid) != 8 || ! in_array($gender, $sexos)) {
            $consumo = ApiControllerV1::consumir_servicio($nationalid, $producto);
            $id_consumo = $consumo->transaction_id;
            $fecha_consumo = $consumo->transaction_date;
        }

        if (! $selfie_image) {
            return json_encode([
                'Status' => 'ERROR', 'Message' => 'El campo selfie_image no puede estar vacío', 'Response' => []
            ]);
        }

        if (strlen($nationalid) != 8) {
            return json_encode([
                'Status' => 'ERROR', 'Message' => 'El campo nationalid debe tener exactamente 8 números', 'Response' => []
            ]);
        }

        if (! in_array($gender, $sexos)) {
            return json_encode([
                'Status' => 'ERROR', 'Message' => 'El campo gender debe ser M o F', 'Response' => [], 'Transaction_id' => $id_consumo
            ]);
        }

        // En caso de no encontrar el documento en padron guarda el consumo por lo enviado en nationalID
        $busca_persona = SqlConnection::backendStoreProcedure('buscar_padron_dni_sexo', array($nationalid, $gender), 'selectOne');
        if (! $busca_persona) {

            $consumo = ApiControllerV1::consumir_servicio($nationalid, $producto);
            $id_consumo = $consumo->transaction_id;
            $fecha_consumo = $consumo->transaction_date;

            return json_encode([
                'Status' => 'ERROR', 'Message' => 'Combinacion NationalID Gender no encontrado', 'Response' => [], 'Transaction_id' => $id_consumo
            ]);
        }

        $nombres_persona = $busca_persona->nombres;
        $apellidos_persona = $busca_persona->apellidos;
        $cuit_persona = $busca_persona->identificacion;

        $forzar_login = 'N';
        $datos = self::obtenerDatosLoginFace(env('RENAPER_FACE_SERVICIO'), $forzar_login);
        if (isset($datos->error)) {
            return json_encode([
                'Status' => 'ERROR', 'Message' => 'La consulta no puede realizarse en este momento.', 'Response' => [], 'Transaction_id' => $id_consumo,
            ]);
        }
        $iError = 0;
        if (isset($datos->token)) {
            $respuesta = self::obtenerDatosRenaperFace($selfie_image, $nationalid, $gender, $datos->token);
            if (isset(json_decode($respuesta)->error)) {
                $mje_error = 'obtenerFaceMatch 0 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
                self::mail_error('', '', 'La consulta no puede realizarse en este momento.', $mje_error);
                return json_encode([
                    'Status' => 'ERROR', 'Message' => 'La consulta no puede realizarse en este momento.', 'Response' => [], 'Transaction_id' => $id_consumo,
                ]);
            }

            //AGB 25/09/2022
            /*
              if (!isset(json_decode($respuesta)->error)) 
              {
              
               $mje_error = 'obtenerFaceMatch 999 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . 
                              ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;  
                 self::mail_error('','', 'Error contacting FaceMatch service.', $mje_error); 
               return json_encode([
                 'Status'=>'ERROR','Message'=>'Error contacting FaceMatch service.','Response'=>[]
                 ]);
                 //var_dump($respuesta);die();
              }
            */

            $data = json_decode($respuesta)->data;

            if (isset($data->codigo) && $data->codigo !== 200) {
                $mje_error = 'obtenerFaceMatch 1 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
                self::mail_error('', $data->codigo, $data->mensaje, $mje_error);
                return json_encode([
                    'Status' => 'ERROR', 'Message' => $data->mensaje, 'Response' => [], 'Transaction_id' => $id_consumo,
                ]);
            }

            $data = json_decode($respuesta)->data;
            if (! empty($data->notificacion) && ! empty($data->notificacion->errorArray)) {
                $error_recibido = $data->notificacion->errorArray[0];
                if (! empty($error_recibido)) {
                    $consumo = ApiControllerV1::consumir_servicio($nationalid, $producto);
                    $id_consumo = $consumo->transaction_id;

                    $mje_error = 'obtenerFaceMatch 789 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
                    return json_encode([
                        'Status' => $error_recibido->code, 'Message' => $error_recibido->description, 'Response' => [], 'Transaction_id' => $id_consumo,
                    ]);
                }
            }

            $respuesta = json_decode($respuesta);
            $resp = new \stdClass();
            if ($respuesta->codigo_http !== 200) {  // Error especificado en el campo $respuesta->mensaje
                $resp = $respuesta->mensaje_http;
                $resp = str_replace('ERROR INTERNO', 'RENAPER INFORMA ERROR INTERNO', $resp);
                return json_encode([
                    'Status' => 'ERROR', 'Message' => $resp, 'Response' => [], 'Transaction_id' => $id_consumo,
                ]);
            }
            $notificacion = $data->notificacion;
            $notificacion_1 = $data->notificacion;
            $errorArray = $notificacion->errorArray;
            $errorArray_1 = $notificacion->errorArray;

            // guardo la consulta con el CUIT, aunque haya consultado por DNI / sexo
            //ApiControllerV1::consumir_servicio($cuit_persona,$producto); 
            $consumo = ApiControllerV1::consumir_servicio($cuit_persona, $producto);
            $id_consumo = $consumo->transaction_id;
            $fecha_consumo = $consumo->transaction_date;

            $id = SqlConnection::backendStoreProcedure('RENAPER_FACE_INSERTAR', array(
                $nationalid,
                $gender,
                $respuesta->codigo_http ?? null,
                $respuesta->mensaje_http ?? null,
                $data->codigo ?? null,
                $data->mensaje ?? null,
                $notificacion->transactionControlNumber ?? null,
                $notificacion->typeOfTransaction ?? null,
                $notificacion->dateOfTransaction ?? null,
                $errorArray[0]->code ?? null,
                $errorArray[0]->description ?? null,
                $errorArray[0]->name ?? null,
                null
            ), 'selectOne');

            if (isset($id->transaccion)) {
                $final = self::obtenerDatosRenaperFaceFinal($id->transaccion, $datos->token);
                if (isset(json_decode($final)->error)) {
                    $mje_error = 'obtenerFaceMatch 2 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;

                    self::mail_error('', '', 'La consulta no puede realizarse en este momento.', $mje_error);
                    return json_encode([
                        'Status' => 'ERROR', 'Message' => 'La consulta no puede realizarse en este momento.', 'Response' => [], 'Transaction_id' => $id_consumo,
                    ]);
                }

                $data = json_decode($final)->data;
                if (isset($data->codigo) && $data->codigo !== 0) {
                    $mensaje_error = $errorArray_1[0]->description ?? $data->mensaje;
                    $mensaje_error = str_replace('ERROR INTERNO', 'RENAPER INFORMA ERROR INTERNO', $mensaje_error);
                    $response = [];
                    $response[0] = new \stdClass();
                    $response[0]->tcnid = $notificacion_1->transactionControlNumber ?? '';
                    $response[0]->status = '';
                    $response[0]->score = '';
                    $response[0]->face_match_datetime = $fecha_consumo ?? '';
                    $response[0]->name = '';
                    $response[0]->surname = '';
                    $response[0]->nationalid = $nationalid;
                    $response[0]->facematch_id = $notificacion_1->transactionControlNumber ?? '';

                    //$mje_error = 'obtenerFaceMatch 3 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid . ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id; 
                    //self::mail_error('',$data->codigo, $data->mensaje,$mje_error); 

                    return json_encode([
                        'Status' => 'ERROR', 'Message' => $mensaje_error, 'Response' => $response, 'Transaction_id' => $id_consumo,
                    ]);
                }

                $respuesta = json_decode($final);
                $resp = new \stdClass();
                if ($respuesta->codigo_http !== 200)  // Error especificado en el campo $respuesta->mensaje
                {
                    $resp = $respuesta->mensaje_http;
                    return json_encode([
                        'Status' => 'ERROR', 'Message' => $resp, 'Response' => [], 'Transaction_id' => $id_consumo,
                    ]);
                }

                $notificacion = $data->notificacion;
                $fechor = $notificacion->fechanoti ?? '';
                $fechor .= ' ';
                $fechor .= $notificacion->horanoti ?? '';

                $ok = SqlConnection::backendStoreProcedure('RENAPER_FACE_INSERTAR_FINAL',
                    array($id->id,
                        $respuesta->codigo_http ?? null,
                        $respuesta->mensaje_http ?? null,
                        $notificacion->TCN ?? null,
                        $notificacion->status ?? null,
                        $notificacion->score ?? null,
                        $notificacion->matchtype ?? null,
                        $notificacion->comments ?? null,
                        $notificacion->fechanoti ?? null,
                        $notificacion->horanoti ?? null,
                        $data->codigo ?? null,
                        $data->mensaje ?? null
                    ), 'selectOne');
                $response = [];
                $response[0] = new \stdClass();
                $response[0]->tcnid = $notificacion->TCN ?? '';
                $response[0]->status = $notificacion->status ?? '';
                //$response[0]->score  = $notificacion->score     ?? '';
                $score = $notificacion->score ?? '';
                if (is_numeric($score)) {
                    $score = intdiv($score, 100);
                    $score = strval($score);
                }
                /* Agregado 09/11/2023: Si Renaper devolvio score vacio, responde error */
                if ($score == '') {
                    $resp = 'Error en la conexion al sistema publico de validacion de identidad';
                    return json_encode([
                        'Status' => 'ERROR', 'Message' => $resp, 'Response' => [], 'Transaction_id' => $id_consumo,
                    ]);
                }
                /**/
                $response[0]->score = $score;
                $response[0]->face_match_datetime = $fecha_consumo ?? '';
                $response[0]->name = $nombres_persona ?? '';
                $response[0]->surname = $apellidos_persona ?? '';
                $response[0]->nationalid = $nationalid;
                $response[0]->facematch_id = $id->transaccion;

                return json_encode([
                    'Status' => 'OK', 'Message' => 'OK', 'Response' => $response, 'Transaction_id' => $id_consumo,
                ]);
            } else {
                $mje_error = 'obtenerFaceMatch 4 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .
                    ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
                self::mail_error('', '', 'La consulta no puede realizarse en este momento.', $mje_error);
                return json_encode([
                    'Status' => 'ERROR', 'Message' => 'La consulta no puede realizarse en este momento.', 'Response' => [], 'Transaction_id' => $id_consumo,
                ]);
            }
        }
    }

    /* RENAPER - face-match-demo */
    public static function obtenerFaceMatchDemo()
    {
        $apikey = Request::input('apikey');
        $selfie_image = Request::input('selfie_image');
        $nationalid = Request::input('nationalid');
        $gender = Request::input('gender');

        $respuesta = [];
        $respuesta[0] = new \stdClass();
        $respuesta[0]->tcnid = 'TCN-00000000000000';
        $respuesta[0]->status = 'HIT';
        $respuesta[0]->score = '91';
        $respuesta[0]->face_match_datetime = '2021-02-08 14:53:22';
        $respuesta[0]->name = 'xxxxxxx';
        $respuesta[0]->surname = 'xxxxxxx';
        $respuesta[0]->nationalid = 'xxxxxxx';
        $respuesta[0]->facematch_id = '0000000';


        return json_encode([
            'Status' => 'OK',
            'Message' => 'OK',
            'Response' => $respuesta
        ]);
    }

    /* -- Consulta -- */

    private static function obtenerDatosRenaper($dni, $sexo, $token)
    {
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => "https://apirenaper.idear.gov.ar/apidatos/porDniSexo.php?dni=" . $dni . "&sexo=" . $sexo,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_HTTPHEADER => array(
                "cache-control: no-cache",
                "postman-token: " . $token
            ),
        ));

        $authorization = "Authorization: Bearer " . $token; // Prepare the authorisation token
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json', $authorization)); // Inject the token into the header
        
        $start_time = microtime(true);
        $response = curl_exec($curl);
        $end_time = microtime(true);
        $duracion = $end_time - $start_time;
        self::$tiempo_curl += $duracion; 
        self::$proveedor_curl = 'Renaper'; 


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

        $response = json_decode($response, true);

        $dataArrayIso = array_map(function ($value) {
            $current_encoding = mb_detect_encoding($value, 'auto');
            if ($current_encoding == "UTF-8") {
                $campo = [];
                $campo = [iconv('UTF-8', 'ISO-8859-1', $value)];
                $valido = json_encode($campo);
                if (false == $valido) {
                    return $value;
                } else {
                    return $campo[0];
                }
            }
            return $value;
        }, $response);

        $response = json_encode($dataArrayIso);

        if ($err) {
            return json_encode(["error" => $err]);
        } else {
            return $response;
        }
    }

    /* -- Login -- */
    private static function obtenerDatosLogin($metodo, $forzar_login)
    {
        if ($forzar_login == "N") {
            $datos = SQLConnection::backendStoreProcedure('renaper_obtener_datos_login', array(), 'selectOne');
        }
        if (! empty($datos) && $forzar_login == "N") {
            session::put($metodo, $datos);
            return $datos;
        } else {
            $login = self::obtenerLoginRenaper($metodo);
            if ($login == true) {
                $datos = SQLConnection::backendStoreProcedure('renaper_obtener_datos_login', array(), 'selectOne');
                session::put($metodo, $datos);
            } else {
                $datos = new \stdClass();
                $datos->error = "No ha podido establecer la conexion con Renaper";
            }
            return $datos;
        }
    }

    private static function RenaperCall()
    {
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => env("RENAPER_LOGIN_WSDL"),
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => array('username' => env("RENAPER_USERNAME"), 'password' => env("RENAPER_PASSWORD")),
        ));

        $start_time = microtime(true);
        $response = curl_exec($curl);
        $end_time = microtime(true);
        $duracion = $end_time - $start_time;
        self::$tiempo_curl += $duracion; 
        self::$proveedor_curl = 'Renaper'; 

        $err = curl_error($curl);
        /*var_dump($response); 
        var_dump($err); die();  
        AGB ERROR
        string(308) "{"codigo_http":200,"mensaje_http":"OK","data":{"codigo":0,"mensaje":"Token generado","token":"
        eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiI0NTkiLCJ1c2VyTmFtZSI6ImZpZGVsaXRhc2RhdG9zIiwicHJvdmluY2lhSWQiOm51bGwsIm5iZiI6MTczMzA1MTUwNSwiZXhwIjoxNzMzMTA4Mzk5fQ.uG8Yq9lDJBp-C1kr4S0Rgq3WCtTGYxzSwJYbtnm6W0E"}}" string(0) ""
        
        */
        curl_close($curl);
        $array = json_decode($response);
        if ( is_object($array) ){
            $codigo = $array->data->codigo;
            $mensaje = $array->data->mensaje;
            $token = $array->data->token;
        }
        //
        if ( is_array($array) ){
            if (sizeof($array) > 0) {
                foreach ($array as $key => $resp) {
                    if ($key == 'data') {
                        $codigo = $resp->codigo;
                        $mensaje = $resp->mensaje;
                        $token = $resp->token;
                    }
                }
            }
        } 
        elseif (is_object($array)){ 
                $codigo = $array->data->codigo;
                $mensaje = $array->data->mensaje;
                $token = $array->data->token;
            }

        /*else {
            $codigo = $array->codigo;
            $mensaje = $array->mensaje;
            $token = $array->token;
*/

        
        //
        if ($err) {
            return json_encode(["error" => $err]);
        } else {
            return json_encode(['codigo' => $codigo, 'mensaje' => $mensaje, 'token' => $token, 'response' => $response, 'err' => $err]);
        }
    }

    private static function obtenerLoginRenaper($metodo)
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $client_id = $usuario->cliente['client_id'];

        $respuesta = self::RenaperCall();
        $resp = json_decode($respuesta);
        if (isset($resp->token) && isset($resp->codigo) && isset($resp->mensaje)) {
            SQLConnection::backendStoreProcedure('Renaper_guardar_autenticacion', array($resp->codigo, $resp->mensaje, $resp->token));
            return true;
        } else {
            $mje_error = 'obtenerLoginRenaper - Cliente: ' . $client_id . ' - Usuario: ' . $user_id;
            self::mail_error($resp->response, $resp->err, '', $mje_error);
        }
        return false;
    }

    private static function mail_error($response, $err, $error, $face = '')
    {
        Mailer::from('soporte@fidelitas.com.ar');
        Mailer::to('soporte@fidelitas.com.ar');
        Mailer::replyto('soporte@fidelitas.com.ar');
        $mail_content = 'Error al consultar Renaper ' . $face;
        $mail_content .= '<br><br>response: ' . $response;
        $mail_content .= '<br><br>err: ' . $err;
        $mail_content .= '<br><br>error: ' . $error;
        $mail_content .= '<br><br>';
        $mail_subject = 'Error al consultar Renaper ' . $face;
        Mailer::text($mail_content, $mail_subject);
        return Mailer::send();
    }

    /* ----------------------------------------------- */
    /* API PASAPORTE */
    /* ----------------------------------------------- */

    public static function obtenerRenaperPasaporte()
    {
        $nationalid = Request::input('nationalid');
        $gender = Request::input('gender');
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $client_id = $usuario->cliente['client_id'];

        $producto = $usuario->producto ?? 101;

        $sexos = array('M', 'm', 'F', 'f');

        $respuesta = [];
        $id_consumo = '';
        $fecha_consumo = '';

        $nationalid = str_pad($nationalid, 8, "0", STR_PAD_LEFT); // Completa con ceros a la izquierda hasta long 8

        // En caso de error en los parametros guarda el consumo por lo enviado en nationalID
        if (strlen($nationalid) !== 8 || $nationalid == NULL || $nationalid == '00000000' || ! in_array($gender, $sexos)) {
            $consumo = ApiControllerV1::consumir_servicio($nationalid, $producto);
            $id_consumo = $consumo->transaction_id;
            $fecha_consumo = $consumo->transaction_date;
        }

        if ($nationalid == NULL || $nationalid == '00000000') {
            return json_encode([
                'Status' => 'ERROR',
                'Message' => 'El campo nationalid no puede estar vacio',
                'Response' => [],
                'Transaction_id' => $id_consumo,
                'Internal_id' => ''
            ]);
        }
        if (strlen($nationalid) !== 8) {
            return json_encode([
                'Status' => 'ERROR',
                'Message' => 'El campo nationalid ingresado tiene mas de 8 digitos',
                'Response' => [],
                'Transaction_id' => $id_consumo,
                'Internal_id' => ''
            ]);
        }
        if (! in_array($gender, $sexos)) {
            return json_encode([
                'Status' => 'ERROR',
                'Message' => 'El campo gender debe ser M o F',
                'Response' => [],
                'Transaction_id' => $id_consumo,
                'Internal_id' => ''
            ]);
        }


        // En caso de no encontrar el documento en padron guarda el consumo por lo enviado en nationalID
        $busca_persona = SqlConnection::backendStoreProcedure('buscar_padron_dni_sexo', array($nationalid, $gender), 'selectOne');
        if (! $busca_persona) {
            $consumo = ApiControllerV1::consumir_servicio($nationalid, $producto);
            $id_consumo = $consumo->transaction_id;
            $fecha_consumo = $consumo->transaction_date;
            return json_encode([
                'Status' => 'ERROR',
                'Message' => 'Combinacion NationalID Gender no encontrado',
                'Response' => [],
                'Transaction_id' => $id_consumo,
                'Internal_id' => ''
            ]);
        }

        $nombres_persona = $busca_persona->nombres;
        $apellidos_persona = $busca_persona->apellidos;
        $cuit_persona = $busca_persona->identificacion;
        $nombre = trim($busca_persona->nombre_persona) ?? '';
        $id_padron = $busca_persona->id_padron;

        $consumo = ApiControllerV1::consumir_servicio($cuit_persona, $producto);
        $id_consumo = $consumo->transaction_id;
        $fecha_consumo = $consumo->transaction_date;



        /* Se fija si ya lo consultamos */

        $dias = env("DIAS_RENAPER_PASAPORTE");
        $respuesta = SqlConnection::backendStoreProcedure('RENAPER_PASAPORTE_BUSCAR', array($nationalid, $gender, $dias), 'selectOne');
        //------
        if (! empty($respuesta) && trim($respuesta->nro_pasaporte) !== '' && $respuesta->nro_pasaporte !== NULL) {
            $response = [];
            $response[0] = new \stdClass();
            $response[0]->datetime = $fecha_consumo ?? '';
            $response[0]->nationalid = $nationalid;
            $response[0]->gender = $gender;
            $response[0]->data = [];
            $response[0]->data[0] = new \stdClass();
            $response[0]->data[0]->code = $respuesta->codigo;
            $response[0]->data[0]->message = $respuesta->mensaje;
            $response[0]->data[0]->passport_number = $respuesta->nro_pasaporte;
            $response[0]->data[0]->expiration_date = $respuesta->fecha_vencimiento;
            $response[0]->data[0]->name = $nombre;
            $response[0]->data[0]->taxid = $cuit_persona;

            return json_encode(['Status' => 'OK', 'Message' => 'OK', 'Response' => $response, 'Transaction_id' => $id_consumo, 'Internal_id' => $respuesta->id]);
        }

        /* La primera vez no fuerza el token, busca si tenemos uno generado, si con ese generado 
           Renaper devuelve error 401 -  Acceso denegado : Expired token, 
           entonces va a buscar un nuevo token. 
           Este while sirve para hacer el loop, hasta que obtenga el token valido 
        */

        $token_ok = 'N';
        $forzar_login = 'N';
        while ($token_ok == 'N') {
            $datos = self::obtenerDatosLoginPasaporte(env('RENAPER_PASAPORTE_SERVICIO'), $forzar_login);
            if (isset($datos->error)) {
                return json_encode([
                    'Status' => 'ERROR',
                    'Message' => 'La consulta no puede realizarse en este momento.',
                    'Response' => [],
                    'Transaction_id' => $id_consumo,
                    'Internal_id' => ''
                ]);
            }

            $iError = 0;
            if (isset($datos->token)) {
                $respuesta = self::obtenerDatosRenaperPasaporte($nationalid, $gender, $datos->token);
                if (isset(json_decode($respuesta)->error)) {
                    $mje_error = 'obtenerRenaperPasaporte 0 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .
                        ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;

                    self::mail_error('', '', 'La consulta no puede realizarse en este momento.', $mje_error);
                    return json_encode([
                        'Status' => 'ERROR',
                        'Message' => 'La consulta no puede realizarse en este momento.',
                        'Response' => [],
                        'Transaction_id' => $id_consumo,
                        'Internal_id' => ''
                    ]);
                }

                $data = json_decode($respuesta);

                if (isset($data->codigo) && $data->codigo == 401) // Acceso denegado : Expired token
                {
                    $forzar_login = 'S';
                    continue;
                }

                $token_ok = 'S';
                if (isset($data->codigo) && $data->codigo !== 200) {
                    $mje_error = 'obtenerRenaperPasaporte 1 - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .
                        ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
                    self::mail_error('', $data->codigo, $data->mensaje, $mje_error);
                    return json_encode([
                        'Status' => 'ERROR',
                        'Message' => $data->mensaje,
                        'Response' => [],
                        'Transaction_id' => $id_consumo,
                        'Internal_id' => ''
                    ]);
                } else {
                    $datos = json_decode($respuesta)->datos;

                    // DNI Nahuel 41876480

                    $id = SqlConnection::backendStoreProcedure(
                        'RENAPER_PASAPORTE_INSERTAR',
                        array(
                            $nationalid,
                            $gender,
                            $cuit_persona,
                            $id_padron,
                            $data->codigo ?? null,
                            $data->mensaje ?? null,
                            $datos->nro_pasaporte ?? null,
                            $datos->fecha_vencimiento ?? null
                        ),
                        'selectOne'
                    );

                    $response = [];
                    $response[0] = new \stdClass();
                    $response[0]->datetime = $fecha_consumo ?? '';
                    $response[0]->nationalid = $nationalid;
                    $response[0]->gender = $gender;
                    $response[0]->data = [];
                    $response[0]->data[0] = new \stdClass();
                    $response[0]->data[0]->code = $data->codigo;
                    $response[0]->data[0]->message = $data->mensaje;
                    $response[0]->data[0]->passport_number = $datos->nro_pasaporte;
                    $response[0]->data[0]->expiration_date = $datos->fecha_vencimiento;
                    $response[0]->data[0]->name = $nombre;
                    $response[0]->data[0]->taxid = $cuit_persona;
                    return json_encode([
                        'Status' => 'OK',
                        'Message' => 'OK',
                        'Response' => $response,
                        'Transaction_id' => $id_consumo,
                        'Internal_id' => $id->id
                    ]);
                }
            } else {
                $mje_error = 'obtenerRenaperPasaporte Sin Token - Cliente: ' . $client_id . ' - DNI: ' . $nationalid .
                    ' - Sexo: ' . $gender . ' - Usuario: ' . $user_id;
                self::mail_error('', $data->codigo, $data->mensaje, $mje_error);
                return json_encode([
                    'Status' => 'ERROR',
                    'Message' => 'La consulta no puede realizarse en este momento.',
                    'Response' => [],
                    'Transaction_id' => $id_consumo,
                    'Internal_id' => ''
                ]);
            }
        }
    }

    /* -- Login Pasaporte -- */
    private static function obtenerDatosLoginPasaporte($metodo, $forzar_login)
    {

        if ($forzar_login == "N") {
            $datos = SQLConnection::backendStoreProcedure('renaper_pasaporte_obtener_datos_login', array(), 'selectOne');
        }
        if (! empty($datos) && $forzar_login == "N") {
            session::put($metodo, $datos);
            return $datos;
        } else {
            $login = self::obtenerLoginRenaperPasaporte($metodo);
            if ($login == true) {
                $datos = SQLConnection::backendStoreProcedure('renaper_pasaporte_obtener_datos_login', array(), 'selectOne');
                session::put($metodo, $datos);
            } else {
                $datos = new \stdClass();
                $datos->error = "No ha podido establecer la conexion con Renaper";
            }
            return $datos;
        }
    }

    private static function obtenerLoginRenaperPasaporte($metodo)
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $client_id = $usuario->cliente['client_id'];

        $respuesta = self::RenaperPasaporteCall();
        $resp = json_decode($respuesta);
        if (isset($resp->token) && isset($resp->codigo) && isset($resp->mensaje)) {
            $ok = SQLConnection::backendStoreProcedure('Renaper_Pasaporte_guardar_autenticacion', array($resp->codigo, $resp->mensaje, $resp->token));
            return true;
        } else {
            $mje_error = 'obtenerLoginRenaperPasaporte - Cliente: ' . $client_id . ' - Usuario: ' . $user_id;
            self::mail_error($resp->response, $resp->err, '', $mje_error);
        }
        return false;
    }

    private static function RenaperPasaporteCall()
    {
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => env("RENAPER_PASAPORTE_LOGIN_WSDL"),
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => array('username' => env("RENAPER_PASAPORTE_USERNAME"), 'password' => env("RENAPER_PASAPORTE_PASSWORD")),
        ));

        $start_time = microtime(true);
        $response = curl_exec($curl);
        $end_time = microtime(true);
        $duracion = $end_time - $start_time;
        self::$tiempo_curl += $duracion; 
        self::$proveedor_curl = 'Pasaporte'; 

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

        if ($err) {
            return json_encode(["error" => $err]);
        } else {
            $respuesta = json_decode($response);
            $codigo = $respuesta->codigo;
            $mensaje = $respuesta->mensaje;
            $token = $respuesta->token;
            return json_encode(['codigo' => $codigo, 'mensaje' => $mensaje, 'token' => $token, 'response' => $response, 'err' => $err]);
        }
    }

    private static function obtenerDatosRenaperPasaporte($dni, $sexo, $token)
    {
        /*
        var_dump(env("RENAPER_PASAPORTE_WSDL"));  
        var_dump($dni);  
        var_dump($sexo);  
        var_dump($token); die();
        */

        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => env("RENAPER_PASAPORTE_WSDL") . "?dni=" . $dni . "&sexo=" . $sexo,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_HTTPHEADER => array(
                "cache-control: no-cache",
                "postman-token: " . $token
            ),
        ));

        $authorization = "Authorization: Bearer " . $token; // Prepare the authorisation token
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json', $authorization)); // Inject the token into the header
        
        $start_time = microtime(true);
        $response = curl_exec($curl);
        $end_time = microtime(true);
        $duracion = $end_time - $start_time;
        self::$tiempo_curl += $duracion; 
        self::$proveedor_curl = 'Pasaporte'; 


        $err = curl_error($curl);
        curl_close($curl);
        /*
        var_dump("Response");
        var_dump($response);
        var_dump("err");
        var_dump($err);
        die(); 
        */

        if ($err == '' && $response == '') // Cuando la persona no tiene pasaporte Renaper no devuelve nada de nada
        {
            $response = new \stdClass();
            $response->codigo = 200;
            $response->mensaje = 'OK';
            $response->datos = new \stdClass();
            $response->datos->nro_pasaporte = '';
            $response->datos->fecha_vencimiento = '';
            return json_encode($response);
        }

        if ($err) {
            return json_encode(["error" => $err]);
        } else {
            return $response;
        }
    }
}
