<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Response;
use App\Custom\Misc;
use App\Custom\SQLConnection;
use App\Http\Controllers\AFIPController;

class DataCleaningController extends Controller
{
    /**
     * Parametros a los servicios
     * de API de Datacleaning (ademas del apikey)
     * @param string Key:identificador -->  el identificador o el tipo de documento de identidad
     * @param string|int Key:identificacion --> la identificacion o el numero de documento de identidad
     * @param string Key:country_code --> el codigo iso2 del pais emisor del documento o documento de identidad recibido
     * @param string Key:nombre_apellido_persona --> nombre completo de la persona asociado al numero de documento de identidad
     * @param string Key:tipo_persona --> una letra que caracteriza el tipo de persona del documento de identidad ('F' (Fisica) o 'J' (Juridica))
     * @param string Key:sexo --> sexo de la persona ('M' (Masculino) o 'F' (Femenino))
     * @param int Key:es_pasaporte --> un campo parecido a bit mandar 1 si el tipo de documento es pasaporte sino ignorarlo o mandar 0
     * @param string Key:tarea --> el id de referencia de terceros, es el id de la tarea de inquiro 
     * lo cual el Informe generado va a ser vinculado con , cuando termine el informe de data cleaning
     * Inquirovitae va a recibir una peticion con ese numero de id indicando que el informe de data cleaning
     * se finalizo.
     */

    /**
     * Funcion que maneja el
     * servicio de API para
     * dar de alta informes de 
     * data cleaning de juicios
     * @access public
     * @return \Illuminate\Http\JsonResponse
     */
    public function dclJuicios()
    {
        // Country Code
        if (!isset($_POST['country_code'])) {
            return Response::JSON(['error' => '1.1', 'mensaje' => 'El codigo ISO2 del pais no esta en los datos recibidos.'], 400);
        }
        // Nombre Apellido persona
        if (!isset($_POST['nombre_apellido_persona'])) {
            return Response::JSON(['error' => '1.2', 'mensaje' => 'El nombre completo de la persona no esta en los datos recibidos.'], 400);
        }
        // Identificacion
        if (!isset($_POST['identificacion'])) {
            return Response::JSON(['error' => '1.3', 'mensaje' => 'La identificacion no esta en los datos recibidos.'], 400);
        }
        // Identificador
        if (!isset($_POST['identificador'])) {
            return Response::JSON(['error' => '1.4', 'mensaje' => 'El identificador no esta en los datos recibidos.'], 400);
        }
        // Referencia
        if (!isset($_POST['tarea'])) {
            return Response::JSON(['error' => '1.5', 'mensaje' => 'La referencia no esta en los datos recibidos.'], 400);
        }
        // Tipo de Persona
        if (!isset($_POST['tipo_persona'])) {
            return Response::JSON(['error' => '1.6', 'mensaje' => 'El tipo de persona no esta en los datos recibidos.'], 400);
        }
        //
        $cliente = Session::get('usuario')->cliente['client_id'];
        $user_id = Session::get('usuario')->user_id;
        // Parametros
        $tarea = Request::input('tarea');
        $country_code = Request::input('country_code');
        $nombre_persona = Request::input('nombre_apellido_persona');
        $identificador = strtoupper(trim(Request::input('identificador')));
        $identificacion = Request::input('identificacion');
        $tipo_persona = strtoupper(Request::input('tipo_persona'));
        $sexo = NULL;
        $es_pasaporte = Request::input('es_pasaporte') ?? 0;
        // Control de tipo de identificacion
        if ($tipo_persona == 'F') {
            // Control de Sexo (si es persona fisica)
            /* if ( !isset($_POST['sexo']) ){
                      return Response::JSON(['error' => '2.6','mensaje' => 'El sexo no esta en los datos recibidos.'],400);
                  } else {
                      $sexo = Request::input('sexo');
                  } */
            $sexo = Request::input('sexo');
            if (!is_null($sexo)) {
                $sexo = strtoupper($sexo);
                if ($sexo != 'M' && $sexo != 'F') {
                    $sexo = NULL;
                }
            }
        } else {
            return Response::JSON(['error' => '2.5', 'mensaje' => 'El tipo de persona recibido es invalido, solamente se procesan pedidos de personas fisicas.'], 400);
        }
        // Control Codigo Pais
        if (strlen($country_code) != 2) {
            return Response::JSON(['error' => '2.3', 'mensaje' => 'El codigo de pais recibido es invalido.'], 400);
        }
        // Control Nombre Persona
        $caracteres_invalidos = '/!\"#\$%&\/()\=\'\}\{\[\]\,/';
        if (is_numeric($nombre_persona) || preg_match($caracteres_invalidos, $nombre_persona)) {
            return Response::JSON(['error' => '2.4', 'mensaje' => 'El nombre completo recibido es invalido.'], 400);
        }
        //
        $id_padron_fide = NULL;
        if ($es_pasaporte) {
            // Buscar en Padron
            $ident_pasaporte = (SQLConnection::obtenerPasaportePais($country_code))->identificador;
            $id_padron_fide = $this->evaluarEnPadron($identificacion, $ident_pasaporte, true);
            if (!$id_padron_fide) {
                // Si no esta insertar en Padron
                $id_padron_fide = SQLConnection::backendStoreProcedure('backend_insertar_padron', array(trim($ident_pasaporte), trim($identificacion), trim($nombre_persona), $tipo_persona, $sexo, "0", "0", NULL, NULL, NULL, $country_code, NULL, NULL), 'selectOne');
            }
        } elseif ($identificador == 'CUIL' || $identificador == 'CUIT') {
            // Validar CUIT
            $es_cuit = Misc::validarCuit($identificacion);
            if (!$es_cuit) {
                return Response::JSON(['error' => '2.1', 'mensaje' => 'La identificación recibida no tiene una estructura valida de CUIT.'], 400);
            }
            // Buscar en Padron
            $id_padron_fide = $this->evaluarEnPadron($identificacion, $identificador, true);
            // Si no esta consultar AFIP
            if (!$id_padron_fide) {
                //
                AFIPController::obtenerPadron($identificacion, true);
                $id_padron_fide = $this->evaluarEnPadron($identificacion, $identificador, true);
                if (!$id_padron_fide) {
                    return Response::JSON(['error' => '2.2', 'mensaje' => 'La identificación recibida es invalida.'], 400);
                }
            }
        } else {
            return Response::JSON(['error' => '1.6', 'mensaje' => 'El tipo de identificación debe ser CUIT,CUIL o pasaporte.'], 400);
        }

        // Alta del informe de data cleaning de juicios
        $fecha_comprometida = $this->setFechaComprometidaInforme(env('ID_INFORME_DCLJUICIOS'));
        // $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros',array('ALTA_INFORME_TERCEROS',$cliente,$user_id,env('ID_INFORME_DCLJUICIOS'),$identificacion,$identificador,$tarea,env('ID_TEAM_DCL')),'selectOne');      
        // TODO: IMPORTANTE COMENTAR CUANDO SE REALICEN PRUEBAS
        $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros', array('CONTRAPARTE_DATACLEAN', $cliente, $user_id, env('ID_INFORME_DCLJUICIOS'), $identificacion, $identificador, $tarea, env('ID_TEAM_DCL'), NULL, NULL, env('LED_PRODUCTO'), $id_padron_fide), 'selectOne');

        /* SE CREO LA SECCION DE ABAJO PORQUE LOS INFORMES POR API ESTABAN INGRESANDO SIN FECHA COMPROMETIDA- TBS */

        //BUSCO LOS DATOS DEL INFORME PARA PODER OBTENER LA DURACION DEL MISMO
        $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', Session::get('usuario')->user_id, null, null, null, $id_informe->infGenerado), 'selectOne');
        $fechas_informe = Misc::establecerFechasInforme($datos_informe->duracion_informe);

        //ACTUALIZO EL INFORME PARA QUE MUESTRE LA FECHA COMPROMETIDA
        $actualizar = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL', array('UPD_informe', $id_informe->infGenerado, $datos_informe->codigo_estado_informe, Session::get('usuario')->user_id, $datos_informe->userIDAsigandoInforme, $fechas_informe['fecha_inicio'], $fechas_informe['fecha_comprometida']));

        return Response::JSON(['error' => '0', 'mensaje' => 'El informe de juicios fue creado con exito.', 'id_informe' => $id_informe->infGenerado]);
    }

    /**
     * Funcion que maneja el
     * servicio de API para
     * dar de alta informes de 
     * data cleaning de edictos
     * @access public
     * @return \Illuminate\Http\JsonResponse
     */
    public function dclEdictos()
    {
        // Country Code
        if (!isset($_POST['country_code'])) {
            return Response::JSON(['error' => '1.1', 'mensaje' => 'El codigo ISO2 del pais no esta en los datos recibidos.'], 400);
        }
        // Nombre Apellido persona
        if (!isset($_POST['nombre_apellido_persona'])) {
            return Response::JSON(['error' => '1.2', 'mensaje' => 'El nombre completo de la persona no esta en los datos recibidos.'], 400);
        }
        // Identificacion
        if (!isset($_POST['identificacion'])) {
            return Response::JSON(['error' => '1.1', 'mensaje' => 'La identificacion no esta en los datos recibidos.'], 400);
        }
        // Identificador
        if (!isset($_POST['identificador'])) {
            return Response::JSON(['error' => '1.2', 'mensaje' => 'El identificador no esta en los datos recibidos.'], 400);
        }
        // Referencia
        if (!isset($_POST['tarea'])) {
            return Response::JSON(['error' => '1.3', 'mensaje' => 'La referencia no esta en los datos recibidos.'], 400);
        }
        // Tipo de Persona
        if (!isset($_POST['tipo_persona'])) {
            return Response::JSON(['error' => '1.6', 'mensaje' => 'El tipo de persona no esta en los datos recibidos.'], 400);
        }
        //
        $cliente = Session::get('usuario')->cliente['client_id'];
        $user_id = Session::get('usuario')->user_id;
        //
        $country_code = Request::input('country_code');
        $nombre_persona = Request::input('nombre_apellido_persona');
        $tarea = Request::input('tarea');
        $identificador = Request::input('identificador');
        $identificacion = Request::input('identificacion');
        $tipo_persona = strtoupper(Request::input('tipo_persona'));
        $sexo = NULL;
        $es_pasaporte = Request::input('es_pasaporte') ?? 0;
        //
        // Control de tipo de identificacion
        if ($tipo_persona == 'F') {
            // Control de Sexo (si es persona fisica)
            /* if ( !isset($_POST['sexo']) ){
                      return Response::JSON(['error' => '2.6','mensaje' => 'El sexo no esta en los datos recibidos.'],400);
                  } else {
                      $sexo = Request::input('sexo');
                  } */
            $sexo = Request::input('sexo');
            if (!is_null($sexo)) {
                $sexo = strtoupper($sexo);
                if ($sexo != 'M' && $sexo != 'F') {
                    $sexo = NULL;
                }
            }
        } else {
            return Response::JSON(['error' => '2.5', 'mensaje' => 'El tipo de persona recibido es invalido, solamente se procesan pedidos de personas fisicas.'], 400);
        }
        // Control Codigo Pais
        if (strlen($country_code) != 2) {
            return Response::JSON(['error' => '2.3', 'mensaje' => 'El codigo de pais recibido es invalido.'], 400);
        }
        // Control Nombre Persona
        $caracteres_invalidos = '/!\"#\$%&\/()\=\'\}\{\[\]\,/';
        if (is_numeric($nombre_persona) || preg_match($caracteres_invalidos, $nombre_persona)) {
            return Response::JSON(['error' => '2.4', 'mensaje' => 'El nombre completo recibido es invalido.'], 400);
        }
        //
        $id_padron_fide = NULL;
        if ($es_pasaporte) {
            // Buscar en Padron
            $ident_pasaporte = (SQLConnection::obtenerPasaportePais($country_code))->identificador;
            $id_padron_fide = $this->evaluarEnPadron($identificacion, $ident_pasaporte, true);
            if (!$id_padron_fide) {
                // Si no esta insertar en Padron
                $id_padron_fide = SQLConnection::backendStoreProcedure('backend_insertar_padron', array(trim($ident_pasaporte), trim($identificacion), trim($nombre_persona), $tipo_persona, $sexo, "0", "0", NULL, NULL, NULL, $country_code, NULL, NULL), 'selectOne');
            }
        } elseif ($identificador == 'CUIL' || $identificador == 'CUIT') {
            // Validar CUIT
            $es_cuit = Misc::validarCuit($identificacion);
            if (!$es_cuit) {
                return Response::JSON(['error' => '2.1', 'mensaje' => 'La identificación recibida no tiene una estructura valida de CUIT.'], 400);
            }
            // Buscar en Padron
            $id_padron_fide = $this->evaluarEnPadron($identificacion, $identificador, true);
            // Si no esta consultar AFIP
            if (!$id_padron_fide) {
                //
                AFIPController::obtenerPadron($identificacion, true);
                $id_padron_fide = $this->evaluarEnPadron($identificacion, $identificador, true);
                if (!$id_padron_fide) {
                    return Response::JSON(['error' => '2.2', 'mensaje' => 'La identificación recibida es invalida.'], 400);
                }
            }
        } else {
            return Response::JSON(['error' => '1.6', 'mensaje' => 'El tipo de identificación debe ser CUIT,CUIL o pasaporte.'], 400);
        }
        // Alta del informe de data cleaning de boletines
        // $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros',array('ALTA_INFORME_TERCEROS',$cliente,$user_id,env('ID_INFORME_DCLDIRECTORIOS'),$identificacion,$identificador,$tarea,env('ID_TEAM_DCL')),'selectOne');
        // TODO: IMPORTANTE COMENTAR CUANDO SE REALICEN PRUEBAS
        $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros', array('CONTRAPARTE_DATACLEAN', $cliente, $user_id, env('ID_INFORME_DCLDIRECTORIOS'), $identificacion, $identificador, $tarea, env('ID_TEAM_DCL'), NULL, NULL, env('LED_PRODUCTO'), $id_padron_fide), 'selectOne');
        //
        /* SE CREO LA SECCION DE ABAJO PORQUE LOS INFORMES POR API ESTABAN INGRESANDO SIN FECHA COMPROMETIDA- TBS */

        //BUSCO LOS DATOS DEL INFORME PARA PODER OBTENER LA DURACION DEL MISMO
        $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', Session::get('usuario')->user_id, null, null, null, $id_informe->infGenerado), 'selectOne');
        $fechas_informe = Misc::establecerFechasInforme($datos_informe->duracion_informe);
        //ACTUALIZO EL INFORME PARA QUE MUESTRE LA FECHA COMPROMETIDA
        $actualizar = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL', array('UPD_informe', $id_informe->infGenerado, $datos_informe->codigo_estado_informe, Session::get('usuario')->user_id, $datos_informe->userIDAsigandoInforme, $fechas_informe['fecha_inicio'], $fechas_informe['fecha_comprometida']));
        //
        return Response::JSON(['error' => '0', 'mensaje' => 'El informe de edictos fue creado con exito.', 'id_informe' => $id_informe->infGenerado]);
    }

    /**
     * Funcion que maneja el
     * servicio de API para
     * dar de alta informes de 
     * data cleaning completo
     * @access public
     * @return \Illuminate\Http\JsonResponse
     */
    public function dclCompleto()
    {
        // return Response::JSON(['error' => '3.1','mensaje' => 'El servicio no esta disponible.'],503);
        // Country Code
        if (!isset($_POST['country_code'])) {
            return Response::JSON(['error' => '1.1', 'mensaje' => 'El codigo ISO2 del pais no esta en los datos recibidos.'], 400);
        }
        // Nombre Apellido persona
        if (!isset($_POST['nombre_apellido_persona'])) {
            return Response::JSON(['error' => '1.2', 'mensaje' => 'El nombre completo de la persona no esta en los datos recibidos.'], 400);
        }
        // Identificacion
        if (!isset($_POST['identificacion'])) {
            return Response::JSON(['error' => '1.1', 'mensaje' => 'La identificacion no esta en los datos recibidos.'], 400);
        }
        // Identificador
        if (!isset($_POST['identificador'])) {
            return Response::JSON(['error' => '1.2', 'mensaje' => 'El identificador no esta en los datos recibidos.'], 400);
        }
        // Referencia
        if (!isset($_POST['tarea'])) {
            return Response::JSON(['error' => '1.3', 'mensaje' => 'La referencia no esta en los datos recibidos.'], 400);
        }
        // Tipo de Persona
        if (!isset($_POST['tipo_persona'])) {
            return Response::JSON(['error' => '1.6', 'mensaje' => 'El tipo de persona no esta en los datos recibidos.'], 400);
        }
        //
        $cliente = Session::get('usuario')->cliente['client_id'];
        $user_id = Session::get('usuario')->user_id;
        //
        $country_code = Request::input('country_code');
        $nombre_persona = Request::input('nombre_apellido_persona');
        $tarea = Request::input('tarea');
        $identificador = Request::input('identificador');
        $identificacion = Request::input('identificacion');
        $tipo_persona = strtoupper(Request::input('tipo_persona'));
        $sexo = NULL;
        $es_pasaporte = Request::input('es_pasaporte') ?? 0;
        // Control de tipo de identificacion
        if ($tipo_persona == 'F') {
            // Control de Sexo (si es persona fisica)
            /* if ( !isset($_POST['sexo']) ){
                      return Response::JSON(['error' => '2.6','mensaje' => 'El sexo no esta en los datos recibidos.'],400);
                  } else {
                      $sexo = Request::input('sexo');
                  } */
            $sexo = Request::input('sexo');
            if (!is_null($sexo)) {
                $sexo = strtoupper($sexo);
                if ($sexo != 'M' && $sexo != 'F') {
                    $sexo = NULL;
                }
            }
        } else {
            return Response::JSON(['error' => '2.5', 'mensaje' => 'El tipo de persona recibido es invalido, solamente se procesan pedidos de personas fisicas.'], 400);
        }
        // Control Codigo Pais
        if (strlen($country_code) != 2) {
            return Response::JSON(['error' => '2.3', 'mensaje' => 'El codigo de pais recibido es invalido.'], 400);
        }
        // Control Nombre Persona
        $caracteres_invalidos = '/!\"#\$%&\/()\=\'\}\{\[\]\,/';
        if (is_numeric($nombre_persona) || preg_match($caracteres_invalidos, $nombre_persona)) {
            return Response::JSON(['error' => '2.4', 'mensaje' => 'El nombre completo recibido es invalido.'], 400);
        }
        //
        $id_padron_fide = NULL;
        if ($es_pasaporte) {
            // Buscar en Padron
            $ident_pasaporte = (SQLConnection::obtenerPasaportePais($country_code))->identificador;
            $id_padron_fide = $this->evaluarEnPadron($identificacion, $ident_pasaporte, true);
            if (!$id_padron_fide) {
                // Si no esta insertar en Padron
                $id_padron_fide = SQLConnection::backendStoreProcedure('backend_insertar_padron', array(trim($ident_pasaporte), trim($identificacion), trim($nombre_persona), $tipo_persona, $sexo, "0", "0", NULL, NULL, NULL, $country_code, NULL, NULL), 'selectOne');
            }
        } elseif ($identificador == 'CUIL' || $identificador == 'CUIT') {
            // Validar CUIT
            $es_cuit = Misc::validarCuit($identificacion);
            if (!$es_cuit) {
                return Response::JSON(['error' => '2.1', 'mensaje' => 'La identificación recibida no tiene una estructura valida de CUIT.'], 400);
            }
            // Buscar en Padron
            $id_padron_fide = $this->evaluarEnPadron($identificacion, $identificador, true);
            // Si no esta consultar AFIP
            if (!$id_padron_fide) {
                //
                AFIPController::obtenerPadron($identificacion, true);
                $id_padron_fide = $this->evaluarEnPadron($identificacion, $identificador, true);
                if (!$id_padron_fide) {
                    return Response::JSON(['error' => '2.2', 'mensaje' => 'La identificación recibida es invalida.'], 400);
                }
            }
        } else {
            return Response::JSON(['error' => '1.6', 'mensaje' => 'El tipo de identificación debe ser CUIT,CUIL o pasaporte.'], 400);
        }
        // Alta del informe de data cleaning
        $fecha_comprometida = $this->setFechaComprometidaInforme(env('ID_INFORME_DCLCOMPLETO'));
        /* DIEGO 17/07/2024 - MOD Agregar la fecha comprometida a los Informes*/
        // $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros',array('CONTRAPARTE_DATACLEAN',$cliente,$user_id,env('ID_INFORME_DCLCOMPLETO'),$identificacion,$identificador,$tarea,env('ID_TEAM_DCL'),NULL,NULL,env('LED_PRODUCTO'),$id_padron_fide),'selectOne');
        if(!app()->environment('testing')) {
            // TODO: IMPORTANTE COMENTAR CUANDO SE REALICEN PRUEBAS
            $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros', array('CONTRAPARTE_DATACLEAN', $cliente, $user_id, env('ID_INFORME_DCLCOMPLETO'), $identificacion, $identificador, $tarea, env('ID_TEAM_DCL'), NULL, NULL, env('LED_PRODUCTO'), $id_padron_fide, $fecha_comprometida['fecha_comprometida']), 'selectOne');
        } else {
            // Modo de prueba: generar un id_informe simulado
            $id_informe = (object)['infGenerado' => 'TEST_ID'];
        }
        
        //
        return Response::JSON(['error' => '0', 'mensaje' => 'El informe de data cleaning fue creado con exito.', 'id_informe' => $id_informe->infGenerado]);
    }

    public function dclIC()
    {
        // return Response::JSON(['error' => '3.1','mensaje' => 'El servicio no esta disponible.'],503);
        // Country Code
        if (!isset($_POST['country_code'])) {
            return Response::JSON(['error' => '1.1', 'mensaje' => 'El codigo ISO2 del pais no esta en los datos recibidos.'], 400);
        }
        // Nombre Apellido persona
        if (!isset($_POST['nombre_apellido_persona'])) {
            return Response::JSON(['error' => '1.2', 'mensaje' => 'El nombre completo de la persona no esta en los datos recibidos.'], 400);
        }
        // Identificacion
        if (!isset($_POST['identificacion'])) {
            return Response::JSON(['error' => '1.1', 'mensaje' => 'La identificacion no esta en los datos recibidos.'], 400);
        }
        // Identificador
        if (!isset($_POST['identificador'])) {
            return Response::JSON(['error' => '1.2', 'mensaje' => 'El identificador no esta en los datos recibidos.'], 400);
        }
        // Referencia
        if (!isset($_POST['tarea'])) {
            return Response::JSON(['error' => '1.3', 'mensaje' => 'La referencia no esta en los datos recibidos.'], 400);
        }
        // Tipo de Persona
        if (!isset($_POST['tipo_persona'])) {
            return Response::JSON(['error' => '1.6', 'mensaje' => 'El tipo de persona no esta en los datos recibidos.'], 400);
        }
        //
        $cliente = Session::get('usuario')->cliente['client_id'];
        $user_id = Session::get('usuario')->user_id;
        //
        $country_code = Request::input('country_code');
        $nombre_persona = Request::input('nombre_apellido_persona');
        $tarea = Request::input('tarea');
        $identificador = Request::input('identificador');
        $identificacion = Request::input('identificacion');
        $tipo_persona = strtoupper(Request::input('tipo_persona'));
        $sexo = NULL;
        $es_pasaporte = Request::input('es_pasaporte') ?? 0;
        // Control de tipo de identificacion
        if ($tipo_persona == 'F') {
            // Control de Sexo (si es persona fisica)
            /* if ( !isset($_POST['sexo']) ){
                      return Response::JSON(['error' => '2.6','mensaje' => 'El sexo no esta en los datos recibidos.'],400);
                  } else {
                      $sexo = Request::input('sexo');
                  } */
            $sexo = Request::input('sexo');
            if (!is_null($sexo)) {
                $sexo = strtoupper($sexo);
                if ($sexo != 'M' && $sexo != 'F') {
                    $sexo = NULL;
                }
            }
        } else {
            return Response::JSON(['error' => '2.5', 'mensaje' => 'El tipo de persona recibido es invalido, solamente se procesan pedidos de personas fisicas.'], 400);
        }
        // Control Codigo Pais
        if (strlen($country_code) != 2) {
            return Response::JSON(['error' => '2.3', 'mensaje' => 'El codigo de pais recibido es invalido.'], 400);
        }
        // Control Nombre Persona
        $caracteres_invalidos = '/!\"#\$%&\/()\=\'\}\{\[\]\,/';
        if (is_numeric($nombre_persona) || preg_match($caracteres_invalidos, $nombre_persona)) {
            return Response::JSON(['error' => '2.4', 'mensaje' => 'El nombre completo recibido es invalido.'], 400);
        }
        //
        $id_padron_fide = NULL;
        if ($es_pasaporte) {
            // Buscar en Padron
            $ident_pasaporte = (SQLConnection::obtenerPasaportePais($country_code))->identificador;
            $id_padron_fide = $this->evaluarEnPadron($identificacion, $ident_pasaporte, true);
            if (!$id_padron_fide) {
                // Si no esta insertar en Padron
                $id_padron_fide = SQLConnection::backendStoreProcedure('backend_insertar_padron', array(trim($ident_pasaporte), trim($identificacion), trim($nombre_persona), $tipo_persona, $sexo, "0", "0", NULL, NULL, NULL, $country_code, NULL, NULL), 'selectOne');
            }
        } elseif ($identificador == 'CUIL' || $identificador == 'CUIT') {
            // Validar CUIT
            $es_cuit = Misc::validarCuit($identificacion);
            if (!$es_cuit) {
                return Response::JSON(['error' => '2.1', 'mensaje' => 'La identificación recibida no tiene una estructura valida de CUIT.'], 400);
            }
            // Buscar en Padron
            $id_padron_fide = $this->evaluarEnPadron($identificacion, $identificador, true);
            // Si no esta consultar AFIP
            if (!$id_padron_fide) {
                //
                AFIPController::obtenerPadron($identificacion, true);
                $id_padron_fide = $this->evaluarEnPadron($identificacion, $identificador, true);
                if (!$id_padron_fide) {
                    return Response::JSON(['error' => '2.2', 'mensaje' => 'La identificación recibida es invalida.'], 400);
                }
            }
        } else {
            return Response::JSON(['error' => '1.6', 'mensaje' => 'El tipo de identificación debe ser CUIT,CUIL o pasaporte.'], 400);
        }
        // Alta del informe de data cleaning
        // TODO: IMPORTANTE COMENTAR CUANDO SE REALICEN PRUEBAS
        $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros', array('CONTRAPARTE_DATACLEAN', $cliente, $user_id, env(key: 'ID_INFORME_DCLCONIC'), $identificacion, $identificador, $tarea, env('ID_TEAM_DCL'), NULL, NULL, env(key: 'LED_PRODUCTO'), $id_padron_fide), 'selectOne');
        //
        return Response::JSON(['error' => '0', 'mensaje' => 'El informe de data cleaning fue creado con exito.', 'id_informe' => $id_informe->infGenerado]);
    }

    /**
     * funcion que evalua con
     * el identificador y la identificacion
     * si el registro esta dado de alta
     * @access private
     * @param string el identificacion
     * @param string el tipo de identificacion o identificador
     * @param bool si devuelve los datos o devuelve si existe o no
     * @return bool|object|null
     */
    private function evaluarEnPadron($identificacion, $identificador, $con_datos = false)
    {
        $datos = SQLConnection::verificarPadron($identificacion, $identificador);
        $id_padron = NULL;
        // si esta vacia la busqueda
        if (empty($datos)) {
            if ($con_datos) {
                return $id_padron;
            } else {
                return false;
            }
        } else {
            // si no esta vacia la busqueda
            // Para los CUIT o CUIL evalua para ambos , porque puede ser que es un CUIT pero es informado por el api como CUIL
            // Entonces se busca para los dos
            foreach ($datos as $obj_pad) {
                if (($obj_pad->identificador == $identificador) || ($identificador == 'CUIT' && $obj_pad == 'CUIL') || ($identificador == 'CUIL' && $obj_pad == 'CUIT')) {
                    $id_padron = $obj_pad->id_padron;
                    break;
                }
            }
            //
            if ($con_datos) {
                return $id_padron;
            } else {
                if (!is_null($id_padron)) {
                    return true;
                } else {
                    return false;
                }
            }
        }
    }

    private function setFechaComprometidaInforme($tipo_informe)
    {
        // Duracion Tipo Informe
        $datos_tipo_informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR', null, null, null, null, null, null, null, null, null, $tipo_informe, null), 'selectOne');
        //
        $duracion = (is_null($datos_tipo_informe->duracion)) ? 1 : intval($datos_tipo_informe->duracion);
        // calculo de fechas del informe
        $fecha_inicio = new \DateTime();
        $fechas_informe = Misc::establecerFechasInforme($duracion);

        return $fechas_informe;
    }
}
