<?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\RenaperController;
use App\Http\Controllers\MainController;

use DateTime;
use Exception;
use stdClass;

class ApiControllerV1 extends Controller
{
    public static $MainController;
    private static $amerita_situacion_1 = false;
    private static $cantidad_situacion_1 = 0;
    private static $cuit = '';
    private static $tiene_pdf = false;
    private static $observado = false;
    private static $sesion_externa = '';
    private static $suma_de_grupos = 0;
    private static $porcentaje_por_grupo_afectado_por_preferencias = 0;
    private static $score_contables = 0;
    private static $edad = 28;
    public static $monsanto = 'No Registra Antecedentes Negativos';
    public static $revisar_monsanto = false;

    public function __construct()
    {
        if (! self::$MainController) {
            self::$MainController = new MainController();
        }
    }
    public static function BuscarCuit($dni, $posibles = 'N')
    {
        /* 01/10/2020 */
        /* Busca CUITs en el padron, para ese dni, y lo pasa por AFIP */
        /* Segundo parametro 'S' busca siempre otros posibles CUITs que no estén en el padrón */
        /* o si no lo encuetra en Padrón busca si o si los posibles CUITs para ese DNI */
        $cuits = SQLConnection::backendStoreProcedure('dni_buscar_cuit_segun_dni', array($dni));


        foreach ($cuits as $key => $value) {
            AFIPController::obtenerPadron($value->cuit, true, 'AR', false);
        }

        if ($posibles == 'S' && sizeof($cuits) == 0) {
            $cuitp = SQLConnection::backendStoreProcedure('dni_buscar_cuit_posible', array($dni, 'N'));

            foreach ($cuitp as $key => $value) {
                AFIPController::obtenerPadron($value->cuit, true, 'AR', false);
            }

            return $cuitp;
        }
        return $cuits;
    }

    public static function validacionNombre($enviados, $persona)
    {
        $name_validation = 'FALSE';
        $nombre_contains = explode(' ', $enviados['name']);

        foreach ($nombre_contains as $name) {
            foreach (explode(' ', $persona->nombres) as $nombre_enviado) {
                if (strtoupper($nombre_enviado) == strtoupper($name)) {
                    $name_validation = 'PARTIALLY TRUE';
                    $persona->nombres = str_ireplace($name, '', $persona->nombres);
                }
            }

        }
        if (trim($persona->nombres) == '') {
            $name_validation = 'TRUE';
        }

        if ($name_validation != 'TRUE') {
            foreach ($nombre_contains as $name) {
                foreach (explode(' ', $persona->nombres) as $nombre_enviado) {

                    $damerau = self::DamerauLevenshtein(strtoupper($nombre_enviado), strtoupper($name));

                    if ($damerau == 1 || $damerau == 0) {
                        $name_validation = 'PARTIALLY TRUE';
                        $persona->nombres = str_ireplace($name, '', $persona->nombres);
                    }
                }
            }
        }

        if (trim($persona->nombres) == '') {
            $name_validation = 'TRUE';
        }

        return $name_validation;

    }

    /**
     * API especial para mati, reutilizar desde el api.php con otra entrada de "empresa"..
     */
    public static function validacionMati(){
		$usuario    		= Session::get('usuario');
		$user_id    		= $usuario->user_id;
		$cliente     		= $usuario->cliente['client_id'];
		$dni     		= trim(Request::input('dni'));
		$nombre     		= trim(Request::input('nombre'));
		$fecha_nacimiento	= trim(Request::input('fecha_nacimiento'));
		$p_ip 			= $_SERVER['REMOTE_ADDR'];
		$cuit			= "";
		$enviados['dni'] = $dni;
		$enviados['nombre'] = $nombre;
		$enviados['fecha_nacimiento'] = $fecha_nacimiento;
		$producto       = $usuario->producto ?? 71;
		
		if(empty($dni) || strlen($dni) != 8){
			return json_encode([
				'Parameters'=>$enviados,'Status'=>'ERROR','Message'=>'El campo dni no puede estar vacío y debe ser un número de 8 dígitos','Response'=>[]
			]);
		}
		
		self::BuscarCuit($dni,'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */ 

		$response = SQLConnection::backendStoreProcedure('api_validacion_mati',array($dni),'select');
		//dd($response);
        /* RENAPER */
		/* 23/07/2021: Si no tenemos la fecha de nacimiento en la BD (el campo buscar_fecha_nac viene con valor 1) entonces, buscamos en Renaper */
		if (is_null($response[0]->fecha_nacimiento)) {
			if ($response->identificacion[0] == '2') {
			  $renaper = json_decode(RenaperController::obtenerUltimoEjemplarUno($response->dni, 'M',1)); 
			} else { 
			  $renaper = json_decode(RenaperController::obtenerUltimoEjemplarUno($response->dni,'F',1)); 
			}
			$response = SQLConnection::backendStoreProcedure('api_validacion_mati',array($dni),'select');
		}
		/* FIN RENAPER */
		
		$result = [];
		foreach ($response as $key => $value) {
			$persona = new stdClass();
			$persona->nombres = $value->nombre_persona;
			$name_validation = 'FALSE';
			$nombre_contains = explode(' ',$enviados['nombre']);
			foreach ($nombre_contains as $name) {
				foreach (explode(' ',$value->nombre_persona) as $nombre_enviado) {
					if (strtoupper($nombre_enviado) == strtoupper($name)) {
						$name_validation = 'PARTIALLY TRUE';
						$persona->nombres = str_ireplace($name,'',$persona->nombres);
					}
				}
			}
			
			if (trim($persona->nombres) == '') {
				$name_validation = 'TRUE';
			}

			$result[$key]['valores'] = new StdClass();
			$result[$key]['valores']->fecha_nacimiento	= $value->fecha_nacimiento;
			$result[$key]['valores']->nombre_persona	= $value->nombre_persona;
			$result[$key]['valores']->dni				= $value->dni;
			$result[$key]['valores']->fecha_defuncion	= $value->fecha_defuncion;
			$result[$key]['valores']->cuit				= $value->identificacion;
			$result[$key]['valores']->telefonos			= $value->telefonos;
			$result[$key]['validacion'] = new StdClass();
			$result[$key]['validacion']->fecha_nacimiento	= ($fecha_nacimiento == $value->fecha_nacimiento) ? 'TRUE' : 'FALSE';
			$result[$key]['validacion']->nombre_persona		= $name_validation;
			$result[$key]['validacion']->dni				= ($value->dni == $value->dni) ? 'TRUE' : 'FALSE';
			
			//si el dni ingresado no es válido transacciono el consumo con el DNI y sino con el cuit
			if (empty($value->identificacion) || $value->identificacion == NULL) {
				$cuit = $value->dni;
			} else {
				$cuit = $value->identificacion;
			}
		}

		if (empty($response)) {
			$cuit = $dni; 
		}
		$producto = $usuario->producto ?? 71;
		self::consumir_servicio($cuit,$producto); 

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

    public static function validacionApellido($enviados, $persona)
    {
        $surname_validation = 'FALSE';
        $surname_contains = explode(' ', $enviados['surname']);
        foreach ($surname_contains as $surname) {
            foreach (explode(' ', $persona->apellidos) as $apellido_enviado) {
                if (strtoupper($apellido_enviado) == strtoupper($surname)) {
                    $surname_validation = 'PARTIALLY TRUE';
                    $persona->apellidos = str_ireplace($surname, '', $persona->apellidos);
                }
            }
        }
        if (trim($persona->apellidos) == '') {
            $surname_validation = 'TRUE';
        }
        if ($surname_validation != 'TRUE') {
            foreach ($surname_contains as $name) {
                foreach (explode(' ', $persona->apellidos) as $apellido_enviado) {
                    $damerau = self::DamerauLevenshtein(strtoupper($apellido_enviado), strtoupper($surname));
                    if ($damerau == 1 || $damerau == 0) {
                        $surname_validation = 'PARTIALLY TRUE';
                        $persona->apellidos = str_ireplace($surname, '', $persona->apellidos);
                    }
                }
            }
        }
        if (trim($persona->apellidos) == '') {
            $surname_validation = 'TRUE';
        }

        return $surname_validation;
    }

    /**
     * Naïve implementation of Damerau-Levenshtein distance
     * (Does not work when there are neighbouring transpositions)!
     */
    public static function DamerauLevenshtein($S1, $S2)
    {
        $L1 = strlen($S1);
        $L2 = strlen($S2);
        if ($L1 == 0 || $L2 == 0) {
            // Trivial case: one string is 0-length
            return max($L1, $L2);
        } else {
            // The cost of substituting the last character
            $substitutionCost = ($S1[$L1 - 1] != $S2[$L2 - 1]) ? 1 : 0;
            // {H1,H2} are {L1,L2} with the last character chopped off
            $H1 = substr($S1, 0, $L1 - 1);
            $H2 = substr($S2, 0, $L2 - 1);
            if ($L1 > 1 && $L2 > 1 && $S1[$L1 - 1] == $S2[$L2 - 2] && $S1[$L1 - 2] == $S2[$L2 - 1]) {
                return min(
                    self::DamerauLevenshtein($H1, $S2) + 1,
                    self::DamerauLevenshtein($S1, $H2) + 1,
                    self::DamerauLevenshtein($H1, $H2) + $substitutionCost,
                    self::DamerauLevenshtein(substr($S1, 0, $L1 - 2), substr($S2, 0, $L2 - 2)) + 1
                );
            }
            return min(
                self::DamerauLevenshtein($H1, $S2) + 1,
                self::DamerauLevenshtein($S1, $H2) + 1,
                self::DamerauLevenshtein($H1, $H2) + $substitutionCost
            );
        }
    }

    public static function prueba_compara_domicilios()
    {
        $street_name1 = trim(Request::input('street_name1'));
        $street_number1 = trim(Request::input('street_number1'));
        $floor1 = trim(Request::input('floor1'));
        $apartment1 = trim(Request::input('apartment1'));
        $city1 = trim(Request::input('city1'));
        $state1 = trim(Request::input('state1'));
        $country1 = trim(Request::input('country1'));

        $street_name2 = trim(Request::input('street_name2'));
        $street_number2 = trim(Request::input('street_number2'));
        $floor2 = trim(Request::input('floor2'));
        $apartment2 = trim(Request::input('apartment2'));
        $city2 = trim(Request::input('city2'));
        $state2 = trim(Request::input('state2'));
        $country2 = trim(Request::input('country2'));

        $resultado = self::funcion_compara_domicilios(
            $street_name1,
            $street_number1,
            $floor1,
            $apartment1,
            $city1,
            $state1,
            $country1,

            $street_name2,
            $street_number2,
            $floor2,
            $apartment2,
            $city2,
            $state2,
            $country2
        );

        return json_encode([
            'Response' => $resultado
        ]);
    }

    /**
     * API especial para monsanto, devuelve datos que se devolvian en un batch que pidieron ellos..
     */
    public static function monsantoInfo()
    {

        $usuario = Session::get('usuario');
        if (! $usuario) {
            return response()->json([
                'Status' => 'ERROR',
                'Message' => 'Usuario no autenticado o sesión no válida',
                'Response' => []
            ], 403);
        }

        $user_id = $usuario->user_id;
        $cliente = $usuario->cliente['client_id'];
        $cuit = trim(Request::input('cuit'));
        $p_ip = $_SERVER['REMOTE_ADDR'];

        $enviados['cuit'] = $cuit;
        $producto = $usuario->producto ?? 78;

        //aca se consume el servicio
        self::consumir_servicio($cuit, $producto);

        if (empty($cuit)) {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'El cuit no puede estar vacío',
                'Response' => []
            ]);
        }

        if (strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        } else {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'El cuit debe poseer 11 números',
                'Response' => []
            ]);
        }

        $result = SQLConnection::backendStoreProcedure('api_monsanto_batch', array($cliente, date('Y-m-d h:i:s'), $cuit), 'selectOne');

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

    /**
     * valida datos personales.
     * devuelve @json (Parameters,Status,Message,Response)
     */
    //validacionnotaxid
    public static function validacionnotaxid()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $name = trim(Request::input('name'));
        $surname = trim(Request::input('surname'));
        $dni = trim(Request::input('dni'));
        $tax_id = trim(Request::input('tax_id'));
        $birthdate = trim(Request::input('birthdate'));
        $address = trim(Request::input('address'));
        $city = trim(Request::input('city'));
        $state = trim(Request::input('state'));
        $telephone = trim(Request::input('telephone'));
        $gender = trim(Request::input('gender'));
        $enviados['name'] = $name;
        $enviados['surname'] = $surname;
        $enviados['dni'] = $dni;
        $enviados['tax_id'] = $tax_id;
        $enviados['birthdate'] = $birthdate;
        $enviados['address'] = $address;
        $enviados['city'] = $city;
        $enviados['state'] = $state;
        $enviados['telephone'] = $telephone;
        $enviados['gender'] = $gender;

        $integridad = 3;
        if ($address != '') {
            $integridad += 1;
        }

        $fecha_nac = $enviados['birthdate'];

        // estos campos pueden no indicarse verificar que no falle ante la ausencia de los mismos
        if (empty($tax_id) && empty($dni)) {
            /*return json_encode([
                         'Parameters'=>$enviados,'Status'=>'ERROR','Message'=>'TAX_ID AND DNI CANNOT BE NULL','Response'=>[]
                     ]);*/
        }
        if (strlen($name) < 2 || strlen($surname) < 2) {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'THE MINIMUM NUMBER OF CHARACTERS FOR NAME AND SURNAME IS 2',
                'Response' => []
            ]);
        }
        if (empty($tax_id) && empty($dni)) {
            if (empty($name) || empty($surname) || empty($birthdate)) {
                return json_encode([
                    'Parameters' => $enviados,
                    'Status' => 'ERROR',
                    'Message' => 'TAX_ID OR DNI CAN BE NOT NULL or NAME/SURNAME AND BIRTHDATE CAN BE NOT NULL',
                    'Response' => []
                ]);
            }
        }

        if (! empty($tax_id)) {
            $taxid_dni = $tax_id;
        } else {
            $taxid_dni = $dni;
        }

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

        if (strlen($tax_id) == 11) {
            AFIPController::obtenerPadron($tax_id, true, 'AR', false);
        } elseif (! empty($taxid_dni) && strlen($taxid_dni) <= 8) {
            /* 01/10/2020 */
            $cuitss = self::BuscarCuit($taxid_dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
            $tax_id = $cuitss[0]->cuit ?? $tax_id;
        }

        $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $tax_id, $name, $surname, $birthdate), 'select');
        $result = [];
        $cuit = [];
        $encontrados = 0;
        foreach ($datos as $key => $persona) {
            $encontrados += 1;
            $info = SQLConnection::backendStoreProcedure('[sp_procesos_cuit_enrichment_api_datos]', array(1, $persona->cuit), 'selectOne');
            $nombres = $persona->nombres;
            $apellidos = $persona->apellidos;
            $name_validation = self::validacionNombre($enviados, $persona);
            $surname_validation = self::validacionApellido($enviados, $persona);
            $localidad = '';
            $provincia = '';
            $pais = '';
            $address_validation = 'FALSE';
            $full_address = explode(',', $enviados['address']);

            $address_contains = explode(' ', $address);
            foreach ($address_contains as $address_value) {
                if (stripos($info->domicilio, $address_value) !== false) {
                    $address_validation = 'TRUE';
                } else {
                    $address_validation = 'FALSE';
                    break;
                }
            }

            $localidad = $city ?? '';
            $provincia = $state ?? '';
            $pais = 'ARGENTINA';
            if ($info->provicia == 'CIUDAD AUTONOMA BUENOS AIRES' || $info->provicia == 'CIUDAD DE BUENOS AIRES' || $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES') {
                $info->provicia = 'CIUDAD AUTONOMA DE BUENOS AIRES';
                $info->localidad = 'CIUDAD AUTONOMA DE BUENOS AIRES';
            }
            if ($address_validation != 'FALSE') {
                if (($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' && $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES') || ($info->provicia == $provincia && $info->localidad == $localidad) && $pais = 'ARGENTINA') {
                    $address_validation = 'TRUE';
                } else {
                    $address_validation = 'PARTIALLY TRUE';
                }
            }

            $birthdate_validation = 'FALSE';
            if ($enviados['birthdate'] == $persona->fecha_nacimiento) {
                $birthdate_validation = 'TRUE';
            }

            $dni_validation = 'FALSE';
            if ($enviados['dni'] == $persona->dni) {
                $dni_validation = 'TRUE';
            }

            $tax_id_validation = 'FALSE';
            if ($enviados['tax_id'] == $persona->cuit) {
                $tax_id_validation = 'TRUE';
            }

            $telephone_validation = 'FALSE';
            $telefono = '';
            $telephone_contains = explode(' /', $info->telefonos);
            foreach ($telephone_contains as $key2 => $value) {
                if ($value == $enviados['telephone']) {
                    $telephone_validation = 'TRUE';
                    $telefono = $value;
                    break;
                } else if (stripos(trim($value), $enviados['telephone']) !== false || stripos('11' . trim($value), $enviados['telephone']) !== false) {
                    $telephone_validation = 'PARTIALLY TRUE';
                    $telefono = $value;
                    break;
                }
            }

            if ($telefono == '' && isset($telephone_contains[0])) {
                $telefono = $telephone_contains[0];
            }

            $gender_validation = 'FALSE';
            if (strtoupper($enviados['gender']) == strtoupper($persona->sexo)) {
                $gender_validation = 'TRUE';
            }

            $result[$key] = new StdClass();
            $result[$key]->dni = $dni_validation;
            $result[$key]->tax_id = $tax_id_validation;
            $result[$key]->birthdate = $persona->fecha_nacimiento ?? '';
            $result[$key]->name = $name_validation;
            $result[$key]->surname = $surname_validation;
            $result[$key]->gender = $gender_validation;
            $result[$key]->deceased = ($persona->fecha_fallecimiento != '') ? 'TRUE' : 'FALSE';
            $result[$key]->address = $address_validation;
            $result[$key]->street_name = $info->domicilio ?? '';
            $result[$key]->city = $info->localidad ?? '';
            $result[$key]->state = $info->provicia ?? '';
            $result[$key]->zip = $info->codpos ?? '';
            $result[$key]->telephone = trim($telefono) ?? '';
            $result[$key]->last_name = $apellidos ?? '';
            $result[$key]->first_name = $nombres ?? '';
            $result[$key]->tax_id_number = $persona->cuit;
            $result[$key]->nationalid = $persona->dni;
            $result[$key]->transaction_id = $resp->transaction_id ?? 0;
            $result[$key]->integrity = 100;

            $cuit[$key] = $persona->cuit;
        }

        $resultado = [];
        $cant = [];

        // Si hay muchos, elige el que tiene mas campos TRUE o PARTIALLY TRUE 
        if ($encontrados <= 1) {
            foreach ($result as $key2 => $value) {
                // valores para generar la integridad
                $valores = 0;
                if ($value->birthdate == $fecha_nac) {
                    $valores += 100;
                } elseif ($value->birthdate !== '') {
                    $valores += 50;
                }

                if ($value->name == 'TRUE') {
                    $valores += 100;
                } elseif ($value->name == 'PARTIALLY TRUE') {
                    $valores += 50;
                }

                if ($value->surname == 'TRUE' || $value->surname == 'PARTIALLY TRUE') {
                    $valores += 100;
                }

                if ($value->address == 'TRUE' || $value->address == 'PARTIALLY TRUE') {
                    $valores += 100;
                }
                $value->integrity = round(($valores / $integridad), 2);
            }
            $resultado = $result;
            if ($encontrados == 1) {
                $resp = self::consumir_servicio($result[0]->tax_id_number, $producto);
                $resultado[0]->transaction_id = $resp->transaction_id ?? 0;
            }
        } else {
            $mas_iguales = 0;
            $mas_iguales_key = 0;
            foreach ($result as $key2 => $value) {
                // valores para generar la integridad
                $valores = 0;
                $cant_iguales = 0;
                if ($value->dni == 'TRUE' || $value->dni == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                }

                if ($value->tax_id == 'TRUE' || $value->tax_id == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                }

                if ($value->birthdate == $fecha_nac) {
                    $valores += 100;
                } elseif ($value->birthdate !== '') {
                    $valores += 50;
                }

                if ($value->name == 'TRUE') {
                    $cant_iguales += 1;
                    $valores += 100;
                } elseif ($value->name == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                    $valores += 50;
                }

                if ($value->surname == 'TRUE' || $value->surname == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                    $valores += 100;
                }

                if ($value->address == 'TRUE' || $value->address == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                    $valores += 100;
                }

                if ($value->telephone == 'TRUE' || $value->telephone == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                }

                if ($value->gender == 'TRUE' || $value->gender == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                }

                if ($value->deceased == 'TRUE' || $value->deceased == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                }

                $value->integrity = round(($valores / $integridad), 2);
                $cant[$key2] = $cant_iguales;
            }
            /* 02/07/2021: Se cambió para que devuelva varios registros si encuentra mas de 1, máximo 5 */
            array_multisort($cant, SORT_DESC, $result);
            foreach ($result as $key2 => $value) {
                $resultado[$key2] = $result[$key2];
                $resp = self::consumir_servicio($value->tax_id_number, $producto);
                $resultado[$key2]->transaction_id = $resp->transaction_id ?? 0;
                if ($key2 == 4) {
                    break;
                }
            }
        }
        //-> para debug, agregar a la respuesta del json antes del 'Status' = 'Parameters'=>$enviados,
        $temporal = array();

        foreach ($resultado as $key => $val) {
            $temporal[] = array(
                'street_name' => $val->street_name,
                'city' => $val->city,
                'state' => $val->state,
                'zip' => $val->zip,
                'telephone' => $val->telephone,
                'last_name' => $val->last_name,
                'first_name' => $val->first_name,
                'tax_id_number' => $val->tax_id_number,
                'nationalid' => $val->nationalid,
                'birthdate' => $val->birthdate,
                'transaction_id' => $val->transaction_id,
                'integrity' => $val->integrity
            );
        }

        $resultado = $temporal;

        return json_encode([
            'Parameters' => $enviados,
            'Status' => 'OK',
            'Message' => 'OK',
            'Response' => $resultado
        ]);

    }

    //-- Api Demo Claudio  caso Trulioo  --//
    public static function validacionnotaxid_cla()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $name = trim(Request::input('name'));
        $surname = trim(Request::input('surname'));
        $dni = trim(Request::input('dni'));
        $tax_id = trim(Request::input('tax_id'));
        $birthdate = trim(Request::input('birthdate'));
        $address = trim(Request::input('address'));
        $city = trim(Request::input('city'));
        $state = trim(Request::input('state'));
        $telephone = trim(Request::input('telephone'));
        $gender = trim(Request::input('gender'));
        $enviados['name'] = $name;
        $enviados['surname'] = $surname;
        $enviados['dni'] = $dni;
        $enviados['tax_id'] = $tax_id;
        $enviados['birthdate'] = $birthdate;
        $enviados['address'] = $address;
        $enviados['city'] = $city;
        $enviados['state'] = $state;
        $enviados['telephone'] = $telephone;
        $enviados['gender'] = $gender;

        $integridad = 3;
        if ($address != '') {
            $integridad += 1;
        }

        $fecha_nac = $enviados['birthdate'];

        // estos campos pueden no indicarse verificar que no falle ante la ausencia de los mismos
        if (empty($tax_id) && empty($dni)) {
            /*return json_encode([
                         'Parameters'=>$enviados,'Status'=>'ERROR','Message'=>'TAX_ID AND DNI CANNOT BE NULL','Response'=>[]
                     ]);*/
        }
        if (strlen($name) < 2 || strlen($surname) < 2) {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'THE MINIMUM NUMBER OF CHARACTERS FOR NAME AND SURNAME IS 2',
                'Response' => []
            ]);
        }
        if (empty($tax_id) && empty($dni)) {
            if (empty($name) || empty($surname) || empty($birthdate)) {
                return json_encode([
                    'Parameters' => $enviados,
                    'Status' => 'ERROR',
                    'Message' => 'TAX_ID OR DNI CAN BE NOT NULL or NAME/SURNAME AND BIRTHDATE CAN BE NOT NULL',
                    'Response' => []
                ]);
            }
        }

        if (! empty($tax_id)) {
            $taxid_dni = $tax_id;
        } else {
            $taxid_dni = $dni;
        }

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

        if (strlen($tax_id) == 11) {
            AFIPController::obtenerPadron($tax_id, true, 'AR', false);
        }
        /* 01/10/2020 */ elseif (! empty($taxid_dni) && strlen($taxid_dni) <= 8) {
            $cuitss = self::BuscarCuit($taxid_dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
            $tax_id = $cuitss[0]->cuit ?? $tax_id;
        }

        $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $tax_id, $name, $surname, $birthdate), 'select');
        $result = [];
        $cuit = [];
        $encontrados = 0;
        foreach ($datos as $key => $persona) {
            $encontrados += 1;
            $info = SQLConnection::backendStoreProcedure('[sp_procesos_cuit_enrichment_api_datos]', array(1, $persona->cuit), 'selectOne');
            $nombres = $persona->nombres;
            $apellidos = $persona->apellidos;
            $name_validation = self::validacionNombre($enviados, $persona);
            $surname_validation = self::validacionApellido($enviados, $persona);
            $localidad = '';
            $provincia = '';
            $pais = '';
            $address_validation = 'FALSE';
            $full_address = explode(',', $enviados['address']);

            $address_contains = explode(' ', $address);
            foreach ($address_contains as $address_value) {
                if (stripos($info->domicilio, $address_value) !== false) {
                    $address_validation = 'TRUE';
                } else {
                    $address_validation = 'FALSE';
                    break;
                }
            }

            $localidad = $city ?? '';
            $provincia = $state ?? '';
            $pais = 'ARGENTINA';
            if ($info->provicia == 'CIUDAD AUTONOMA BUENOS AIRES' || $info->provicia == 'CIUDAD DE BUENOS AIRES' || $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES') {
                $info->provicia = 'CIUDAD AUTONOMA DE BUENOS AIRES';
                $info->localidad = 'CIUDAD AUTONOMA DE BUENOS AIRES';
            }
            if ($address_validation != 'FALSE') {
                if (($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' && $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES') || ($info->provicia == $provincia && $info->localidad == $localidad) && $pais = 'ARGENTINA') {
                    $address_validation = 'TRUE';
                } else {
                    $address_validation = 'PARTIALLY TRUE';
                }
            }

            $birthdate_validation = 'FALSE';
            if ($enviados['birthdate'] == $persona->fecha_nacimiento) {
                $birthdate_validation = 'TRUE';
            }

            $dni_validation = 'FALSE';
            if ($enviados['dni'] == $persona->dni) {
                $dni_validation = 'TRUE';
            }

            $tax_id_validation = 'FALSE';
            if ($enviados['tax_id'] == $persona->cuit) {
                $tax_id_validation = 'TRUE';
            }

            $telephone_validation = 'FALSE';
            $telefono = '';
            $telephone_contains = explode(' /', $info->telefonos);
            foreach ($telephone_contains as $key2 => $value) {
                if ($value == $enviados['telephone']) {
                    $telephone_validation = 'TRUE';
                    $telefono = $value;
                    break;
                } else if (stripos(trim($value), $enviados['telephone']) !== false || stripos('11' . trim($value), $enviados['telephone']) !== false) {
                    $telephone_validation = 'PARTIALLY TRUE';
                    $telefono = $value;
                    break;
                }
            }

            if ($telefono == '' && isset($telephone_contains[0])) {
                $telefono = $telephone_contains[0];
            }

            $gender_validation = 'FALSE';
            if (strtoupper($enviados['gender']) == strtoupper($persona->sexo)) {
                $gender_validation = 'TRUE';
            }
            $result[$key] = new StdClass();
            $result[$key]->dni = $dni_validation;
            $result[$key]->tax_id = $tax_id_validation;
            $result[$key]->birthdate = $persona->fecha_nacimiento ?? '';
            $result[$key]->name = $name_validation;
            $result[$key]->surname = $surname_validation;
            $result[$key]->gender = $gender_validation;
            $result[$key]->deceased = ($persona->fecha_fallecimiento != '') ? 'TRUE' : 'FALSE';
            $result[$key]->address = $address_validation;
            $result[$key]->street_name = $info->domicilio ?? '';
            $result[$key]->city = $info->localidad ?? '';
            $result[$key]->state = $info->provicia ?? '';
            $result[$key]->zip = $info->codpos ?? '';
            $result[$key]->telephone = trim($telefono) ?? '';
            $result[$key]->last_name = $apellidos ?? '';
            $result[$key]->first_name = $nombres ?? '';
            $result[$key]->tax_id_number = $persona->cuit;
            $result[$key]->nationalid = $persona->dni;
            $result[$key]->transaction_id = $resp->transaction_id ?? 0;
            $result[$key]->integrity = 100;

            $cuit[$key] = $persona->cuit;
        }

        $resultado = [];
        $cant = [];

        // Si hay muchos, elige el que tiene mas campos TRUE o PARTIALLY TRUE 
        if ($encontrados <= 1) {
            foreach ($result as $key2 => $value) {
                // valores para generar la integridad
                $valores = 0;
                if ($value->birthdate == $fecha_nac) {
                    $valores += 100;
                } elseif ($value->birthdate !== '') {
                    $valores += 50;
                }
                if ($value->name == 'TRUE') {
                    $valores += 100;
                } elseif ($value->name == 'PARTIALLY TRUE') {
                    $valores += 50;
                }
                if ($value->surname == 'TRUE' || $value->surname == 'PARTIALLY TRUE') {
                    $valores += 100;
                }
                if ($value->address == 'TRUE' || $value->address == 'PARTIALLY TRUE') {
                    $valores += 100;
                }
                $value->integrity = round(($valores / $integridad), 2);
            }
            $resultado = $result;
            if ($encontrados == 1) {
                $resp = self::consumir_servicio($result[0]->tax_id_number, $producto);
                $resultado[0]->transaction_id = $resp->transaction_id ?? 0;
            }
        } else {
            $mas_iguales = 0;
            $mas_iguales_key = 0;
            foreach ($result as $key2 => $value) {
                // valores para generar la integridad
                $valores = 0;
                $cant_iguales = 0;
                if ($value->dni == 'TRUE' || $value->dni == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                }
                if ($value->tax_id == 'TRUE' || $value->tax_id == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                }
                if ($value->birthdate == $fecha_nac) {
                    $valores += 100;
                } elseif ($value->birthdate !== '') {
                    $valores += 50;
                }
                if ($value->name == 'TRUE') {
                    $cant_iguales += 1;
                    $valores += 100;
                } elseif ($value->name == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                    $valores += 50;
                }
                if ($value->surname == 'TRUE' || $value->surname == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                    $valores += 100;
                }
                if ($value->address == 'TRUE' || $value->address == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                    $valores += 100;
                }
                if ($value->telephone == 'TRUE' || $value->telephone == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                }
                if ($value->gender == 'TRUE' || $value->gender == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                }
                if ($value->deceased == 'TRUE' || $value->deceased == 'PARTIALLY TRUE') {
                    $cant_iguales += 1;
                }
                $value->integrity = round(($valores / $integridad), 2);
                $cant[$key2] = $cant_iguales;
            }
            /* 02/07/2021: Se cambió para que devuelva varios registros si encuentra mas de 1, máximo 5 */
            array_multisort($cant, SORT_DESC, $result);
            foreach ($result as $key2 => $value) {
                $resultado[$key2] = $result[$key2];
                $resp = self::consumir_servicio($value->tax_id_number, $producto);
                $resultado[$key2]->transaction_id = $resp->transaction_id ?? 0;
                if ($key2 == 4) {
                    break;
                }
            }
        }
        //-> para debug, agregar a la respuesta del json antes del 'Status' = 'Parameters'=>$enviados,
        $temporal = array();

        foreach ($resultado as $key => $val) {
            $temporal[] = array(
                'street_name' => $val->street_name,
                'city' => $val->city,
                'state' => $val->state,
                'zip' => $val->zip,
                'telephone' => $val->telephone,
                'last_name' => $val->last_name,
                'first_name' => $val->first_name,
                'tax_id_number' => $val->tax_id_number,
                'nationalid' => $val->nationalid,
                'birthdate' => $val->birthdate,
                'transaction_id' => $val->transaction_id,
                'integrity' => $val->integrity
            );
        }

        $resultado = $temporal;

        return json_encode([
            'Parameters' => $enviados,
            'Status' => 'OK',
            'Message' => 'OK',
            'Response' => $resultado
        ]);

    }

    public static function validacionMati_cla()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $cliente = $usuario->cliente['client_id'];
        $dni = trim(Request::input('dni'));
        $nombre = trim(Request::input('nombre'));
        $fecha_nacimiento = trim(Request::input('fecha_nacimiento'));
        $p_ip = $_SERVER['REMOTE_ADDR'];
        $cuit = "";
        $enviados['dni'] = $dni;
        $enviados['nombre'] = $nombre;
        $enviados['fecha_nacimiento'] = $fecha_nacimiento;
        $producto = $usuario->producto ?? 71;

        if (empty($dni) || strlen($dni) != 8) {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'El campo dni no puede estar vacío y debe ser un número de 8 dígitos',
                'Response' => []
            ]);
        }

        try {

            /* Funcion inexistente
            self::BuscarCuit_clau($dni, 'S'); */  
            /* Busca CUITs para el dni solicitado, y los pasa por AFIP */

            $response = SQLConnection::backendStoreProcedure('api_validacion_mati', array($dni), 'select');
            $result = [];

            foreach ($response as $key => $value) {
                $persona = new StdClass();
                $persona->nombres = $value->nombre_persona;
                $name_validation = 'FALSE';
                $nombre_contains = explode(' ', $enviados['nombre']);
                foreach ($nombre_contains as $name) {
                    foreach (explode(' ', $value->nombre_persona) as $nombre_enviado) {
                        if (strtoupper($nombre_enviado) == strtoupper($name)) {
                            $name_validation = 'PARTIALLY TRUE';
                            $persona->nombres = str_ireplace($name, '', $persona->nombres);
                        }
                    }
                }

                if (trim($persona->nombres) == '') {
                    $name_validation = 'TRUE';
                }

                $result[$key]['valores'] = new StdClass();
                $result[$key]['valores']->fecha_nacimiento = $value->fecha_nacimiento;
                $result[$key]['valores']->nombre_persona = $value->nombre_persona;
                $result[$key]['valores']->dni = $value->dni;
                $result[$key]['valores']->fecha_defuncion = $value->fecha_defuncion;
                $result[$key]['valores']->cuit = $value->identificacion;
                $result[$key]['valores']->telefonos = $value->telefonos;
                $result[$key]['validacion'] = new StdClass();
                $result[$key]['validacion']->fecha_nacimiento = ($fecha_nacimiento == $value->fecha_nacimiento) ? 'TRUE' : 'FALSE';
                $result[$key]['validacion']->nombre_persona = $name_validation;
                $result[$key]['validacion']->dni = ($value->dni == $value->dni) ? 'TRUE' : 'FALSE';

                //si el dni ingresado no es válido transacciono el consumo con el DNI y sino con el cuit
                if (empty($value->identificacion) || $value->identificacion == NULL) {
                    $cuit = $value->dni;
                } else {
                    $cuit = $value->identificacion;
                }
            }

            if (empty($response)) {
                $cuit = $dni;
            }

            //SQLConnection::backendStoreProcedure('consumir_servicio_API',array($user_id,$cuit,$producto,$p_ip),'selectOne');
            $producto = $usuario->producto ?? 71;
            //self::consumir_servicio($cuit,$producto); //--> linea comentada para no guardar el consumo, solo para pruebas.

            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'OK',
                'Message' => 'OK',
                'Response' => $result
            ]);

        } catch (\Throwable $th) {
            $mensaje = 'Error al consultar API validacionMati fidelitas-www <br>Producto: ' . $producto . '<br>Cliente: ' . $cliente . '<br>User_Id: ' . $user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
            Misc::enviarMail_errores_api($mensaje);
            return json_encode(['Status' => 'INTERNAL ERROR', 'Message' => 'TIMEOUT EXCEEDED.']);
        }

    }

    public static function idauthentication()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $name = trim(Request::input('name'));
        $surname = trim(Request::input('surname'));
        $dni = trim(Request::input('national_id'));
        $internal_id = trim(Request::input('internal_id'));
        $tax_id = trim(Request::input('tax_id'));
        $birthdate = trim(Request::input('birthdate'));
        $gender = trim(Request::input('gender'));
        $emision = trim(Request::input('issue_date'));
        $expira = trim(Request::input('expiry_date'));
        $copy = trim(Request::input('copy'));

        $enviados['name'] = self::nombre_formateo($name);
        $enviados['surname'] = self::nombre_formateo($surname);
        $enviados['national_id'] = self::normalizador_dni($dni);
        $enviados['internal_id'] = $internal_id;
        $enviados['birthdate'] = $birthdate;
        $enviados['gender'] = $gender;
        $enviados['issue_date'] = $emision;
        $enviados['expiry_date'] = $expira;
        $enviados['copy'] = $copy;

        $tax_id = (isset($tax_id) && self::tax_id_valido($tax_id)) ? $tax_id : '';

        $name_validation = 'FALSE';
        $surname_validation = 'FALSE';

        $p_url = $_SERVER['REQUEST_URI'];

        $consulta = SQLConnection::backendStoreProcedure('guardar_parametros_API', array($user_id, $name, $surname, $dni, null, $birthdate, null, null, $gender, $p_url), 'selectOne');

        if (self::fecha_valida($enviados['birthdate']) && self::dni_valido($enviados['national_id'])) {

            if (empty($tax_id) && empty($dni)) {
                return json_encode(['Parameters' => $enviados, 'Status' => 'ERROR', 'Message' => 'TAX_ID AND DNI CANNOT BE NULL', 'Response' => []]);
            }

            if (strlen($name) < 2 || strlen($surname) < 2) {
                return json_encode([
                    'Parameters' => $enviados,
                    'Status' => 'ERROR',
                    'Message' => 'THE MINIMUM NUMBER OF CHARACTERS FOR NAME AND SURNAME IS 2',
                    'Response' => []
                ]);
            }

            if (! empty($tax_id)) {
                $taxid_dni = $tax_id;
            } else {
                $taxid_dni = $dni;
            }
            $producto = $usuario->producto ?? 71;

            if ($producto == 109) {

                $renaper = json_decode(self::soloRenaperGBG($dni, $gender));
                if (! $gender) {
                    $renaper_datos = $renaper->Response;
                    $gender = $renaper_datos->gender;
                }

                $datos_renaper = SQLConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $gender), 'select');

                $datos = [];
                if ($datos_renaper) {
                    $datos[0] = $datos_renaper[0];
                }
            } else {
                if (! empty($tax_id) && strlen($tax_id) == 11) {
                    AFIPController::obtenerPadron($tax_id, true, 'AR', false); //-> SE COMENTA PORQUE GENERA UN ERROR (REVISAR)
                } elseif (! empty($taxid_dni) && strlen($taxid_dni) == 8) {
                    $cuitss = self::BuscarCuit($taxid_dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    $tax_id = $cuitss[0]->cuit ?? $tax_id;
                }

                $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $tax_id), 'select');

                if (count($datos) == 0) {
                    $cuitss = self::BuscarCuit_Forzado($dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $cuitss[0]->cuit), 'select');
                }
                if (sizeOf($datos) < 1) {
                    $resp = self::consumir_servicio($taxid_dni, $producto);
                }
            }

            $result = [];
            $dni_validation = 'FALSE';
            $birthdate_validation = 'FALSE';
            $gender_validation = 'FALSE';
            $issue_date = 'FALSE';
            $expiry_date = 'FALSE';
            $ejemplar = 'FALSE';
            $numTramite = "FALSE";

            if (! is_null($datos[0]->apellidos) && ! is_null($datos[0]->nombres)) {

                foreach ($datos as $key => $persona) {
                    $info = new StdClass();

                    if ($producto == 109) {

                        $persona->nombres = self::nombre_formateo($persona->nombres);
                        $persona->apellidos = self::nombre_formateo($persona->apellido);
                        $fecha_nacimiento = substr($persona->fechaNacimiento, 6, 4) . '-' . substr($persona->fechaNacimiento, 3, 2) . '-' . substr($persona->fechaNacimiento, 0, 2);
                        $persona->fecha_nacimiento = $fecha_nacimiento;
                        //$persona->sexo = $persona->sexo;
                        $persona->cuit = $persona->identificacion;
                        //$persona->dni = $persona->dni;
                        $fecha_fallecimiento = substr($persona->fechaf, 6, 4) . '-' . substr($persona->fechaf, 3, 2) . '-' . substr($persona->fechaf, 0, 2);
                        $persona->fecha_fallecimiento = $fecha_fallecimiento;
                        $persona->VENCIMIENTO = substr($persona->VENCIMIENTO, 6, 4) . '-' . substr($persona->VENCIMIENTO, 3, 2) . '-' . substr($persona->VENCIMIENTO, 0, 2);
                        $persona->expiry_date = $persona->VENCIMIENTO;
                        $persona->EMISION = substr($persona->EMISION, 6, 4) . '-' . substr($persona->EMISION, 3, 2) . '-' . substr($persona->EMISION, 0, 2);
                        $persona->issue_date = $persona->EMISION;
                        $persona->ID_TRAMITE_PRINCIPAL = "00" . $persona->ID_TRAMITE_PRINCIPAL;
                        $persona->internal_id = $persona->ID_TRAMITE_PRINCIPAL;

                        //$info->taxid = $persona->identificacion;
                        $info->tipo = null;
                        $info->nombre = $persona->apellidos ?? '' . ' ' . $persona->nombres ?? '';


                    } else {
                        $persona->nombres = self::nombre_formateo($persona->nombres);
                        $persona->apellidos = self::nombre_formateo($persona->apellidos);
                        $info = SQLConnection::backendStoreProcedure('[sp_procesos_cuit_enrichment_api_datos]', array(1, $persona->cuit), 'selectOne');
                    }

                    $resp = self::consumir_servicio($persona->cuit, $producto);
                    $name_validation = self::validacionNombre($enviados, $persona);
                    $surname_validation = self::validacionApellido($enviados, $persona);

                    if ($enviados['birthdate'] == $persona->fecha_nacimiento) {
                        $birthdate_validation = 'TRUE';
                    }

                    if ($enviados['national_id'] == $persona->dni) {
                        $dni_validation = 'TRUE';
                    }

                    if (strtoupper($enviados['gender']) == strtoupper($persona->sexo)) {
                        $gender_validation = 'TRUE';
                    }

                    if (isset($persona->issue_date) && $enviados['issue_date'] == $persona->issue_date) {
                        $issue_date = 'TRUE';
                    }

                    if (isset($persona->expiry_date) && $enviados['expiry_date'] == $persona->expiry_date) {
                        $expiry_date = 'TRUE';
                    }

                    if (isset($persona->EJEMPLAR) && $enviados['copy'] == $persona->EJEMPLAR) {
                        $ejemplar = 'TRUE';
                    }

                    if (isset($persona->internal_id) && $enviados['internal_id'] == $persona->internal_id) {
                        $numTramite = 'TRUE';
                    }

                    $result[2] = new StdClass();
                    $result[2]->dni = $dni_validation;
                    $result[2]->internal_id = $numTramite;
                    $result[2]->birthdate = $birthdate_validation;
                    $result[2]->name = $name_validation;
                    $result[2]->surname = $surname_validation;
                    $result[2]->gender = $gender_validation;
                    //$result[2]->deceased 		= $persona->fecha_fallecimiento;
                    $result[2]->deceased = ($persona->fecha_fallecimiento != '') ? 'TRUE' : 'FALSE';
                    $result[2]->issue_date = $issue_date;
                    $result[2]->expiry_date = $expiry_date;
                    $result[2]->copy = $ejemplar;
                    $result[2]->transaction_id = $resp->transaction_id;

                    SQLConnection::backendStoreProcedure('guardar_parametros_API_2', array($consulta->id, $resp->transaction_id), 'selectOne');
                }
            } else {

                $resp = self::consumir_servicio($dni, $producto);

                $result[2] = new StdClass();
                $result[2]->dni = $dni_validation;
                $result[2]->internal_id = $numTramite;
                $result[2]->birthdate = $birthdate_validation;
                $result[2]->name = $name_validation;
                $result[2]->surname = $surname_validation;
                $result[2]->gender = $gender_validation;
                $result[2]->deceased = "FALSE";
                $result[2]->issue_date = $issue_date;
                $result[2]->expiry_date = $expiry_date;
                $result[2]->copy = $ejemplar;
                $result[2]->transaction_id = $resp->transaction_id;

                SQLConnection::backendStoreProcedure('guardar_parametros_API_2', array($consulta->id, $resp->transaction_id), 'selectOne');
            }
            return json_encode([

                'Parameters' => $enviados,
                'Status' => 'OK',
                'Message' => 'OK',
                'Response' => $result
            ]);
        } else {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'ERROR IN DATA (birthdate OR dni)',
                'Response' => []
            ]);
        }
    }

    public static function InformeComercialTrad()
    {
        $usuario = Session::get('usuario');
        $cliente = $usuario->cliente['client_id'];

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

        if (isset($_POST['cuit'])) {
            $cuit = Request::input('cuit');
            $apikey = Request::input('apikey');
            $json_ic = self::ObtenerInformeComercialCompleto($cuit, $apikey, 'ENG');
        }
        /*
              if ( isset($json_ic)){
                  $json_trad = self::ICTranslator($json_ic,'ENG');
              }
              return $json_trad;
              */
        return $json_ic;
    }

    public static function encriptarUsuario()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $username = Request::input('username');
        if (empty($username)) {
            return json_encode([
                'Status' => 'ERROR',
                'Message' => 'USUARIO INVÁLIDO/VACÍO',
                'Response' => []
            ]);
        }
        $array['username'] = $username;
        $array['date'] = date('Y-m-d h:i:s');
        //$exec = Misc::encrypt($array);  // asi estaba en www2
        $exec = Misc::encrypt(json_encode($array)); // asi en www
        return json_encode([
            'Status' => 'OK',
            'Message' => 'OK',
            'Response' => $exec
        ]);
    }

    public static function obtenerControlacceso()
    {
        //3915936
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $client_id = Request::input('client_id');

        $producto = $usuario->producto ?? 68;
        self::consumir_servicio($client_id, $producto);
        //SQLConnection::consumirServicio($user_id,$client_id,68);

        if (empty($client_id)) {
            return json_encode([
                'Status' => 'ERROR',
                'Message' => 'CLIENTE INVÁLIDO',
                'Response' => []
            ]);
        }
        $exec = SQLConnection::backendStoreProcedure('Imperium_Digicard_Response', array($client_id));
        return json_encode([
            'Status' => 'OK',
            'Message' => 'OK',
            'Response' => $exec
        ]);
    }

    public static function cuitEnrichment()
    {
        $cuit = Request::input('cuit');
        $meses = Request::input('meses') ? Request::input('meses') : 12;
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $cliente = $usuario->cliente['client_id'];

        $producto = $usuario->producto ?? 65;
        self::consumir_servicio($cuit, $producto);
        //SQLConnection::consumirServicio($user_id,$cuit,65);

        //obtenerAFIP.
        if (! empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        } else {
            return json_encode([
                'Status' => 'ERROR',
                'Message' => 'CUIT INVÁLIDO',
                'Response' => []
            ]);
        }

        $exec = SQLConnection::backendStoreProcedure('sp_procesos_cuit_enrichment_api', array($cliente, $cuit, $meses), 'selectOne');
        return json_encode([
            'Status' => 'OK',
            'Message' => 'OK',
            'Response' => $exec
        ]);
    }

    public static function obtenerIC()
    {
        $sesion = self::obtenerSesion();

        $cuit = $sesion['cuit'];

        //consume el servicio
        self::consumir_servicio($cuit);

        $idp = SQLConnection::obtenerIdPadron($cuit);
        $id_padron = $idp->id_padron;
        //$score = self::$MainController->obtenerServicioScore($cuit);
        $persona_fisica = (substr($cuit, 0, 1) != '3') ? true : false;
        $tipo_persona = (substr($cuit, 0, 1) != '3') ? 'f' : 'j';
        //Nodos Principales Obligatorios
        $resp = [];
        $formales = [];
        $fiscales = [];
        $legales = [];
        $bancos = [];

        $formales = self::obtenerFormales($cuit, $persona_fisica);
        $fiscales = self::obtenerFiscales($cuit, $id_padron);
        $bancos = self::obtenerBancos($cuit, $id_padron, $persona_fisica);
        $sociedades = self::obtenerSociedades($cuit, $tipo_persona);
        $legales = self::obtenerLegales($cuit);

        //$resp['score'] = $score;
        $resp['formales'] = $formales;
        $resp['fiscales'] = $fiscales;
        $resp['sociedades'] = $sociedades;
        $resp['bcra'] = $bancos;
        $resp['legales'] = $legales;

        return json_encode($resp);
    }

    private static function obtenerLegales($cuit)
    {
        $juicios['demandado'] = [];
        $juicios['actor'] = [];
        $demandado = SQLConnection::obtenerJuiciosDemandadoActor(null, 'D', $cuit);
        $actor = SQLConnection::obtenerJuiciosDemandadoActor(null, 'A', $cuit);
        if (! empty($demandado)) {
            foreach ($demandado as $key => $value) {
                $demandado[$key]->cuit_actor = $demandado[$key]->cuit_otra_parte;
                $demandado[$key]->nombre_actor = $demandado[$key]->nombre_otra_parte;
                unset($demandado[$key]->cuit_otra_parte);
                unset($demandado[$key]->nombre_otra_parte);
                unset($demandado[$key]->demandado_actor);
                unset($demandado[$key]->fecha_causa_dmy);
                unset($demandado[$key]->id_tipo_causa);
                unset($demandado[$key]->seccion);
                unset($demandado[$key]->grupo);
                unset($demandado[$key]->tiempo);
                unset($demandado[$key]->nombre_padron_otra_parte);
                unset($demandado[$key]->visible);
                unset($demandado[$key]->vigente);
                unset($demandado[$key]->observaciones);
                unset($demandado[$key]->verificaciones);
                unset($demandado[$key]->nombre_y_apellido_del_sindico);
                unset($demandado[$key]->domicilio_sindico);
                unset($demandado[$key]->domicilio_completo_sindico);
                $juicios['demandado'][] = $value;
            }
        }
        if (! empty($actor)) {
            foreach ($actor as $key => $value) {
                $actor[$key]->cuit_demandado = $actor[$key]->cuit_otra_parte;
                $actor[$key]->nombre_demandado = $actor[$key]->nombre_otra_parte;
                unset($actor[$key]->cuit_otra_parte);
                unset($actor[$key]->nombre_otra_parte);
                unset($actor[$key]->demandado_actor);
                unset($actor[$key]->fecha_causa_dmy);
                unset($actor[$key]->id_tipo_causa);
                unset($actor[$key]->seccion);
                unset($actor[$key]->grupo);
                unset($actor[$key]->tiempo);
                unset($actor[$key]->nombre_padron_otra_parte);
                unset($actor[$key]->visible);
                unset($actor[$key]->vigente);
                unset($actor[$key]->observaciones);
                $juicios['actor'][] = $value;
            }
        }
        return $juicios;
    }

    private static function obtenerSociedades($cuit, $tipo_persona)
    {

        $sociedades = SQLConnection::obtenerSociedades($cuit);
        if (! empty($sociedades)) {
            unset($sociedades->moneda);
            unset($sociedades->id_sociedad);
            unset($sociedades->c01_codigo);
            unset($sociedades->soc_codigo);
            unset($sociedades->sindicatura);
            unset($sociedades->fecha_ins_rpc);
            unset($sociedades->nro_ins_rpc);
            unset($sociedades->folio);
            unset($sociedades->libro);
            unset($sociedades->tomo);
            unset($sociedades->duracion);
            unset($sociedades->ram_codigo);
            unset($sociedades->sra_codigo);
            unset($sociedades->nroigj);
            unset($sociedades->prv_codigo);
            unset($sociedades->nroana);
            unset($sociedades->nroexp);
            unset($sociedades->fecha_act);
            unset($sociedades->user_id);
            unset($sociedades->id);
            //$sociedades->capital = number_format($sociedades->capital,0,2);
            $sociedades->moneda_codigo = $sociedades->mon_codigo;
            $sociedades->iibb = $sociedades->ingbru;
            unset($sociedades->mon_codigo);
            unset($sociedades->ingbru);
        }
        $info['datos_inscripcion'] = $sociedades;
        $accionista_de = SQLConnection::obtenerAccionistasDe($cuit);
        if (! empty($accionista_de)) {
            foreach ($accionista_de as $key => $value) {
                unset($accionista_de[$key]->cant_acciones);
                unset($accionista_de[$key]->monto);
                unset($accionista_de[$key]->porcentaje);
                unset($accionista_de[$key]->idp);
                unset($accionista_de[$key]->fecha_ins_rpc);
            }
        }
        $info['accionista_de'] = $accionista_de;
        $info['participaciones'] = SQLConnection::obtenerParticipacionSociosDirectores($cuit);
        $socios_directores = SQLConnection::obtenerSociosDirectores($cuit, $tipo_persona);
        if (! empty($socios_directores)) {
            foreach ($socios_directores as $key => $value) {
                unset($socios_directores[$key]->idp);
                $socios_directores[$key]->cargo = $socios_directores[$key]->car_nombre;
                $socios_directores[$key]->periodo_desde = $socios_directores[$key]->c04_periodo_desde;
                $socios_directores[$key]->periodo_hasta = $socios_directores[$key]->c04_periodo_hasta;
                unset($socios_directores[$key]->car_nombre);
                unset($socios_directores[$key]->c04_periodo_desde);
                unset($socios_directores[$key]->c04_periodo_hasta);
                unset($socios_directores[$key]->actividad);
                unset($socios_directores[$key]->fecha_cons);
                unset($socios_directores[$key]->fecha_ins_rpc);
                unset($socios_directores[$key]->nacionalidad);
                unset($socios_directores[$key]->estado_civil);
                unset($socios_directores[$key]->tipo_doc1);
                unset($socios_directores[$key]->nrodoc_1);
                unset($socios_directores[$key]->tipo_doc2);
                unset($socios_directores[$key]->nrodoc_2);
                unset($socios_directores[$key]->fecha_nac);
            }
        }
        $info['socios_directores'] = $socios_directores;
        return $info;
    }

    private static function obtenerBancos($cuit, $id_persona, $persona_fisica)
    {
        $bancos = SQLConnection::obtenerBancos($cuit);
        if (! empty($bancos)) {
            foreach ($bancos as $key => $value) {
                $bancos[$key]->situacion = (int) $bancos[$key]->situacion;
            }
        }
        $info['bancos'] = $bancos;

        $cheques = SQLConnection::obtenerCheques($cuit, $id_persona, $persona_fisica);
        if (! empty($cheques)) {
            foreach ($cheques as $key => $value) {
                if ($cheques[$key]->tipo == 'vinculaciones') {
                    unset($cheques[$key]);
                    continue;
                }
                if ($cheques[$key]->tipo == 'a_nombre_de_empresa') {
                    if ($persona_fisica) {
                        $cheques[$key]->tipo = 'firmado para empresas';
                    } else {
                        $cheques[$key]->tipo = 'propio';
                    }

                }
                if ($cheques[$key]->nombre_persona_relacionado == '0') {
                    $cheques[$key]->nombre_persona_relacionado = null;
                }
                if ($cheques[$key]->Cuit_relacionado == '0') {
                    $cheques[$key]->Cuit_relacionado = null;
                }
                unset($cheques[$key]->idp);
                unset($cheques[$key]->idppr);
                unset($cheques[$key]->causa);
                unset($cheques[$key]->total_cheques);
                unset($cheques[$key]->cantidad);
            }
        }
        //tipo "vinculaciones" sacar a la mierda.
        $info['cheques'] = $cheques;
        return $info;
    }

    private static function obtenerFiscales($cuit, $id_padron)
    {
        $impuestos = SQLConnection::obtenerPadronImpuestos($id_padron);
        if (! empty($impuestos)) {
            foreach ($impuestos as $key => $value) {
                unset($impuestos[$key]->codigo_impuesto);
            }
        }
        $info['actividades'] = SQLConnection::obtenerPadronActividades($id_padron);
        $caracterizaciones = SQLConnection::obtenerPadronCaracterizaciones($id_padron);
        if (! empty($caracterizaciones)) {
            foreach ($caracterizaciones as $key => $value) {
                unset($caracterizaciones[$key]->codigo_caracterizacion);
            }
        }
        $inscripciones = SQLConnection::obtenerInscripciones($cuit);
        if (! empty($inscripciones)) {
            unset($inscripciones->actividad);
            unset($inscripciones->country_name);
        }
        $info['impuestos'] = $impuestos;
        $info['caracterizaciones'] = $caracterizaciones;
        $info['inscripciones'] = $inscripciones;
        return $info;
    }

    private static function obtenerFormales($cuit, $persona_fisica)
    {
        $formales['domicilios'] = [];
        $domicilios = SQLConnection::obtenerDomicilios($cuit);
        if (! empty($domicilios)) {
            foreach ($domicilios as $key => $value) {
                $domicilios[$key]->provincia = $domicilios[$key]->prv_nombre;
                $domicilios[$key]->localidad = $domicilios[$key]->loc_nombre;
                $domicilios[$key]->pais = $domicilios[$key]->pai_nombre;
                $domicilios[$key]->cp = $domicilios[$key]->codpos;
                unset($domicilios[$key]->prv_nombre);
                unset($domicilios[$key]->loc_nombre);
                unset($domicilios[$key]->pai_nombre);
                unset($domicilios[$key]->codpos);
                unset($domicilios[$key]->isLast);
                unset($domicilios[$key]->id_domicilio);
                unset($domicilios[$key]->visible);
                unset($domicilios[$key]->telefono);
                unset($domicilios[$key]->email);
                unset($domicilios[$key]->tipo_domicilio);
                $formales['domicilios'][] = $value;
            }
        }
        $formales['defuncion'] = SQLConnection::obtenerDefuncion($cuit);
        $persona = null;
        if ($persona_fisica) {
            $persona = SQLConnection::obtenerPersona($cuit);
        }

        if (! empty($persona)) {
            $persona->cuit = $persona->identificacion;
            unset($persona->identificacion);
            unset($persona->fecha_nac_dmy);
            unset($persona->codigo_profesion);
            unset($persona->codigo_ocupacion);
            unset($persona->doc_codigo_2);
            unset($persona->c02_nrodoc_2);
            unset($persona->codigo_estado_civil);
            unset($persona->pro_codigo_ocupacion);
            unset($persona->doc_codigoc_c2);
            unset($persona->doc_codigoc_c);
            unset($persona->c02_nrodoc_conyuge_2);
            unset($persona->doc_codigo);
            unset($persona->nombre_conyuge);
            unset($persona->doc_codigo_c);
            unset($persona->nombre_padre);
            unset($persona->nombre_madre);

            unset($persona->c02_nrodoc);
            unset($persona->c02_nrodoc_conyuge);
            if (! empty($persona->fecha_nacimiento)) {
                $anio = explode('/', $persona->fecha_nacimiento);
                $anio = $anio[2];
                if ($anio) {
                    $persona->edad = date('Y') - $anio;
                }
            }
        }
        $formales['persona'] = $persona;
        $empleado_de = null;
        if ($persona_fisica) {
            $empleado_de = SQLConnection::obtenerEmpleadoDe($cuit);
            if (! empty($empleado_de)) {
                foreach ($empleado_de as $key => $value) {
                    unset($empleado_de[$key]->ultimo_periodo_procesado);
                }
            }
        }

        $formales['empleado_de'] = $empleado_de;
        return $formales;
    }

    public static function ICSinGraficos()
    {
        $respuesta = self::obtenerVistaCompacto();
        $respuesta .= self::obtenerFormalesHTML(false);
        $respuesta .= self::obtenerComercialesHTML(false);
        $respuesta .= self::obtenerContablesHTML(false);
        $respuesta .= self::obtenerFiscalesHTML(false);
        $respuesta .= self::obtenerSociedadesHTML(false);
        $respuesta .= self::obtenerLegalesHTML(false);
        $respuesta .= self::obtenerBancosHTML(false);
        $respuesta .= self::obtenerFooterHTML();
        return $respuesta;
    }

    public static function obtenerFooterHTML()
    {
        $download = false;
        return View('Api/compacto_footer')->with(compact('download'))->render();
    }

    private static function obtenerSesion()
    {
        $cuit = isset($_POST['cuit']) ? $_POST['cuit'] : '';
        $apikey = isset($_POST['apikey']) ? $_POST['apikey'] : '';
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;

        $producto = ENV('INFORME_API');
        self::consumir_servicio($cuit, $producto);
        //SQLConnection::consumirServicio($user_id,$cuit,ENV('INFORME_API'));

        if (empty($cuit)) {
            echo json_encode(array('error' => '1', 'message' => 'Error: La CUIT no está seteada o es inválida'));
            die();
        }
        $razon_social = SQLConnection::obtenerRazonSocial($cuit);
        if (! $razon_social) {
            echo json_encode(array('error' => '1', 'message' => 'Error: La CUIT no está seteada o es inválida'));
            die();
        }
        $razon_social = $razon_social->nombre_persona;

        $client_id = $usuario->cliente['client_id'];
        $secciones = self::obtenerSeccionesHabilitadas($user_id);
        $usuario->cliente[ENV('INFORME_API')] = new stdClass;
        $secciones = array_change_key_case($secciones, CASE_LOWER);
        $usuario->cliente[ENV('INFORME_API')]->secciones = $secciones;
        $usuario->cliente[ENV('INFORME_API')]->client_id = $client_id;
        Session::put('usuario', $usuario);
        Session::save();
        return ['cuit' => $cuit, 'razon_social' => $razon_social, 'apikey' => $apikey, 'secciones' => $secciones];
    }

    private static function obtenerSeccionesHabilitadas($user_id)
    {
        if ($user_id == '673762136') {
            $secciones_habilitadas = SQLConnection::obtenerSeccionesHabilitadasInforme($user_id, ENV('INFORME_API'));
        } else {
            $secciones_habilitadas = SQLConnection::obtenerSeccionesHabilitadasInforme($user_id, ENV('ID_INFORME_COMERCIAL'));
        }
        $secciones_habilitadas_ordenadas = [];
        foreach ($secciones_habilitadas as $secciones) {
            $secciones_habilitadas_ordenadas[$secciones->nombre_seccion] = $secciones;
        }
        return $secciones_habilitadas_ordenadas;
    }

    public static function obtenerVistaCompacto()
    {
        $respuesta = self::obtenerSesion();
        $secciones_sabana = $respuesta['secciones'];
        $version_sabana = 1;
        $num_comentarios = 0;
        $monitoreo = 0;
        $token = '';
        return View('Api/compacto_header')->with(compact('version_sabana', 'token', 'secciones_sabana', 'num_comentarios', 'monitoreo'))->render();
    }

    //-- VERSION ACTUALIZADA, APLICADA EN PRODUCCION. LA ANTERIOR 'obtenerICXML()' NO VA MAS, NO SE ELIMNINA PARA TENERLA DE REFERENCIA.
    public static function obtenerICXML2()
    {
        $nn = self::ICSinGraficos();
        //echo("ok 1"); die();
        header('Content-Type: application/xml');
        $cuit = Request::input('cuit');
        $apikey = Request::input('apikey');
        $cliente = Request::input('cliente') ?? 110864291;
        $response = '';
        //echo("ok 2"); die();
        $xml = new \SimpleXMLElement('<?xml version="1.0" encoding="utf-8" standalone="yes"?><data/>');
        $busqueda = $xml->addChild('busqueda');
        $busqueda->addChild('cliente', $cliente);
        $busqueda->addChild('cuit', $cuit);
        $data = $xml->addChild('response');
        self::$revisar_monsanto = true;
        //echo("ok 3"); die();
        $resp = self::obtenerServicioScore($cuit, true, false);

        //echo(var_dump($resp)); die();
        //$data->addChild('html',self::ICSinGraficos());
        $data->addChild('html', $nn);
        $data->addChild('rechazo', self::$monsanto);
        //echo(var_dump($xml->asXML()));
        return $xml->asXML();
    }

    public static function obtenerChequesBancos()
    {
        $cuit = Request::input('cuit');
        $idp = SQLConnection::obtenerIdPadron($cuit);
        $id_padron = $idp->id_padron;
        $persona_fisica = (substr($cuit, 0, 1) != '3') ? true : false;
        $tipo_persona = (substr($cuit, 0, 1) != '3') ? 'f' : 'j';
        /*Nodos Principales Obligatorios*/
        $bancos = [];
        $bancos = self::obtenerBancos($cuit, $id_padron, $persona_fisica);
        $resp['bcra'] = $bancos;
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;

        $producto = $usuario->producto ?? 30;
        self::consumir_servicio($cuit, $producto);
        //SQLConnection::consumirServicio($user_id,$cuit,30);
        return json_encode($resp);
    }

    //busca tanto persona física como jurídica relacionadas a un cuit o un nombre
    public static function buscarPersona()
    {
        //CAMBIAR BUSCADOR POR EL DE PRODUCCION
        $apikey = Request::input('apikey');
        if ($apikey != '1F44A3FAA0C15C42') {
            return json_encode(['error' => true]);
        }
        $identificacion = Request::input('identificacion');
        $nombre_persona = Request::input('nombre_persona');
        $domicilio = Request::input('domicilio');
        $tipo_persona = Request::input('tipo_persona');
        $buscar_empleadores = Request::input('buscar_empleadores') ?? 0;
        $buscar_actividades = Request::input('buscar_actividades') ?? 0;
        $buscar_vinculaciones = Request::input('buscar_vinculaciones') ?? 0;
        $tipo_domicilio = Request::input('tipo_domicilio');

        $peticion = ($identificacion != '') ? $identificacion : $nombre_persona;
        $respuesta = MainController::obtenerResultadoPadron($peticion, $tipo_persona);
        //$respuesta        = SQLConnection::backendStoreProcedure('api_buscar_razon_social',array($identificacion,$nombre_persona,$tipo_persona));
        $domicilios = '';
        $vinculaciones = '';
        $actividad_principal = '';
        //if (isset($respuesta[0])){
        foreach ($respuesta as $key => $resp) {
            if ($tipo_persona != 'J') {
                if ($resp->tipo_persona == 'F') {
                    $formales = self::buscarDatosFormales($resp->identificacion);
                    $formales = json_decode($formales);
                    $respuesta[$key]->fecha_nacimiento = isset($formales->fecha_nacimiento) ? $formales->fecha_nacimiento : '';
                    $respuesta[$key]->fecha_defuncion = isset($formales->fecha_defuncion) ? $formales->fecha_defuncion : '';
                }
                if ($resp->tipo_persona == 'F' && $buscar_empleadores == 1) {
                    $empleadores = self::buscarEmpleadores($resp->identificacion);
                    $empleadores = json_decode($empleadores);
                    $respuesta[$key]->empleadores = $empleadores;
                }
            }
            $domicilios = self::buscarDomicilios($resp->identificacion);
            $domicilios = json_decode($domicilios);
            foreach ($domicilios as $key2 => $value) {
                if ($tipo_domicilio == 'principal') {
                    if (stripos($value->tipo_domicilio, 'D') !== false) {
                        $domicilios = $value;
                        if ($resp->tipo_persona == 'F') {
                            $respuesta[$key]->pais = $value->pai_nombre;
                            $respuesta[$key]->provincia = $value->prv_nombre;
                        }
                        break;
                    }
                }
            }
            if ($buscar_actividades == 1) {
                $actividad_principal = self::buscarActividadPrincipal($resp->identificacion);
                $actividad_principal = json_decode($actividad_principal);
                $respuesta[$key]->actividad_principal = $actividad_principal;
            }
            if ($buscar_vinculaciones == 1) {
                $vinculaciones = self::buscarVinculaciones($resp->identificacion, $tipo_persona);
                $vinculaciones = json_decode($vinculaciones);
                $respuesta[$key]->vinculaciones = $vinculaciones;
            }
            $respuesta[$key]->domicilios = $domicilios;
            if ($tipo_persona == 'F' && $resp->tipo_persona == 'F') {
                if (! isset($respuesta[$key]->formales)) {
                    $respuesta[$key]->formales = [];
                }
                if (! isset($respuesta[$key]->empleadores)) {
                    $respuesta[$key]->empleadores = [];
                }
            }
        }
        //}

        return json_encode($respuesta);
    }

    public static function actualizarAFIP()
    {
        $identificacion = Request::input('identificacion');
        if ($identificacion) {
            return AFIPController::obtenerPadron($identificacion, false, 'AR', false);
        }
    }

    //busca todos los domicilios relacionados a un cuit
    private static function buscarDomicilios($identificacion)
    {
        $respuesta = SQLConnection::backendStoreProcedure('sp_obtener_domicilios', array($identificacion));
        return json_encode($respuesta);
    }

    //busca todas las vinculaciones relacionadas a un cuit
    private static function buscarVinculaciones($identificacion, $tipo_persona)
    {
        $respuesta = SQLConnection::backendStoreProcedure('api_buscar_vinculaciones', array($identificacion, $tipo_persona));
        return json_encode($respuesta);
    }

    //busca todos los empleadores relacionados a un cuil/cuit
    private static function buscarEmpleadores($identificacion)
    {
        $respuesta = SQLConnection::backendStoreProcedure('api_buscar_empleado_de', array($identificacion));
        return json_encode($respuesta);
    }

    public static function obtenerInfoCuitAmpliada()
    {
        $cuit = Request::input('cuit');
        if (! isset($cuit)) {
            return json_encode(['error' => true, 'error_message' => 'El parámetro cuit debe poseer 11 caracteres.']);
        }

        if (strlen($cuit) != 11) {
            return json_encode(['error' => true, 'error_message' => 'El cuit contiene un largo diferente de 11.']);
        }

        if ($cuit) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }
        $persona = SQLConnection::backendStoreProcedure('api_info_formal_cuit', array($cuit), 'selectOne');
        $domicilios = SQLConnection::backendStoreProcedure('api_info_domicilios_cuit', array($cuit));
        $telefonos = SQLConnection::backendStoreProcedure('api_info_telefonos_cuit', array($cuit));

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


        //$p_ip = $_SERVER['REMOTE_ADDR'];
        $producto = $usuario->producto ?? 37;
        self::consumir_servicio($cuit, $producto);
        //SQLConnection::consumirServicio($user_id,$cuit,37);

        return json_encode($persona);
    }

    //servicio para validar con gente que parsea EDICTOS.
    public static function obtenerInfoCuitDni()
    {
        $cuit = Request::input('identificacion');
        $nombre = trim(Request::input('nombre'));
        $nombre_contains = '';
        if ($nombre) {
            $nombre_contains = Misc::parsearBusquedaPadron($nombre);
        }
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $provincia = Request::input('provincia') ?? null;
        $maxregistros = Request::input('maxqty') ?? 20;
        $respuesta = new stdClass();

        $producto = $usuario->producto ?? 40;
        self::consumir_servicio($cuit, $producto);
        //SQLConnection::consumirServicio($user_id,$cuit,40);

        /* 22/07/2021 Agregamos que pase por afip */
        if (! empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }

        $validacion = SQLConnection::backendStoreProcedure('api_edictos_dni_cuit', array($cuit, $nombre, $nombre_contains, $maxregistros, $provincia), false);

        if (! empty($validacion)) {
            foreach ($validacion as $key => $value) {

                $respuesta->identificacion_buscada = $cuit;
                $respuesta->nombre_buscado = $nombre;
                $respuesta->fecha = date("Y-m-d h:i:s");

                if ($value->error > 0) {
                    $respuesta->codigo_error = $value->error;
                    $respuesta->mensaje_error = $value->mensaje_error;
                    $respuesta->fidelitas_response = [];
                    $usuario = Session::get('usuario');
                    $user_id = $usuario->user_id;
                    return json_encode($respuesta);
                }

                if ($key == 0) {
                    $respuesta->codigo_error = $value->error;
                    $respuesta->mensaje_error = $value->mensaje_error;
                    $respuesta->fidelitas_response = [];
                }

                $respuesta->fidelitas_response[$key]['mensaje'] = $value->mensaje_validacion;
                $respuesta->fidelitas_response[$key]['validacion'] = $value->validacion;
                $respuesta->fidelitas_response[$key]['nombre_correcto'] = trim($value->nombre_correcto);
                $respuesta->fidelitas_response[$key]['cuit_buscado'] = trim($value->cuit_buscado);

                //AFIPController::ontenerPadronA4($value->cuit_buscado); 

                //$domicilios = SQLConnection::backendStoreProcedure('api_info_domicilios_cuit',array($value->cuit_buscado),false);
                $domicilios = SQLConnection::backendStoreProcedure('api_info_domicilios_cuit', array($value->cuit_buscado, $provincia), false);


                $respuesta->fidelitas_response[$key]['domicilios'] = $domicilios;
            }
        } else {
            $respuesta->identificacion_buscada = $cuit;
            $respuesta->nombre_buscado = $nombre;
            $respuesta->fecha = date("Y-m-d h:i:s");
            $respuesta->codigo_error = 5;
            //$respuesta->mensaje_error='Error en la consulta realizada';
            $respuesta->mensaje_error = 'No se encontraron datos';
            $respuesta->fidelitas_response = [];
            return json_encode($respuesta);
        }
        //print_r(json_encode($respuesta));die();
        return json_encode($respuesta);
    }

    public static function obtenerValidacionCUIT()
    {
        $cuit = Request::input('cuit');
        //obtenerAFIP.
        if (! empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }
        $nombre = trim(Request::input('nombre'));
        $nombre_contains = '';
        if ($nombre) {
            $nombre_contains = Misc::parsearBusquedaPadron($nombre);
        }
        $respuesta = SQLConnection::backendStoreProcedure('api_validacion_cuit', array($cuit, $nombre, $nombre_contains));
        $respuesta[0]->cuit_buscado = $cuit;
        $respuesta[0]->nombre_buscado = $nombre;
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;

        $producto = $usuario->producto ?? 26;
        self::consumir_servicio($cuit, $producto);
        //SQLConnection::consumirServicio($user_id,$cuit,26);
        return json_encode($respuesta);
    }

    public static function obtenerIDVerification()
    {
        $pedido = date('Y-m-d h:i:s');
        $ip = $_SERVER['REMOTE_ADDR'];
        $cuit = Request::input('cuit');
        $apikey = Request::input('apikey');
        $url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        /* 22/07/2021 Agregamos que pase por afip */
        if (! empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }

        SQLConnection::backendStoreProcedure('insertar_api_log', array($apikey, $cuit, $user_id, $pedido, $ip, $url));

        $cantidad_invalidos = Request::input('cantidad_invalidos');
        $cantidad_validos = Request::input('cantidad_validos');
        if (empty($cantidad_validos)) {
            $cantidad_validos = 1;
        }
        if (empty($cantidad_invalidos)) {
            $cantidad_invalidos = 5;
        }

        $respuesta['financial_data'] = SQLConnection::backendStoreProcedure('ws_idverification_bancos', array($cuit, $cantidad_invalidos, $cantidad_validos));
        $respuesta['addresses'] = SQLConnection::backendStoreProcedure('ws_idverification_domicilios', array($cuit, $cantidad_invalidos, $cantidad_validos));
        $respuesta['business_data'] = SQLConnection::backendStoreProcedure('ws_idverification_empresas', array($cuit, $cantidad_invalidos, $cantidad_validos));
        $respuesta['personal_data'] = SQLConnection::backendStoreProcedure('ws_idverification_personales', array($cuit, $cantidad_invalidos, $cantidad_validos));
        $respuesta['related_data'] = SQLConnection::backendStoreProcedure('ws_idverification_sociedades', array($cuit, $cantidad_invalidos, $cantidad_validos));

        $usuario = Session::get('usuario');
        $producto = $usuario->producto ?? 27;
        self::consumir_servicio($cuit, $producto);
        //SQLConnection::consumirServicio($user_id,$cuit,27);

        return json_encode($respuesta);
    }

    public static function imperiumextraercuit()
    {
        //$user_id  = Session::get('usuario');
        //$actiondb='ALTA';
        //$titulo='null';
        //$user_id  = 15342812;
        $dbid = Request::input('dbid');
        $listacuit = Request::input('listacuit');
        $updlistacuit = 'UPDLISTACUIT';
        $resp = SQLConnection::backendStoreProcedure('Imperium_pdf_read', array($updlistacuit, $dbid, $listacuit), 'selectOne');
        //var_dump($resp);
        return $listacuit;//$resp; 
    }

    public static function empleadoresCUIT()
    {
        if (isset($_POST['cuit'])) {
            $cuit = trim(Request::input('cuit'));
            $producto = Session::get('usuario')->producto ?? 0;
            //
            if ($producto == 0) {
                return Response::JSON(['error' => 3, 'mensaje' => 'El apikey recibido es inválido.'], 403);
            }
            //
            if (Misc::validarCuit($cuit)) {
                //
                self::consumir_servicio($cuit, $producto);
                //
                $extendido = false;
                if (isset($_POST['extendido']) && $_POST['extendido'] == 1) {
                    $extendido = true;
                }
                //	
                $empleadores = SQLConnection::backendStoreProcedure('backend_empleados', array($cuit, NULL, 'empleadores'));
                //
                if (empty($empleadores)) {
                    return Response::JSON(['error' => 0, 'mensaje' => 'No se encontro empleos anteriores.', 'empleadores' => []], 200);
                }
                //
                if ($extendido) {
                    return Response::JSON(['error' => 0, 'mensaje' => 'OK.', 'empleadores' => $empleadores], 200);
                } else {
                    $fecha = NULL;
                    $periodos = [];
                    $datos_empleadores = [];
                    $i = 0;
                    //
                    /* foreach( $empleadores as $empleador ){
                                       $fecha = date_create_from_format('Y-m',$empleador->periodo);
                                       //
                                       if ( !isset($periodos[$empleador->cuit]) ){
                                           $periodos[$empleador->cuit] = (object) ['indice' => $i,'periodo' => date_create_from_format('Y-m',$empleador->periodo)];
                                           $datos_empleadores[] = (object) ['cuit' => $empleador->cuit, 'empleador' => $empleador->empleador, 'periodo' => $empleador->periodo];
                                           //
                                           $i++;
                                       } else {
                                           if ( $fecha < $periodos[$empleador->cuit]->periodo ){
                                               $periodos[$empleador->cuit]->periodo = date_create_from_format('Y-m',$empleador->periodo);
                                               $datos_empleadores[$periodos[$empleador->cuit]->indice]->periodo = $empleador->periodo;
                                           }
                                       }
                                   } */
                    // se resumen los datos hasta el primer periodo de cada empleador
                    foreach ($empleadores as $empleador) {
                        $fecha = date_create_from_format('Y-m', $empleador->periodo);
                        //
                        if (! isset($periodos[$empleador->cuit])) {
                            $periodos[$empleador->cuit] = ['indice' => $i, 'periodo' => date_create_from_format('Y-m', $empleador->periodo)];
                            $datos_empleadores[] = ['cuit' => $empleador->cuit, 'empleador' => $empleador->empleador, 'periodo' => $empleador->periodo];
                            //
                            $i++;
                        } else {
                            if ($fecha < $periodos[$empleador->cuit]['periodo']) {
                                $periodos[$empleador->cuit]['periodo'] = date_create_from_format('Y-m', $empleador->periodo);
                                $datos_empleadores[$periodos[$empleador->cuit]['indice']]['periodo'] = $empleador->periodo;
                            }
                        }
                    }
                    //
                    unset($fecha);
                    unset($periodos);
                    unset($i);
                    //
                    return Response::JSON(['error' => 0, 'mensaje' => 'OK.', 'empleadores' => $datos_empleadores], 200);
                }
            }
            //
            return Response::JSON(['error' => 2, 'mensaje' => 'El CUIT recibido es inválido.'], 400);
        }
        //
        return Response::JSON(['error' => 1, 'mensaje' => 'No se recibio el CUIT de la persona a consultar.'], 400);
    }

    //devuelve todos las novedades del campo smart alert true para un cliente especifico.
    public static function obtenerSmartAlert()
    {
        header('Content-Type: application/xml');
        $apikey = Request::input('apikey');
        $ip = $_SERVER['REMOTE_ADDR'];
        $url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $pedido = date('Y-m-d h:i:s');
        // 1299789112,'2018-11-28'
        $date = new DateTime(date('Y-m-d')); // For today/now, don't pass an arg.
        $date->modify("-1 day");
        $cliente = Request::input('cliente') ?? 110864291;
        $fecha = $date->format("Y-m-d");
        $smart_alert = SQLConnection::backendStoreProcedure('api_smart_alert', array($cliente), 'select');
        $actualizar_smart_alert = SQLConnection::backendStoreProcedure('api_actualizar_smart_alert', array($cliente), 'select');
        $xml = new \SimpleXMLElement('<data/>');
        $busqueda = $xml->addChild('busqueda');
        $busqueda->addChild('cliente', $cliente);
        $busqueda->addChild('fecha', $fecha);
        foreach ($smart_alert as $key => $value) {
            $data = $xml->addChild('persona');
            $data->addChild('dni_cuit', $value->dni_cuit);
            $data->addChild('categoria', $value->categoria);
            $data->addChild('explicacion', $value->explicacion);
        }
        SQLConnection::backendStoreProcedure('insertar_api_log', array($apikey, '00000000000', $user_id, $pedido, $ip, $url));
        return $xml->asXML();
    }

    /* 
    -------------------- 
    Nueva API para EBANX 
    -------------------- 

    El cliente solicita tener un nuevo servicio que permita obtener cierta información asociada a un CUIT/DNI y un Nombre.
    El servicio deberá devolver los siguientes datos: 
    CUIT, Nombre, 
    Fecha de Nacimiento, Fecha de Defunción y Responsable Inscripto (Si/No)
    Dirección (todas las direcciones que tengamos registradas), 
    De la Dirección, solicita los siguientes datos: Tipo de domicilio, Domicilio, Localidad, Código Postal y Provincia.

    El servicio puede recibir un CUIT o un DNI, y un Nombre. Ambos campos son obligatorios
    Buscar el/los CUITs asociados al dato recibido
    Con el/los CUITs encontrados, actualizar los datos utilizando el servicio de AFIP
    Validar el nombre recibido con el nombre que tengamos en la base de datos
    Recabar el resto de los datos para aquellas validaciones que dieron como resultado 1. 
    SÓLO si todas las validaciones dieron como resultado 0, recabar el resto de los datos para el/los CUITs

    */
    /*
    19/07/2021 antes se hacía un top 1 en el SP, para que solo devuelva un registro en caso de encontrar más de 1.
    Ahora devuelve todos los encontrados
    */


public static function obtenerInfoDniCuitAmpliada() {
        $cuit = Request::input('cuit');
        $nombre = trim(Request::input('nombre'));
        $nombre_contains = '';
        
        if ($nombre) {
            $nombre_contains = Misc::parsearBusquedaPadron($nombre);
        }
        
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $respuesta = new stdClass();
        $producto = $usuario->producto ?? 40;

        $consumo = self::consumir_servicio($cuit,$producto);
        $id_consumo = $consumo->transaction_id;

        if (isset($cuit[0]) && $cuit[0] != '2' && strlen($cuit) == 11) {
            $usuario = Session::get('usuario');
            //$producto = $usuario->producto ?? 40;
            
            //SQLConnection::consumirServicio($user_id,$cuit,40);

            $respuesta->identificacion_buscada = $cuit;
            $respuesta->nombre_buscado = $nombre;
            $respuesta->fecha = date("Y-m-d h:i:s");
            $respuesta->codigo_error = 5;
            $respuesta->mensaje_error = 'El cuit es inválido ó no pertenece a una persona humana';
            $respuesta->fidelitas_response = [];

            self::Guardar_resultado_api(
                $user_id, 
                $producto, 
                $cuit, 
                '', 
                $id_consumo, 
                json_encode($respuesta),
                '5',
                Misc::medirTiempoRespuesta()
            );	

            return json_encode($respuesta);
        }
        
        $validacion = SQLConnection::backendStoreProcedure('api_validacion_dni_cuit', array($cuit, $nombre, $nombre_contains), false);
        if (!empty($validacion)) {
            foreach ($validacion as $key => $value) {

                $usuario = Session::get('usuario');
                //$producto = $usuario->producto ?? 40;
                //SQLConnection::consumirServicio($user_id,$cuit,40);

                $respuesta->identificacion_buscada = $cuit;
                $respuesta->nombre_buscado = $nombre;
                $respuesta->fecha = date("Y-m-d h:i:s");

                if ($value->error > 0) {
                    $respuesta->codigo_error = $value->error;
                    $respuesta->mensaje_error = $value->mensaje_error;
                    $respuesta->fidelitas_response = [];
                    $usuario = Session::get('usuario');
                    $user_id = $usuario->user_id;
                    //self::consumir_servicio($cuit, $producto);

                    self::Guardar_resultado_api(
                        $user_id, 
                        $producto, 
                        $cuit, 
                        '', 
                        $id_consumo, 
                        json_encode($respuesta),
                        $respuesta->codigo_error,
                        Misc::medirTiempoRespuesta()
                    );	

                    return json_encode($respuesta);
                }

                if ($key == 0) {
                    $respuesta->codigo_error = $value->error;
                    $respuesta->mensaje_error = $value->mensaje_error;
                    $respuesta->fidelitas_response = [];
                }

                $respuesta->fidelitas_response[$key]['mensaje'] = $value->mensaje_validacion;
                $respuesta->fidelitas_response[$key]['validacion'] = $value->validacion;
                $respuesta->fidelitas_response[$key]['nombre_correcto'] = trim($value->nombre_correcto);
                $respuesta->fidelitas_response[$key]['cuit_buscado'] = trim($value->cuit_buscado);

                //AFIPController::ontenerPadronA4($value->cuit_buscado); 
                $resp = [];
                AFIPController::obtenerPadron($value->cuit_buscado, false, 'AR', false);

                // AGB VER ESTE SLEEP BORRACHO
                //usleep(500000);
                $afip = SQLConnection::backendStoreProcedure('api_info_afip_cuit', array($value->cuit_buscado), true);
                //if (!empty($resp)) {
                /* RENAPER */
                /* 23/07/2021: Si no tenemos la fecha de nacimiento en la BD (el campo buscar_fecha_nac viene con valor 1)
                                       entonces, buscamos en Renaper */
                if ($afip->buscar_fecha_nac == 1 || $afip->buscar_fecha_nac == '1') {
                    if ($afip->sexo == null) {
                        $renaper = json_decode(RenaperController::obtenerUltimoEjemplarUno($afip->dni, 'M', 1));
                        if (!isset($renaper->Response->fechaNacimiento)) {
                            $renaper = json_decode(RenaperController::obtenerUltimoEjemplarUno($afip->dni, 'F', 1));
                        }
                    } else {
                        $renaper = json_decode(RenaperController::obtenerUltimoEjemplarUno($afip->dni, $afip->sexo, 1));
                    }
                }
                /* FIN RENAPER */
                //}

                $respuesta->fidelitas_response[$key]['afip'] = new stdClass();
                /* 23/07/2021: El sp api_info_afip_cuit devuelve mas datos, entonces tomamos solo los campos que necesitamos */
                //$respuesta->fidelitas_response[$key]['afip'] = $afip;
                $respuesta->fidelitas_response[$key]['afip']->responsable_inscripto = $afip->responsable_inscripto;
                $respuesta->fidelitas_response[$key]['afip']->monotributo = $afip->monotributo;
                $respuesta->fidelitas_response[$key]['afip']->fecha_nacimiento = $afip->fecha_nacimiento;
                $respuesta->fidelitas_response[$key]['afip']->persona_fallecida = $afip->persona_fallecida;

                $domicilios = SQLConnection::backendStoreProcedure('api_info_domicilios_cuit', array($value->cuit_buscado), false);
                //$respuesta->fidelitas_response[$key]['domicilios']= $domicilios;  
                /* 22/04/2021: Se pidio que solo devuelva un domicilio (prefenrentemente el fiscal) */
                if (sizeof($domicilios) > 0) {
                    $domiclio_fiscal = $domicilios[0];
                    foreach ($domicilios as $dom) {
                        if ($dom->tipo_de_domicilio == 'Fiscal') {
                            $domiclio_fiscal = $dom;
                        }
                    }
                    $respuesta->fidelitas_response[$key]['domicilios'] = $domiclio_fiscal;
                }

                $usuario = Session::get('usuario');
                //$producto = $usuario->producto ?? 40;
                //self::consumir_servicio($value->cuit_buscado, $producto);
                //SQLConnection::consumirServicio($user_id,$value->cuit_buscado,40);
            }
        } else {

            $usuario = Session::get('usuario');
            //$producto = $usuario->producto ?? 40;
            //self::consumir_servicio($cuit, $producto);
            //SQLConnection::consumirServicio($user_id,$cuit,40);

            $respuesta->identificacion_buscada = $cuit;
            $respuesta->nombre_buscado = $nombre;
            $respuesta->fecha = date("Y-m-d h:i:s");
            $respuesta->codigo_error = 5;
            $respuesta->mensaje_error = 'Error en la consulta realizada';
            $respuesta->fidelitas_response = [];

            self::Guardar_resultado_api(
                $user_id, 
                $producto, 
                $cuit, 
                '', 
                $id_consumo, 
                json_encode($respuesta),
                '5',
                Misc::medirTiempoRespuesta()
            );	

            return json_encode($respuesta);
        }
        
        self::Guardar_resultado_api(
            $user_id, 
            $producto, 
            $cuit, 
            '', 
            $id_consumo, 
            json_encode($respuesta),
            '5',
            Misc::medirTiempoRespuesta()
        );	
        
        //print_r(json_encode($respuesta));die();
        return json_encode($respuesta);
    }

    public static function obtenerInfoDniCuitAmpliadaTBB()
    {
        $cuit = Request::input('cuit');
        $nombre = trim(Request::input('nombre'));
        $nombre_contains = '';
        if ($nombre) {
            $nombre_contains = Misc::parsearBusquedaPadron($nombre);
        }
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $respuesta = new stdClass();

        if (isset($cuit[0]) && $cuit[0] != '2' && strlen($cuit) == 11) {
            $usuario = Session::get('usuario');
            $producto = $usuario->producto ?? 40;
            self::consumir_servicio($cuit, $producto);
            //SQLConnection::consumirServicio($user_id,$cuit,40);

            $respuesta->identificacion_buscada = $cuit;
            $respuesta->nombre_buscado = $nombre;
            $respuesta->fecha = date("Y-m-d h:i:s");
            $respuesta->codigo_error = 5;
            $respuesta->mensaje_error = 'El cuit es inválido ó no pertenece a una persona humana';
            $respuesta->fidelitas_response = [];
            return json_encode($respuesta);
        }
        $validacion = SQLConnection::backendStoreProcedure('api_validacion_dni_cuit', array($cuit, $nombre, $nombre_contains), false);
        if (! empty($validacion)) {
            foreach ($validacion as $key => $value) {

                $usuario = Session::get('usuario');
                $producto = $usuario->producto ?? 40;
                //SQLConnection::consumirServicio($user_id,$cuit,40);

                $respuesta->identificacion_buscada = $cuit;
                $respuesta->nombre_buscado = $nombre;
                $respuesta->fecha = date("Y-m-d h:i:s");

                if ($value->error > 0) {
                    $respuesta->codigo_error = $value->error;
                    $respuesta->mensaje_error = $value->mensaje_error;
                    $respuesta->fidelitas_response = [];
                    $usuario = Session::get('usuario');
                    $user_id = $usuario->user_id;
                    self::consumir_servicio($cuit, $producto);
                    return json_encode($respuesta);
                }

                if ($key == 0) {
                    $respuesta->codigo_error = $value->error;
                    $respuesta->mensaje_error = $value->mensaje_error;
                    $respuesta->fidelitas_response = [];
                }

                $respuesta->fidelitas_response[$key]['mensaje'] = $value->mensaje_validacion;
                $respuesta->fidelitas_response[$key]['validacion'] = $value->validacion;
                $respuesta->fidelitas_response[$key]['nombre_correcto'] = trim($value->nombre_correcto);
                $respuesta->fidelitas_response[$key]['cuit_buscado'] = trim($value->cuit_buscado);

                //AFIPController::ontenerPadronA4($value->cuit_buscado); 
                $resp = [];
                #$resp = AFIPController::obtenerPadron($value->cuit_buscado, false, 'AR', false);
                ## 17/03/2025: 
                $cliente = $usuario->cliente['client_id'];
                $dias_afip = null;   
                if ($cliente == '4405537') // EBANX S.A.
                {
                    $dias_afip = ENV('AFIP_TIEMPO_ESPECIAL');  
                }
                $resp = AFIPController::obtenerPadron($value->cuit_buscado, false, 'AR', false, $dias_afip);


                // AGB VER ESTE SLEEP BORRACHO
                //usleep(500000);
                $afip = SQLConnection::backendStoreProcedure('api_info_afip_cuit', array($value->cuit_buscado), true);
                //if (!empty($resp)) {
                /* RENAPER */
                /* 23/07/2021: Si no tenemos la fecha de nacimiento en la BD (el campo buscar_fecha_nac viene con valor 1)
                                       entonces, buscamos en Renaper */
                if ($afip->buscar_fecha_nac == 1 || $afip->buscar_fecha_nac == '1') {
                    if ($afip->sexo == null) {
                        $renaper = json_decode(RenaperController::obtenerUltimoEjemplarUno($afip->dni, 'M', 1));
                        if (! isset($renaper->Response->fechaNacimiento)) {
                            $renaper = json_decode(RenaperController::obtenerUltimoEjemplarUno($afip->dni, 'F', 1));
                        }
                    } else {
                        $renaper = json_decode(RenaperController::obtenerUltimoEjemplarUno($afip->dni, $afip->sexo, 1));
                    }
                }
                /* FIN RENAPER */
                //}

                $respuesta->fidelitas_response[$key]['afip'] = new stdClass();
                /* 23/07/2021: El sp api_info_afip_cuit devuelve mas datos, entonces tomamos solo los campos que necesitamos */
                //$respuesta->fidelitas_response[$key]['afip'] = $afip;
                $respuesta->fidelitas_response[$key]['afip']->responsable_inscripto = $afip->responsable_inscripto;
                $respuesta->fidelitas_response[$key]['afip']->monotributo = $afip->monotributo;
                $respuesta->fidelitas_response[$key]['afip']->fecha_nacimiento = $afip->fecha_nacimiento;
                $respuesta->fidelitas_response[$key]['afip']->persona_fallecida = $afip->persona_fallecida;

                $domicilios = SQLConnection::backendStoreProcedure('api_info_domicilios_cuit', array($value->cuit_buscado), false);
                //$respuesta->fidelitas_response[$key]['domicilios']= $domicilios;  
                /* 22/04/2021: Se pidio que solo devuelva un domicilio (prefenrentemente el fiscal) */
                if (sizeof($domicilios) > 0) {
                    $domiclio_fiscal = $domicilios[0];
                    foreach ($domicilios as $dom) {
                        if ($dom->tipo_de_domicilio == 'Fiscal') {
                            $domiclio_fiscal = $dom;
                        }
                    }
                    $respuesta->fidelitas_response[$key]['domicilios'] = $domiclio_fiscal;
                }

                $usuario = Session::get('usuario');
                $producto = $usuario->producto ?? 40;
                self::consumir_servicio($value->cuit_buscado, $producto);
                //SQLConnection::consumirServicio($user_id,$value->cuit_buscado,40);
            }
        } else {

            $usuario = Session::get('usuario');
            $producto = $usuario->producto ?? 40;
            self::consumir_servicio($cuit, $producto);
            //SQLConnection::consumirServicio($user_id,$cuit,40);

            $respuesta->identificacion_buscada = $cuit;
            $respuesta->nombre_buscado = $nombre;
            $respuesta->fecha = date("Y-m-d h:i:s");
            $respuesta->codigo_error = 5;
            $respuesta->mensaje_error = 'Error en la consulta realizada';
            $respuesta->fidelitas_response = [];
            return json_encode($respuesta);
        }
        //print_r(json_encode($respuesta));die();
        return json_encode($respuesta);
    }

    public static function obtenerSociedadesHTML($json = true)
    {
        return self::$MainController->obtenerSociedades($json);
    }
    public static function obtenerFormalesHTML($json = true)
    {
        return self::$MainController->obtenerFormales($json);
    }
    public static function obtenerComercialesHTML($json = true)
    {
        return self::$MainController->obtenerComerciales($json);
    }
    public static function obtenerFiscalesHTML($json = true)
    {
        return self::$MainController->obtenerFiscales($json);
    }
    public static function obtenerBancosHTML($json = true)
    {
        return self::$MainController->obtenerBancos($json);
    }
    public static function obtenerContablesHTML($json = true)
    {
        return self::$MainController->obtenerContables($json);
    }
    public static function obtenerLegalesHTML($json = true)
    {
        return self::$MainController->obtenerLegales($json);
    }

    public static function addressvalidation()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $name = trim(Request::input('name'));
        $surname = trim(Request::input('surname'));
        $dni = trim(Request::input('national_id'));
        $tax_id = "";
        $birthdate = trim(Request::input('birthdate'));
        $gender = trim(Request::input('gender'));
        $street_name = trim(Request::input('street_name'));
        $street_number = trim(Request::input('street_number'));
        $floor = trim(Request::input('floor'));
        $apartment = trim(Request::input('apartment'));
        $city = trim(Request::input('city'));
        $state = trim(Request::input('state'));
        $country_code = trim(Request::input('country_code'));
        $producto = $usuario->producto;

        $cliente = $usuario->cliente['client_id'];

        $enviados = [];
        if ($usuario->producto == 110) {
            $enviados['name'] = self::nombre_formateo($name);
            $enviados['surname'] = self::nombre_formateo($surname);
            $enviados['national_id'] = self::normalizador_dni($dni);
            $enviados['gender'] = $gender;
            $enviados['street_name'] = $street_name;
            $enviados['street_number'] = $street_number;
            $enviados['floor'] = $floor;
            $enviados['apartment'] = $apartment;
            $enviados['city'] = $city;
            $enviados['state'] = $state;
            $enviados['country_code'] = $country_code;

            $name_validation = 'FALSE';
            $surname_validation = 'FALSE';

            $p_url = $_SERVER['REQUEST_URI'];
            $consulta = SQLConnection::backendStoreProcedure('guardar_parametros_API', array($user_id, $name, $surname, $dni, $tax_id, $birthdate, NULL, NULL, $gender, $p_url), 'selectOne');

            if (self::dni_valido($enviados['national_id'])) {
                if (empty($tax_id) && empty($dni)) {
                    return json_encode(['Parameters' => $enviados, 'Status' => 'ERROR', 'Message' => Misc::error_query(312), 'Response' => []]);
                }

                #if (strlen($name) < 2 || strlen($surname) < 2) {
                #	return json_encode([
                #		'Parameters'=>$enviados,'Status'=>'ERROR','Message'=>'THE MINIMUM NUMBER OF CHARACTERS FOR NAME AND SURNAME IS 2','Response'=>[]
                #	]);
                #}

                if (! empty($tax_id)) {
                    $taxid_dni = $tax_id;
                } else {
                    $taxid_dni = $dni;
                }
                $producto = $usuario->producto;

                if (! empty($tax_id) && strlen($tax_id) == 11) {
                    AFIPController::obtenerPadron($tax_id, true, 'AR', false); //-> SE COMENTA PORQUE GENERA UN ERROR (REVISAR)
                } elseif (! empty($taxid_dni) && strlen($taxid_dni) == 8) {
                    $cuitss = self::BuscarCuit($taxid_dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    $tax_id = $cuitss[0]->cuit ?? $tax_id;
                }

                $res_renaper = self::tratamientoSoloRenaper($taxid_dni); /* 27/06/2023: No se mandaba sexo y buscaba siempre primero por 'F' y si habia F y M. Traia siempre el F */

                #$response = SQLConnection::backendStoreProcedure('api_get_govcheck',array($dni),'select'); /* lo pasamos aca 27/06/2023 */																	

                if (! empty($res_renaper)) {
                    if (is_null($res_renaper->fecha_consulta) || Misc::cantidadMeses($res_renaper->fecha_consulta) >= 4) {
                        $res_renaper = self::tratamientoRenaper_v3($dni, $response->sexo, $res_renaper->identificacion);
                    }
                } else {
                    $res_renaper = self::tratamientoRenaper_v3($dni, NULL, $dni);
                }


                if (isset($res_renaper->nroError) && ! empty($res_renaper->nroError) && $res_renaper->nroError != 99) {
                    return json_encode(['Parameters' => $enviados, 'Status' => 'ERROR', 'Message' => $res_renaper->descripcionError, 'Response' => []]);
                }


                $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $tax_id), 'select');
                if (count($datos) == 0) {
                    $cuitss = self::BuscarCuit_Forzado($dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $cuitss[0]->cuit), 'select');
                }

                /* 26/07/2021 Si no devuelve nada, guardamos con lo que busco, sino Lo hacemos dentro del foreach, para guardar la consulta por el cuit */
                if (sizeOf($datos) < 1) {
                    $resp = self::consumir_servicio($taxid_dni, $producto);
                }


                $result = [];
                $address_complete_validation = 'FALSE';
                $dni_validation = 'FALSE';
                $tax_id_validation = 'FALSE';
                $gender_validation = 'FALSE';

                foreach ($datos as $key => $persona) {
                    $info = new StdClass();

                    $persona->nombres = self::nombre_formateo($persona->nombres);
                    $persona->apellidos = self::nombre_formateo($persona->apellidos);
                    $info = SQLConnection::backendStoreProcedure('[sp_procesos_cuit_enrichment_api_datos]', array(1, $persona->cuit), 'selectOne');


                    /* 26/07/2021 Lo hacemos dentro del foreach, para guardar la consulta por el cuit */
                    $resp = self::consumir_servicio($persona->cuit, $producto);

                    $name_validation = empty($name) ? '' : (self::validacionNombre($enviados, $persona));

                    $surname_validation = empty($surname) ? '' : (self::validacionApellido($enviados, $persona));

                    $localidad = '';
                    $provincia = '';
                    $pais = '';

                    // $info->domicilio = self::eliminar_acentos($info->domicilio);
                    $info->domicilio = isset($registro_elegido->domicilio) ? self::eliminar_acentos($registro_elegido->domicilio) : '';
                    // $info->provicia = self::eliminar_acentos($info->provicia);
                    $info->provicia = isset($registro_elegido->state) ? self::eliminar_acentos($registro_elegido->state) : '';
                    // $info->localidad = self::eliminar_acentos($info->localidad);
                    $info->localidad = isset($registro_elegido->city) ? self::eliminar_acentos($registro_elegido->city) : '';

                    if ($enviados['national_id'] == $persona->dni) {
                        $dni_validation = 'TRUE';
                    }

                    if (! empty(strtoupper($enviados['gender']))) {
                        if (strtoupper($enviados['gender']) == strtoupper($persona->sexo)) {
                            $gender_validation = 'TRUE';
                        }
                    } else {
                        $gender_validation = '';
                    }

                    $address_complete_validation = 'FALSE';
                    //EL STORE QUE DEVUELVE EL LOS DATOS DEL DOMICILIO COMPLETO
                    $datos_domicilios = SQLConnection::backendStoreProcedure('api_domicilios', array($persona->cuit));

                    $registro_elegido = [];
                    //PRIMERO BUSCA COMO PRIORIDAD LA FUENTE DE RENAPER Y DEVUELVE LOS DATOS DE DOMICILIO
                    foreach ($datos_domicilios as $key => $value) {
                        if ($value->nombre_fuente == 'RENAPER') {
                            $registro_elegido = $datos_domicilios[$key];
                            break;
                        }
                    }

                    //SI NO ENCUENTRA COMO FUENTE RENAPER, BUSCA TIPO DE DOMICILIO L
                    if (empty($registro_elegido)) {
                        foreach ($datos_domicilios as $key => $value) {
                            if ($value->address_type == 'L') {
                                $registro_elegido = $datos_domicilios[$key];
                                break;
                            }
                        }
                    }

                    //SI NO HAY UN DOMICILIO TIPO L , AGARRA EL PRIMER REGISTRO
                    if (empty($registro_elegido)) {
                        $registro_elegido = (count($datos_domicilios) == 0 || is_null($datos_domicilios)) ? '' : $datos_domicilios[0];
                    }

                    //---- EN ESTE CONDICION CAMBIA EL NOMBRE SI ES CIUDAD AUTONOMA DE BUENOS AIRES, PARA PODER HACER LA COMPARACION CON EL REGISTRO OBTENIDO
                    if (strtoupper($enviados['state']) == 'CABA' || strtoupper($enviados['state']) == 'CIUDAD AUTONOMA DE BUENOS AIRES' || strtoupper($enviados['state']) == 'CAPITAL FEDERAL') {
                        $enviados['state'] = 'CIUDAD AUTONOMA BUENOS AIRES';
                    }

                    try {
                        //---- DEFENIENDO LAS FUNCION LEVENSHTEIN
                        $levenshtein_nombre_calle = levenshtein(strtoupper((strlen($enviados['street_name']) > 0) ? $enviados['street_name'] : 'null'), $registro_elegido->street_name);
                        $levenshtein_provincia = levenshtein(strtoupper($enviados['state']), $registro_elegido->state);
                        $levenshtein_localidad = levenshtein(strtoupper($enviados['city']), $registro_elegido->city);
                    } catch (\Throwable $th) {
                        $levenshtein_nombre_calle = 2;
                        $levenshtein_provincia = 2;
                        $levenshtein_localidad = 2;
                        $objTemporal = new StdClass();
                        $objTemporal->country_code = 'FALSE';
                        $objTemporal->street_number = 'FALSE';
                        $objTemporal->floor = 'FALSE';
                        $objTemporal->appartment = 'FALSE';
                        $registro_elegido = $objTemporal;
                    }

                    //LLAMO A LA FUNCION QUE VALIDA EL DOMICILIO POR PARTE																		
                    $individual_address_validations = self::funcion_compara_domicilios(
                        $street_name,
                        $street_number,
                        $floor,
                        $apartment,
                        $city,
                        $state,
                        $country_code,

                        $registro_elegido->street_name,
                        $registro_elegido->street_number,
                        $registro_elegido->floor,
                        $registro_elegido->appartment,
                        $registro_elegido->city,
                        $registro_elegido->state,
                        $registro_elegido->country_code
                    );

                    $result[2] = new StdClass();
                    $result[2]->national_id = $dni_validation;
                    $result[2]->name = $name_validation;
                    $result[2]->surname = $surname_validation;
                    $result[2]->gender = $gender_validation;
                    $result[2]->individual_address_validations = $individual_address_validations;
                    $result[2]->transaction_id = $resp->transaction_id;

                    SQLConnection::backendStoreProcedure('guardar_parametros_API_2', array($consulta->id, $resp->transaction_id), 'selectOne');
                }

                return json_encode([
                    'Parameters' => $enviados,
                    'Status' => 'OK',
                    'Message' => 'OK',
                    'Response' => $result
                ]);
            } else {
                return json_encode([
                    'Parameters' => $enviados,
                    'Status' => 'ERROR',
                    'Message' => Misc::error_query(300),
                    'Response' => []
                ]);
            }
        } else {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => Misc::error_query(311),
                'Response' => []
            ]);
        }
    }

    #Se cambio la funcion que obtiene el ejemplar para que ahora devuelva errores
    public static function tratamientoRenaper_v3($dni, $sexo, $cuit)
    {
        if (($sexo != 'F' && $sexo != 'M') || is_null($sexo)) {
            $sexo = Misc::posibleGenero($cuit); // busca posible genero si no lo tiene
        }
        //return json_decode(RenaperController::obtenerUltimoEjemplarUno($dni, $sexo, 1))->Response;
        $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto_v3($dni, $sexo, 1))->Response;
        if (empty($r) && $sexo == 'M') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto_v3($dni, 'F', 1))->Response;
            return (empty($r)) ? null : $r;
            //return json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1))->Response;
        } else if (empty($r) && $sexo == 'F') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto_v3($dni, 'M', 1))->Response;
            return (empty($r)) ? null : $r;
            //return json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1))->Response;
        } else {
            return $r;
        }
    }

    public static function validacionGBG_v214032025()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $name = trim(Request::input('name'));
        $surname = trim(Request::input('surname'));
        $dni = trim(Request::input('dni'));
        $tax_id = trim(Request::input('tax_id'));
        $birthdate = trim(Request::input('birthdate'));
        $address = trim(Request::input('address'));
        $telephone = trim(Request::input('telephone'));
        $gender = trim(Request::input('gender'));
        //--- Modificacion 24/09/2021
        $street_name = trim(Request::input('street_name'));
        $street_number = trim(Request::input('street_number'));
        $floor = trim(Request::input('floor'));
        $apartment = trim(Request::input('apartment'));
        $city = trim(Request::input('city'));
        $state = trim(Request::input('state'));
        $country_code = trim(Request::input('country_code'));
        $idReg = trim(Request::input('idReg'));

        //---

        $enviados_originales['name'] = $name;
        $enviados_originales['surname'] = $surname;
        $enviados_originales['dni'] = $dni;
        $enviados_originales['tax_id'] = $tax_id;
        $enviados_originales['birthdate'] = $birthdate;
        $enviados_originales['address'] = $address;
        $enviados_originales['telephone'] = $telephone;
        $enviados_originales['gender'] = $gender;
        $enviados_originales['street_name'] = $street_name;
        $enviados_originales['street_number'] = $street_number;
        $enviados_originales['floor'] = $floor;
        $enviados_originales['apartment'] = $apartment;
        $enviados_originales['city'] = $city;
        $enviados_originales['state'] = $state;
        $enviados_originales['country_code'] = $country_code;

        $enviados['name'] = self::nombre_formateo($name);
        $enviados['surname'] = self::nombre_formateo($surname);
        $enviados['dni'] = self::normalizador_dni($dni);
        $enviados['tax_id'] = $tax_id;
        $tax_id = (isset($tax_id) && self::tax_id_valido($tax_id)) ? $tax_id : '';
        $enviados['birthdate'] = $birthdate;
        $enviados['address'] = self::acentos_enies($address);
        $enviados['telephone'] = self::acentos_enies($telephone);
        $enviados['gender'] = self::acentos_enies($gender);
        //------Modificacion 24/09/2021
        $enviados['street_name'] = self::acentos_enies($street_name);
        $enviados['street_number'] = self::acentos_enies($street_number);
        $enviados['floor'] = self::acentos_enies($floor);
        $enviados['apartment'] = self::acentos_enies($apartment);
        $enviados['city'] = self::acentos_enies($city);
        $enviados['state'] = self::acentos_enies($state);
        $enviados['country_code'] = self::acentos_enies($country_code);

        //------
        $integridad = 0;
        $name_validation = 'FALSE';
        $surname_validation = 'FALSE';

        $p_url = $_SERVER['REQUEST_URI'];

        $array_txt = [];
        $consulta = SQLConnection::backendStoreProcedure('guardar_parametros_API', array($user_id, $name, $surname, $dni, $tax_id, $birthdate, $address, $telephone, $gender, $p_url), 'selectOne');


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


        if (self::fecha_valida($enviados['birthdate']) && self::dni_valido($enviados['dni'])) {

            if (empty($tax_id) && empty($dni)) {
                self::Guardar_resultado_api($user_id, $producto, $enviados_originales['dni'], $enviados_originales['gender'], null, json_encode(['Parameters' => $enviados_originales, 'Status' => 'ERROR', 'Message' => 'TAX_ID AND DNI CANNOT BE NULL', 'Response' => []]));
                return json_encode(['Parameters' => $enviados_originales, 'Status' => 'ERROR', 'Message' => 'TAX_ID AND DNI CANNOT BE NULL', 'Response' => []]);
            }

            if (strlen($name) < 2 || strlen($surname) < 2) {
                self::Guardar_resultado_api($user_id, $producto, $enviados_originales['dni'], $enviados_originales['gender'], null, json_encode([
                    'Parameters' => $enviados_originales,
                    'Status' => 'ERROR',
                    'Message' => 'THE MINIMUM NUMBER OF CHARACTERS FOR NAME AND SURNAME IS 2',
                    'Response' => []
                ]));
                return json_encode([
                    'Parameters' => $enviados_originales,
                    'Status' => 'ERROR',
                    'Message' => 'THE MINIMUM NUMBER OF CHARACTERS FOR NAME AND SURNAME IS 2',
                    'Response' => []
                ]);
            }

            if (! empty($tax_id)) {
                $taxid_dni = $tax_id;
            } else {
                $taxid_dni = $dni;
            }
            /* 06/12/2023 */
            if ($producto == 109) {
                $renaper = json_decode(self::soloRenaperGBG($dni, $gender));
                if (! $gender) {
                    $renaper_datos = $renaper->Response;
                    $gender = $renaper_datos->gender;
                }

                $datos_renaper = SQLConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $gender), 'select');
                $datos = [];
                if ($datos_renaper) {
                    $datos[0] = $datos_renaper[0];
                }
            } else {
                if (! empty($tax_id) && strlen($tax_id) == 11) {
                    //AFIPController::obtenerPadronForzado($tax_id,true,'AR',false); //-> SE COMENTA PORQUE GENERA UN ERROR (REVISAR)
                    AFIPController::obtenerPadron($tax_id, true, 'AR', false); //-> SE COMENTA PORQUE GENERA UN ERROR (REVISAR)
                } elseif (! empty($taxid_dni) && strlen($taxid_dni) == 8) {
                    $cuitss = self::BuscarCuit($taxid_dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    //echo(var_dump($cuitss)); die();
                    $tax_id = $cuitss[0]->cuit ?? $tax_id;
                }

                //$datos = SQLConnection::backendStoreProcedure('validar_gbg',array($dni,$tax_id),'select');	
                $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $tax_id), 'select');

                if (count($datos) == 0) {
                    $cuitss = self::BuscarCuit_Forzado($dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $cuitss[0]->cuit), 'select');
                }
                /* 26/07/2021 Si no devuelve nada, guardamos con lo que busco, sino Lo hacemos dentro del foreach, para guardar la consulta por el cuit */
                if (sizeOf($datos) < 1) {
                    $resp = self::consumir_servicio($taxid_dni, $producto);
                }
            }

            $result = [];
            //----------------------------------------------------
            $address_validation = 'FALSE';
            $address_complete_validation = 'FALSE';
            $dni_validation = 'FALSE';
            $tax_id_validation = 'FALSE';
            $birthdate_validation = 'FALSE';
            $telephone_validation = 'FALSE';
            $gender_validation = 'FALSE';
            $pcia_validation = 'FALSE';
            //----------------------------------------------------
            foreach ($datos as $key => $persona) {

                /* 06/12/2023 */
                $info = new StdClass();
                if ($producto == 109) {
                    $persona->nombres = self::nombre_formateo($persona->nombres);
                    $persona->apellidos = self::nombre_formateo($persona->apellido);

                    if ($persona->fechaNacimiento) {
                        $fecha_nacimiento = substr($persona->fechaNacimiento, 6, 4) . '-' . substr($persona->fechaNacimiento, 3, 2) . '-' . substr($persona->fechaNacimiento, 0, 2);
                    } else {
                        $fecha_nacimiento = '';
                    }
                    //$fecha_nacimiento = substr($persona->fechaNacimiento,6,4) . '-' . substr($persona->fechaNacimiento,3,2) . '-' . substr($persona->fechaNacimiento,0,2);
                    $persona->fecha_nacimiento = $fecha_nacimiento;
                    //$persona->sexo = $persona->sexo;
                    $persona->cuit = $persona->identificacion;
                    //$persona->dni = $persona->dni;
                    if ($persona->fechaf) {
                        $fecha_fallecimiento = substr($persona->fechaf, 6, 4) . '-' . substr($persona->fechaf, 3, 2) . '-' . substr($persona->fechaf, 0, 2);
                    } else {
                        $fecha_fallecimiento = '';
                    }
                    $persona->fecha_fallecimiento = $fecha_fallecimiento;

                    $info->taxid = $persona->identificacion;
                    $info->tipo = null;
                    $info->nombre = $persona->apellidos ?? '' . ' ' . $persona->nombres ?? '';
                    $calle = $persona->calle ?? '';
                    $numero = $persona->numero ?? '';
                    $piso = $persona->piso ?? '';
                    $departamento = $persona->departamento ?? '';
                    $domicilio = $calle . ' ' . $numero . ' ' . $piso . ' ' . $departamento;
                    $domicilio = str_replace('    ', ' ', $domicilio);
                    $domicilio = str_replace('   ', ' ', $domicilio);
                    $domicilio = trim($domicilio);

                    $info->domicilio = str_replace('  ', ' ', $domicilio);
                    $info->localidad = ($persona->ciudad && $persona->ciudad !== NULL) ? $persona->ciudad : ($persona->municipio ?? '');
                    $info->provicia = $persona->provincia;
                    $info->codpos = $persona->cpostal;
                    $info->telefonos = null;
                    $info->actividades = null;
                    $info->empleadores = null;
                    $info->monotributo = null;
                    $info->autonomo = null;
                    $info->emails = null;
                    $info->es_empleador = null;
                    $info->facturas_apocrifas = null;

                    // $info->domicilio = self::eliminar_acentos($info->domicilio);
                    // $info->provicia = self::eliminar_acentos($info->provicia);
                    // $info->localidad = self::eliminar_acentos($info->localidad);
                    //
                    $info->domicilio = isset($registro_elegido->domicilio) ? self::eliminar_acentos($registro_elegido->domicilio) : '';
                    $info->provicia = isset($registro_elegido->state) ? self::eliminar_acentos($registro_elegido->state) : '';
                    $info->localidad = isset($registro_elegido->city) ? self::eliminar_acentos($registro_elegido->city) : '';

                    // El registro elegido es este que trajo Renaper
                    $registro_elegido = new stdClass();
                    $registro_elegido->street_name = $persona->calle;
                    $registro_elegido->state = $info->provicia;
                    $registro_elegido->city = $info->localidad;
                    $registro_elegido->country_code = $persona->pais ?? 'AR';
                    $registro_elegido->street_number = $persona->numero;
                    $registro_elegido->floor = $persona->piso;
                    $registro_elegido->appartment = $persona->departamento;

                } else {
                    /* 05/12/2023 */
                    $persona->nombres = self::nombre_formateo($persona->nombres);
                    $persona->apellidos = self::nombre_formateo($persona->apellidos);
                    //$info = SQLConnection::backendStoreProcedure('[sp_procesos_cuit_enrichment_api_datos]',array(1,$persona->cuit),'selectOne');
                    //No se usa mas el SP de arriba, ahora se llama al de telefonos y al de domicilios

                    $datos_domicilios = SQLConnection::backendStoreProcedure('api_domicilios', array($persona->cuit));

                    //----- El registro elegido es el de tipo RENAPER, si no hay sera el Fiscal, y sino el Legal
                    $registro_elegido = new stdClass();

                    foreach ($datos_domicilios as $key => $value) {
                        if ($value->nombre_fuente == 'RENAPER') { // Es el mas importante, si lo tiene pisa lo que sea y sale
                            $registro_elegido = $datos_domicilios[$key];
                            break;
                        }
                        if ($value->address_type == 'F') { // El Fiscal puede pisar al Legal
                            $registro_elegido = $datos_domicilios[$key];
                        }
                        if ($value->address_type == 'L' && ! isset($registro_elegido->domicilio)) { // solo toma el Legal si no tengo ninguno de los otros 2
                            $registro_elegido = $datos_domicilios[$key];
                        }
                    }
                    if (empty($registro_elegido)) { // Si esta vacio toma el primero
                        $registro_elegido = (count($datos_domicilios) == 0 || is_null($datos_domicilios)) ? '' : $datos_domicilios[0];
                    }

                    // $info->domicilio = self::eliminar_acentos($registro_elegido->domicilio) ?? '';
                    $info->domicilio = isset($registro_elegido->domicilio) ? self::eliminar_acentos($registro_elegido->domicilio) : '';
                    // $info->provicia = self::eliminar_acentos($registro_elegido->state) ?? '';
                    $info->provicia = isset($registro_elegido->state) ? self::eliminar_acentos($registro_elegido->state) : '';
                    // $info->localidad = self::eliminar_acentos($registro_elegido->city) ?? '';
                    $info->localidad = isset($registro_elegido->city) ? self::eliminar_acentos($registro_elegido->city) : '';

                    $info->codpos = $registro_elegido->zip_code ?? '';

                }


                /* 26/07/2021 Lo hacemos dentro del foreach, para guardar la consulta por el cuit */
                $resp = self::consumir_servicio($persona->cuit, $producto);
                /**/

                $name_validation = self::validacionNombre($enviados, $persona);

                $surname_validation = self::validacionApellido($enviados, $persona);

                $localidad = '';
                $provincia = '';
                $pais = '';
                $address_validation = 'FALSE';


                $full_address = explode(',', $enviados['address']);

                if (sizeOf($full_address) > 0) {

                    //$domicilio = $info->domicilio; //-> SE COMENTA Y AGREGA LA LINEA DE ABAJO PARA SOLUCIONAR PROBLEMA E RESPUESTA DE AFIP
                    $domicilio = html_entity_decode($info->domicilio); //-> ESTO SE AGREGO PARA CONVERTIR CODIGO HTML QUE ENVIA AFIP EN LA RESPUESTA, GENRABA PROBLEMAS EN LA RESPUESTA JSON
                    // Elimino blancos 
                    $domicilio = trim($domicilio);
                    while (strpos($domicilio, '  ') !== false) {
                        $domicilio = str_replace('  ', ' ', $domicilio);
                    }

                    $full_address[0] = trim($full_address[0]);
                    while (strpos($full_address[0], '  ') !== false) {
                        $full_address[0] = str_replace('  ', ' ', $full_address[0]);
                    }

                    // Comparo si el domicilio es exactamente igual
                    if ($full_address[0] == $domicilio && $domicilio != '') {
                        $address_validation = 'TRUE';
                    } else {
                        // Comparamos que no haya palabras o partes distintas 
                        $address_contains = explode(' ', $full_address[0]);
                        foreach ($address_contains as $address_value) {
                            if ($address_value == '') {
                                continue;
                            }

                            if (stripos($domicilio, $address_value) !== false && strlen($address_value) > 1) {
                                if ($address_validation !== 'PARTIALLY TRUE') {
                                    $address_validation = 'TRUE';
                                }
                                $domicilio = str_ireplace($address_value, '', $domicilio);
                            } else {
                                // Tiene algo distinto y era verdadero, pasa a ser parcialmente 
                                if ($address_validation == 'TRUE') {
                                    $address_validation = 'PARTIALLY TRUE';
                                }
                            }
                        }
                        // Si termina de comparar y en domicilio todavia le queda algo, es porque el de la BD tiene mas cosas
                        $domicilio = trim($domicilio);
                        if ($address_validation == 'TRUE' && $domicilio !== '') {
                            $address_validation = 'PARTIALLY TRUE';
                        }
                    }

                    $localidad = (isset($full_address[1])) ? strtoupper(trim($full_address[1])) : '';
                    $provincia = (isset($full_address[2])) ? strtoupper(trim($full_address[2])) : '';
                    $pais = (isset($full_address[3])) ? trim($full_address[3]) : 'ARGENTINA';


                    if (isset($info->provicia)) {
                        if ($info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES' || $info->provicia == 'CIUDAD AUTONOMA BUENOS AIRES' || $info->provicia == 'CIUDAD DE BUENOS AIRES' || $info->provicia == 'CIUDAD BUENOS AIRES' || $info->provicia == 'CABA' || $info->provicia == 'C.A.B.A.' || $info->provicia == 'CAPITAL FEDERAL') {
                            $info->provicia = 'CIUDAD AUTONOMA DE BUENOS AIRES';
                        }
                    }

                    $registro_elegido->state = isset($info->provicia) ? strtoupper($info->provicia) : '';
                    $registro_elegido->city = isset($info->localidad) ? strtoupper($info->localidad) : '';

                    if ($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' || $provincia == 'CIUDAD AUTONOMA BUENOS AIRES' || $provincia == 'CIUDAD DE BUENOS AIRES' || $provincia == 'CIUDAD BUENOS AIRES' || $provincia == 'CABA' || $provincia == 'C.A.B.A.' || $provincia == 'CAPITAL FEDERAL') {
                        $provincia = 'CIUDAD AUTONOMA DE BUENOS AIRES';
                    }

                    /*
                    if( ($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' && $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES' ) || 
                            $info->provicia == $provincia  ){
                        $pcia_validation = 'TRUE';
                    } 
                    */
                    if (isset($info->provicia) && $info->provicia == $provincia) {
                        $pcia_validation = 'TRUE';
                    }

                    if ($address_validation == 'TRUE') {
                        if (($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' && $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES') || ($info->provicia == $provincia && $info->localidad == $localidad) && ($pais = 'ARGENTINA' or $pais == 'AR')) {
                            $address_validation = 'TRUE';
                        } else {
                            $address_validation = 'PARTIALLY TRUE';
                        }
                    }
                }

                //$birthdate_validation = 'FALSE'; //--> esto se lleva mas arriba.
                if ($enviados['birthdate'] == $persona->fecha_nacimiento) {
                    $birthdate_validation = 'TRUE';
                    $integridad += 100;
                }

                //$dni_validation = 'FALSE';  //--> esto se lleva mas arriba.
                if ($enviados['dni'] == $persona->dni) {
                    $dni_validation = 'TRUE';
                    $integridad += 100;
                }

                //$tax_id_validation = 'FALSE'; //--> esto se lleva mas arriba.
                if ($enviados['tax_id'] == $persona->cuit) {
                    $tax_id_validation = 'TRUE';
                }

                //$telephone_validation = 'FALSE'; //--> esto se lleva mas arriba.
                $telephone = SQLConnection::backendStoreProcedure('api_info_telefonos_cuit', array($persona->cuit));

                foreach ($telephone as $key2 => $telefonos) {
                    $value = $telefonos->telefono;
                    if ($value == $enviados['telephone'] && $enviados['telephone'] != '') {
                        $telephone_validation = 'TRUE';
                    } else if (stripos(trim($value), $enviados['telephone']) !== false || stripos('11' . trim($value), $enviados['telephone']) !== false) {
                        $telephone_validation = 'PARTIALLY TRUE';
                    } else {
                        $telephone_validation = 'FALSE';
                    }
                }
                //$gender_validation = 'FALSE';  //--> esto se lleva mas arriba.
                if (strtoupper($enviados['gender']) == strtoupper($persona->sexo)) {
                    $gender_validation = 'TRUE';
                }

                $address_complete_validation = 'FALSE';

                //---- EN ESTE CONDICION CAMBIA EL NOMBRE SI ES CIUDAD AUTONOMA DE BUENOS AIRES, PARA PODER HACER LA COMPARACION CON EL REGISTRO OBTENIDO
                if (
                    strtoupper($enviados['state']) == 'CABA' || strtoupper($enviados['state']) == 'C.A.B.A.' ||
                    strtoupper($enviados['state']) == 'CAPITAL FEDERAL' ||
                    strtoupper($enviados['state']) == 'CIUDAD BUENOS AIRES' ||
                    strtoupper($enviados['state']) == 'CIUDAD AUTONOMA DE BUENOS AIRES' ||
                    strtoupper($enviados['state']) == 'CIUDAD AUTONOMA BUENOS AIRES'
                ) {
                    $enviados['state'] = 'CIUDAD AUTONOMA DE BUENOS AIRES';
                }

                try {
                    //---- DEFENIENDO LAS FUNCION LEVENSHTEIN
                    $levenshtein_nombre_calle = levenshtein(strtoupper((strlen($enviados['street_name']) > 0) ? $enviados['street_name'] : 'null'), $registro_elegido->street_name);
                    $levenshtein_provincia = levenshtein(strtoupper($enviados['state']), $registro_elegido->state);
                    $levenshtein_localidad = levenshtein(strtoupper($enviados['city']), $registro_elegido->city);
                } catch (\Throwable $th) {
                    $levenshtein_nombre_calle = 2;
                    $levenshtein_provincia = 2;
                    $levenshtein_localidad = 2;
                    $objTemporal = new StdClass();
                    $objTemporal->country_code = 'FALSE';
                    $objTemporal->street_number = 'FALSE';
                    $objTemporal->floor = 'FALSE';
                    $objTemporal->appartment = 'FALSE';
                    $registro_elegido = $objTemporal;
                }
                //---- COMIENZO DE LA VALIDACION DEL DOMICILIO COMPLETO
                //----- SI EL PAIS ES VALIDO
                if (strtoupper($enviados['country_code']) == $registro_elegido->country_code) {
                    //---- SI EL NOMBRE DE LA CALLE ES VALIDO
                    if ($levenshtein_nombre_calle == 1 || $levenshtein_nombre_calle == 0) {
                        //----- SI LA PROVINCIA ES VALIDA 
                        if ($levenshtein_provincia == 0 || $levenshtein_provincia == 1) {
                            //---- SI LA LOCALIDAD ES VALIDA
                            if ($levenshtein_localidad == 0 || $levenshtein_localidad == 1 || (strtoupper($enviados['state']) == 'CIUDAD AUTONOMA BUENOS AIRES')) {
                                //---- SI LA ALTURA ES VALIDA
                                if (strtoupper($enviados['street_number']) == $registro_elegido->street_number) {
                                    //---- SI TIENE PISO
                                    if ($registro_elegido->floor != NULL) {
                                        //---- SI EL PISO ES VALIDO
                                        if (strtoupper($enviados['floor']) == $registro_elegido->floor) {
                                            //---- SI TIENE DEPARTAMENTO
                                            if ($registro_elegido->appartment != NULL) {
                                                //---- SI EL DEPARTAMENTO ES VALIDO O NO
                                                if (strtoupper($enviados['apartment']) == $registro_elegido->appartment) {
                                                    $address_complete_validation = 'TRUE';
                                                } else {
                                                    $address_complete_validation = 'PARTIALLY TRUE';
                                                }
                                            } else {
                                                //---- SI NO TIENE DEPARTAMENTO
                                                $address_complete_validation = 'TRUE';
                                            }
                                        } else {
                                            //--- SI EL PISO ES INVALIDO
                                            $address_complete_validation = 'PARTIALLY TRUE';
                                        }
                                    } else {
                                        //--- SI NO TIENE PISO
                                        $address_complete_validation = 'TRUE';
                                    }
                                } else {
                                    //---- SI LA ALTURA ES INVALIDA
                                    $address_complete_validation = 'PARTIALLY TRUE';
                                }
                            } else {
                                //------ SI LA LOCALIDAD ES INVALIDA
                                $address_complete_validation = 'FALSE';
                            }
                        } else {
                            //--- SI LA PROVINCIA ES INVALIDA
                            $address_complete_validation = 'FALSE';
                        }
                    } else {
                        //--- SI LA CALLE NO ES INVALIDA
                        $address_complete_validation = 'FALSE';
                    }
                } else {
                    //--- SI EL PAIS ES INVALIDO
                    $address_complete_validation = 'FALSE';
                }

                //-------------------------------------- FIN DE MODIFICACION 24/09/2021
                //---------MODIFICACION 02/12/2021
                //------- COMIENZO DE VALIDACION INDIVIDUAL DEL DOMICILIO
                //-- VALIDACION DE CODIGO PAIS
                $country_code_validation = 'FALSE';
                $street_name_validation = 'FALSE';
                $state_validation = 'FALSE';
                $city_validation = 'FALSE';
                $street_number_validation = 'FALSE';
                $floor_validation = 'FALSE';
                $apartment_validation = 'FALSE';

                if ($enviados['country_code'] && $enviados['country_code'] !== '') {
                    $country_code_validation = ((strtoupper($enviados['country_code']) == $registro_elegido->country_code) ||
                        (strtoupper($enviados['country_code']) == 'AR' && $registro_elegido->country_code == 'ARGENTINA') ||
                        (strtoupper($enviados['country_code']) == 'ARGENTINA' && $registro_elegido->country_code == 'AR')) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DEL NOMBRE DE CALLE
                if ($enviados['street_name'] && $enviados['street_name'] !== '') {
                    $street_name_validation = ($levenshtein_nombre_calle == 1) ? 'TRUE' : (($levenshtein_nombre_calle == 0) ? 'TRUE' : 'FALSE');
                }

                //-- VALIDACION DEL NOMBRE DE PROVINCIA
                if ($enviados['state'] && $enviados['state'] !== '') {
                    $state_validation = ($levenshtein_provincia == 0 || $levenshtein_provincia == 1) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DE NOMBRE DE LOCALIDAD
                if ($enviados['city'] && $enviados['city'] !== '') {
                    $city_validation = ($levenshtein_localidad == 0 || $levenshtein_localidad == 1) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DE ALTURA DE CALLE
                if ($enviados['street_number'] && $enviados['street_number'] !== '') {
                    $street_number_validation = (strtoupper($enviados['street_number']) == $registro_elegido->street_number) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DE PISO , SI EXISTE
                if ($enviados['floor'] && $enviados['floor'] !== '') {
                    if ($registro_elegido->floor != NULL) {
                        $floor_validation = (strtoupper($enviados['floor']) == $registro_elegido->floor) ? 'TRUE' : 'FALSE';
                    }
                } else {
                    if (($registro_elegido->floor == NULL || $registro_elegido->floor == '') && ($enviados['street_name'] && $enviados['street_name'] !== '')) {
                        $floor_validation = 'TRUE';
                    }
                }

                //-- VALIDACION DE DEPARTAMENTO
                if ($enviados['apartment'] && $enviados['apartment'] !== '') {
                    if ($registro_elegido->appartment != NULL) {
                        $apartment_validation = (strtoupper($enviados['apartment']) == $registro_elegido->appartment) ? 'TRUE' : 'FALSE';
                    }
                } else {
                    if (($registro_elegido->appartment == NULL || $registro_elegido->appartment == '') && ($enviados['street_name'] && $enviados['street_name'] !== '')) {
                        $apartment_validation = 'TRUE';
                    }
                }

                //--------- FIN DE MODIFICACION
                $result[2] = new StdClass();
                $result[2]->dni = $dni_validation;
                $result[2]->tax_id = $tax_id_validation;
                $result[2]->birthdate = $birthdate_validation;
                $result[2]->name = $name_validation;
                $result[2]->surname = $surname_validation;
                $result[2]->address = $address_validation;
                //$result[2]->stateV			= $pcia_validation;
                $result[2]->telephone = $telephone_validation;
                $result[2]->gender = $gender_validation;
                $result[2]->deceased = ($persona->fecha_fallecimiento !== '') ? 'TRUE' : 'FALSE';
                $result[2]->transaction_id = $resp->transaction_id;
                $result[2]->legal_address = html_entity_decode($info->domicilio) ?? 'SIN DATOS'; //-> SE AGREGA PARA CONVERTIR CODIFICACION HTML QUE DEVUELVE AFIP
                $result[2]->state = $info->provicia ?? 'SIN DATOS';
                $result[2]->city = $info->localidad ?? 'SIN DATOS';
                $result[2]->zip = $info->codpos ?? 'SIN DATOS';
                //---- MODIFICACION 24/09/2021
                $result[2]->complete_address = $address_complete_validation;
                $result[2]->country_code = $registro_elegido->country_code ?? 'SIN DATOS';
                $result[2]->street_name = $registro_elegido->street_name ?? 'SIN DATOS';
                $result[2]->street_number = $registro_elegido->street_number ?? 'SIN DATOS';
                $result[2]->floor = $registro_elegido->floor ?? 'SIN DATOS';
                $result[2]->apartment = $registro_elegido->appartment ?? 'SIN DATOS';
                //---- FIN DE MODIFICACION 
                //---- MODIFICACION 02/12/2021


                if ($enviados['state'] && $enviados['state'] !== '') {
                    $pcia_validation = $state_validation;
                }

                $result[2]->individual_address_validations = array(
                    'country_code_validation' => $country_code_validation,
                    'street_name_validation' => $street_name_validation,
                    'state_validation' => $pcia_validation,
                    'city_validation' => $city_validation,
                    'street_number_validation' => $street_number_validation,
                    'floor_validation' => $floor_validation,
                    'apartment_validation' => $apartment_validation

                );
                //--- FIN DE MODIFICACION
                SQLConnection::backendStoreProcedure('guardar_parametros_API_2', array($consulta->id, $resp->transaction_id), 'selectOne');
            }

            if ($name_validation == 'TRUE') {
                $integridad += 100;
            } else if ($name_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($surname_validation == 'TRUE') {
                $integridad += 100;
            } else if ($surname_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($address_validation == 'TRUE') {
                $integridad += 100;
            } else if ($address_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($pcia_validation == 'TRUE') {
                $integridad += 100;
            } else if ($pcia_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }


            //---- MODIFICACION 24/09/2021
            if ($address_complete_validation == 'TRUE') {
                $integridad += 100;
            } else if ($address_complete_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }
            //----

            $resultado_integridad = round(($integridad / 6), 2);

            // idReg
            /*
                     try {
                         $fresco = array('UPDATELOTE',$dni_validation,$tax_id_validation,$birthdate_validation,$name_validation,$surname_validation,$address_validation,
                         $telephone_validation,$gender_validation,$result[2]->deceased ,$resp->transaction_id,$result[2]->legal_address ,$info->provicia,
                         $info->localidad,$info->codpos,$address_complete_validation,$registro_elegido->country_code,$result[2]->street_name ,$result[2]->street_number,
                         $result[2]->floor ,$result[2]->apartment,null,null,$idReg);	
                     } catch (\Throwable $th) {
                         $fresco = array('UPDATELOTE',$dni_validation,$tax_id_validation,$birthdate_validation,$name_validation,$surname_validation,$address_validation,
                         $telephone_validation,$gender_validation,'null' ,$resp->transaction_id,'null' ,'null',
                         'null','null',$address_complete_validation,'null','null' ,'null',
                         'null' ,'null',null,null,$idReg);
                     }
                     SQLConnection::backendStoreProcedure('API_GET_BATCH_LOTE',$fresco,'selectOne');
                     */
            self::Guardar_resultado_api($user_id, $producto, $enviados_originales['dni'], $enviados_originales['gender'], $resp->transaction_id ?? null, json_encode([
                'Parameters' => $enviados_originales,
                'Status' => 'OK',
                'Message' => 'OK',
                'Response' => $result,
                'Integrity' => $resultado_integridad . ' %'
            ]));

            return json_encode([
                'Parameters' => $enviados_originales,
                'Status' => 'OK',
                'Message' => 'OK',
                'Response' => $result,
                'Integrity' => $resultado_integridad . ' %'
            ]);
        } else {
            self::Guardar_resultado_api($user_id, $producto, $enviados_originales['dni'], $enviados_originales['gender'], $resp->transaction_id ?? null, json_encode([
                'Parameters' => $enviados_originales,
                'Status' => 'ERROR',
                'Message' => 'ERROR IN DATA (birthdate OR dni)',
                'Response' => []
            ]));

            return json_encode([
                'Parameters' => $enviados_originales,
                'Status' => 'ERROR',
                'Message' => 'ERROR IN DATA (birthdate OR dni)',
                'Response' => []
            ]);
        }
    }


    public static function validacionGBG_v2()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $name = trim(Request::input('name'));
        $surname = trim(Request::input('surname'));
        $dni = trim(Request::input('dni'));
        $tax_id = trim(Request::input('tax_id'));
        $birthdate = trim(Request::input('birthdate'));
        $address = trim(Request::input('address'));
        $telephone = trim(Request::input('telephone'));
        $gender = trim(Request::input('gender'));
        //--- Modificacion 24/09/2021
        $street_name = trim(Request::input('street_name'));
        $street_number = trim(Request::input('street_number'));
        $floor = trim(Request::input('floor'));
        $apartment = trim(Request::input('apartment'));
        $city = trim(Request::input('city'));
        $state = trim(Request::input('state'));
        $country_code = trim(Request::input('country_code'));
        $idReg = trim(Request::input('idReg'));

        //---

        $enviados_originales['name'] = $name;
        $enviados_originales['surname'] = $surname;
        $enviados_originales['dni'] = $dni;
        $enviados_originales['tax_id'] = $tax_id;
        $enviados_originales['birthdate'] = $birthdate;
        $enviados_originales['address'] = $address;
        $enviados_originales['telephone'] = $telephone;
        $enviados_originales['gender'] = $gender;
        $enviados_originales['street_name'] = $street_name;
        $enviados_originales['street_number'] = $street_number;
        $enviados_originales['floor'] = $floor;
        $enviados_originales['apartment'] = $apartment;
        $enviados_originales['city'] = $city;
        $enviados_originales['state'] = $state;
        $enviados_originales['country_code'] = $country_code;

        $enviados['name'] = self::nombre_formateo($name);
        $enviados['surname'] = self::nombre_formateo($surname);
        $enviados['dni'] = self::normalizador_dni($dni);
        $enviados['tax_id'] = $tax_id;
        $tax_id = (isset($tax_id) && self::tax_id_valido($tax_id)) ? $tax_id : '';
        $enviados['birthdate'] = $birthdate;
        $enviados['address'] = self::acentos_enies($address);
        $enviados['telephone'] = self::acentos_enies($telephone);
        $enviados['gender'] = self::acentos_enies($gender);
        //------Modificacion 24/09/2021
        $enviados['street_name'] = self::acentos_enies($street_name);
        $enviados['street_number'] = self::acentos_enies($street_number);
        $enviados['floor'] = self::acentos_enies($floor);
        $enviados['apartment'] = self::acentos_enies($apartment);
        $enviados['city'] = self::acentos_enies($city);
        $enviados['state'] = self::acentos_enies($state);
        $enviados['country_code'] = self::acentos_enies($country_code);

        //------
        $integridad = 0;
        $name_validation = 'FALSE';
        $surname_validation = 'FALSE';

        $p_url = $_SERVER['REQUEST_URI'];

        $array_txt = [];
        $consulta = SQLConnection::backendStoreProcedure('guardar_parametros_API', array($user_id, $name, $surname, $dni, $tax_id, $birthdate, $address, $telephone, $gender, $p_url), 'selectOne');


        // $producto = $usuario->producto ?? 71;
        $producto = $usuario->producto;


        if (self::fecha_valida($enviados['birthdate']) && self::dni_valido($enviados['dni'])) {

            if (empty($tax_id) && empty($dni)) {
                self::Guardar_resultado_api($user_id, $producto, $enviados_originales['dni'], $enviados_originales['gender'], null, 
                    json_encode([
                        'Parameters' => $enviados_originales, 
                        'Status' => 'ERROR', 
                        'Message' => 'TAX_ID AND DNI CANNOT BE NULL', 
                        'Response' => []
                    ]),
                    'ERROR',
                    Misc::medirTiempoRespuesta()
                );
                return json_encode(['Parameters' => $enviados_originales, 'Status' => 'ERROR', 'Message' => 'TAX_ID AND DNI CANNOT BE NULL', 'Response' => []]);
            }

            if (strlen($name) < 2 || strlen($surname) < 2) {
                self::Guardar_resultado_api($user_id, $producto, $enviados_originales['dni'], $enviados_originales['gender'], null, json_encode([
                        'Parameters' => $enviados_originales,
                        'Status' => 'ERROR',
                        'Message' => 'THE MINIMUM NUMBER OF CHARACTERS FOR NAME AND SURNAME IS 2',
                        'Response' => []
                    ]),
                    'ERROR',
                    Misc::medirTiempoRespuesta()
                );
                return json_encode([
                    'Parameters' => $enviados_originales,
                    'Status' => 'ERROR',
                    'Message' => 'THE MINIMUM NUMBER OF CHARACTERS FOR NAME AND SURNAME IS 2',
                    'Response' => []
                ]);
            }

            if (! empty($tax_id)) {
                $taxid_dni = $tax_id;
            } else {
                $taxid_dni = $dni;
            }
            /* 06/12/2023 */

            if ($producto == 109) {
                $renaper = json_decode(self::soloRenaperGBG($dni, $gender));
                if (! $gender) {
                    $renaper_datos = $renaper->Response;
                    $gender = $renaper_datos->gender;
                }

                $datos_renaper = SQLConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $gender), 'select');
                $datos = [];
                if ($datos_renaper) {
                    $datos[0] = $datos_renaper[0];
                }
            } else {
                if (!empty($tax_id) && strlen($tax_id) == 11) {
                    
                    AFIPController::obtenerPadron($tax_id, true, 'AR', false); 
                    
                    /* if (floatval(Misc::medirTiempoRespuesta()) > 3.5) {
                        return Misc::interrumpirPorTimeout($user_id, $producto, $enviados_originales);
                    } */

                } elseif (!empty($taxid_dni) && strlen($taxid_dni) == 8) {
                    $cuitss = self::BuscarCuit($taxid_dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    $tax_id = $cuitss[0]->cuit ?? $tax_id; 
                    
                    /* if (floatval(Misc::medirTiempoRespuesta()) > 3.5) {
                        return Misc::interrumpirPorTimeout($user_id, $producto, $enviados_originales);
                    } */
                }
                    

                $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $tax_id), 'select');

                if (count($datos) == 0) {
                    $cuitss = self::BuscarCuit_Forzado($dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $cuitss[0]->cuit), 'select');
                }
                /* 26/07/2021 Si no devuelve nada, guardamos con lo que busco, sino Lo hacemos dentro del foreach, para guardar la consulta por el cuit */
                if (sizeOf($datos) < 1) {
                    $resp = self::consumir_servicio($taxid_dni, $producto);
                }
            }

            $result = [];
            //----------------------------------------------------
            $address_validation = 'FALSE';
            $address_complete_validation = 'FALSE';
            $dni_validation = 'FALSE';
            $tax_id_validation = 'FALSE';
            $birthdate_validation = 'FALSE';
            $telephone_validation = 'FALSE';
            $gender_validation = 'FALSE';
            $pcia_validation = 'FALSE';
            //----------------------------------------------------
            foreach ($datos as $key => $persona) {
                /* 06/12/2023 */
                $info = new StdClass();
                if ($producto == 109) {

                    $persona->nombres = self::nombre_formateo($persona->nombres);
                    $persona->apellidos = self::nombre_formateo($persona->apellido);

                    if ($persona->fechaNacimiento) {
                        $fecha_nacimiento = substr($persona->fechaNacimiento, 6, 4) . '-' . substr($persona->fechaNacimiento, 3, 2) . '-' . substr($persona->fechaNacimiento, 0, 2);
                    } else {
                        $fecha_nacimiento = '';
                    }
                    //$fecha_nacimiento = substr($persona->fechaNacimiento,6,4) . '-' . substr($persona->fechaNacimiento,3,2) . '-' . substr($persona->fechaNacimiento,0,2);
                    $persona->fecha_nacimiento = $fecha_nacimiento;
                    //$persona->sexo = $persona->sexo;
                    $persona->cuit = $persona->identificacion;
                    //$persona->dni = $persona->dni;
                    if ($persona->fechaf) {
                        $fecha_fallecimiento = substr($persona->fechaf, 6, 4) . '-' . substr($persona->fechaf, 3, 2) . '-' . substr($persona->fechaf, 0, 2);
                    } else {
                        $fecha_fallecimiento = '';
                    }
                    $persona->fecha_fallecimiento = $fecha_fallecimiento;

                    $info->taxid = $persona->identificacion;
                    $info->tipo = null;
                    $info->nombre = $persona->apellidos ?? '' . ' ' . $persona->nombres ?? '';
                    $calle = $persona->calle ?? '';
                    $numero = $persona->numero ?? '';
                    $piso = $persona->piso ?? '';
                    $departamento = $persona->departamento ?? '';
                    $domicilio = $calle . ' ' . $numero . ' ' . $piso . ' ' . $departamento;
                    $domicilio = str_replace('    ', ' ', $domicilio);
                    $domicilio = str_replace('   ', ' ', $domicilio);
                    $domicilio = trim($domicilio);

                    $info->domicilio = str_replace('  ', ' ', $domicilio);
                    $info->localidad = ($persona->ciudad && $persona->ciudad !== NULL) ? $persona->ciudad : ($persona->municipio ?? '');
                    $info->provicia = $persona->provincia;
                    $info->codpos = $persona->cpostal;
                    $info->telefonos = null;
                    $info->actividades = null;
                    $info->empleadores = null;
                    $info->monotributo = null;
                    $info->autonomo = null;
                    $info->emails = null;
                    $info->es_empleador = null;
                    $info->facturas_apocrifas = null;

                    $info->domicilio = self::eliminar_acentos($info->domicilio);
                    $info->provicia = self::eliminar_acentos($info->provicia);
                    $info->localidad = self::eliminar_acentos($info->localidad);

                    // El registro elegido es este que trajo Renaper
                    $registro_elegido = new stdClass();
                    $registro_elegido->street_name = $persona->calle;
                    $registro_elegido->state = $info->provicia;
                    $registro_elegido->city = $info->localidad;
                    $registro_elegido->country_code = $persona->pais ?? 'AR';
                    $registro_elegido->street_number = $persona->numero;
                    $registro_elegido->floor = $persona->piso;
                    $registro_elegido->appartment = $persona->departamento;

                } else {
                    /* 05/12/2023 */
                    $persona->nombres = self::nombre_formateo($persona->nombres);
                    $persona->apellidos = self::nombre_formateo($persona->apellidos);
                    //$info = SQLConnection::backendStoreProcedure('[sp_procesos_cuit_enrichment_api_datos]',array(1,$persona->cuit),'selectOne');
                    //No se usa mas el SP de arriba, ahora se llama al de telefonos y al de domicilios

                    $datos_domicilios = SQLConnection::backendStoreProcedure('api_domicilios', array($persona->cuit));

                    //----- El registro elegido es el de tipo RENAPER, si no hay sera el Fiscal, y sino el Legal
                    $registro_elegido = new stdClass();

                    foreach ($datos_domicilios as $key => $value) {
                        if ($value->nombre_fuente == 'RENAPER') { // Es el mas importante, si lo tiene pisa lo que sea y sale
                            $registro_elegido = $datos_domicilios[$key];
                            break;
                        }
                        if ($value->address_type == 'F') { // El Fiscal puede pisar al Legal
                            $registro_elegido = $datos_domicilios[$key];
                        }
                        if ($value->address_type == 'L' && ! isset($registro_elegido->domicilio)) { // solo toma el Legal si no tengo ninguno de los otros 2
                            $registro_elegido = $datos_domicilios[$key];
                        }
                    }
                    if (empty($registro_elegido)) { // Si esta vacio toma el primero
                        $registro_elegido = (count($datos_domicilios) == 0 || is_null($datos_domicilios)) ? '' : $datos_domicilios[0];
                    }
                    
                    //$info->domicilio = self::eliminar_acentos($registro_elegido->domicilio) ?? '';
                    $info->domicilio = isset($registro_elegido->domicilio) ? self::eliminar_acentos($registro_elegido->domicilio) : '';
                                        
                    //$info->provicia = self::eliminar_acentos($registro_elegido->state) ?? '';
                    $info->provicia = isset($registro_elegido->state) ? self::eliminar_acentos($registro_elegido->state) : '';

                    //$info->localidad = self::eliminar_acentos($registro_elegido->city) ?? '';
                    $info->localidad = isset($registro_elegido->city) ? self::eliminar_acentos($registro_elegido->city) : '';

                    $info->codpos = $registro_elegido->zip_code ?? '';

                }


                /* 26/07/2021 Lo hacemos dentro del foreach, para guardar la consulta por el cuit */
                $resp = self::consumir_servicio($persona->cuit, $producto);
                /**/
                if (!empty($persona->nombres))
                {
                    $name_validation = self::validacionNombre($enviados, $persona);
                }

                if (!empty($persona->apellidos))
                {
                    $surname_validation = self::validacionApellido($enviados, $persona);
                }

                $localidad = '';
                $provincia = '';
                $pais = '';
                $address_validation = 'FALSE';


                $full_address = explode(',', $enviados['address']);

                if (sizeOf($full_address) > 0) {

                    //$domicilio = $info->domicilio; //-> SE COMENTA Y AGREGA LA LINEA DE ABAJO PARA SOLUCIONAR PROBLEMA E RESPUESTA DE AFIP
                    $domicilio = html_entity_decode($info->domicilio); //-> ESTO SE AGREGO PARA CONVERTIR CODIGO HTML QUE ENVIA AFIP EN LA RESPUESTA, GENRABA PROBLEMAS EN LA RESPUESTA JSON
                    // Elimino blancos 
                    $domicilio = trim($domicilio);
                    while (strpos($domicilio, '  ') !== false) {
                        $domicilio = str_replace('  ', ' ', $domicilio);
                    }

                    $full_address[0] = trim($full_address[0]);
                    while (strpos($full_address[0], '  ') !== false) {
                        $full_address[0] = str_replace('  ', ' ', $full_address[0]);
                    }

                    // Comparo si el domicilio es exactamente igual
                    if ($full_address[0] == $domicilio && $domicilio != '') {
                        $address_validation = 'TRUE';
                    } else {
                        // Comparamos que no haya palabras o partes distintas 
                        $address_contains = explode(' ', $full_address[0]);
                        foreach ($address_contains as $address_value) {
                            if ($address_value == '') {
                                continue;
                            }

                            if (stripos($domicilio, $address_value) !== false && strlen($address_value) > 1) {
                                if ($address_validation !== 'PARTIALLY TRUE') {
                                    $address_validation = 'TRUE';
                                }
                                $domicilio = str_ireplace($address_value, '', $domicilio);
                            } else {
                                // Tiene algo distinto y era verdadero, pasa a ser parcialmente 
                                if ($address_validation == 'TRUE') {
                                    $address_validation = 'PARTIALLY TRUE';
                                }
                            }
                        }
                        // Si termina de comparar y en domicilio todavia le queda algo, es porque el de la BD tiene mas cosas
                        $domicilio = trim($domicilio);
                        if ($address_validation == 'TRUE' && $domicilio !== '') {
                            $address_validation = 'PARTIALLY TRUE';
                        }
                    }

                    $localidad = (isset($full_address[1])) ? strtoupper(trim($full_address[1])) : '';
                    $provincia = (isset($full_address[2])) ? strtoupper(trim($full_address[2])) : '';
                    $pais = (isset($full_address[3])) ? trim($full_address[3]) : 'ARGENTINA';

                    
                    if (isset($info->provicia)) {
                        if ($info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES' || $info->provicia == 'CIUDAD AUTONOMA BUENOS AIRES' || $info->provicia == 'CIUDAD DE BUENOS AIRES' || $info->provicia == 'CIUDAD BUENOS AIRES' || $info->provicia == 'CABA' || $info->provicia == 'C.A.B.A.' || $info->provicia == 'CAPITAL FEDERAL') {
                            $info->provicia = 'CIUDAD AUTONOMA DE BUENOS AIRES';
                        }
                    }
                 
                    //$registro_elegido->state = strtoupper($info->provicia);
                    $registro_elegido->state = isset($info->provicia) ? strtoupper($info->provicia) : '';
                    //$registro_elegido->city = strtoupper($info->localidad);
                    $registro_elegido->city = isset($info->localidad) ? strtoupper($info->localidad) : '';


                    if ($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' || $provincia == 'CIUDAD AUTONOMA BUENOS AIRES' || $provincia == 'CIUDAD DE BUENOS AIRES' || $provincia == 'CIUDAD BUENOS AIRES' || $provincia == 'CABA' || $provincia == 'C.A.B.A.' || $provincia == 'CAPITAL FEDERAL') {
                        $provincia = 'CIUDAD AUTONOMA DE BUENOS AIRES';
                    }

                    /*
                    if( ($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' && $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES' ) || 
                            $info->provicia == $provincia  ){
                        $pcia_validation = 'TRUE';
                    } 
                    */
                    if (isset($info->provicia) && $info->provicia == $provincia) {
                        $pcia_validation = 'TRUE';
                    }

                    if ($address_validation == 'TRUE') {
                        if (($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' && $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES') || ($info->provicia == $provincia && $info->localidad == $localidad) && ($pais = 'ARGENTINA' or $pais == 'AR')) {
                            $address_validation = 'TRUE';
                        } else {
                            $address_validation = 'PARTIALLY TRUE';
                        }
                    }
                }

                //$birthdate_validation = 'FALSE'; //--> esto se lleva mas arriba.
                if ($enviados['birthdate'] == $persona->fecha_nacimiento) {
                    $birthdate_validation = 'TRUE';
                    $integridad += 100;
                }

                //$dni_validation = 'FALSE';  //--> esto se lleva mas arriba.
                if ($enviados['dni'] == $persona->dni) {
                    $dni_validation = 'TRUE';
                    $integridad += 100;
                }

                //$tax_id_validation = 'FALSE'; //--> esto se lleva mas arriba.
                if ($enviados['tax_id'] == $persona->cuit) {
                    $tax_id_validation = 'TRUE';
                }

                //$telephone_validation = 'FALSE'; //--> esto se lleva mas arriba.
                $telephone = SQLConnection::backendStoreProcedure('api_info_telefonos_cuit', array($persona->cuit));

                foreach ($telephone as $key2 => $telefonos) {
                    $value = $telefonos->telefono;
                    if ($value == $enviados['telephone'] && $enviados['telephone'] != '') {
                        $telephone_validation = 'TRUE';
                    } else if (stripos(trim($value), $enviados['telephone']) !== false || stripos('11' . trim($value), $enviados['telephone']) !== false) {
                        $telephone_validation = 'PARTIALLY TRUE';
                    } else {
                        $telephone_validation = 'FALSE';
                    }
                }
                //$gender_validation = 'FALSE';  //--> esto se lleva mas arriba.
                if (!empty($persona->ID_TRAMITE_PRINCIPAL))
                {
                    if (strtoupper($enviados['gender']) == strtoupper($persona->sexo)) {
                        $gender_validation = 'TRUE';
                    }
                }

                $address_complete_validation = 'FALSE';

                //---- EN ESTE CONDICION CAMBIA EL NOMBRE SI ES CIUDAD AUTONOMA DE BUENOS AIRES, PARA PODER HACER LA COMPARACION CON EL REGISTRO OBTENIDO
                if (
                    strtoupper($enviados['state']) == 'CABA' || strtoupper($enviados['state']) == 'C.A.B.A.' ||
                    strtoupper($enviados['state']) == 'CAPITAL FEDERAL' ||
                    strtoupper($enviados['state']) == 'CIUDAD BUENOS AIRES' ||
                    strtoupper($enviados['state']) == 'CIUDAD AUTONOMA DE BUENOS AIRES' ||
                    strtoupper($enviados['state']) == 'CIUDAD AUTONOMA BUENOS AIRES'
                ) {
                    $enviados['state'] = 'CIUDAD AUTONOMA DE BUENOS AIRES';
                }

                try {
                    //---- DEFENIENDO LAS FUNCION LEVENSHTEIN
                    $levenshtein_nombre_calle = levenshtein(strtoupper((strlen($enviados['street_name']) > 0) ? $enviados['street_name'] : 'null'), $registro_elegido->street_name);
                    $levenshtein_provincia = levenshtein(strtoupper($enviados['state']), $registro_elegido->state);
                    $levenshtein_localidad = levenshtein(strtoupper($enviados['city']), $registro_elegido->city);
                } catch (\Throwable $th) {
                    $levenshtein_nombre_calle = 2;
                    $levenshtein_provincia = 2;
                    $levenshtein_localidad = 2;
                    $objTemporal = new StdClass();
                    $objTemporal->country_code = 'FALSE';
                    $objTemporal->street_number = 'FALSE';
                    $objTemporal->floor = 'FALSE';
                    $objTemporal->appartment = 'FALSE';
                    $registro_elegido = $objTemporal;
                }
                //---- COMIENZO DE LA VALIDACION DEL DOMICILIO COMPLETO
                //----- SI EL PAIS ES VALIDO
                if (strtoupper($enviados['country_code']) == $registro_elegido->country_code) {
                    //---- SI EL NOMBRE DE LA CALLE ES VALIDO
                    if ($levenshtein_nombre_calle == 1 || $levenshtein_nombre_calle == 0) {
                        //----- SI LA PROVINCIA ES VALIDA 
                        if ($levenshtein_provincia == 0 || $levenshtein_provincia == 1) {
                            //---- SI LA LOCALIDAD ES VALIDA
                            if ($levenshtein_localidad == 0 || $levenshtein_localidad == 1 || (strtoupper($enviados['state']) == 'CIUDAD AUTONOMA BUENOS AIRES')) {
                                //---- SI LA ALTURA ES VALIDA
                                if (strtoupper($enviados['street_number']) == $registro_elegido->street_number) {
                                    //---- SI TIENE PISO
                                    if ($registro_elegido->floor != NULL) {
                                        //---- SI EL PISO ES VALIDO
                                        if (strtoupper($enviados['floor']) == $registro_elegido->floor) {
                                            //---- SI TIENE DEPARTAMENTO
                                            if ($registro_elegido->appartment != NULL) {
                                                //---- SI EL DEPARTAMENTO ES VALIDO O NO
                                                if (strtoupper($enviados['apartment']) == $registro_elegido->appartment) {
                                                    $address_complete_validation = 'TRUE';
                                                } else {
                                                    $address_complete_validation = 'PARTIALLY TRUE';
                                                }
                                            } else {
                                                //---- SI NO TIENE DEPARTAMENTO
                                                $address_complete_validation = 'TRUE';
                                            }
                                        } else {
                                            //--- SI EL PISO ES INVALIDO
                                            $address_complete_validation = 'PARTIALLY TRUE';
                                        }
                                    } else {
                                        //--- SI NO TIENE PISO
                                        $address_complete_validation = 'TRUE';
                                    }
                                } else {
                                    //---- SI LA ALTURA ES INVALIDA
                                    $address_complete_validation = 'PARTIALLY TRUE';
                                }
                            } else {
                                //------ SI LA LOCALIDAD ES INVALIDA
                                $address_complete_validation = 'FALSE';
                            }
                        } else {
                            //--- SI LA PROVINCIA ES INVALIDA
                            $address_complete_validation = 'FALSE';
                        }
                    } else {
                        //--- SI LA CALLE NO ES INVALIDA
                        $address_complete_validation = 'FALSE';
                    }
                } else {
                    //--- SI EL PAIS ES INVALIDO
                    $address_complete_validation = 'FALSE';
                }

                //-------------------------------------- FIN DE MODIFICACION 24/09/2021
                //---------MODIFICACION 02/12/2021
                //------- COMIENZO DE VALIDACION INDIVIDUAL DEL DOMICILIO
                //-- VALIDACION DE CODIGO PAIS
                $country_code_validation = 'FALSE';
                $street_name_validation = 'FALSE';
                $state_validation = 'FALSE';
                $city_validation = 'FALSE';
                $street_number_validation = 'FALSE';
                $floor_validation = 'FALSE';
                $apartment_validation = 'FALSE';

                if ($enviados['country_code'] && $enviados['country_code'] !== '') {
                    $country_code_validation = ((strtoupper($enviados['country_code']) == $registro_elegido->country_code) ||
                        (strtoupper($enviados['country_code']) == 'AR' && $registro_elegido->country_code == 'ARGENTINA') ||
                        (strtoupper($enviados['country_code']) == 'ARGENTINA' && $registro_elegido->country_code == 'AR')) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DEL NOMBRE DE CALLE
                if ($enviados['street_name'] && $enviados['street_name'] !== '') {
                    $street_name_validation = ($levenshtein_nombre_calle == 1) ? 'TRUE' : (($levenshtein_nombre_calle == 0) ? 'TRUE' : 'FALSE');
                }

                //-- VALIDACION DEL NOMBRE DE PROVINCIA
                if ($enviados['state'] && $enviados['state'] !== '') {
                    $state_validation = ($levenshtein_provincia == 0 || $levenshtein_provincia == 1) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DE NOMBRE DE LOCALIDAD
                if ($enviados['city'] && $enviados['city'] !== '') {
                    $city_validation = ($levenshtein_localidad == 0 || $levenshtein_localidad == 1) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DE ALTURA DE CALLE
                if ($enviados['street_number'] && $enviados['street_number'] !== '') {
                    $street_number_validation = (strtoupper($enviados['street_number']) == $registro_elegido->street_number) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DE PISO , SI EXISTE
                if ($enviados['floor'] && $enviados['floor'] !== '') {
                    if ($registro_elegido->floor != NULL) {
                        $floor_validation = (strtoupper($enviados['floor']) == $registro_elegido->floor) ? 'TRUE' : 'FALSE';
                    }
                } else {
                    if (($registro_elegido->floor == NULL || $registro_elegido->floor == '') && ($enviados['street_name'] && $enviados['street_name'] !== '')) {
                        $floor_validation = 'TRUE';
                    }
                }

                //-- VALIDACION DE DEPARTAMENTO
                if ($enviados['apartment'] && $enviados['apartment'] !== '') {
                    if ($registro_elegido->appartment != NULL) {
                        $apartment_validation = (strtoupper($enviados['apartment']) == $registro_elegido->appartment) ? 'TRUE' : 'FALSE';
                    }
                } else {
                    if (($registro_elegido->appartment == NULL || $registro_elegido->appartment == '') && ($enviados['street_name'] && $enviados['street_name'] !== '')) {
                        $apartment_validation = 'TRUE';
                    }
                }

                //--------- FIN DE MODIFICACION
                $result[2] = new StdClass();
                $result[2]->dni = $dni_validation;
                $result[2]->tax_id = $tax_id_validation;
                $result[2]->birthdate = $birthdate_validation;
                $result[2]->name = $name_validation;
                $result[2]->surname = $surname_validation;
                $result[2]->address = $address_validation;
                //$result[2]->stateV            = $pcia_validation;
                $result[2]->telephone = $telephone_validation;
                $result[2]->gender = $gender_validation;
                $result[2]->deceased = ($persona->fecha_fallecimiento !== '') ? 'TRUE' : 'FALSE';
                $result[2]->transaction_id = $resp->transaction_id;
                $result[2]->legal_address = html_entity_decode($info->domicilio) ?? 'SIN DATOS'; //-> SE AGREGA PARA CONVERTIR CODIFICACION HTML QUE DEVUELVE AFIP
                $result[2]->state = $info->provicia ?? 'SIN DATOS';
                $result[2]->city = $info->localidad ?? 'SIN DATOS';
                $result[2]->zip = $info->codpos ?? 'SIN DATOS';
                //---- MODIFICACION 24/09/2021
                $result[2]->complete_address = $address_complete_validation;
                $result[2]->country_code = $registro_elegido->country_code ?? 'SIN DATOS';
                $result[2]->street_name = $registro_elegido->street_name ?? 'SIN DATOS';
                $result[2]->street_number = $registro_elegido->street_number ?? 'SIN DATOS';
                $result[2]->floor = $registro_elegido->floor ?? 'SIN DATOS';
                $result[2]->apartment = $registro_elegido->appartment ?? 'SIN DATOS';
                //---- FIN DE MODIFICACION 
                //---- MODIFICACION 02/12/2021


                if ($enviados['state'] && $enviados['state'] !== '') {
                    $pcia_validation = $state_validation;
                }

                $result[2]->individual_address_validations = array(
                    'country_code_validation' => $country_code_validation,
                    'street_name_validation' => $street_name_validation,
                    'state_validation' => $pcia_validation,
                    'city_validation' => $city_validation,
                    'street_number_validation' => $street_number_validation,
                    'floor_validation' => $floor_validation,
                    'apartment_validation' => $apartment_validation

                );
                //--- FIN DE MODIFICACION
                SQLConnection::backendStoreProcedure('guardar_parametros_API_2', array($consulta->id, $resp->transaction_id), 'selectOne');
            }

            if ($name_validation == 'TRUE') {
                $integridad += 100;
            } else if ($name_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($surname_validation == 'TRUE') {
                $integridad += 100;
            } else if ($surname_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($address_validation == 'TRUE') {
                $integridad += 100;
            } else if ($address_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($pcia_validation == 'TRUE') {
                $integridad += 100;
            } else if ($pcia_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }


            //---- MODIFICACION 24/09/2021
            if ($address_complete_validation == 'TRUE') {
                $integridad += 100;
            } else if ($address_complete_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }
            //----

            $resultado_integridad = round(($integridad / 6), 2);

            // idReg
            /*
                     try {
                         $fresco = array('UPDATELOTE',$dni_validation,$tax_id_validation,$birthdate_validation,$name_validation,$surname_validation,$address_validation,
                         $telephone_validation,$gender_validation,$result[2]->deceased ,$resp->transaction_id,$result[2]->legal_address ,$info->provicia,
                         $info->localidad,$info->codpos,$address_complete_validation,$registro_elegido->country_code,$result[2]->street_name ,$result[2]->street_number,
                         $result[2]->floor ,$result[2]->apartment,null,null,$idReg);    
                     } catch (\Throwable $th) {
                         $fresco = array('UPDATELOTE',$dni_validation,$tax_id_validation,$birthdate_validation,$name_validation,$surname_validation,$address_validation,
                         $telephone_validation,$gender_validation,'null' ,$resp->transaction_id,'null' ,'null',
                         'null','null',$address_complete_validation,'null','null' ,'null',
                         'null' ,'null',null,null,$idReg);
                     }
                     SQLConnection::backendStoreProcedure('API_GET_BATCH_LOTE',$fresco,'selectOne');
                     */
                self::Guardar_resultado_api($user_id, $producto, $enviados_originales['dni'], $enviados_originales['gender'], $resp->transaction_id ?? null, json_encode([
                        'Parameters' => $enviados_originales,
                        'Status' => 'OK',
                        'Message' => 'OK',
                        'Response' => $result,
                        'Integrity' => $resultado_integridad . ' %'
                    ]),
                    '200',
                    Misc::medirTiempoRespuesta()            
                );

            return json_encode([
                'Parameters' => $enviados_originales,
                'Status' => 'OK',
                'Message' => 'OK',
                'Response' => $result,
                'Integrity' => $resultado_integridad . ' %'
            ]);
        } else {
            self::Guardar_resultado_api($user_id, $producto, $enviados_originales['dni'], $enviados_originales['gender'], $resp->transaction_id ?? null, json_encode([
                'Parameters' => $enviados_originales,
                'Status' => 'ERROR',
                'Message' => 'ERROR IN DATA (birthdate OR dni)',
                'Response' => []
                ]),
                'ERROR',
                Misc::medirTiempoRespuesta()                   
            );

            return json_encode([
                'Parameters' => $enviados_originales,
                'Status' => 'ERROR',
                'Message' => 'ERROR IN DATA (birthdate OR dni)',
                'Response' => []
            ]);
        }
    }

    public static function validacionGBG_v2_prueba()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $name = trim(Request::input('name'));
        $surname = trim(Request::input('surname'));
        $dni = trim(Request::input('dni'));
        $tax_id = trim(Request::input('tax_id'));
        $birthdate = trim(Request::input('birthdate'));
        $address = trim(Request::input('address'));
        $telephone = trim(Request::input('telephone'));
        $gender = trim(Request::input('gender'));
        //--- Modificacion 24/09/2021
        $street_name = trim(Request::input('street_name'));
        $street_number = trim(Request::input('street_number'));
        $floor = trim(Request::input('floor'));
        $apartment = trim(Request::input('apartment'));
        $city = trim(Request::input('city'));
        $state = trim(Request::input('state'));
        $country_code = trim(Request::input('country_code'));
        $idReg = trim(Request::input('idReg'));

        //---
        $enviados['name'] = self::nombre_formateo($name);
        $enviados['surname'] = self::nombre_formateo($surname);
        $enviados['dni'] = self::normalizador_dni($dni);
        $enviados['tax_id'] = $tax_id;
        $tax_id = (isset($tax_id) && self::tax_id_valido($tax_id)) ? $tax_id : '';
        $enviados['birthdate'] = $birthdate;
        $enviados['address'] = mb_strtoupper($address);
        $enviados['telephone'] = $telephone;
        $enviados['gender'] = $gender;
        //------Modificacion 24/09/2021
        $enviados['street_name'] = $street_name;
        $enviados['street_number'] = $street_number;
        $enviados['floor'] = $floor;
        $enviados['apartment'] = $apartment;
        $enviados['city'] = $city;
        $enviados['state'] = $state;
        $enviados['country_code'] = $country_code;
        //------
        $integridad = 0;
        $name_validation = 'FALSE';
        $surname_validation = 'FALSE';

        $p_url = $_SERVER['REQUEST_URI'];
        $consulta = SQLConnection::backendStoreProcedure('guardar_parametros_API', array($user_id, $name, $surname, $dni, $tax_id, $birthdate, $address, $telephone, $gender, $p_url), 'selectOne');

        if (self::fecha_valida($enviados['birthdate']) && self::dni_valido($enviados['dni'])) {

            if (empty($tax_id) && empty($dni)) {
                return json_encode(['Parameters' => $enviados, 'Status' => 'ERROR', 'Message' => 'TAX_ID AND DNI CANNOT BE NULL', 'Response' => []]);
            }

            if (strlen($name) < 2 || strlen($surname) < 2) {
                return json_encode([
                    'Parameters' => $enviados,
                    'Status' => 'ERROR',
                    'Message' => 'THE MINIMUM NUMBER OF CHARACTERS FOR NAME AND SURNAME IS 2',
                    'Response' => []
                ]);
            }

            if (! empty($tax_id)) {
                $taxid_dni = $tax_id;
            } else {
                $taxid_dni = $dni;
            }
            $producto = $usuario->producto ?? 71;
            /* 06/12/2023 */
            if ($producto == 109) {
                $renaper = json_decode(self::soloRenaperGBG($dni, $gender));
                if (! $gender) {
                    $renaper_datos = $renaper->Response;
                    $gender = $renaper_datos->gender;
                }

                $datos_renaper = SQLConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $gender), 'select');
                $datos = [];
                if ($datos_renaper) {
                    $datos[0] = $datos_renaper[0];
                }
            } else {
                if (! empty($tax_id) && strlen($tax_id) == 11) {
                    //AFIPController::obtenerPadronForzado($tax_id,true,'AR',false); //-> SE COMENTA PORQUE GENERA UN ERROR (REVISAR)
                    AFIPController::obtenerPadron($tax_id, true, 'AR', false); //-> SE COMENTA PORQUE GENERA UN ERROR (REVISAR)
                } elseif (! empty($taxid_dni) && strlen($taxid_dni) == 8) {
                    $cuitss = self::BuscarCuit($taxid_dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    //echo(var_dump($cuitss)); die();
                    $tax_id = $cuitss[0]->cuit ?? $tax_id;
                }

                //$datos = SQLConnection::backendStoreProcedure('validar_gbg',array($dni,$tax_id),'select');	
                $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $tax_id), 'select');

                if (count($datos) == 0) {
                    $cuitss = self::BuscarCuit_Forzado($dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $cuitss[0]->cuit), 'select');
                }
                /* 26/07/2021 Si no devuelve nada, guardamos con lo que busco, sino Lo hacemos dentro del foreach, para guardar la consulta por el cuit */
                if (sizeOf($datos) < 1) {
                    $resp = self::consumir_servicio($taxid_dni, $producto);
                }
            }

            $result = [];
            //----------------------------------------------------
            $address_validation = 'FALSE';
            $address_complete_validation = 'FALSE';
            $dni_validation = 'FALSE';
            $tax_id_validation = 'FALSE';
            $birthdate_validation = 'FALSE';
            $telephone_validation = 'FALSE';
            $gender_validation = 'FALSE';
            $pcia_validation = 'FALSE';
            //----------------------------------------------------


            foreach ($datos as $key => $persona) {


                /* 06/12/2023 */
                $info = new StdClass();
                if ($producto == 109) {
                    $persona->nombres = self::nombre_formateo($persona->nombres);
                    $persona->apellidos = self::nombre_formateo($persona->apellido);
                    $fecha_nacimiento = substr($persona->fechaNacimiento, 6, 4) . '-' . substr($persona->fechaNacimiento, 3, 2) . '-' . substr($persona->fechaNacimiento, 0, 2);
                    $persona->fecha_nacimiento = $fecha_nacimiento;
                    //$persona->sexo = $persona->sexo;
                    $persona->cuit = $persona->identificacion;
                    //$persona->dni = $persona->dni;
                    $fecha_fallecimiento = substr($persona->fechaf, 6, 4) . '-' . substr($persona->fechaf, 3, 2) . '-' . substr($persona->fechaf, 0, 2);
                    $persona->fecha_fallecimiento = $fecha_fallecimiento;

                    $info->taxid = $persona->identificacion;
                    $info->tipo = null;
                    $info->nombre = $persona->apellidos ?? '' . ' ' . $persona->nombres ?? '';
                    $calle = $persona->calle ?? '';
                    $numero = $persona->numero ?? '';
                    $piso = $persona->piso ?? '';
                    $departamento = $persona->departamento ?? '';
                    $domicilio = $calle . ' ' . $numero . ' ' . $piso . ' ' . $departamento;
                    $domicilio = str_replace('    ', ' ', $domicilio);
                    $domicilio = str_replace('   ', ' ', $domicilio);
                    $info->domicilio = str_replace('  ', ' ', $domicilio);
                    $info->localidad = $persona->ciudad ?? $persona->municipio;
                    $info->provicia = $persona->provincia;
                    $info->codpos = $persona->cpostal;
                    $info->telefonos = null;
                    $info->actividades = null;
                    $info->empleadores = null;
                    $info->monotributo = null;
                    $info->autonomo = null;
                    $info->emails = null;
                    $info->es_empleador = null;
                    $info->facturas_apocrifas = null;

                } else {
                    /* 05/12/2023 */
                    $persona->nombres = self::nombre_formateo($persona->nombres);
                    $persona->apellidos = self::nombre_formateo($persona->apellidos);
                    $info = SQLConnection::backendStoreProcedure('[sp_procesos_cuit_enrichment_api_datos]', array(1, $persona->cuit), 'selectOne');
                }

                /* 26/07/2021 Lo hacemos dentro del foreach, para guardar la consulta por el cuit */
                $resp = self::consumir_servicio($persona->cuit, $producto);
                /**/

                $name_validation = self::validacionNombre($enviados, $persona);

                $surname_validation = self::validacionApellido($enviados, $persona);

                $localidad = '';
                $provincia = '';
                $pais = '';
                $address_validation = 'FALSE';

                $full_address = explode(',', $enviados['address']);

                if (sizeOf($full_address) > 0) {

                    //$domicilio = $info->domicilio; //-> SE COMENTA Y AGREGA LA LINEA DE ABAJO PARA SOLUCIONAR PROBLEMA E RESPUESTA DE AFIP
                    $domicilio = html_entity_decode($info->domicilio); //-> ESTO SE AGREGO PARA CONVERTIR CODIGO HTML QUE ENVIA AFIP EN LA RESPUESTA, GENRABA PROBLEMAS EN LA RESPUESTA JSON
                    // Elimino blancos 
                    $domicilio = trim($domicilio);
                    while (strpos($domicilio, '  ') !== false) {
                        $domicilio = str_replace('  ', ' ', $domicilio);
                    }

                    $full_address[0] = trim($full_address[0]);
                    while (strpos($full_address[0], '  ') !== false) {
                        $full_address[0] = str_replace('  ', ' ', $full_address[0]);
                    }

                    // Comparo si el domicilio es exactamente igual
                    if ($full_address[0] == $domicilio && $domicilio != '') {
                        $address_validation = 'TRUE';
                    } else {
                        // Comparamos que no haya palabras o partes distintas 
                        $address_contains = explode(' ', $full_address[0]);
                        foreach ($address_contains as $address_value) {
                            if ($address_value == '') {
                                continue;
                            }

                            if (stripos($domicilio, $address_value) !== false && strlen($address_value) > 1) {
                                if ($address_validation !== 'PARTIALLY TRUE') {
                                    $address_validation = 'TRUE';
                                }
                                $domicilio = str_ireplace($address_value, '', $domicilio);
                            } else {
                                // Tiene algo distinto y era verdadero, pasa a ser parcialmente 
                                if ($address_validation == 'TRUE') {
                                    $address_validation = 'PARTIALLY TRUE';
                                }
                            }
                        }
                        // Si termina de comparar y en domicilio todavia le queda algo, es porque el de la BD tiene mas cosas
                        $domicilio = trim($domicilio);
                        if ($address_validation == 'TRUE' && $domicilio !== '') {
                            $address_validation = 'PARTIALLY TRUE';
                        }
                    }

                    $localidad = (isset($full_address[1])) ? strtoupper(trim($full_address[1])) : '';
                    $provincia = (isset($full_address[2])) ? strtoupper(trim($full_address[2])) : '';
                    $pais = (isset($full_address[3])) ? trim($full_address[3]) : 'ARGENTINA';

                    if ($info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES' || $info->provicia == 'CIUDAD AUTONOMA BUENOS AIRES' || $info->provicia == 'CIUDAD DE BUENOS AIRES' || $info->provicia == 'CIUDAD BUENOS AIRES') {
                        $info->provicia = 'CIUDAD AUTONOMA DE BUENOS AIRES';
                    }

                    if (($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' && $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES') || $info->provicia == $provincia) {
                        $pcia_validation = 'TRUE';
                    }

                    if ($address_validation == 'TRUE') {
                        if (($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' && $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES') || ($info->provicia == $provincia && $info->localidad == $localidad) && $pais = 'ARGENTINA') {
                            $address_validation = 'TRUE';
                        } else {
                            $address_validation = 'PARTIALLY TRUE';
                        }
                    }
                }

                //$birthdate_validation = 'FALSE'; //--> esto se lleva mas arriba.
                if ($enviados['birthdate'] == $persona->fecha_nacimiento) {
                    $birthdate_validation = 'TRUE';
                    $integridad += 100;
                }

                //$dni_validation = 'FALSE';  //--> esto se lleva mas arriba.
                if ($enviados['dni'] == $persona->dni) {
                    $dni_validation = 'TRUE';
                    $integridad += 100;
                }

                //$tax_id_validation = 'FALSE'; //--> esto se lleva mas arriba.
                if ($enviados['tax_id'] == $persona->cuit) {
                    $tax_id_validation = 'TRUE';
                }

                //$telephone_validation = 'FALSE'; //--> esto se lleva mas arriba.
                $telephone_contains = explode(' /', $info->telefonos);
                foreach ($telephone_contains as $key2 => $value) {
                    if ($value == $enviados['telephone'] && $enviados['telephone'] != '') {
                        $telephone_validation = 'TRUE';
                    } else if (stripos(trim($value), $enviados['telephone']) !== false || stripos('11' . trim($value), $enviados['telephone']) !== false) {
                        $telephone_validation = 'PARTIALLY TRUE';
                    } else {
                        $telephone_validation = 'FALSE';
                    }
                }
                //$gender_validation = 'FALSE';  //--> esto se lleva mas arriba.
                if (strtoupper($enviados['gender']) == strtoupper($persona->sexo)) {
                    $gender_validation = 'TRUE';
                }

                //------------ MODIFICACION 24/09/2021
                $address_complete_validation = 'FALSE';
                //---- EL STORE QUE DEVUELVE EL LOS DATOS DEL DOMICILIO COMPLETO
                $datos_domicilios = SQLConnection::backendStoreProcedure('api_domicilios', array($persona->cuit));
                //-----
                $registro_elegido = [];
                //----- EL REGISTRO ELEGIDO ES DEL TIPO L
                foreach ($datos_domicilios as $key => $value) {
                    if ($value->address_type == 'L') {
                        $registro_elegido = $datos_domicilios[$key];
                        break;
                    }
                }
                //---------- SI NO HAY UN DOMICILIO TIPO L , AGARRA EL PRIMER REGISTRO
                if (empty($registro_elegido)) {
                    $registro_elegido = (count($datos_domicilios) == 0 || is_null($datos_domicilios)) ? '' : $datos_domicilios[0];
                }
                //---- EN ESTE CONDICION CAMBIA EL NOMBRE SI ES CIUDAD AUTONOMA DE BUENOS AIRES, PARA PODER HACER LA COMPARACION CON EL REGISTRO OBTENIDO
                if (strtoupper($enviados['state']) == 'CABA' || strtoupper($enviados['state']) == 'CIUDAD AUTONOMA DE BUENOS AIRES' || strtoupper($enviados['state']) == 'CAPITAL FEDERAL') {
                    $enviados['state'] = 'CIUDAD AUTONOMA BUENOS AIRES';
                }
                try {
                    //---- DEFENIENDO LAS FUNCION LEVENSHTEIN
                    $levenshtein_nombre_calle = levenshtein(strtoupper((strlen($enviados['street_name']) > 0) ? $enviados['street_name'] : 'null'), $registro_elegido->street_name);
                    $levenshtein_provincia = levenshtein(strtoupper($enviados['state']), $registro_elegido->state);
                    $levenshtein_localidad = levenshtein(strtoupper($enviados['city']), $registro_elegido->city);
                } catch (\Throwable $th) {
                    $levenshtein_nombre_calle = 2;
                    $levenshtein_provincia = 2;
                    $levenshtein_localidad = 2;
                    $objTemporal = new StdClass();
                    $objTemporal->country_code = 'FALSE';
                    $objTemporal->street_number = 'FALSE';
                    $objTemporal->floor = 'FALSE';
                    $objTemporal->appartment = 'FALSE';
                    $registro_elegido = $objTemporal;
                }
                //---- COMIENZO DE LA VALIDACION DEL DOMICILIO COMPLETO
                //----- SI EL PAIS ES VALIDO
                if (strtoupper($enviados['country_code']) == $registro_elegido->country_code) {
                    //---- SI EL NOMBRE DE LA CALLE ES VALIDO
                    if ($levenshtein_nombre_calle == 1 || $levenshtein_nombre_calle == 0) {
                        //----- SI LA PROVINCIA ES VALIDA 
                        if ($levenshtein_provincia == 0 || $levenshtein_provincia == 1) {
                            //---- SI LA LOCALIDAD ES VALIDA
                            if ($levenshtein_localidad == 0 || $levenshtein_localidad == 1 || (strtoupper($enviados['state']) == 'CIUDAD AUTONOMA BUENOS AIRES')) {
                                //---- SI LA ALTURA ES VALIDA
                                if (strtoupper($enviados['street_number']) == $registro_elegido->street_number) {
                                    //---- SI TIENE PISO
                                    if ($registro_elegido->floor != NULL) {
                                        //---- SI EL PISO ES VALIDO
                                        if (strtoupper($enviados['floor']) == $registro_elegido->floor) {
                                            //---- SI TIENE DEPARTAMENTO
                                            if ($registro_elegido->appartment != NULL) {
                                                //---- SI EL DEPARTAMENTO ES VALIDO O NO
                                                if (strtoupper($enviados['apartment']) == $registro_elegido->appartment) {
                                                    $address_complete_validation = 'TRUE';
                                                } else {
                                                    $address_complete_validation = 'PARTIALLY TRUE';
                                                }
                                            } else {
                                                //---- SI NO TIENE DEPARTAMENTO
                                                $address_complete_validation = 'TRUE';
                                            }
                                        } else {
                                            //--- SI EL PISO ES INVALIDO
                                            $address_complete_validation = 'PARTIALLY TRUE';
                                        }
                                    } else {
                                        //--- SI NO TIENE PISO
                                        $address_complete_validation = 'TRUE';
                                    }
                                } else {
                                    //---- SI LA ALTURA ES INVALIDA
                                    $address_complete_validation = 'PARTIALLY TRUE';
                                }
                            } else {
                                //------ SI LA LOCALIDAD ES INVALIDA
                                $address_complete_validation = 'FALSE';
                            }
                        } else {
                            //--- SI LA PROVINCIA ES INVALIDA
                            $address_complete_validation = 'FALSE';
                        }
                    } else {
                        //--- SI LA CALLE NO ES INVALIDA
                        $address_complete_validation = 'FALSE';
                    }
                } else {
                    //--- SI EL PAIS ES INVALIDO
                    $address_complete_validation = 'FALSE';
                }

                //-------------------------------------- FIN DE MODIFICACION 24/09/2021
                //---------MODIFICACION 02/12/2021
                //------- COMIENZO DE VALIDACION INDIVIDUAL DEL DOMICILIO
                //-- VALIDACION DE CODIGO PAIS
                $country_code_validation = (strtoupper($enviados['country_code']) == $registro_elegido->country_code) ? 'TRUE' : 'FALSE';
                //-- VALIDACION DEL NOMBRE DE CALLE
                $street_name_validation = ($levenshtein_nombre_calle == 1) ? 'TRUE' : (($levenshtein_nombre_calle == 0) ? 'TRUE' : 'FALSE');
                //-- VALIDACION DEL NOMBRE DE PROVINCIA
                $state_validation = ($levenshtein_provincia == 0 || $levenshtein_provincia == 1) ? 'TRUE' : 'FALSE';
                //-- VALIDACION DE NOMBRE DE LOCALIDAD
                $city_validation = ($levenshtein_localidad == 0 || $levenshtein_localidad == 1 || (strtoupper($enviados['state']) == 'CIUDAD AUTONOMA BUENOS AIRES')) ? 'TRUE' : 'FALSE';
                //-- VALIDACION DE ALTURA DE CALLE
                $street_number_validation = (strtoupper($enviados['street_number']) == $registro_elegido->street_number) ? 'TRUE' : 'FALSE';
                //-- VALIDACION DE PISO , SI EXISTE
                if ($registro_elegido->floor != NULL) {
                    $floor_validation = (strtoupper($enviados['floor']) == $registro_elegido->floor) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DE DEPARTAMENTO
                if ($registro_elegido->appartment != NULL) {
                    $apartment_validation = (strtoupper($enviados['apartment']) == $registro_elegido->appartment) ? 'TRUE' : 'FALSE';
                }
                //--------- FIN DE MODIFICACION

                $result[2] = new StdClass();
                $result[2]->dni = $dni_validation;
                $result[2]->tax_id = $tax_id_validation;
                $result[2]->birthdate = $birthdate_validation;
                $result[2]->name = $name_validation;
                $result[2]->surname = $surname_validation;
                $result[2]->address = $address_validation;
                //$result[2]->stateV			= $pcia_validation;
                $result[2]->telephone = $telephone_validation;
                $result[2]->gender = $gender_validation;
                $result[2]->deceased = ($persona->fecha_fallecimiento != '') ? 'TRUE' : 'FALSE';
                $result[2]->transaction_id = $resp->transaction_id;
                $result[2]->legal_address = html_entity_decode($info->domicilio); //-> SE AGREGA PARA CONVERTIR CODIFICACION HTML QUE DEVUELVE AFIP
                $result[2]->state = $info->provicia;
                $result[2]->city = $info->localidad;
                $result[2]->zip = $info->codpos;
                //---- MODIFICACION 24/09/2021
                $result[2]->complete_address = $address_complete_validation;
                $result[2]->country_code = $registro_elegido->country_code;
                $result[2]->street_name = $registro_elegido->street_name ?? 'SIN DATOS';
                $result[2]->street_number = $registro_elegido->street_number ?? 'SIN DATOS';
                $result[2]->floor = $registro_elegido->floor ?? 'SIN DATOS';
                $result[2]->apartment = $registro_elegido->appartment ?? 'SIN DATOS';
                //---- FIN DE MODIFICACION 
                //---- MODIFICACION 02/12/2021

                $result[2]->individual_address_validations = array(
                    'country_code_validation' => $country_code_validation,
                    'street_name_validation' => $street_name_validation,
                    'state_validation' => $pcia_validation,
                    'city_validation' => $city_validation,
                    'street_number_validation' => $street_number_validation,
                    'floor_validation' => isset($floor_validation) ? $floor_validation : 'SIN DATOS',
                    'apartment_validation' => isset($apartment_validation) ? $apartment_validation : 'SIN DATOS'

                );
                //--- FIN DE MODIFICACION
                SQLConnection::backendStoreProcedure('guardar_parametros_API_2', array($consulta->id, $resp->transaction_id), 'selectOne');
            }

            if ($name_validation == 'TRUE') {
                $integridad += 100;
            } else if ($name_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($surname_validation == 'TRUE') {
                $integridad += 100;
            } else if ($surname_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($address_validation == 'TRUE') {
                $integridad += 100;
            } else if ($address_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($pcia_validation == 'TRUE') {
                $integridad += 100;
            } else if ($pcia_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }


            //---- MODIFICACION 24/09/2021
            if ($address_complete_validation == 'TRUE') {
                $integridad += 100;
            } else if ($address_complete_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }
            //----

            $resultado_integridad = round(($integridad / 6), 2);

            // idReg
            /*
                     try {
                         $fresco = array('UPDATELOTE',$dni_validation,$tax_id_validation,$birthdate_validation,$name_validation,$surname_validation,$address_validation,
                         $telephone_validation,$gender_validation,$result[2]->deceased ,$resp->transaction_id,$result[2]->legal_address ,$info->provicia,
                         $info->localidad,$info->codpos,$address_complete_validation,$registro_elegido->country_code,$result[2]->street_name ,$result[2]->street_number,
                         $result[2]->floor ,$result[2]->apartment,null,null,$idReg);	
                     } catch (\Throwable $th) {
                         $fresco = array('UPDATELOTE',$dni_validation,$tax_id_validation,$birthdate_validation,$name_validation,$surname_validation,$address_validation,
                         $telephone_validation,$gender_validation,'null' ,$resp->transaction_id,'null' ,'null',
                         'null','null',$address_complete_validation,'null','null' ,'null',
                         'null' ,'null',null,null,$idReg);
                     }
                     SQLConnection::backendStoreProcedure('API_GET_BATCH_LOTE',$fresco,'selectOne');
                     */

            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'OK',
                'Message' => 'OK',
                'Response' => $result,
                'Integrity' => $resultado_integridad . ' %'
            ]);
        } else {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'ERROR IN DATA (birthdate OR dni)',
                'Response' => []
            ]);
        }
    }

    public static function validacionGBG_v2_marita()
    {

        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $name = trim(Request::input('name'));
        $surname = trim(Request::input('surname'));
        $dni = trim(Request::input('dni'));
        $tax_id = trim(Request::input('tax_id'));
        $birthdate = trim(Request::input('birthdate'));
        $address = trim(Request::input('address'));
        $telephone = trim(Request::input('telephone'));
        $gender = trim(Request::input('gender'));
        //--- Modificacion 24/09/2021
        $street_name = trim(Request::input('street_name'));
        $street_number = trim(Request::input('street_number'));
        $floor = trim(Request::input('floor'));
        $apartment = trim(Request::input('apartment'));
        $city = trim(Request::input('city'));
        $state = trim(Request::input('state'));
        $country_code = trim(Request::input('country_code'));
        $idReg = trim(Request::input('idReg'));

        //---
        $enviados['name'] = self::nombre_formateo($name);
        $enviados['surname'] = self::nombre_formateo($surname);
        $enviados['dni'] = self::normalizador_dni($dni);
        $enviados['tax_id'] = $tax_id;
        $tax_id = (isset($tax_id) && self::tax_id_valido($tax_id)) ? $tax_id : '';
        $enviados['birthdate'] = $birthdate;
        $enviados['address'] = mb_strtoupper($address);
        $enviados['telephone'] = $telephone;
        $enviados['gender'] = $gender;
        //------Modificacion 24/09/2021
        $enviados['street_name'] = $street_name;
        $enviados['street_number'] = $street_number;
        $enviados['floor'] = $floor;
        $enviados['apartment'] = $apartment;
        $enviados['city'] = $city;
        $enviados['state'] = $state;
        $enviados['country_code'] = $country_code;
        //------
        $integridad = 0;
        $name_validation = 'FALSE';
        $surname_validation = 'FALSE';

        $p_url = $_SERVER['REQUEST_URI'];
        $consulta = SQLConnection::backendStoreProcedure('guardar_parametros_API', array($user_id, $name, $surname, $dni, $tax_id, $birthdate, $address, $telephone, $gender, $p_url), 'selectOne');

        if (self::fecha_valida($enviados['birthdate']) && self::dni_valido($enviados['dni'])) {

            if (empty($tax_id) && empty($dni)) {
                return json_encode(['Parameters' => $enviados, 'Status' => 'ERROR', 'Message' => 'TAX_ID AND DNI CANNOT BE NULL', 'Response' => []]);
            }

            if (strlen($name) < 2 || strlen($surname) < 2) {
                return json_encode([
                    'Parameters' => $enviados,
                    'Status' => 'ERROR',
                    'Message' => 'THE MINIMUM NUMBER OF CHARACTERS FOR NAME AND SURNAME IS 2',
                    'Response' => []
                ]);
            }

            if (! empty($tax_id)) {
                $taxid_dni = $tax_id;
            } else {
                $taxid_dni = $dni;
            }
            $producto = $usuario->producto ?? 71;
            /* 06/12/2023 */
            if ($producto == 109) {
                $renaper = json_decode(self::soloRenaperGBG($dni, $gender));
                if (! $gender) {
                    $renaper_datos = $renaper->Response;
                    $gender = $renaper_datos->gender;
                }

                $datos_renaper = SQLConnection::backendStoreProcedure('RENAPER_BUSCAR', array($dni, $gender), 'select');
                $datos = [];
                if ($datos_renaper) {
                    $datos[0] = $datos_renaper[0];
                }
            } else {
                if (! empty($tax_id) && strlen($tax_id) == 11) {
                    //AFIPController::obtenerPadronForzado($tax_id,true,'AR',false); //-> SE COMENTA PORQUE GENERA UN ERROR (REVISAR)
                    AFIPController::obtenerPadron($tax_id, true, 'AR', false); //-> SE COMENTA PORQUE GENERA UN ERROR (REVISAR)
                } elseif (! empty($taxid_dni) && strlen($taxid_dni) == 8) {
                    $cuitss = self::BuscarCuit($taxid_dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    //echo(var_dump($cuitss)); die();
                    $tax_id = $cuitss[0]->cuit ?? $tax_id;
                }

                //$datos = SQLConnection::backendStoreProcedure('validar_gbg',array($dni,$tax_id),'select');	
                $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $tax_id), 'select');

                if (count($datos) == 0) {
                    $cuitss = self::BuscarCuit_Forzado($dni, 'S');  /* Busca CUITs para el dni solicitado, y los pasa por AFIP */
                    $datos = SQLConnection::backendStoreProcedure('validar_gbg_nombre', array($dni, $cuitss[0]->cuit), 'select');
                }
                /* 26/07/2021 Si no devuelve nada, guardamos con lo que busco, sino Lo hacemos dentro del foreach, para guardar la consulta por el cuit */
                if (sizeOf($datos) < 1) {
                    $resp = self::consumir_servicio($taxid_dni, $producto);
                }
            }

            $result = [];
            //----------------------------------------------------
            $address_validation = 'FALSE';
            $address_complete_validation = 'FALSE';
            $dni_validation = 'FALSE';
            $tax_id_validation = 'FALSE';
            $birthdate_validation = 'FALSE';
            $telephone_validation = 'FALSE';
            $gender_validation = 'FALSE';
            $pcia_validation = 'FALSE';
            //----------------------------------------------------


            foreach ($datos as $key => $persona) {
                /* 06/12/2023 */
                $info = new StdClass();
                if ($producto == 109) {
                    $persona->nombres = self::nombre_formateo($persona->nombres);
                    $persona->apellidos = self::nombre_formateo($persona->apellido);
                    $fecha_nacimiento = substr($persona->fechaNacimiento, 6, 4) . '-' . substr($persona->fechaNacimiento, 3, 2) . '-' . substr($persona->fechaNacimiento, 0, 2);
                    $persona->fecha_nacimiento = $fecha_nacimiento;
                    //$persona->sexo = $persona->sexo;
                    $persona->cuit = $persona->identificacion;
                    //$persona->dni = $persona->dni;
                    $fecha_fallecimiento = substr($persona->fechaf, 6, 4) . '-' . substr($persona->fechaf, 3, 2) . '-' . substr($persona->fechaf, 0, 2);
                    $persona->fecha_fallecimiento = $fecha_fallecimiento;

                    $info->taxid = $persona->identificacion;
                    $info->tipo = null;
                    $info->nombre = $persona->apellidos ?? '' . ' ' . $persona->nombres ?? '';
                    $calle = $persona->calle ?? '';
                    $numero = $persona->numero ?? '';
                    $piso = $persona->piso ?? '';
                    $departamento = $persona->departamento ?? '';
                    $domicilio = $calle . ' ' . $numero . ' ' . $piso . ' ' . $departamento;
                    $domicilio = str_replace('    ', ' ', $domicilio);
                    $domicilio = str_replace('   ', ' ', $domicilio);
                    $domicilio = trim($domicilio);

                    $info->domicilio = str_replace('  ', ' ', $domicilio);
                    $info->localidad = ($persona->ciudad && $persona->ciudad !== NULL) ? $persona->ciudad : ($persona->municipio ?? '');
                    $info->provicia = $persona->provincia;
                    $info->codpos = $persona->cpostal;
                    $info->telefonos = null;
                    $info->actividades = null;
                    $info->empleadores = null;
                    $info->monotributo = null;
                    $info->autonomo = null;
                    $info->emails = null;
                    $info->es_empleador = null;
                    $info->facturas_apocrifas = null;


                    $info->domicilio = self::eliminar_acentos($info->domicilio);
                    $info->provicia = self::eliminar_acentos($info->provicia);
                    $info->localidad = self::eliminar_acentos($info->localidad);

                } else {
                    /* 05/12/2023 */
                    $persona->nombres = self::nombre_formateo($persona->nombres);
                    $persona->apellidos = self::nombre_formateo($persona->apellidos);
                    $info = SQLConnection::backendStoreProcedure('[sp_procesos_cuit_enrichment_api_datos]', array(1, $persona->cuit), 'selectOne');

                    $datos_domicilios = SQLConnection::backendStoreProcedure('api_domicilios', array($persona->cuit));
                    //-----
                    $registro_elegido = [];
                    //----- EL REGISTRO ELEGIDO ES DEL TIPO L
                    foreach ($datos_domicilios as $key => $value) {
                        if ($value->nombre_fuente == 'RENAPER') { // Es el mas importante, si lo tiene pisa lo que sea y sale
                            $registro_elegido = [];
                            $registro_elegido = $datos_domicilios[$key];
                            break;
                        }
                        if ($value->address_type == 'F') { // El Fiscar puede pisar al Legal
                            $registro_elegido = [];
                            $registro_elegido = $datos_domicilios[$key];
                        }
                        if ($value->address_type == 'L' && empty($registro_elegido)) { // solo toma el Legal si no tengo ninguno de los otros 2
                            $registro_elegido = [];
                            $registro_elegido = $datos_domicilios[$key];
                        }
                    }
                    if (empty($registro_elegido)) { // Si esta vacio toma el primero
                        $registro_elegido = (count($datos_domicilios) == 0 || is_null($datos_domicilios)) ? '' : $datos_domicilios[0];
                    }
                    $info->domicilio = self::eliminar_acentos($info->domicilio);
                    $info->provicia = self::eliminar_acentos($info->provicia);
                    $info->localidad = self::eliminar_acentos($info->localidad);
                }

                /* 26/07/2021 Lo hacemos dentro del foreach, para guardar la consulta por el cuit */
                $resp = self::consumir_servicio($persona->cuit, $producto);
                /**/

                $name_validation = self::validacionNombre($enviados, $persona);

                $surname_validation = self::validacionApellido($enviados, $persona);

                $localidad = '';
                $provincia = '';
                $pais = '';
                $address_validation = 'FALSE';


                $full_address = explode(',', $enviados['address']);

                if (sizeOf($full_address) > 0) {

                    //$domicilio = $info->domicilio; //-> SE COMENTA Y AGREGA LA LINEA DE ABAJO PARA SOLUCIONAR PROBLEMA E RESPUESTA DE AFIP
                    $domicilio = html_entity_decode($info->domicilio); //-> ESTO SE AGREGO PARA CONVERTIR CODIGO HTML QUE ENVIA AFIP EN LA RESPUESTA, GENRABA PROBLEMAS EN LA RESPUESTA JSON
                    // Elimino blancos 
                    $domicilio = trim($domicilio);
                    while (strpos($domicilio, '  ') !== false) {
                        $domicilio = str_replace('  ', ' ', $domicilio);
                    }

                    $full_address[0] = trim($full_address[0]);
                    while (strpos($full_address[0], '  ') !== false) {
                        $full_address[0] = str_replace('  ', ' ', $full_address[0]);
                    }

                    // Comparo si el domicilio es exactamente igual
                    if ($full_address[0] == $domicilio && $domicilio != '') {
                        $address_validation = 'TRUE';
                    } else {
                        // Comparamos que no haya palabras o partes distintas 
                        $address_contains = explode(' ', $full_address[0]);
                        foreach ($address_contains as $address_value) {
                            if ($address_value == '') {
                                continue;
                            }

                            if (stripos($domicilio, $address_value) !== false && strlen($address_value) > 1) {
                                if ($address_validation !== 'PARTIALLY TRUE') {
                                    $address_validation = 'TRUE';
                                }
                                $domicilio = str_ireplace($address_value, '', $domicilio);
                            } else {
                                // Tiene algo distinto y era verdadero, pasa a ser parcialmente 
                                if ($address_validation == 'TRUE') {
                                    $address_validation = 'PARTIALLY TRUE';
                                }
                            }
                        }
                        // Si termina de comparar y en domicilio todavia le queda algo, es porque el de la BD tiene mas cosas
                        $domicilio = trim($domicilio);
                        if ($address_validation == 'TRUE' && $domicilio !== '') {
                            $address_validation = 'PARTIALLY TRUE';
                        }
                    }

                    $localidad = (isset($full_address[1])) ? strtoupper(trim($full_address[1])) : '';
                    $provincia = (isset($full_address[2])) ? strtoupper(trim($full_address[2])) : '';
                    $pais = (isset($full_address[3])) ? trim($full_address[3]) : 'ARGENTINA';

                    if ($info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES' || $info->provicia == 'CIUDAD AUTONOMA BUENOS AIRES' || $info->provicia == 'CIUDAD DE BUENOS AIRES' || $info->provicia == 'CIUDAD BUENOS AIRES') {
                        $info->provicia = 'CIUDAD AUTONOMA DE BUENOS AIRES';
                    }

                    if (($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' && $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES') || $info->provicia == $provincia) {
                        $pcia_validation = 'TRUE';
                    }

                    if ($address_validation == 'TRUE') {
                        if (($provincia == 'CIUDAD AUTONOMA DE BUENOS AIRES' && $info->provicia == 'CIUDAD AUTONOMA DE BUENOS AIRES') || ($info->provicia == $provincia && $info->localidad == $localidad) && $pais = 'ARGENTINA') {
                            $address_validation = 'TRUE';
                        } else {
                            $address_validation = 'PARTIALLY TRUE';
                        }
                    }
                }

                //$birthdate_validation = 'FALSE'; //--> esto se lleva mas arriba.
                if ($enviados['birthdate'] == $persona->fecha_nacimiento) {
                    $birthdate_validation = 'TRUE';
                    $integridad += 100;
                }

                //$dni_validation = 'FALSE';  //--> esto se lleva mas arriba.
                if ($enviados['dni'] == $persona->dni) {
                    $dni_validation = 'TRUE';
                    $integridad += 100;
                }

                //$tax_id_validation = 'FALSE'; //--> esto se lleva mas arriba.
                if ($enviados['tax_id'] == $persona->cuit) {
                    $tax_id_validation = 'TRUE';
                }

                //$telephone_validation = 'FALSE'; //--> esto se lleva mas arriba.
                $telephone_contains = explode(' /', $info->telefonos);
                foreach ($telephone_contains as $key2 => $value) {
                    if ($value == $enviados['telephone'] && $enviados['telephone'] != '') {
                        $telephone_validation = 'TRUE';
                    } else if (stripos(trim($value), $enviados['telephone']) !== false || stripos('11' . trim($value), $enviados['telephone']) !== false) {
                        $telephone_validation = 'PARTIALLY TRUE';
                    } else {
                        $telephone_validation = 'FALSE';
                    }
                }
                //$gender_validation = 'FALSE';  //--> esto se lleva mas arriba.
                if (strtoupper($enviados['gender']) == strtoupper($persona->sexo)) {
                    $gender_validation = 'TRUE';
                }

                //------------ MODIFICACION 24/09/2021
                $address_complete_validation = 'FALSE';
                //---- EL STORE QUE DEVUELVE EL LOS DATOS DEL DOMICILIO COMPLETO
                $datos_domicilios = SQLConnection::backendStoreProcedure('api_domicilios', array($persona->cuit));
                //-----
                $registro_elegido = [];
                //----- EL REGISTRO ELEGIDO ES DEL TIPO L
                foreach ($datos_domicilios as $key => $value) {
                    if ($value->nombre_fuente == 'RENAPER') {
                        $registro_elegido = $datos_domicilios[$key];
                        break;
                    }
                    if ($value->address_type == 'L' && empty($registro_elegido)) {
                        $registro_elegido = $datos_domicilios[$key];
                    }
                }
                //---------- SI NO HAY UN DOMICILIO TIPO L , AGARRA EL PRIMER REGISTRO
                if (empty($registro_elegido)) {
                    $registro_elegido = (count($datos_domicilios) == 0 || is_null($datos_domicilios)) ? '' : $datos_domicilios[0];
                }
                //---- EN ESTE CONDICION CAMBIA EL NOMBRE SI ES CIUDAD AUTONOMA DE BUENOS AIRES, PARA PODER HACER LA COMPARACION CON EL REGISTRO OBTENIDO
                if (strtoupper($enviados['state']) == 'CABA' || strtoupper($enviados['state']) == 'CIUDAD AUTONOMA DE BUENOS AIRES' || strtoupper($enviados['state']) == 'CAPITAL FEDERAL') {
                    $enviados['state'] = 'CIUDAD AUTONOMA BUENOS AIRES';
                }
                try {
                    //---- DEFENIENDO LAS FUNCION LEVENSHTEIN
                    $levenshtein_nombre_calle = levenshtein(strtoupper((strlen($enviados['street_name']) > 0) ? $enviados['street_name'] : 'null'), $registro_elegido->street_name);
                    $levenshtein_provincia = levenshtein(strtoupper($enviados['state']), $registro_elegido->state);
                    $levenshtein_localidad = levenshtein(strtoupper($enviados['city']), $registro_elegido->city);
                } catch (\Throwable $th) {
                    $levenshtein_nombre_calle = 2;
                    $levenshtein_provincia = 2;
                    $levenshtein_localidad = 2;
                    $objTemporal = new StdClass();
                    $objTemporal->country_code = 'FALSE';
                    $objTemporal->street_number = 'FALSE';
                    $objTemporal->floor = 'FALSE';
                    $objTemporal->appartment = 'FALSE';
                    $registro_elegido = $objTemporal;
                }
                //---- COMIENZO DE LA VALIDACION DEL DOMICILIO COMPLETO
                //----- SI EL PAIS ES VALIDO
                if (strtoupper($enviados['country_code']) == $registro_elegido->country_code) {
                    //---- SI EL NOMBRE DE LA CALLE ES VALIDO
                    if ($levenshtein_nombre_calle == 1 || $levenshtein_nombre_calle == 0) {
                        //----- SI LA PROVINCIA ES VALIDA 
                        if ($levenshtein_provincia == 0 || $levenshtein_provincia == 1) {
                            //---- SI LA LOCALIDAD ES VALIDA
                            if ($levenshtein_localidad == 0 || $levenshtein_localidad == 1 || (strtoupper($enviados['state']) == 'CIUDAD AUTONOMA BUENOS AIRES')) {
                                //---- SI LA ALTURA ES VALIDA
                                if (strtoupper($enviados['street_number']) == $registro_elegido->street_number) {
                                    //---- SI TIENE PISO
                                    if ($registro_elegido->floor != NULL) {
                                        //---- SI EL PISO ES VALIDO
                                        if (strtoupper($enviados['floor']) == $registro_elegido->floor) {
                                            //---- SI TIENE DEPARTAMENTO
                                            if ($registro_elegido->appartment != NULL) {
                                                //---- SI EL DEPARTAMENTO ES VALIDO O NO
                                                if (strtoupper($enviados['apartment']) == $registro_elegido->appartment) {
                                                    $address_complete_validation = 'TRUE';
                                                } else {
                                                    $address_complete_validation = 'PARTIALLY TRUE';
                                                }
                                            } else {
                                                //---- SI NO TIENE DEPARTAMENTO
                                                $address_complete_validation = 'TRUE';
                                            }
                                        } else {
                                            //--- SI EL PISO ES INVALIDO
                                            $address_complete_validation = 'PARTIALLY TRUE';
                                        }
                                    } else {
                                        //--- SI NO TIENE PISO
                                        $address_complete_validation = 'TRUE';
                                    }
                                } else {
                                    //---- SI LA ALTURA ES INVALIDA
                                    $address_complete_validation = 'PARTIALLY TRUE';
                                }
                            } else {
                                //------ SI LA LOCALIDAD ES INVALIDA
                                $address_complete_validation = 'FALSE';
                            }
                        } else {
                            //--- SI LA PROVINCIA ES INVALIDA
                            $address_complete_validation = 'FALSE';
                        }
                    } else {
                        //--- SI LA CALLE NO ES INVALIDA
                        $address_complete_validation = 'FALSE';
                    }
                } else {
                    //--- SI EL PAIS ES INVALIDO
                    $address_complete_validation = 'FALSE';
                }

                //-------------------------------------- FIN DE MODIFICACION 24/09/2021
                //---------MODIFICACION 02/12/2021
                //------- COMIENZO DE VALIDACION INDIVIDUAL DEL DOMICILIO
                //-- VALIDACION DE CODIGO PAIS


                $country_code_validation = 'FALSE';
                $street_name_validation = 'FALSE';
                $state_validation = 'FALSE';
                $city_validation = 'FALSE';
                $street_number_validation = 'FALSE';
                $floor_validation = 'FALSE';
                $apartment_validation = 'FALSE';

                if ($enviados['country_code'] && $enviados['country_code'] !== '') {
                    $country_code_validation = (strtoupper($enviados['country_code']) == $registro_elegido->country_code) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DEL NOMBRE DE CALLE
                if ($enviados['street_name'] && $enviados['street_name'] !== '') {
                    $street_name_validation = ($levenshtein_nombre_calle == 1) ? 'TRUE' : (($levenshtein_nombre_calle == 0) ? 'TRUE' : 'FALSE');
                }

                //-- VALIDACION DEL NOMBRE DE PROVINCIA
                if ($enviados['state'] && $enviados['state'] !== '') {
                    $state_validation = ($levenshtein_provincia == 0 || $levenshtein_provincia == 1) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DE NOMBRE DE LOCALIDAD
                if ($enviados['city'] && $enviados['city'] !== '') {
                    $city_validation = ($levenshtein_localidad == 0 || $levenshtein_localidad == 1 || (strtoupper($enviados['state']) == 'CIUDAD AUTONOMA BUENOS AIRES')) ? 'TRUE' : 'FALSE';
                }
                //-- VALIDACION DE ALTURA DE CALLE
                if ($enviados['city'] && $enviados['city'] !== '') {
                    $street_number_validation = (strtoupper($enviados['street_number']) == $registro_elegido->street_number) ? 'TRUE' : 'FALSE';
                }
                if ($enviados['floor'] && $enviados['floor'] !== '') {
                    //-- VALIDACION DE PISO , SI EXISTE
                    if ($registro_elegido->floor != NULL) {
                        $floor_validation = (strtoupper($enviados['floor']) == $registro_elegido->floor) ? 'TRUE' : 'FALSE';
                    }
                }
                //-- VALIDACION DE DEPARTAMENTO
                if ($enviados['apartment'] && $enviados['apartment'] !== '') {
                    if ($registro_elegido->appartment != NULL) {
                        $apartment_validation = (strtoupper($enviados['apartment']) == $registro_elegido->appartment) ? 'TRUE' : 'FALSE';
                    }
                }
                //--------- FIN DE MODIFICACION


                $result[2] = new StdClass();
                $result[2]->dni = $dni_validation;
                $result[2]->tax_id = $tax_id_validation;
                $result[2]->birthdate = $birthdate_validation;
                $result[2]->name = $name_validation;
                $result[2]->surname = $surname_validation;
                $result[2]->address = $address_validation;
                //$result[2]->stateV			= $pcia_validation;
                $result[2]->telephone = $telephone_validation;
                $result[2]->gender = $gender_validation;
                $result[2]->deceased = ($persona->fecha_fallecimiento != '') ? 'TRUE' : 'FALSE';
                $result[2]->transaction_id = $resp->transaction_id;
                $result[2]->legal_address = html_entity_decode($info->domicilio) ?? 'SIN DATOS'; //-> SE AGREGA PARA CONVERTIR CODIFICACION HTML QUE DEVUELVE AFIP
                $result[2]->state = $info->provicia ?? 'SIN DATOS';
                $result[2]->city = $info->localidad ?? 'SIN DATOS';
                $result[2]->zip = $info->codpos ?? 'SIN DATOS';
                //---- MODIFICACION 24/09/2021
                $result[2]->complete_address = $address_complete_validation;
                $result[2]->country_code = $registro_elegido->country_code ?? 'SIN DATOS';
                $result[2]->street_name = $registro_elegido->street_name ?? 'SIN DATOS';
                $result[2]->street_number = $registro_elegido->street_number ?? 'SIN DATOS';
                $result[2]->floor = $registro_elegido->floor ?? 'SIN DATOS';
                $result[2]->apartment = $registro_elegido->appartment ?? 'SIN DATOS';
                //---- FIN DE MODIFICACION 
                //---- MODIFICACION 02/12/2021

                $result[2]->individual_address_validations = array(
                    'country_code_validation' => $country_code_validation,
                    'street_name_validation' => $street_name_validation,
                    'state_validation' => $pcia_validation,
                    'city_validation' => $city_validation,
                    'street_number_validation' => $street_number_validation,
                    'floor_validation' => $floor_validation,
                    'apartment_validation' => $apartment_validation

                );
                //--- FIN DE MODIFICACION
                SQLConnection::backendStoreProcedure('guardar_parametros_API_2', array($consulta->id, $resp->transaction_id), 'selectOne');
            }

            if ($name_validation == 'TRUE') {
                $integridad += 100;
            } else if ($name_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($surname_validation == 'TRUE') {
                $integridad += 100;
            } else if ($surname_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($address_validation == 'TRUE') {
                $integridad += 100;
            } else if ($address_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }

            if ($pcia_validation == 'TRUE') {
                $integridad += 100;
            } else if ($pcia_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }


            //---- MODIFICACION 24/09/2021
            if ($address_complete_validation == 'TRUE') {
                $integridad += 100;
            } else if ($address_complete_validation == 'PARTIALLY TRUE') {
                $integridad += 48;
            }
            //----

            $resultado_integridad = round(($integridad / 6), 2);

            // idReg
            /*
            try {
                $fresco = array('UPDATELOTE',$dni_validation,$tax_id_validation,$birthdate_validation,$name_validation,$surname_validation,$address_validation,
                $telephone_validation,$gender_validation,$result[2]->deceased ,$resp->transaction_id,$result[2]->legal_address ,$info->provicia,
                $info->localidad,$info->codpos,$address_complete_validation,$registro_elegido->country_code,$result[2]->street_name ,$result[2]->street_number,
                $result[2]->floor ,$result[2]->apartment,null,null,$idReg);	
            } catch (\Throwable $th) {
                $fresco = array('UPDATELOTE',$dni_validation,$tax_id_validation,$birthdate_validation,$name_validation,$surname_validation,$address_validation,
                $telephone_validation,$gender_validation,'null' ,$resp->transaction_id,'null' ,'null',
                'null','null',$address_complete_validation,'null','null' ,'null',
                'null' ,'null',null,null,$idReg);
            }
            SQLConnection::backendStoreProcedure('API_GET_BATCH_LOTE',$fresco,'selectOne');
            */

            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'OK',
                'Message' => 'OK',
                'Response' => $result,
                'Integrity' => $resultado_integridad . ' %'
            ]);
        } else {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'ERROR IN DATA (birthdate OR dni)',
                'Response' => []
            ]);
        }
    }

    public static function ObtenerInformeComercialCompleto($cuit = '', $apikey = '', $idioma = 'ESP', )
    {
        $usuario = Session::get('usuario');
        $cliente = $usuario->cliente['client_id'];

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

        //datos básicos y declaraciones de clases y arrays, para que no fallen
        if (! $cuit) {
            $cuit = Request::input('cuit');
        }
        /* 22/07/2021 Agregamos que pase por afip */
        if (! empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }
        // $idioma = (Request::input('idioma') !== NULL ) ? Request::input('idioma') : 'ESP';

        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;

        // AGB por favor transaccionar el ID producto que corresponde a cada APIKEY . Está usando fijo el 55 y ese producto se llama
        // informe comercial Teipesa. Creditsafe y Mati usan esta ruta con diferentes apikey y con el producto 79
        // Luego hay que actualizar la base de datos para que los consumos del 55 se muevan al 79 para estos dos clientes
        // El apikey se controla en api.php pero el producto del apikey se ignora.

        $producto = $usuario->producto ?? 55;
        //$p_ip   = $_SERVER['REMOTE_ADDR'];
        //$csa = SQLConnection::backendStoreProcedure('consumir_servicio_API',array($user_id,$cuit,$producto,$p_ip),'selectOne');
        $csa = self::consumir_servicio($cuit, $producto);

        //SQLConnection::consumirServicio($user_id,$cuit,55);

        if (! $apikey) {
            $apikey = Request::input('apikey');
        }
        $user_id = 0;
        $persona = new StdClass();
        $configuracion = [];
        $cuit_validado = Misc::validarCuit($cuit);
        if (! $cuit_validado) {
            return json_encode(['error' => 'Cuit Inválido']);
        }
        $respuesta = json_decode(self::obtenerServicioScore($cuit, true, false));
        $idp = SQLConnection::obtenerIdPadron($cuit);
        $id_padron = $idp->id_padron;

        //obtengo la configuración para este cliente/usuario y veo que secciones le habilito
        if ($apikey) {
            $configuracion = SQLConnection::backendStoreProcedure('api_obtener_configuracion_secciones', array($apikey), true);
        }

        //si tiene la configuración de formales, tomamos todos los datos posibles del formales. (defunción, domicilios, datos personales. etc.)
        if (isset($configuracion->formales) && $configuracion->formales == true) {
            //definicion de variables compartidas.
            $nombre = '';

            $defuncion = SQLConnection::backendStoreProcedure('obtener_defuncion', array($cuit), true);
            $fisica_juridica = Misc::tipoPersona($cuit);
            $p_fisica = ($fisica_juridica == 'F') ? 'FISICA' : 'JURIDICA';

            $legalForm = "";
            if ("F" != $p_fisica) {
                $cardScore = SQLConnection::obtenerCardScore($cuit);
                if (!empty($cardScore) && property_exists($cardScore, 'forma_juridica')) {
                    $legalForm = $cardScore->forma_juridica ?? "";
                }
            } else {
                $cardScorePF = SQLConnection::obtenerCardScorePF($cuit);
                if (!empty($cardScorePF) && property_exists($cardScorePF, 'forma_juridica')) {
                    $legalForm = $cardScorePF->forma_juridica ?? "";
                }
            }                        
            
            if ($idioma == 'ESP') {
                if (!isset($persona->formales)) {
                    $persona->formales = new stdClass();
                }
                $persona->formales->tipo_persona = $p_fisica;
                $persona->formales->forma_legal = $legalForm;
            } elseif ($idioma == 'ENG') {
                if (!isset($persona->formaldata)) {
                    $persona->formaldata = new stdClass();
                }
                $persona->formaldata->legal_type = $p_fisica;
                $persona->formaldata->legal_form = $legalForm;
            }

            $telefonos = SQLConnection::backendStoreProcedure('obtener_telefono', array($id_padron));

            if ($idioma == 'ESP') {
                $persona->formales->identificacion = $cuit;
            } elseif ($idioma == 'ENG') {
                $persona->formaldata->taxid = $cuit;
            }

            if ($fisica_juridica == 'F') {
                $datos_persona = SQLConnection::backendStoreProcedure('obtener_persona', array($cuit), true);
                $nombre = $datos_persona->nombre_persona;
                $dni = (int) substr($cuit, 2, -1);
                $empleado_de = SQLConnection::backendStoreProcedure('obtener_empleado_de', array($cuit));
                if ($idioma == 'ESP') {
                    $persona->formales->dni = (string) $dni;
                    $persona->formales->telefonos = $telefonos;
                    $persona->formales->sexo = $datos_persona->sexo;
                    $persona->formales->anio_nacimiento = $datos_persona->anio_nacimiento;
                    //$persona->formales->nacionalidad    = ''; // en www2 estaba sacada esta linea
                    //$persona->formales->ejemplar        = '';
                    $persona->formales->defuncion = new StdClass();
                } elseif ($idioma == 'ENG') {
                    $persona->formaldata->national_id = (string) $dni;
                    $persona->formaldata->phone = $telefonos;
                    $persona->formaldata->gender = $datos_persona->sexo;
                    $persona->formaldata->YOB = $datos_persona->anio_nacimiento;
                    //$persona->formaldata->nacionalidad    = ''; // en www2 estaba sacada esta linea
                    //$persona->formaldata->ejemplar        = '';
                    $persona->formaldata->death_info = new StdClass();
                }

                if (! empty($datos_persona->fecha_nacimiento)) {
                    $edad = Misc::calcularEdad($datos_persona->fecha_nacimiento);
                    if ($edad) {
                        if ($idioma == 'ESP') {
                            $persona->formales->edad = $edad;
                        } elseif ($idioma == 'ENG') {
                            $persona->formaldata->age = $edad;
                        }
                    }
                }

                if ($idioma == 'ESP') {
                    $persona->formales->empleado_de = $empleado_de;
                    $persona->formales->profesion = $datos_persona->profesion;
                    $persona->formales->fecha_nacimiento = $datos_persona->fecha_nacimiento;
                    $persona->formales->estado_civil = $datos_persona->estado_civil;

                    $persona->formales->defuncion->fuente = ! empty($defuncion->fuente) ? $defuncion->fuente : '-';
                    $persona->formales->defuncion->fecha_deceso = ! empty($defuncion->fecha_deceso) ? $defuncion->fecha_deceso : '-';
                    $persona->formales->defuncion->defuncion = ! empty($defuncion->defuncion) ? $defuncion->defuncion : '-';
                } elseif ($idioma == 'ENG') {
                    // FALTA TRADUCIR
                    $persona->formaldata->employee_of = $empleado_de;
                    $persona->formaldata->profession = $datos_persona->profesion;
                    $persona->formaldata->DOB = $datos_persona->fecha_nacimiento;
                    $persona->formaldata->marital_status = $datos_persona->estado_civil;

                    $persona->formaldata->death_info->source = ! empty($defuncion->fuente) ? $defuncion->fuente : '-';
                    $persona->formaldata->death_info->DOD = ! empty($defuncion->fecha_deceso) ? $defuncion->fecha_deceso : '-';
                    $persona->formaldata->death_info->isdead = ! empty($defuncion->defuncion) ? $defuncion->defuncion : '-';
                }
            } else {
                $nombre = SQLConnection::obtenerRazonSocial($cuit)->nombre_persona;
                $sociedades = SQLConnection::backendStoreProcedure('obtener_sociedades', array($cuit));
                $info_empresa_formales = [];
                $card_empleados = SQLConnection::backendStoreProcedure('obtener_empleados', array($cuit), 'selectOne');
                if (isset($card_empleados->total)) {
                    if ($idioma == 'ESP') {
                        $card_empleados->total = (int) $card_empleados->total;
                    } elseif ($idioma == 'ENG') {
                        $card_empleados->perc_men = $card_empleados->cantidad_hombres;
                        $card_empleados->perc_women = $card_empleados->cantidad_mujeres;
                        $card_empleados->total_employees = (int) $card_empleados->total;
                        $card_empleados->period = $card_empleados->fecha;
                        unset($card_empleados->cantidad_mujeres);
                        unset($card_empleados->cantidad_hombres);
                        unset($card_empleados->total);
                        unset($card_empleados->fecha);
                    }
                }
                if ($idioma == 'ESP') {
                    $persona->formales->empleados = $card_empleados;
                } elseif ($idioma == 'ENG') {
                    $persona->formaldata->employees = $card_empleados;
                }

                if ($idioma == 'ESP') {
                    foreach ($sociedades as $key => $value) {
                        $info_empresa_formales[$key] = new StdClass();
                        $info_empresa_formales[$key]->ramo = $value->ramo;
                        $info_empresa_formales[$key]->subramo = $value->subramo;
                        $info_empresa_formales[$key]->fecha_contrato_social = $value->fecha_cons;
                        $info_empresa_formales[$key]->capital = (int) $value->capital;
                    }
                    $persona->formales->mas_info = $info_empresa_formales;
                } elseif ($idioma == 'ENG') {
                    foreach ($sociedades as $key => $value) {
                        $info_empresa_formales[$key] = new StdClass();
                        $info_empresa_formales[$key]->ramo = $value->ramo;
                        $info_empresa_formales[$key]->subramo = $value->subramo;
                        $info_empresa_formales[$key]->social_contract_date = $value->fecha_cons;
                        $info_empresa_formales[$key]->capital = (int) $value->capital;
                    }
                    $persona->formaldata->more_info = $info_empresa_formales;
                }

                $claes_info = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
                $claes = [];

                if ($idioma == 'ESP') {
                    foreach ($claes_info as $key => $value) {
                        $claes[$key] = new StdClass();
                        $claes[$key]->cod_clae = $value->cod_clae;
                        $claes[$key]->descripcion = $value->descripcion;
                    }
                    $persona->formales->claes = $claes;
                } elseif ($idioma == 'ENG') {
                    foreach ($claes_info as $key => $value) {
                        $claes[$key] = new StdClass();
                        $claes[$key]->clae_code = $value->cod_clae;
                        $claes[$key]->description = $value->descripcion;
                    }
                    $persona->formaldata->economic_activity = $claes;
                }
            }


            if ($idioma == 'ESP') {
                $persona->formales->nombre = $nombre;
                $persona->formales->domicilios = new StdClass();
            } elseif ($idioma == 'ENG') {
                $persona->formaldata->legal_name = $nombre;
                $persona->formaldata->addresses = new StdClass();
            }

            $domicilios = SQLConnection::backendStoreProcedure('sp_obtener_domicilios', array($cuit));

            if (! empty($domicilios)) {
                if ($idioma == 'ESP') {
                    foreach ($domicilios as $key => $value) {
                        //$domicilios[$key]->domicilio = $domicilios[$key]->domicilio;
                        $domicilios[$key]->provincia = $domicilios[$key]->prv_nombre;
                        $domicilios[$key]->localidad = $domicilios[$key]->loc_nombre;
                        $domicilios[$key]->pais = $domicilios[$key]->pai_nombre;
                        $domicilios[$key]->cp = $domicilios[$key]->codpos;
                        unset($domicilios[$key]->domicilio);
                        unset($domicilios[$key]->prv_nombre);
                        unset($domicilios[$key]->loc_nombre);
                        unset($domicilios[$key]->pai_nombre);
                        unset($domicilios[$key]->codpos);
                        unset($domicilios[$key]->id);
                        unset($domicilios[$key]->tipo_domicilio);
                        unset($domicilios[$key]->created);
                    }
                    $persona->formales->domicilios = $domicilios;
                } elseif ($idioma == 'ENG') {
                    // nahu
                    foreach ($domicilios as $key => $value) {
                        $domicilios[$key]->address = $domicilios[$key]->domicilio;
                        $domicilios[$key]->state = $domicilios[$key]->prv_nombre;
                        $domicilios[$key]->city = $domicilios[$key]->loc_nombre;
                        $domicilios[$key]->country = $domicilios[$key]->pai_nombre;
                        $domicilios[$key]->zip_code = $domicilios[$key]->codpos;
                        unset($domicilios[$key]->domicilio);
                        unset($domicilios[$key]->prv_nombre);
                        unset($domicilios[$key]->loc_nombre);
                        unset($domicilios[$key]->pai_nombre);
                        unset($domicilios[$key]->codpos);
                        unset($domicilios[$key]->id);
                        unset($domicilios[$key]->tipo_domicilio);
                        unset($domicilios[$key]->created);
                    }
                    $persona->formaldata->addresses = $domicilios;
                }
            }
            //      $persona->formales->defuncion->defuncion    = empty($defuncion->defuncion) ? '-' : $defuncion ;
        }

        // FALTA TARDUCIR NODO BALANCE
        if ($idioma == 'ESP') {
            $persona->balances = [];
            $persona->balances = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
        } elseif ($idioma == 'ENG') {
            // FALTA TRADUCIR
            $persona->balance_sheets = [];
            $persona->balance_sheets = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
        }

        $participaciones = [];
        //$vinculaciones    = []; // estaba wn www2
        //$relaciones       = []; // estaba wn www2 

        //Información socios/directores/sociedades.
        if (isset($configuracion) && $configuracion->relaciones == true) {
            if ($idioma == 'ESP') {
                $persona->relaciones = new StdClass();
                $persona->relaciones->socios = [];
                $persona->relaciones->participaciones = [];
                $persona->relaciones->vinculaciones = [];
                if ($fisica_juridica == 'F') {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));

                } else {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                }
                $i = 0;
                foreach ($participaciones as $key => $value) {
                    $persona->relaciones->participaciones[$i] = new StdClass();
                    $persona->relaciones->participaciones[$i]->razon_social_sociedad = $value->nombre_sociedad;
                    $persona->relaciones->participaciones[$i]->cuit_sociedad = $value->cuit_sociedad;
                    $persona->relaciones->participaciones[$i]->cuit_socio = $value->cuit_socio;
                    $persona->relaciones->participaciones[$i]->nombre_socio = $value->nombre_socio;
                    $persona->relaciones->participaciones[$i]->cargo = $value->cargo;
                    $i++;
                }

                $i = 0;
                foreach ($relaciones as $key => $value) {
                    $persona->relaciones->socios[$i] = new StdClass();
                    $persona->relaciones->socios[$i]->cuit = $value->cuit;
                    $persona->relaciones->socios[$i]->pais = $value->country_name;
                    $persona->relaciones->socios[$i]->nombre_persona = $value->nombre_persona;
                    $persona->relaciones->socios[$i]->cargo = $value->car_nombre;
                    $persona->relaciones->socios[$i]->desde = $value->c04_periodo_desde;
                    $persona->relaciones->socios[$i]->hasta = $value->c04_periodo_hasta;
                    $i++;
                }
                $i = 0;
                foreach ($vinculaciones as $key => $value) {
                    $persona->relaciones->vinculaciones[$i] = new StdClass();
                    $persona->relaciones->vinculaciones[$i]->cuit = $value->cuit_vinculada;
                    $persona->relaciones->vinculaciones[$i]->nombre_persona = $value->nombre_persona;
                    $persona->relaciones->vinculaciones[$i]->tipo = $value->nombre;
                    $persona->relaciones->vinculaciones[$i]->detalle = $value->detalle;
                    $i++;
                }

            } elseif ($idioma == 'ENG') {

                $persona->corporate_realationships = new StdClass();
                $persona->corporate_realationships->partners = [];
                $persona->corporate_realationships->shareholding_activity = [];
                $persona->corporate_realationships->linkages = [];
                if ($fisica_juridica == 'F') {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));

                } else {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                }
                $i = 0;
                foreach ($participaciones as $key => $value) {
                    $persona->corporate_realationships->shareholding_activity[$i] = new StdClass();
                    $persona->corporate_realationships->shareholding_activity[$i]->legal_name = $value->nombre_sociedad;
                    $persona->corporate_realationships->shareholding_activity[$i]->taxid = $value->cuit_sociedad;
                    $persona->corporate_realationships->shareholding_activity[$i]->taxid_sharheolder = $value->cuit_socio;
                    $persona->corporate_realationships->shareholding_activity[$i]->legal_name_shareholder = $value->nombre_socio;
                    $persona->corporate_realationships->shareholding_activity[$i]->role = $value->cargo;
                    $i++;
                }

                $i = 0;
                foreach ($relaciones as $key => $value) {
                    $persona->corporate_realationships->partners[$i] = new StdClass();
                    $persona->corporate_realationships->partners[$i]->taxid = $value->cuit;
                    $persona->corporate_realationships->partners[$i]->country = $value->country_name;
                    $persona->corporate_realationships->partners[$i]->legal_name = $value->nombre_persona;
                    $persona->corporate_realationships->partners[$i]->position = $value->car_nombre;
                    $persona->corporate_realationships->partners[$i]->from_date = $value->c04_periodo_desde;
                    $persona->corporate_realationships->partners[$i]->to_date = $value->c04_periodo_hasta;
                    $i++;
                }
                $i = 0;
                foreach ($vinculaciones as $key => $value) {
                    $persona->corporate_realationships->linkages[$i] = new StdClass();
                    $persona->corporate_realationships->linkages[$i]->tax_id = $value->cuit_vinculada;
                    $persona->corporate_realationships->linkages[$i]->legal_name = $value->nombre_persona;
                    $persona->corporate_realationships->linkages[$i]->tipo = $value->nombre;
                    $persona->corporate_realationships->linkages[$i]->detalle = $value->detalle;
                    $i++;
                }
            }
        }

        //Información Comercial.
        if (isset($configuracion) && $configuracion->comerciales == true) {
            if ($idioma == 'ESP') {
                $persona->comerciales = new StdClass();
            } elseif ($idioma == 'ENG') {
                $persona->commercial_data = new StdClass();
            }
            $consultas_ramos = SQLConnection::backendStoreProcedure('obtener_consulta_por_ramos', array($cuit, 12));
            $seguros = SQLConnection::backendSeguros($cuit);
            $marcas = SQLConnection::backendStoreProcedure('obtener_marcas', array($cuit));
            $consultas = [];
            if ($consultas_ramos) {
                if ($idioma == 'ESP') {
                    foreach ($consultas_ramos as $key_ramo => $consulta) {
                        $consultas[$key_ramo]['nombre'] = $consulta->descripcion;
                        $consultas[$key_ramo][$consulta->antiguedad] = $consulta->cantidad;
                    }

                    foreach ($consultas as $key => $consulta) {
                        if (! isset($consultas[$key]['entre_0_1'])) {
                            $consultas[$key]['entre_0_1'] = 0;
                        }
                        if (! isset($consultas[$key]['entre_1_2'])) {
                            $consultas[$key]['entre_1_2'] = 0;
                        }
                        if (! isset($consultas[$key]['entre_2_5'])) {
                            $consultas[$key]['entre_2_5'] = 0;
                        }
                        ksort($consultas[$key]);
                    }
                }
                if ($idioma == 'ENG') {
                    foreach ($consultas_ramos as $key_ramo => $consulta) {
                        $consultas[$key_ramo]['name'] = $consulta->descripcion;
                        $consultas[$key_ramo][$consulta->antiguedad] = $consulta->cantidad;
                    }

                    foreach ($consultas as $key => $consulta) {
                        if (! isset($consultas[$key]['between_0_1'])) {
                            $consultas[$key]['between_0_1'] = 0;
                        }
                        if (! isset($consultas[$key]['between_1_2'])) {
                            $consultas[$key]['between_1_2'] = 0;
                        }
                        if (! isset($consultas[$key]['between_2_5'])) {
                            $consultas[$key]['between_2_5'] = 0;
                        }
                        ksort($consultas[$key]);
                    }
                }

            }
            if (! empty($marcas)) {
                if ($idioma == 'ESP') {
                    foreach ($marcas as $key => $value) {
                        unset($value->num_boletin);
                        unset($value->directorio);
                        unset($value->web);
                        unset($value->fecha_publicacion);
                        unset($value->encontrada);
                    }

                } elseif ($idioma == 'ENG') {
                    foreach ($marcas as $key => $value) {
                        //$marcas[$key]->num_acta = $marcas[$key]->num_acta;
                        //$marcas[$key]->tipo = $marcas[$key]->tipo;
                        //$marcas[$key]->marca = $marcas[$key]->marca;
                        //$marcas[$key]->clase = $marcas[$key]->clase;

                        unset($value->num_boletin);
                        unset($value->directorio);
                        unset($value->web);
                        unset($value->fecha_publicacion);
                        unset($value->encontrada);
                    }
                }
            }

            if (! empty($seguros)) {
                if ($idioma == 'ESP') {
                    foreach ($seguros as $key => $value) {
                        unset($seguros[$key]->seg_codigo);
                        unset($seguros[$key]->rie_codigo);
                        unset($seguros[$key]->id_seguros);
                        unset($seguros[$key]->id_padron);
                        unset($seguros[$key]->visible);
                        unset($seguros[$key]->estado);
                    }

                } elseif ($idioma == 'ENG') {
                    foreach ($seguros as $key => $value) {
                        //$seguros[$key]->seg_nombre = $seguros[$key]->seg_nombre;
                        //$seguros[$key]->rie_nombre = $seguros[$key]->rie_nombre;
                        unset($seguros[$key]->seg_codigo);
                        unset($seguros[$key]->rie_codigo);
                        unset($seguros[$key]->id_seguros);
                        unset($seguros[$key]->id_padron);
                        unset($seguros[$key]->visible);
                        unset($seguros[$key]->estado);
                    }
                }
            }

            if ($idioma == 'ESP') {
                $persona->comerciales->consultas = $consultas;
                $persona->comerciales->seguros = $seguros;
                $persona->comerciales->marcas = $marcas;

            } elseif ($idioma == 'ENG') {
                $persona->commercial_data->qtyqueries = $consultas;
                $persona->commercial_data->insurances = $seguros;
                $persona->commercial_data->brands = $marcas;
            }
        }
        //Información Fiscal.
        if (isset($configuracion) && $configuracion->contables == true) {
            $MainController = new MainController();
            // $contables      = json_decode($MainController->obtenerContables(true,'','','','','','','','','','',$cuit)->getContent())->info;
        }

        if (isset($configuracion) && $configuracion->fiscales == true) {
            if ($idioma == 'ESP') {
                $persona->fiscales = new StdClass();
            } elseif ($idioma == 'ENG') {
                $persona->fiscal_data = new StdClass();
            }
            $claes = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
            $inscripciones = SQLConnection::backendStoreProcedure('obtener_inscripciones', array($cuit));
            $impuestos = SQLConnection::backendStoreProcedure('obtener_padron_impuestos', array($id_padron));
            $apocrifas = SQLConnection::backendStoreProcedure('obtener_apocrifas', array($cuit));
            $sircreb = SQLConnection::backendStoreProcedure('obtener_sircreb', array($cuit));
            $arba = SQLConnection::backendStoreProcedure('obtener_arba', array($cuit));
            $aportes = SQLConnection::backendStoreProcedure('backend_mis_aportes', array($cuit, NULL, 12, 1), false);

            if ($idioma == 'ESP') {
                $persona->fiscales->aportes = $aportes;
                $persona->fiscales->clae = $claes;
                $persona->fiscales->inscripciones = $inscripciones;
                $persona->fiscales->impuestos = $impuestos;
                $persona->fiscales->facturas_apocrifas = $apocrifas;
                $persona->fiscales->sircreb = $sircreb;
                $persona->fiscales->arba = $arba;
            } elseif ($idioma == 'ENG') {
                $persona->fiscal_data->social_security_contributions = $aportes;//AGB VER CON DATOS
                $persona->fiscal_data->economic_activity_code = $claes;
                foreach ($persona->fiscal_data->economic_activity_code as $key => $clae) {
                    $persona->fiscal_data->economic_activity_code[$key]->code = $clae->cod_clae;
                    $persona->fiscal_data->economic_activity_code[$key]->description = $clae->descripcion;
                    $persona->fiscal_data->economic_activity_code[$key]->start_date = $clae->fecha_inicio_actividad;
                    unset($persona->fiscal_data->economic_activity_code[$key]->cod_clae);
                    unset($persona->fiscal_data->economic_activity_code[$key]->descripcion);
                    unset($persona->fiscal_data->economic_activity_code[$key]->fecha_inicio_actividad);
                }

                // FALTA TRADUCIR
                foreach ($inscripciones as $key => $value) {
                    $inscripciones[$key]->fecha_contrato_social = $inscripciones[$key]->fecha_contrato_social;
                    $inscripciones[$key]->numero_inscripcion = $inscripciones[$key]->numero_inscripcion;
                    $inscripciones[$key]->fecha_inscripcion = $inscripciones[$key]->fecha_inscripcion;
                    $inscripciones[$key]->monotributo = $inscripciones[$key]->monotributo;
                    $inscripciones[$key]->inicio_actividad = $inscripciones[$key]->inicio_actividad;
                    $inscripciones[$key]->empleador = $inscripciones[$key]->empleador;
                }
                $persona->fiscal_data->registered_taxes = $inscripciones;

                // FALTA TRADUCIR
                foreach ($impuestos as $key => $value) {
                    $impuestos[$key]->codigo_impuesto = $impuestos[$key]->codigo_impuesto;
                    $impuestos[$key]->nombre_impuesto = $impuestos[$key]->nombre_impuesto;
                    $impuestos[$key]->fecha_inscripcion = $impuestos[$key]->fecha_inscripcion;
                    $impuestos[$key]->estado = $impuestos[$key]->estado;
                }
                $persona->fiscal_data->taxes = $impuestos;

                $persona->fiscal_data->apocryphal_invoices = $apocrifas;
                $persona->fiscal_data->sircreb = $sircreb;
                $persona->fiscal_data->arba = $arba;
            }
        }

        //informacion de bancos
        //if($configuracion->bancos == true){
        $bancos = SQLConnection::backendStoreProcedure('backend_central_deudores', array($cuit, 24, 1));
        $periodo = SQLConnection::backendStoreProcedure('obtener_periodo_maximo', array($cuit), 'selectOne');
        if ($idioma == 'ESP') {
            $persona->periodos = new StdClass();
            $persona->periodos->bancos = Misc::convertirFormatoFecha($periodo->periodo_maximo, 'Y-m-d', 'Ym');
            $persona->bancos = [];
            foreach ($bancos as $key => $value) {

                $persona->bancos[$key] = new StdClass();
                $persona->bancos[$key]->codigo_entidad = $value->codigo_ent;
                $persona->bancos[$key]->nombre_entidad = $value->nombre;
                $persona->bancos[$key]->periodo = $value->fec_inf;
                $persona->bancos[$key]->situacion = $value->situacion;
                $persona->bancos[$key]->monto = $value->total;
                $persona->bancos[$key]->dias_atraso = $value->dia_atraso;
            }
        } elseif ($idioma == 'ENG') {
            $persona->max_bank_information = new StdClass();
            $persona->max_bank_information->period = Misc::convertirFormatoFecha($periodo->periodo_maximo, 'Y-m-d', 'Ym');
            $persona->banks = [];
            foreach ($bancos as $key => $value) {
                $persona->banks[$key] = new StdClass();
                $persona->banks[$key]->bank_code = $value->codigo_ent;
                $persona->banks[$key]->bank_name = $value->nombre;
                $persona->banks[$key]->period = $value->fec_inf;
                $persona->banks[$key]->status = $value->situacion;
                $persona->banks[$key]->amount = $value->total;
                $persona->banks[$key]->days_late = $value->dia_atraso;
            }
        }
        //}
        if ($idioma == 'ESP') {
            $persona->vinculados_segun_bcra = [];
        } elseif ($idioma == 'ENG') {
            $persona->representatives_with_banking_system = [];
        }

        //informacion de cheques
        $cheques = SQLConnection::backendStoreProcedure('obtener_cheques', array($cuit));
        $i = 0;
        foreach ($cheques as $key => $value) {
            if ($value->tipo == 'vinculaciones') {
                if ($idioma == 'ESP') {
                    $persona->vinculados_segun_bcra[$i] = new StdClass();
                    $persona->vinculados_segun_bcra[$i]->nombre_persona_firmante = $value->nombre_persona_firmante;
                    $persona->vinculados_segun_bcra[$i]->cuit_firmante = $value->cuit_firmante;
                    $persona->vinculados_segun_bcra[$i]->nombre_persona_relacionado = $value->nombre_persona_relacionado;
                    $persona->vinculados_segun_bcra[$i]->Cuit_relacionado = $value->Cuit_relacionado;
                    $persona->vinculados_segun_bcra[$i]->cantidad_cheques_firmados = $value->cantidad;
                    $persona->vinculados_segun_bcra[$i]->cantidad_cheques_totales = $value->total_cheques;
                    unset($cheques[$i]);
                    $i += 1;
                } elseif ($idioma == 'ENG') {
                    // FALTA TRADUCIR 
                    $persona->representatives_with_banking_system[$i] = new StdClass();
                    $persona->representatives_with_banking_system[$i]->nombre_persona_firmante = $value->nombre_persona_firmante;
                    $persona->representatives_with_banking_system[$i]->cuit_firmante = $value->cuit_firmante;
                    $persona->representatives_with_banking_system[$i]->nombre_persona_relacionado = $value->nombre_persona_relacionado;
                    $persona->representatives_with_banking_system[$i]->Cuit_relacionado = $value->Cuit_relacionado;
                    $persona->representatives_with_banking_system[$i]->cantidad_cheques_firmados = $value->cantidad;
                    $persona->representatives_with_banking_system[$i]->cantidad_cheques_totales = $value->total_cheques;
                    unset($cheques[$i]);
                    $i += 1;
                }
            } else {
                unset($cheques[$key]->idp);
                unset($cheques[$key]->idppr);
                unset($cheques[$key]->cantidad);
                unset($cheques[$key]->total_cheques);
            }
        }

        if ($idioma == 'ESP') {
            $persona->cheques = $cheques;
        } elseif ($idioma == 'ENG') {
            $persona->bounced_checks = $cheques;
        }

        $score = $respuesta->score;
        if ($idioma == 'ESP') {
            if (isset($configuracion) && $configuracion->score_ic == true) {
                $persona->score = new StdClass();
                $persona->score->valor = $score;
            }
        } elseif ($idioma == 'ENG') {
            if (isset($configuracion) && $configuracion->score_ic == true) {
                $persona->score = new StdClass();
                $persona->score->value = $score;
            }
        }

        if ($idioma == 'ESP') {
            $persona->comex = new StdClass();
        } elseif ($idioma == 'ENG') {
            $persona->comex = new StdClass();
        }
        $impo = SQLConnection::backendStoreProcedure('obtener_comex', array($cuit), 'select');
        $pais = SQLConnection::backendStoreProcedure('obtener_comex_pais', array($cuit), 'select');
        $rubros = SQLConnection::backendStoreProcedure('obtener_comex_rubros', array($cuit), 'select');
        $totales = SQLConnection::backendStoreProcedure('obtener_comex_totales', array($cuit), 'selectOne');
        if ($idioma == 'ESP') {
            $persona->comex->importaciones = [];
            if (! empty($impo)) {
                foreach ($impo as $key => $value) {
                    $persona->comex->importaciones[$key] = new StdClass();
                    $persona->comex->importaciones[$key]->fecha = $value->date;
                    $persona->comex->importaciones[$key]->consumo = $value->consumo;
                    $persona->comex->importaciones[$key]->deposito = $value->deposito;
                    $persona->comex->importaciones[$key]->zonafranca = $value->zonafranca;
                    $persona->comex->importaciones[$key]->temporal = $value->temporal;
                    $persona->comex->importaciones[$key]->total = $value->total;
                }
            }
        } elseif ($idioma == 'ENG') {
            // FALTA TRADUCIR 
            $persona->comex->imports = [];
            if (! empty($impo)) {
                foreach ($impo as $key => $value) {
                    $persona->comex->imports[$key] = new StdClass();
                    $persona->comex->imports[$key]->fecha = $value->date;
                    $persona->comex->imports[$key]->consumo = $value->consumo;
                    $persona->comex->imports[$key]->deposito = $value->deposito;
                    $persona->comex->imports[$key]->zonafranca = $value->zonafranca;
                    $persona->comex->imports[$key]->temporal = $value->temporal;
                    $persona->comex->imports[$key]->total = $value->total;
                }
            }
        }
        if (! empty($pais)) {
            foreach ($pais as $key => $value) {
                $persona->comex->pais[$key] = new StdClass();
                $persona->comex->pais[$key]->tipo_operacion = $value->tipo_operacion;
                $persona->comex->pais[$key]->fob = $value->fob;
                // $persona->comex->pais[$key]->nombre             = $value->nombre; // estaba en www2
            }
        }
        if (! empty($rubros)) {

            foreach ($rubros as $key => $value) {
                $persona->comex->rubros[$key] = new StdClass();
                $persona->comex->rubros[$key]->tipo_operacion = $value->tipo_operacion;
                $persona->comex->rubros[$key]->descripcion = $value->descripcion;
                $persona->comex->rubros[$key]->fob = $value->fob;
                $persona->comex->rubros[$key]->posicion = $value->posicion;
            }
        }
        if (! empty($totales)) {
            if ($idioma == 'ESP') {
                $persona->comex->totales = new StdClass();
                $persona->comex->totales->total_impo = $totales->total_impo;
                $persona->comex->totales->total_expo = $totales->total_expo;
            } elseif ($idioma == 'ENG') {
                $persona->comex->total = new StdClass();
                $persona->comex->total->total_imports = $totales->total_impo;
                $persona->comex->total->total_exports = $totales->total_expo;
            }
        }
        $actor = SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null, 'A', $cuit, 60, 1), 'select');
        $demandado = SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null, 'D', $cuit, 60, 1), 'select');
        if ($idioma == 'ESP') {
            $persona->legales = new StdClass();
            $persona->legales->actor = [];
            $persona->legales->demandado = [];

            foreach ($actor as $key => $value) {
                $persona->legales->actor[$key] = new StdClass();
                $persona->legales->actor[$key]->fecha_causa = $value->fecha_causa;
                $persona->legales->actor[$key]->nombre_causa = $value->nombre_causa;
                $persona->legales->actor[$key]->cuit = $value->cuit_otra_parte;
                $persona->legales->actor[$key]->nombre = $value->nombre_padron_otra_parte;
                $persona->legales->actor[$key]->juzgado = $value->juzgado;
                $persona->legales->actor[$key]->secretaria = $value->secretaria;
            }

            foreach ($demandado as $key => $value) {
                $persona->legales->demandado[$key] = new StdClass();
                $persona->legales->demandado[$key]->fecha_causa = $value->fecha_causa;
                $persona->legales->demandado[$key]->nombre_causa = $value->nombre_causa;
                $persona->legales->demandado[$key]->cuit = $value->cuit_otra_parte;
                $persona->legales->demandado[$key]->nombre = $value->nombre_padron_otra_parte;
                $persona->legales->demandado[$key]->expediente = $value->expediente;
                $persona->legales->demandado[$key]->juzgado = $value->juzgado;
                $persona->legales->demandado[$key]->secretaria = $value->secretaria;

            }

        } elseif ($idioma == 'ENG') {
            $persona->legal = new StdClass();
            $persona->legal->plaintiff = [];
            $persona->legal->defendant = [];
            // FALTA TRADUCIR
            foreach ($actor as $key => $value) {
                $persona->legal->plaintiff[$key] = new StdClass();
                $persona->legal->plaintiff[$key]->fecha_causa = $value->fecha_causa;
                $persona->legal->plaintiff[$key]->nombre_causa = $value->nombre_causa;
                $persona->legal->plaintiff[$key]->cuit = $value->cuit_otra_parte;
                $persona->legal->plaintiff[$key]->nombre = $value->nombre_padron_otra_parte;
                $persona->legal->plaintiff[$key]->juzgado = $value->juzgado;
                $persona->legal->plaintiff[$key]->secretaria = $value->secretaria;
            }
            // FALTA TRADUCIR
            foreach ($demandado as $key => $value) {
                $persona->legal->defendant[$key] = new StdClass();
                $persona->legal->defendant[$key]->fecha_causa = $value->fecha_causa;
                $persona->legal->defendant[$key]->nombre_causa = $value->nombre_causa;
                $persona->legal->defendant[$key]->cuit = $value->cuit_otra_parte;
                $persona->legal->defendant[$key]->nombre = $value->nombre_padron_otra_parte;
                $persona->legal->defendant[$key]->expediente = $value->expediente;
                $persona->legal->defendant[$key]->juzgado = $value->juzgado;
                $persona->legal->defendant[$key]->secretaria = $value->secretaria;

            }

        }
        return json_encode($persona);
    }




	/*20-12-2024 */
    public static function ObtenerInformeComercialCompletoAGB($cuit = '', $apikey = '', $idioma = 'ESP', )
    {
        $usuario = Session::get('usuario');
        $cliente = $usuario->cliente['client_id'];

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

        //datos básicos y declaraciones de clases y arrays, para que no fallen
        if (! $cuit) {
            $cuit = Request::input('cuit');
        }
        /* 22/07/2021 Agregamos que pase por afip */
        if (! empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }
        // $idioma = (Request::input('idioma') !== NULL ) ? Request::input('idioma') : 'ESP';

        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;

        // AGB por favor transaccionar el ID producto que corresponde a cada APIKEY . Está usando fijo el 55 y ese producto se llama
        // informe comercial Teipesa. Creditsafe y Mati usan esta ruta con diferentes apikey y con el producto 79
        // Luego hay que actualizar la base de datos para que los consumos del 55 se muevan al 79 para estos dos clientes
        // El apikey se controla en api.php pero el producto del apikey se ignora.

        $producto = $usuario->producto ?? 55;
        //$p_ip   = $_SERVER['REMOTE_ADDR'];
        //$csa = SQLConnection::backendStoreProcedure('consumir_servicio_API',array($user_id,$cuit,$producto,$p_ip),'selectOne');
        $csa = self::consumir_servicio($cuit, $producto);

        //SQLConnection::consumirServicio($user_id,$cuit,55);

        if (! $apikey) {
            $apikey = Request::input('apikey');
        }
        $user_id = 0;
        $persona = new StdClass();
        $configuracion = [];
        $cuit_validado = Misc::validarCuit($cuit);
        if (! $cuit_validado) {
            return json_encode(['error' => 'Cuit Inválido']);
        }
        $respuesta = json_decode(self::obtenerServicioScore($cuit, true, false));
        $idp = SQLConnection::obtenerIdPadron($cuit);
        $id_padron = $idp->id_padron;

        //obtengo la configuración para este cliente/usuario y veo que secciones le habilito
        if ($apikey) {
            $configuracion = SQLConnection::backendStoreProcedure('api_obtener_configuracion_secciones', array($apikey), true);
        }

        //si tiene la configuración de formales, tomamos todos los datos posibles del formales. (defunción, domicilios, datos personales. etc.)
        if ($configuracion->formales == true) {
            //definicion de variables compartidas.
            $nombre = '';

            $defuncion = SQLConnection::backendStoreProcedure('obtener_defuncion', array($cuit), true);
            $fisica_juridica = Misc::tipoPersona($cuit);
            $p_fisica = ($fisica_juridica == 'F') ? 'FISICA' : 'JURIDICA';

            $legalForm = "";
            if ("F" != $p_fisica) {
                $cardScore = SQLConnection::obtenerCardScore($cuit);
                if (!empty($cardScore) && property_exists($cardScore, 'forma_juridica')) {
                    $legalForm = $cardScore->forma_juridica ?? "";
                }
            } else {
                $cardScorePF = SQLConnection::obtenerCardScorePF($cuit);
                if (!empty($cardScorePF) && property_exists($cardScorePF, 'forma_juridica')) {
                    $legalForm = $cardScorePF->forma_juridica ?? "";
                }
            }                        
            
            if ($idioma == 'ESP') {
                $persona->formales = new stdClass();
                $persona->formales->tipo_persona = $p_fisica;
                $persona->formaldata->forma_legal = $legalForm;
            } elseif ($idioma == 'ENG') {
                $persona->formaldata = new stdClass();
                $persona->formaldata->legal_type = $p_fisica;
                $persona->formaldata->legal_form = $legalForm;
            }

            $telefonos = SQLConnection::backendStoreProcedure('obtener_telefono', array($id_padron));

            if ($idioma == 'ESP') {
                $persona->formales->identificacion = $cuit;
            } elseif ($idioma == 'ENG') {
                $persona->formaldata->taxid = $cuit;
            }

            if ($fisica_juridica == 'F') {
                $datos_persona = SQLConnection::backendStoreProcedure('obtener_persona', array($cuit), true);
                $nombre = $datos_persona->nombre_persona;
                $dni = (int) substr($cuit, 2, -1);
                $empleado_de = SQLConnection::backendStoreProcedure('obtener_empleado_de', array($cuit));
                if ($idioma == 'ESP') {
                    $persona->formales->dni = (string) $dni;
                    $persona->formales->telefonos = $telefonos;
                    $persona->formales->sexo = $datos_persona->sexo;
                    $persona->formales->anio_nacimiento = $datos_persona->anio_nacimiento;
                    //$persona->formales->nacionalidad    = ''; // en www2 estaba sacada esta linea
                    //$persona->formales->ejemplar        = '';
                    $persona->formales->defuncion = new StdClass();
                } elseif ($idioma == 'ENG') {
                    $persona->formaldata->national_id = (string) $dni;
                    $persona->formaldata->phone = $telefonos;
                    $persona->formaldata->gender = $datos_persona->sexo;
                    $persona->formaldata->YOB = $datos_persona->anio_nacimiento;
                    //$persona->formaldata->nacionalidad    = ''; // en www2 estaba sacada esta linea
                    //$persona->formaldata->ejemplar        = '';
                    $persona->formaldata->death_info = new StdClass();
                }

                if (! empty($datos_persona->fecha_nacimiento)) {
                    $edad = Misc::calcularEdad($datos_persona->fecha_nacimiento);
                    if ($edad) {
                        if ($idioma == 'ESP') {
                            $persona->formales->edad = $edad;
                        } elseif ($idioma == 'ENG') {
                            $persona->formaldata->age = $edad;
                        }
                    }
                }

                if ($idioma == 'ESP') {
                    $persona->formales->empleado_de = $empleado_de;
                    $persona->formales->profesion = $datos_persona->profesion;
                    $persona->formales->fecha_nacimiento = $datos_persona->fecha_nacimiento;
                    $persona->formales->estado_civil = $datos_persona->estado_civil;

                    $persona->formales->defuncion->fuente = ! empty($defuncion->fuente) ? $defuncion->fuente : '-';
                    $persona->formales->defuncion->fecha_deceso = ! empty($defuncion->fecha_deceso) ? $defuncion->fecha_deceso : '-';
                    $persona->formales->defuncion->defuncion = ! empty($defuncion->defuncion) ? $defuncion->defuncion : '-';
                } elseif ($idioma == 'ENG') {
                    // FALTA TRADUCIR
                    $persona->formaldata->employee_of = $empleado_de;
                    $persona->formaldata->profession = $datos_persona->profesion;
                    $persona->formaldata->DOB = $datos_persona->fecha_nacimiento;
                    $persona->formaldata->marital_status = $datos_persona->estado_civil;

                    $persona->formaldata->death_info->source = ! empty($defuncion->fuente) ? $defuncion->fuente : '-';
                    $persona->formaldata->death_info->DOD = ! empty($defuncion->fecha_deceso) ? $defuncion->fecha_deceso : '-';
                    $persona->formaldata->death_info->isdead = ! empty($defuncion->defuncion) ? $defuncion->defuncion : '-';
                }
            } else {
                $nombre = SQLConnection::obtenerRazonSocial($cuit)->nombre_persona;
                $sociedades = SQLConnection::backendStoreProcedure('obtener_sociedades', array($cuit));
                $info_empresa_formales = [];
                $card_empleados = SQLConnection::backendStoreProcedure('obtener_empleados', array($cuit), 'selectOne');
                if (isset($card_empleados->total)) {
                    if ($idioma == 'ESP') {
                        $card_empleados->total = (int) $card_empleados->total;
                    } elseif ($idioma == 'ENG') {
                        $card_empleados->perc_men = $card_empleados->cantidad_hombres;
                        $card_empleados->perc_women = $card_empleados->cantidad_mujeres;
                        $card_empleados->total_employees = (int) $card_empleados->total;
                        $card_empleados->period = $card_empleados->fecha;
                        unset($card_empleados->cantidad_mujeres);
                        unset($card_empleados->cantidad_hombres);
                        unset($card_empleados->total);
                        unset($card_empleados->fecha);
                    }
                }
                if ($idioma == 'ESP') {
                    $persona->formales->empleados = $card_empleados;
                } elseif ($idioma == 'ENG') {
                    $persona->formaldata->employees = $card_empleados;
                }

                if ($idioma == 'ESP') {
                    foreach ($sociedades as $key => $value) {
                        $info_empresa_formales[$key] = new StdClass();
                        $info_empresa_formales[$key]->ramo = $value->ramo;
                        $info_empresa_formales[$key]->subramo = $value->subramo;
                        $info_empresa_formales[$key]->fecha_contrato_social = $value->fecha_cons;
                        $info_empresa_formales[$key]->capital = (int) $value->capital;
                    }
                    $persona->formales->mas_info = $info_empresa_formales;
                } elseif ($idioma == 'ENG') {
                    foreach ($sociedades as $key => $value) {
                        $info_empresa_formales[$key] = new StdClass();
                        $info_empresa_formales[$key]->ramo = $value->ramo;
                        $info_empresa_formales[$key]->subramo = $value->subramo;
                        $info_empresa_formales[$key]->social_contract_date = $value->fecha_cons;
                        $info_empresa_formales[$key]->capital = (int) $value->capital;
                    }
                    $persona->formaldata->more_info = $info_empresa_formales;
                }

                $claes_info = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
                $claes = [];

                if ($idioma == 'ESP') {
                    foreach ($claes_info as $key => $value) {
                        $claes[$key] = new StdClass();
                        $claes[$key]->cod_clae = $value->cod_clae;
                        $claes[$key]->descripcion = $value->descripcion;
                    }
                    $persona->formales->claes = $claes;
                } elseif ($idioma == 'ENG') {
                    foreach ($claes_info as $key => $value) {
                        $claes[$key] = new StdClass();
                        $claes[$key]->clae_code = $value->cod_clae;
                        $claes[$key]->description = $value->descripcion;
                    }
                    $persona->formaldata->economic_activity = $claes;
                }
            }


            if ($idioma == 'ESP') {
                $persona->formales->nombre = $nombre;
                $persona->formales->domicilios = new StdClass();
            } elseif ($idioma == 'ENG') {
                $persona->formaldata->legal_name = $nombre;
                $persona->formaldata->addresses = new StdClass();
            }

            $domicilios = SQLConnection::backendStoreProcedure('sp_obtener_domicilios', array($cuit));

            if (! empty($domicilios)) {
                if ($idioma == 'ESP') {
                    foreach ($domicilios as $key => $value) {
                        //$domicilios[$key]->domicilio = $domicilios[$key]->domicilio;
                        $domicilios[$key]->provincia = $domicilios[$key]->prv_nombre;
                        $domicilios[$key]->localidad = $domicilios[$key]->loc_nombre;
                        $domicilios[$key]->pais = $domicilios[$key]->pai_nombre;
                        $domicilios[$key]->cp = $domicilios[$key]->codpos;
                        unset($domicilios[$key]->domicilio);
                        unset($domicilios[$key]->prv_nombre);
                        unset($domicilios[$key]->loc_nombre);
                        unset($domicilios[$key]->pai_nombre);
                        unset($domicilios[$key]->codpos);
                        unset($domicilios[$key]->id);
                        unset($domicilios[$key]->tipo_domicilio);
                        unset($domicilios[$key]->created);
                    }
                    $persona->formales->domicilios = $domicilios;
                } elseif ($idioma == 'ENG') {
                    // nahu
                    foreach ($domicilios as $key => $value) {
                        $domicilios[$key]->address = $domicilios[$key]->domicilio;
                        $domicilios[$key]->state = $domicilios[$key]->prv_nombre;
                        $domicilios[$key]->city = $domicilios[$key]->loc_nombre;
                        $domicilios[$key]->country = $domicilios[$key]->pai_nombre;
                        $domicilios[$key]->zip_code = $domicilios[$key]->codpos;
                        unset($domicilios[$key]->domicilio);
                        unset($domicilios[$key]->prv_nombre);
                        unset($domicilios[$key]->loc_nombre);
                        unset($domicilios[$key]->pai_nombre);
                        unset($domicilios[$key]->codpos);
                        unset($domicilios[$key]->id);
                        unset($domicilios[$key]->tipo_domicilio);
                        unset($domicilios[$key]->created);
                    }
                    $persona->formaldata->addresses = $domicilios;
                }
            }
            //      $persona->formales->defuncion->defuncion    = empty($defuncion->defuncion) ? '-' : $defuncion ;
        }

        // FALTA TARDUCIR NODO BALANCE
        if ($idioma == 'ESP') {
            $persona->balances = [];
            $persona->balances = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
        } elseif ($idioma == 'ENG') {
            // FALTA TRADUCIR
            $persona->balance_sheets = [];
            $persona->balance_sheets = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
        }

        $participaciones = [];
        //$vinculaciones    = []; // estaba wn www2
        //$relaciones       = []; // estaba wn www2 

        //Información socios/directores/sociedades.
        if ($configuracion->relaciones == true) {
            if ($idioma == 'ESP') {
                $persona->relaciones = new StdClass();
                $persona->relaciones->socios = [];
                $persona->relaciones->participaciones = [];
                $persona->relaciones->vinculaciones = [];
                if ($fisica_juridica == 'F') {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));

                } else {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                }
                $i = 0;
                foreach ($participaciones as $key => $value) {
                    $persona->relaciones->participaciones[$i] = new StdClass();
                    $persona->relaciones->participaciones[$i]->razon_social_sociedad = $value->nombre_sociedad;
                    $persona->relaciones->participaciones[$i]->cuit_sociedad = $value->cuit_sociedad;
                    $persona->relaciones->participaciones[$i]->cuit_socio = $value->cuit_socio;
                    $persona->relaciones->participaciones[$i]->nombre_socio = $value->nombre_socio;
                    $persona->relaciones->participaciones[$i]->cargo = $value->cargo;
                    $i++;
                }

                $i = 0;
                foreach ($relaciones as $key => $value) {
                    $persona->relaciones->socios[$i] = new StdClass();
                    $persona->relaciones->socios[$i]->cuit = $value->cuit;
                    $persona->relaciones->socios[$i]->pais = $value->country_name;
                    $persona->relaciones->socios[$i]->nombre_persona = $value->nombre_persona;
                    $persona->relaciones->socios[$i]->cargo = $value->car_nombre;
                    $persona->relaciones->socios[$i]->desde = $value->c04_periodo_desde;
                    $persona->relaciones->socios[$i]->hasta = $value->c04_periodo_hasta;
                    $i++;
                }
                $i = 0;
                foreach ($vinculaciones as $key => $value) {
                    $persona->relaciones->vinculaciones[$i] = new StdClass();
                    $persona->relaciones->vinculaciones[$i]->cuit = $value->cuit_vinculada;
                    $persona->relaciones->vinculaciones[$i]->nombre_persona = $value->nombre_persona;
                    $persona->relaciones->vinculaciones[$i]->tipo = $value->nombre;
                    $persona->relaciones->vinculaciones[$i]->detalle = $value->detalle;
                    $i++;
                }

            } elseif ($idioma == 'ENG') {

                $persona->corporate_realationships = new StdClass();
                $persona->corporate_realationships->partners = [];
                $persona->corporate_realationships->shareholding_activity = [];
                $persona->corporate_realationships->linkages = [];
                if ($fisica_juridica == 'F') {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));

                } else {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                }
                $i = 0;
                foreach ($participaciones as $key => $value) {
                    $persona->corporate_realationships->shareholding_activity[$i] = new StdClass();
                    $persona->corporate_realationships->shareholding_activity[$i]->legal_name = $value->nombre_sociedad;
                    $persona->corporate_realationships->shareholding_activity[$i]->taxid = $value->cuit_sociedad;
                    $persona->corporate_realationships->shareholding_activity[$i]->taxid_sharheolder = $value->cuit_socio;
                    $persona->corporate_realationships->shareholding_activity[$i]->legal_name_shareholder = $value->nombre_socio;
                    $persona->corporate_realationships->shareholding_activity[$i]->role = $value->cargo;
                    $i++;
                }

                $i = 0;
                foreach ($relaciones as $key => $value) {
                    $persona->corporate_realationships->partners[$i] = new StdClass();
                    $persona->corporate_realationships->partners[$i]->taxid = $value->cuit;
                    $persona->corporate_realationships->partners[$i]->country = $value->country_name;
                    $persona->corporate_realationships->partners[$i]->legal_name = $value->nombre_persona;
                    $persona->corporate_realationships->partners[$i]->position = $value->car_nombre;
                    $persona->corporate_realationships->partners[$i]->from_date = $value->c04_periodo_desde;
                    $persona->corporate_realationships->partners[$i]->to_date = $value->c04_periodo_hasta;
                    $i++;
                }
                $i = 0;
                foreach ($vinculaciones as $key => $value) {
                    $persona->corporate_realationships->linkages[$i] = new StdClass();
                    $persona->corporate_realationships->linkages[$i]->tax_id = $value->cuit_vinculada;
                    $persona->corporate_realationships->linkages[$i]->legal_name = $value->nombre_persona;
                    $persona->corporate_realationships->linkages[$i]->tipo = $value->nombre;
                    $persona->corporate_realationships->linkages[$i]->detalle = $value->detalle;
                    $i++;
                }
            }
        }

        //Información Comercial.
        if ($configuracion->comerciales == true) {
            if ($idioma == 'ESP') {
                $persona->comerciales = new StdClass();
            } elseif ($idioma == 'ENG') {
                $persona->commercial_data = new StdClass();
            }
            $consultas_ramos = SQLConnection::backendStoreProcedure('obtener_consulta_por_ramos', array($cuit, 12));
            $seguros = SQLConnection::backendSeguros($cuit);
            $marcas = SQLConnection::backendStoreProcedure('obtener_marcas', array($cuit));
            $consultas = [];
            if ($consultas_ramos) {
                if ($idioma == 'ESP') {
                    foreach ($consultas_ramos as $key_ramo => $consulta) {
                        $consultas[$key_ramo]['nombre'] = $consulta->descripcion;
                        $consultas[$key_ramo][$consulta->antiguedad] = $consulta->cantidad;
                    }

                    foreach ($consultas as $key => $consulta) {
                        if (! isset($consultas[$key]['entre_0_1'])) {
                            $consultas[$key]['entre_0_1'] = 0;
                        }
                        if (! isset($consultas[$key]['entre_1_2'])) {
                            $consultas[$key]['entre_1_2'] = 0;
                        }
                        if (! isset($consultas[$key]['entre_2_5'])) {
                            $consultas[$key]['entre_2_5'] = 0;
                        }
                        ksort($consultas[$key]);
                    }
                }
                if ($idioma == 'ENG') {
                    foreach ($consultas_ramos as $key_ramo => $consulta) {
                        $consultas[$key_ramo]['name'] = $consulta->descripcion;
                        $consultas[$key_ramo][$consulta->antiguedad] = $consulta->cantidad;
                    }

                    foreach ($consultas as $key => $consulta) {
                        if (! isset($consultas[$key]['between_0_1'])) {
                            $consultas[$key]['between_0_1'] = 0;
                        }
                        if (! isset($consultas[$key]['between_1_2'])) {
                            $consultas[$key]['between_1_2'] = 0;
                        }
                        if (! isset($consultas[$key]['between_2_5'])) {
                            $consultas[$key]['between_2_5'] = 0;
                        }
                        ksort($consultas[$key]);
                    }
                }

            }
            if (! empty($marcas)) {
                if ($idioma == 'ESP') {
                    foreach ($marcas as $key => $value) {
                        unset($value->num_boletin);
                        unset($value->directorio);
                        unset($value->web);
                        unset($value->fecha_publicacion);
                        unset($value->encontrada);
                    }

                } elseif ($idioma == 'ENG') {
                    foreach ($marcas as $key => $value) {
                        //$marcas[$key]->num_acta = $marcas[$key]->num_acta;
                        //$marcas[$key]->tipo = $marcas[$key]->tipo;
                        //$marcas[$key]->marca = $marcas[$key]->marca;
                        //$marcas[$key]->clase = $marcas[$key]->clase;

                        unset($value->num_boletin);
                        unset($value->directorio);
                        unset($value->web);
                        unset($value->fecha_publicacion);
                        unset($value->encontrada);
                    }
                }
            }

            if (! empty($seguros)) {
                if ($idioma == 'ESP') {
                    foreach ($seguros as $key => $value) {
                        unset($seguros[$key]->seg_codigo);
                        unset($seguros[$key]->rie_codigo);
                        unset($seguros[$key]->id_seguros);
                        unset($seguros[$key]->id_padron);
                        unset($seguros[$key]->visible);
                        unset($seguros[$key]->estado);
                    }

                } elseif ($idioma == 'ENG') {
                    foreach ($seguros as $key => $value) {
                        //$seguros[$key]->seg_nombre = $seguros[$key]->seg_nombre;
                        //$seguros[$key]->rie_nombre = $seguros[$key]->rie_nombre;
                        unset($seguros[$key]->seg_codigo);
                        unset($seguros[$key]->rie_codigo);
                        unset($seguros[$key]->id_seguros);
                        unset($seguros[$key]->id_padron);
                        unset($seguros[$key]->visible);
                        unset($seguros[$key]->estado);
                    }
                }
            }

            if ($idioma == 'ESP') {
                $persona->comerciales->consultas = $consultas;
                $persona->comerciales->seguros = $seguros;
                $persona->comerciales->marcas = $marcas;

            } elseif ($idioma == 'ENG') {
                $persona->commercial_data->qtyqueries = $consultas;
                $persona->commercial_data->insurances = $seguros;
                $persona->commercial_data->brands = $marcas;
            }
        }
        //Información Fiscal.
        if ($configuracion->contables == true) {
            $MainController = new MainController();
            // $contables      = json_decode($MainController->obtenerContables(true,'','','','','','','','','','',$cuit)->getContent())->info;
        }

        if ($configuracion->fiscales == true) {
            if ($idioma == 'ESP') {
                $persona->fiscales = new StdClass();
            } elseif ($idioma == 'ENG') {
                $persona->fiscal_data = new StdClass();
            }
            $claes = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
            $inscripciones = SQLConnection::backendStoreProcedure('obtener_inscripciones', array($cuit));
            $impuestos = SQLConnection::backendStoreProcedure('obtener_padron_impuestos', array($id_padron));
            $apocrifas = SQLConnection::backendStoreProcedure('obtener_apocrifas', array($cuit));
            $sircreb = SQLConnection::backendStoreProcedure('obtener_sircreb', array($cuit));
            $arba = SQLConnection::backendStoreProcedure('obtener_arba', array($cuit));
            $aportes = SQLConnection::backendStoreProcedure('backend_mis_aportes', array($cuit, NULL, 12, 1), false);

            if ($idioma == 'ESP') {
                $persona->fiscales->aportes = $aportes;
                $persona->fiscales->clae = $claes;
                $persona->fiscales->inscripciones = $inscripciones;
                $persona->fiscales->impuestos = $impuestos;
                $persona->fiscales->facturas_apocrifas = $apocrifas;
                $persona->fiscales->sircreb = $sircreb;
                $persona->fiscales->arba = $arba;
            } elseif ($idioma == 'ENG') {
                $persona->fiscal_data->social_security_contributions = $aportes;//AGB VER CON DATOS
                $persona->fiscal_data->economic_activity_code = $claes;
                foreach ($persona->fiscal_data->economic_activity_code as $key => $clae) {
                    $persona->fiscal_data->economic_activity_code[$key]->code = $clae->cod_clae;
                    $persona->fiscal_data->economic_activity_code[$key]->description = $clae->descripcion;
                    $persona->fiscal_data->economic_activity_code[$key]->start_date = $clae->fecha_inicio_actividad;
                    unset($persona->fiscal_data->economic_activity_code[$key]->cod_clae);
                    unset($persona->fiscal_data->economic_activity_code[$key]->descripcion);
                    unset($persona->fiscal_data->economic_activity_code[$key]->fecha_inicio_actividad);
                }

                // FALTA TRADUCIR
                foreach ($inscripciones as $key => $value) {
                    $inscripciones[$key]->fecha_contrato_social = $inscripciones[$key]->fecha_contrato_social;
                    $inscripciones[$key]->numero_inscripcion = $inscripciones[$key]->numero_inscripcion;
                    $inscripciones[$key]->fecha_inscripcion = $inscripciones[$key]->fecha_inscripcion;
                    $inscripciones[$key]->monotributo = $inscripciones[$key]->monotributo;
                    $inscripciones[$key]->inicio_actividad = $inscripciones[$key]->inicio_actividad;
                    $inscripciones[$key]->empleador = $inscripciones[$key]->empleador;
                }
                $persona->fiscal_data->registered_taxes = $inscripciones;

                // FALTA TRADUCIR
                foreach ($impuestos as $key => $value) {
                    $impuestos[$key]->codigo_impuesto = $impuestos[$key]->codigo_impuesto;
                    $impuestos[$key]->nombre_impuesto = $impuestos[$key]->nombre_impuesto;
                    $impuestos[$key]->fecha_inscripcion = $impuestos[$key]->fecha_inscripcion;
                    $impuestos[$key]->estado = $impuestos[$key]->estado;
                }
                $persona->fiscal_data->taxes = $impuestos;

                $persona->fiscal_data->apocryphal_invoices = $apocrifas;
                $persona->fiscal_data->sircreb = $sircreb;
                $persona->fiscal_data->arba = $arba;
            }
        }

        //informacion de bancos
        //if($configuracion->bancos == true){
        $bancos = SQLConnection::backendStoreProcedure('backend_central_deudores', array($cuit, 24, 1));
        $periodo = SQLConnection::backendStoreProcedure('obtener_periodo_maximo', array($cuit), 'selectOne');
        if ($idioma == 'ESP') {
            $persona->periodos = new StdClass();
            $persona->periodos->bancos = Misc::convertirFormatoFecha($periodo->periodo_maximo, 'Y-m-d', 'Ym');
            $persona->bancos = [];
            foreach ($bancos as $key => $value) {

                $persona->bancos[$key] = new StdClass();
                $persona->bancos[$key]->codigo_entidad = $value->codigo_ent;
                $persona->bancos[$key]->nombre_entidad = $value->nombre;
                $persona->bancos[$key]->periodo = $value->fec_inf;
                $persona->bancos[$key]->situacion = $value->situacion;
                $persona->bancos[$key]->monto = $value->total;
                $persona->bancos[$key]->dias_atraso = $value->dia_atraso;
            }
        } elseif ($idioma == 'ENG') {
            $persona->max_bank_information = new StdClass();
            $persona->max_bank_information->period = Misc::convertirFormatoFecha($periodo->periodo_maximo, 'Y-m-d', 'Ym');
            $persona->banks = [];
            foreach ($bancos as $key => $value) {
                $persona->banks[$key] = new StdClass();
                $persona->banks[$key]->bank_code = $value->codigo_ent;
                $persona->banks[$key]->bank_name = $value->nombre;
                $persona->banks[$key]->period = $value->fec_inf;
                $persona->banks[$key]->status = $value->situacion;
                $persona->banks[$key]->amount = $value->total;
                $persona->banks[$key]->days_late = $value->dia_atraso;
            }
        }
        //}
        if ($idioma == 'ESP') {
            $persona->vinculados_segun_bcra = [];
        } elseif ($idioma == 'ENG') {
            $persona->representatives_with_banking_system = [];
        }

        //informacion de cheques
        $cheques = SQLConnection::backendStoreProcedure('obtener_cheques', array($cuit));
        $i = 0;
        foreach ($cheques as $key => $value) {
            if ($value->tipo == 'vinculaciones') {
                if ($idioma == 'ESP') {
                    $persona->vinculados_segun_bcra[$i] = new StdClass();
                    $persona->vinculados_segun_bcra[$i]->nombre_persona_firmante = $value->nombre_persona_firmante;
                    $persona->vinculados_segun_bcra[$i]->cuit_firmante = $value->cuit_firmante;
                    $persona->vinculados_segun_bcra[$i]->nombre_persona_relacionado = $value->nombre_persona_relacionado;
                    $persona->vinculados_segun_bcra[$i]->Cuit_relacionado = $value->Cuit_relacionado;
                    $persona->vinculados_segun_bcra[$i]->cantidad_cheques_firmados = $value->cantidad;
                    $persona->vinculados_segun_bcra[$i]->cantidad_cheques_totales = $value->total_cheques;
                    unset($cheques[$i]);
                    $i += 1;
                } elseif ($idioma == 'ENG') {
                    // FALTA TRADUCIR 
                    $persona->representatives_with_banking_system[$i] = new StdClass();
                    $persona->representatives_with_banking_system[$i]->nombre_persona_firmante = $value->nombre_persona_firmante;
                    $persona->representatives_with_banking_system[$i]->cuit_firmante = $value->cuit_firmante;
                    $persona->representatives_with_banking_system[$i]->nombre_persona_relacionado = $value->nombre_persona_relacionado;
                    $persona->representatives_with_banking_system[$i]->Cuit_relacionado = $value->Cuit_relacionado;
                    $persona->representatives_with_banking_system[$i]->cantidad_cheques_firmados = $value->cantidad;
                    $persona->representatives_with_banking_system[$i]->cantidad_cheques_totales = $value->total_cheques;
                    unset($cheques[$i]);
                    $i += 1;
                }
            } else {
                unset($cheques[$key]->idp);
                unset($cheques[$key]->idppr);
                unset($cheques[$key]->cantidad);
                unset($cheques[$key]->total_cheques);
            }
        }

        if ($idioma == 'ESP') {
            $persona->cheques = $cheques;
        } elseif ($idioma == 'ENG') {
            $persona->bounced_checks = $cheques;
        }

        $score = $respuesta->score;
        if ($idioma == 'ESP') {
            if ($configuracion->score_ic == true) {
                $persona->score = new StdClass();
                $persona->score->valor = $score;
            }
        } elseif ($idioma == 'ENG') {
            if ($configuracion->score_ic == true) {
                $persona->score = new StdClass();
                $persona->score->value = $score;
            }
        }

        if ($idioma == 'ESP') {
            $persona->comex = new StdClass();
        } elseif ($idioma == 'ENG') {
            $persona->comex = new StdClass();
        }
        $impo = SQLConnection::backendStoreProcedure('obtener_comex', array($cuit), 'select');
        $pais = SQLConnection::backendStoreProcedure('obtener_comex_pais', array($cuit), 'select');
        $rubros = SQLConnection::backendStoreProcedure('obtener_comex_rubros', array($cuit), 'select');
        $totales = SQLConnection::backendStoreProcedure('obtener_comex_totales', array($cuit), 'selectOne');
        if ($idioma == 'ESP') {
            $persona->comex->importaciones = [];
            if (! empty($impo)) {
                foreach ($impo as $key => $value) {
                    $persona->comex->importaciones[$key] = new StdClass();
                    $persona->comex->importaciones[$key]->fecha = $value->date;
                    $persona->comex->importaciones[$key]->consumo = $value->consumo;
                    $persona->comex->importaciones[$key]->deposito = $value->deposito;
                    $persona->comex->importaciones[$key]->zonafranca = $value->zonafranca;
                    $persona->comex->importaciones[$key]->temporal = $value->temporal;
                    $persona->comex->importaciones[$key]->total = $value->total;
                }
            }
        } elseif ($idioma == 'ENG') {
            // FALTA TRADUCIR 
            $persona->comex->imports = [];
            if (! empty($impo)) {
                foreach ($impo as $key => $value) {
                    $persona->comex->imports[$key] = new StdClass();
                    $persona->comex->imports[$key]->fecha = $value->date;
                    $persona->comex->imports[$key]->consumo = $value->consumo;
                    $persona->comex->imports[$key]->deposito = $value->deposito;
                    $persona->comex->imports[$key]->zonafranca = $value->zonafranca;
                    $persona->comex->imports[$key]->temporal = $value->temporal;
                    $persona->comex->imports[$key]->total = $value->total;
                }
            }
        }
        if (! empty($pais)) {
            foreach ($pais as $key => $value) {
                $persona->comex->pais[$key] = new StdClass();
                $persona->comex->pais[$key]->tipo_operacion = $value->tipo_operacion;
                $persona->comex->pais[$key]->fob = $value->fob;
                // $persona->comex->pais[$key]->nombre             = $value->nombre; // estaba en www2
            }
        }
        if (! empty($rubros)) {

            foreach ($rubros as $key => $value) {
                $persona->comex->rubros[$key] = new StdClass();
                $persona->comex->rubros[$key]->tipo_operacion = $value->tipo_operacion;
                $persona->comex->rubros[$key]->descripcion = $value->descripcion;
                $persona->comex->rubros[$key]->fob = $value->fob;
                $persona->comex->rubros[$key]->posicion = $value->posicion;
            }
        }
        if (! empty($totales)) {
            if ($idioma == 'ESP') {
                $persona->comex->totales = new StdClass();
                $persona->comex->totales->total_impo = $totales->total_impo;
                $persona->comex->totales->total_expo = $totales->total_expo;
            } elseif ($idioma == 'ENG') {
                $persona->comex->total = new StdClass();
                $persona->comex->total->total_imports = $totales->total_impo;
                $persona->comex->total->total_exports = $totales->total_expo;
            }
        }
        $actor = SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null, 'A', $cuit, 60, 1), 'select');
        $demandado = SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null, 'D', $cuit, 60, 1), 'select');
        if ($idioma == 'ESP') {
            $persona->legales = new StdClass();
            $persona->legales->actor = [];
            $persona->legales->demandado = [];

            foreach ($actor as $key => $value) {
                $persona->legales->actor[$key] = new StdClass();
                $persona->legales->actor[$key]->fecha_causa = $value->fecha_causa;
                $persona->legales->actor[$key]->nombre_causa = $value->nombre_causa;
                $persona->legales->actor[$key]->cuit = $value->cuit_otra_parte;
                $persona->legales->actor[$key]->nombre = $value->nombre_padron_otra_parte;
                $persona->legales->actor[$key]->juzgado = $value->juzgado;
                $persona->legales->actor[$key]->secretaria = $value->secretaria;
            }

            foreach ($demandado as $key => $value) {
                $persona->legales->demandado[$key] = new StdClass();
                $persona->legales->demandado[$key]->fecha_causa = $value->fecha_causa;
                $persona->legales->demandado[$key]->nombre_causa = $value->nombre_causa;
                $persona->legales->demandado[$key]->cuit = $value->cuit_otra_parte;
                $persona->legales->demandado[$key]->nombre = $value->nombre_padron_otra_parte;
                $persona->legales->demandado[$key]->expediente = $value->expediente;
                $persona->legales->demandado[$key]->juzgado = $value->juzgado;
                $persona->legales->demandado[$key]->secretaria = $value->secretaria;

            }

        } elseif ($idioma == 'ENG') {
            $persona->legal = new StdClass();
            $persona->legal->plaintiff = [];
            $persona->legal->defendant = [];
            // FALTA TRADUCIR
            foreach ($actor as $key => $value) {
                $persona->legal->plaintiff[$key] = new StdClass();
                $persona->legal->plaintiff[$key]->fecha_causa = $value->fecha_causa;
                $persona->legal->plaintiff[$key]->nombre_causa = $value->nombre_causa;
                $persona->legal->plaintiff[$key]->cuit = $value->cuit_otra_parte;
                $persona->legal->plaintiff[$key]->nombre = $value->nombre_padron_otra_parte;
                $persona->legal->plaintiff[$key]->juzgado = $value->juzgado;
                $persona->legal->plaintiff[$key]->secretaria = $value->secretaria;
            }
            // FALTA TRADUCIR
            foreach ($demandado as $key => $value) {
                $persona->legal->defendant[$key] = new StdClass();
                $persona->legal->defendant[$key]->fecha_causa = $value->fecha_causa;
                $persona->legal->defendant[$key]->nombre_causa = $value->nombre_causa;
                $persona->legal->defendant[$key]->cuit = $value->cuit_otra_parte;
                $persona->legal->defendant[$key]->nombre = $value->nombre_padron_otra_parte;
                $persona->legal->defendant[$key]->expediente = $value->expediente;
                $persona->legal->defendant[$key]->juzgado = $value->juzgado;
                $persona->legal->defendant[$key]->secretaria = $value->secretaria;

            }

        }
        return json_encode($persona);
    }

    /*Servicios Internos Inicio*/
    //Servicio que obtiene el Score en test NO va a AFIP. En test SERVICIOS_AFIP = false
    public static function obtenerServicioScore($cuit = '', $calcular_balance = true, $constancia_afip = true, )
    {
        if (! $cuit) {
            $cuit = Request::input('cuit');
        }
        $numero_cliente = Request::input('cliente');
        MainController::verificarMongo($cuit);
        $user_id = 0;
        //$p_fisica = (substr($cuit,0,1) == 3) ? false : true;
        $fisica_juridica = Misc::tipoPersona($cuit);
        $p_fisica = ($fisica_juridica == 'F') ? true : false;
        $resp_constancia = [];
        //Si afip es true pasa por afip. 
        if (ENV('SERVICIOS_AFIP') == true) {
            SQLConnection::busquedaPadron($cuit, 1);
            AFIPController::obtenerPadron($cuit, false, 'AR', $constancia_afip);
            $resp_constancia = AFIPController::obtenerConstanciaPDF($cuit);
        } else {

            $resp_constancia['response'] = 'constancia deshabilitado';
            $resp_constancia['constancia_error'] = false;
            // Si es persona fisica y no tenemos ni año ni fecha de nacimiento, y no se la puede completar con el padron electoral, entonces SI va a afip
            if ($p_fisica) {
                $tiene_nac = SQLConnection::obtenerTieneNacimiento($cuit);
                if (isset($tiene_nac->tiene_nacimiento) && $tiene_nac->tiene_nacimiento == 0) {
                    $actualiza = SQLConnection::actualizarDatosConPadron($cuit, $user_id);
                    if (! isset($actualiza->respuesta) || $actualiza->respuesta != 'ok') {
                        SQLConnection::busquedaPadron($cuit, 1);
                        AFIPController::obtenerPadron($cuit, false, 'AR', $constancia_afip);
                    }
                }
            }
        }

        if (self::$revisar_monsanto == true) {
            $resp = SQLConnection::backendStoreProcedure('obtener_contraparte_cuit', array($cuit, 110864291), 'selectOne');
            $contraparte = $resp->contraparte;
            $resp = SQLConnection::backendStoreProcedure('api_detalle_killer', array(110864291, $contraparte), 'selectOne');
            if (isset($resp->detalle_killer) && $resp->detalle_killer != '') {
                self::$monsanto = 'Rechazo por ' . $resp->detalle_killer;
            }
        }
        /* Si está fallecido o Sintomas de vitalidad = 0 o no es argentino, el score da cero */
        $defuncion = SQLConnection::obtenerDefuncion($cuit);
        if (isset($defuncion->fecha_deceso)) {
            self::$monsanto = 'Rechazo por defunción';
            return json_encode(['score' => 0, 'debug_score' => 'Fecha Deceso', 'resp_constancia' => $resp_constancia]);
        }
        $vitalidad = SQLConnection::obtenerSintomasDeVitalidad($cuit);
        if (isset($vitalidad->vitalidad) && $vitalidad->vitalidad == 0) {
            return json_encode(['score' => 0, 'debug_score' => 'Sintomas de Vitalidad', 'resp_constancia' => $resp_constancia]);
        }
        $nacionalidad = Misc::nacionalidad($cuit);
        if ($nacionalidad !== 'AR') {
            return json_encode(['score' => 0, 'debug_score' => 'No es argentino', 'resp_constancia' => $resp_constancia]);
        }
        //

        /* */

        $debug_score = '';
        // Obtener Bancos para calcular si amerita por situación uno y sumar al score
        // Se almacenan en variable de clase para ser reutilizadas en la pestaña de bancos
        $obtener_bancos = SQLConnection::obtenerBancos($cuit);
        $situacion_1 = Misc::ameritaPorSituacionUno($obtener_bancos);
        self::$amerita_situacion_1 = $situacion_1['amerita'];
        self::$cantidad_situacion_1 = $situacion_1['cantidad'];

        $tabla_score = SQLConnection::obtenerTablaScore();

        $tabla_score_ordenada = [];
        $score_ordenado = [];
        /*var_dump($cuit); 
              var_dump($p_fisica); 
              die(); */
        foreach ($tabla_score as $score) {
            $score->cantidad = 0;
            $tabla_score_ordenada[$score->id_grupo][$score->codigo][] = $score;
        }
        $tabla_score_con_cantidades = $tabla_score_ordenada;
        $array_score_general = SQLConnection::obtenerScore($cuit, $p_fisica);
        $score_fiscales = SQLConnection::obtenerScoreFiscales($cuit, $p_fisica);
        $score = 70;
        foreach ($array_score_general as $score_general) {
            if ($score_general->grupo == 2) {
                $score_ordenado[$score_general->grupo][$score_general->codigo][$score_general->fecha][] = $score_general;
            } else {
                $score_ordenado[$score_general->grupo][$score_general->codigo][] = $score_general;
            }
        }
        $porcentaje_por_grupo = SQLConnection::obtenerPorcentajePorGrupo($cuit);
        self::$porcentaje_por_grupo_afectado_por_preferencias = clone $porcentaje_por_grupo;
        $afectacion_score = SQLConnection::obtenerPorcentajeScorePorAfectacion();

        $afectacion_score_ordenada = [];
        foreach ($afectacion_score as $key => $value) {
            $afectacion_score_ordenada[$value->afecta_directo] = $value;
        }
        $link_pdf = env('HOST_NAS') . '/' . substr($cuit, 0, 2) . '/' . substr($cuit, 2, 3) . '/' . substr($cuit, 5, 3) . '/' . $cuit . '.pdf';
        self::$tiene_pdf = file_exists($link_pdf);
        $card_fiscales = '';
        if ($p_fisica) {
            $card_fiscales = SQLConnection::obtenerCardFiscalesPF($cuit);
        } else {
            $card_fiscales = SQLConnection::obtenerCardFiscales($cuit);
        }
        if (! self::$tiene_pdf && sizeof(array($card_fiscales)) == 0) {
            self::$observado = true;
        }

        if ($calcular_balance == true) {
            $score_contables = SQLConnection::obtenerScoreContable($cuit);
            self::$score_contables = $score_contables;
        }
        if ($calcular_balance == true && isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable)) {
            $score = 65.8;
        }

        if (! $p_fisica) {
            $respuesta = self::calcularScorePersonaJuridica($score, $porcentaje_por_grupo, $score_ordenado, $tabla_score_con_cantidades, $afectacion_score_ordenada, $numero_cliente);
        } else {
            self::$cuit = $cuit;
            self::$edad = Misc::obtenerEdadPersonaFisica($cuit);
            if (self::$edad >= 18 || self::$edad == null) {
                $respuesta = self::calcularScorePersonaFisica($score, $porcentaje_por_grupo, $score_ordenado, $tabla_score_con_cantidades, $afectacion_score_ordenada, $numero_cliente);
                $menor_de_edad = false;
            } else {
                $respuesta['score'] = 0;
                $respuesta['afecta_directo'] = [];
                $respuesta['afecta_directo']['total'] = 0;
                $respuesta['afecta_directo']['debug'] = '';
                $respuesta['afecta_indirecto'] = [];
                $respuesta['afecta_indirecto']['debug'] = '';
                $menor_de_edad = true;
            }
        }

        if ($calcular_balance == true && isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable)) {
            $respuesta = self::calcularScoreBalance($respuesta, false, self::$porcentaje_por_grupo_afectado_por_preferencias->contable);
        }

        $respuesta = self::calcularScoreAportes($respuesta);


        if (is_array($respuesta['afecta_indirecto']['debug'])) {
            array_push($respuesta['afecta_indirecto']['debug'], "------------------------------------------------------------");
            array_push($respuesta['afecta_indirecto']['debug'], "Máximo Judicial Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->judicial);
            array_push($respuesta['afecta_indirecto']['debug'], "Máximo Cheques Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cheques);
            array_push($respuesta['afecta_indirecto']['debug'], "Máximo Cendeu Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cendeu);
            array_push($respuesta['afecta_indirecto']['debug'], "Máximo Fiscal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->fiscal);
            array_push($respuesta['afecta_indirecto']['debug'], "Máximo Formal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->formal);
            array_push($respuesta['afecta_indirecto']['debug'], "Máximo Contable Indirecto: " . (isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable) ? self::$porcentaje_por_grupo_afectado_por_preferencias->contable : 0));
        } else {
            $respuesta['afecta_indirecto']['debug'] .= "<br>------------------------------------------------------------";
            $respuesta['afecta_indirecto']['debug'] .= "<br>Máximo Judicial Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->judicial ?? '-';
            $respuesta['afecta_indirecto']['debug'] .= "<br>Máximo Cheques Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cheques ?? '-';
            $respuesta['afecta_indirecto']['debug'] .= "<br>Máximo Cendeu Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cendeu ?? '-';
            $respuesta['afecta_indirecto']['debug'] .= "<br>Máximo Fiscal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->fiscal ?? '-';
            $respuesta['afecta_indirecto']['debug'] .= "<br>Máximo Formal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->formal ?? '-';
            $respuesta['afecta_indirecto']['debug'] .= "<br>Máximo Contable Indirecto: " . (isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable) ? self::$porcentaje_por_grupo_afectado_por_preferencias->contable : 0);
        }
        $score = $respuesta["score"];

        $debug_score = "<br>DETALLE DEL SCORE:";
        if (isset($respuesta['afecta_directo']['debug']) && $respuesta['afecta_directo']['debug'] != '') {
            $debug_score .= "<br>Afectaciones Directas";
            $debug_score .= "<br>Monsanto: " . self::$monsanto . "<br>";
            //$debug_score .= "<br>";
            //echo(var_dump(array($respuesta['afecta_directo']['debug'])));die();
            //$debug_score .= implode('<br>',$respuesta['afecta_directo']['debug']);
            $debug_score .= implode('<br>', array($respuesta['afecta_directo']['debug']));
            $debug_score .= "<br>";
        }
        if (isset($respuesta['afecta_indirecto']['debug']) && $respuesta['afecta_indirecto']['debug'] != '') {
            $debug_score .= "<br>Afectaciones Indirectas";
            $debug_score .= implode('<br>', array($respuesta['afecta_indirecto']['debug']));
        }

        $score = number_format($score, 1);
        $score = ($score >= 100) ? 100 : $score;
        $score = ($score < 0) ? 0 : $score;
        if ($score == 100) {
            $score = 98;
        }
        $debug_score .= '<br><br>SCORE = ' . $score;
        //return $debug_score;
        return json_encode(['score' => $score, 'debug_score' => $debug_score, 'resp_constancia' => $resp_constancia]);
    }

    public static function calcularScorePersonaFisica($score, $porcentaje_por_grupo, $score_ordenado, $tabla_score_con_cantidades, $porcentaje_por_afectacion, $numero_cliente = '')
    {
        $calc_score['score'] = $score;
        $calc_score['afecta_directo'] = [];
        $calc_score['afecta_directo']['total'] = 0;
        $calc_score['afecta_directo']['debug'] = '';
        $calc_score['afecta_indirecto'] = [];
        $calc_score['afecta_indirecto']['debug'] = '';
        $total_indirecto = [];
        $ultima_fuente_cendeu = SQLConnection::backendStoreProcedure('obtener_ultima_fuente', array('cendeu'), 'selectOne');
        $porcentaje_cheques_no_propios = 10;
        foreach ($score_ordenado as $key_grupo => $score_grupo) {
            foreach ($score_grupo as $key_codigo => $score_codigo) {
                if ($key_codigo == 6 || $key_codigo == '') {
                    continue;
                }

                foreach ($score_codigo as $key_item => $score_item) {
                    if ($key_grupo == 2) {
                        foreach ($score_item as $key_fecha => $score_fecha) {
                            $datetime1 = new DateTime($score_fecha->fecha);
                            $datetime2 = new DateTime();
                            $interval = $datetime1->diff($datetime2);
                            $score_fecha->dias = $interval->format('%a');
                            $cantidad = count($score_item);

                            foreach ($tabla_score_con_cantidades[$key_grupo][$key_codigo] as $key_cantidades => $item_cantidades) {

                                if (
                                    $score_fecha->codigo == $item_cantidades->codigo
                                    && ($score_fecha->dias > $item_cantidades->dias_desde
                                        && $score_fecha->dias <= $item_cantidades->dias_hasta)
                                    && ($cantidad >= $item_cantidades->cant_desde
                                        && $cantidad <= $item_cantidades->cant_hasta)
                                ) {

                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidades = $cantidad;
                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidad = $cantidad;
                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->dias = $score_fecha->dias;
                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->relacionado = $score_fecha->relacionado;
                                }
                            }
                        }
                    } else {
                        $datetime1 = new DateTime($score_item->fecha);
                        if ($score_item->grupo == 3) {
                            $datetime2 = new DateTime($ultima_fuente_cendeu->fecha_informacion);
                        } else {
                            $datetime2 = new DateTime();
                        }
                        $interval = $datetime1->diff($datetime2);
                        $score_item->dias = $interval->format('%a');
                        foreach ($tabla_score_con_cantidades[$key_grupo][$key_codigo] as $key_cantidades => $item_cantidades) {
                            if ($key_grupo == 1 || $key_grupo == 3) {
                                if (
                                    $score_item->codigo == $item_cantidades->codigo
                                    && $score_item->dias >= $item_cantidades->dias_desde
                                    && $score_item->dias <= $item_cantidades->dias_hasta
                                ) {
                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidades = $score_item->cantidades;
                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidad += 1;
                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->dias = $score_item->dias;
                                }
                            } else if ($key_grupo == 7 || $key_grupo == 8) {

                                if (
                                    $score_item->codigo == $item_cantidades->codigo
                                    && $score_item->cantidades >= $item_cantidades->cant_desde
                                    && $score_item->cantidades <= $item_cantidades->cant_hasta
                                ) {

                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidades = $score_item->cantidades;
                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidad += 1;
                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->dias = $score_item->dias;
                                }
                            }
                        }
                    }
                }
            }
        }

        foreach ($tabla_score_con_cantidades as $key_grupo => $score_grupo) {
            foreach ($score_grupo as $key_codigo => $score_codigo) {
                if ($key_codigo == 6 || $key_codigo == '') {
                    continue;
                }
                foreach ($score_codigo as $key_item => $score_item) {
                    if ($score_item->cantidad > 0 && $score_item->valor != 0) {
                        if ($score_item->afecta_directo == 1) {

                            /* porcentaje_cheques_no_propios */
                            $aux_afectacion_porcentaje = $porcentaje_por_afectacion[1]->porcentaje;
                            if ($score_item->id_grupo == 2 && isset($score_item->relacionado) && ($score_item->relacionado != '')) {
                                $score_item->valor = (($score_item->valor / $porcentaje_cheques_no_propios));
                            }
                            /* end of porcentaje_cheques_no_propios */

                            $calc_score['afecta_directo']['total'] += ($score_item->valor + ((($score_item->cantidad - 1) * ($score_item->valor / 2)) / 100));

                            //$calc_score['afecta_directo']['debug'][] =  "Le suma: " .($score_item->valor + ((($score_item->cantidad - 1) * ($score_item->valor/2))/100) ) . " al grupo ".$score_item->id_grupo. " código: ".$score_item->codigo. " cantidad ". $score_item->cantidad. ' días '. $score_item->dias . ' valores '. $score_item->cantidades;
                            $calc_score['afecta_directo']['debug'] .= "<br>Le suma: " . ($score_item->valor + ((($score_item->cantidad - 1) * ($score_item->valor / 2)) / 100)) . " al grupo " . $score_item->id_grupo . " código: " . $score_item->codigo . " cantidad " . $score_item->cantidad . ' días ' . $score_item->dias . ' valores ' . $score_item->cantidades;
                        } else if ($score_item->afecta_directo == 0) {

                            /* porcentaje_cheques_no_propios */
                            $aux_afectacion_porcentaje = $porcentaje_por_afectacion[0]->porcentaje;
                            if ($score_item->id_grupo == 2 && isset($score_item->relacionado) && ($score_item->relacionado != '')) {
                                $score_item->valor = (($score_item->valor / $porcentaje_cheques_no_propios));

                            }
                            /* end of porcentaje_cheques_no_propios */

                            $calc_score['afecta_indirecto'][$key_grupo]['total'][] = -1 * ($score_item->valor + ((($score_item->cantidad - 1) * ($score_item->valor / 2)) / 100));
                            $calc_score['afecta_indirecto']['debug'] = "Le suma: " . ($score_item->valor + ((($score_item->cantidad - 1) * ($score_item->valor / 2)) / 100)) . " al grupo " . $score_item->id_grupo . " código: " . $score_item->codigo . " cantidad " . $score_item->cantidad . ' días ' . $score_item->dias . ' valores ' . $score_item->cantidades;
                        }
                    }
                }
            }
        }
        // Se suma el porcentaje solo una vez por cada variable definida en tabla score y solo en caso de situación 1 en todos los bancos.
        if (self::$amerita_situacion_1) {
            /*foreach ($tabla_score_con_cantidades as $key_grupo => $score_grupo) {
              foreach($score_grupo as $key_codigo => $score_codigo) {
                if ($key_codigo == 1){
                  foreach ($score_codigo as $key_item => $score_item) {
                    $cantidad = 1;
      
                    if($cantidad > 0 && $score_item->valor != 0) {
                      if($score_item->afecta_directo == 1) {
                        $calc_score['afecta_directo']['total'] +=  ($score_item->valor + ((($cantidad - 1) * ($score_item->valor/2))/100) * $porcentaje_por_afectacion[1]->porcentaje);
      
                        $calc_score['afecta_directo']['debug'][] =  "Le suma: " .($score_item->valor + ((($cantidad - 1) * ($score_item->valor/2))/100) * $porcentaje_por_afectacion[1]->porcentaje) . " al grupo ".$score_item->id_grupo. " código: ".$score_item->codigo. " cantidad ". $cantidad;
                      } elseif($score_item->afecta_directo == 0){
                        $calc_score['afecta_indirecto'][$key_grupo]['total'][] = -1 * ($score_item->valor + ((($cantidad - 1) * ($score_item->valor/2))/100) * $porcentaje_por_afectacion[0]->porcentaje);
                        $calc_score['afecta_indirecto']['debug'][] =  "Le suma: " .($score_item->valor + ((($cantidad - 1) * ($score_item->valor/2))/100) * $porcentaje_por_afectacion[0]->porcentaje) . " al grupo ".$score_item->id_grupo. " código: ".$score_item->codigo. " cantidad ". $cantidad;
                      }
                    }
                  }
                }
              }
            }*/
        } else {
            // Si existe un registro situación 10 en la tabla score será procesado con dicho valor cuando no sea situación 1 en todos los bancos y periodos.
            foreach ($tabla_score_con_cantidades as $key_grupo => $score_grupo) {
                foreach ($score_grupo as $key_codigo => $score_codigo) {
                    if ($key_codigo == 10) {
                        foreach ($score_codigo as $key_item => $score_item) {
                            $cantidad = 1;

                            if ($cantidad > 0 && $score_item->valor != 0) {
                                if ($score_item->afecta_directo == 1) {
                                    $calc_score['afecta_directo']['total'] += ($score_item->valor + ((($cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[1]->porcentaje);

                                    $calc_score['afecta_directo']['debug'] .= "<br>Le suma: " . ($score_item->valor + ((($cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[1]->porcentaje) . " al grupo " . $score_item->id_grupo . " código: " . $score_item->codigo . " cantidad " . $cantidad;
                                } elseif ($score_item->afecta_directo == 0) {
                                    $calc_score['afecta_indirecto'][$key_grupo]['total'][] = -1 * ($score_item->valor + ((($cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[0]->porcentaje);
                                    $calc_score['afecta_indirecto']['debug'] .= "<br>Le suma: " . ($score_item->valor + ((($cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[0]->porcentaje) . " al grupo " . $score_item->id_grupo . " código: " . $score_item->codigo . " cantidad " . $cantidad;
                                }
                            }
                        }
                    }
                }
            }
        }
        $calc_score['score'] += $calc_score['afecta_directo']['total'];
        foreach ($calc_score['afecta_indirecto'] as $key_grupo => $score_grupo) {
            if ($key_grupo == 'debug') {
                continue;
            }
            $total_indirecto[$key_grupo] = array_sum($score_grupo['total']);
        }

        /*
        foreach($total_indirecto as $key_total => $value_total){
    
          switch($key_total){
            case '1':
              if($value_total > $porcentaje_por_grupo->judicial){
                $calc_score['score'] -= $porcentaje_por_grupo->judicial;
              }else{
                $calc_score['score'] -= $value_total;
              }
              break;
            case '2':
    
              if($value_total > $porcentaje_por_grupo->cheques){
                $calc_score['score'] -= $porcentaje_por_grupo->cheques;
              }else{
                $calc_score['score'] -= $value_total;
              }
              break;
            case '3':
    
              if($value_total > $porcentaje_por_grupo->cendeu){
                $calc_score['score'] -= $porcentaje_por_grupo->cendeu;
              }else{
                $calc_score['score'] -= $value_total;
              }
              break;
            
            case '4':
    
              if($value_total > $porcentaje_por_grupo->fiscal){
                $calc_score['score'] -= $porcentaje_por_grupo->fiscal;
              }else{
                $calc_score['score'] -= $value_total;
              }
              break;
          }
        }
        */

        foreach ($total_indirecto as $key_total => $value_total) {
            switch ($key_total) {
                case '1':
                    if ($value_total > $porcentaje_por_grupo->judicial) {
                        $total_indirecto[$key_total] = $porcentaje_por_grupo->judicial;
                    }
                    break;
                case '2':
                    if ($value_total > $porcentaje_por_grupo->cheques) {
                        $total_indirecto[$key_total] = $porcentaje_por_grupo->cheques;
                    }
                    break;
                case '3':
                    if ($value_total > $porcentaje_por_grupo->cendeu) {
                        $total_indirecto[$key_total] = $porcentaje_por_grupo->cendeu;
                    }
                    break;
                case '4':
                    if ($value_total > $porcentaje_por_grupo->fiscal) {
                        $total_indirecto[$key_total] = $porcentaje_por_grupo->fiscal;
                    }
                    break;
            }
        }
        $total_indirecto = Misc::scorePorPreferencias($total_indirecto, $porcentaje_por_grupo, self::$suma_de_grupos, self::$porcentaje_por_grupo_afectado_por_preferencias, self::$score_contables);
        foreach ($total_indirecto as $key => $value) {
            $calc_score['score'] -= $value;
        }
        if (self::$amerita_situacion_1) {
            $calc_score = Misc::sumaPorSituacionUno($calc_score, self::$cantidad_situacion_1);
        }
        $calc_score = Misc::demeritarScorePorEdad($calc_score, self::$edad);
        $calc_score = Misc::demeritaSiCuitObservado($calc_score, self::$observado);
        $calc_score = Misc::ameritaPorEmpleo($calc_score, self::$cuit);
        return $calc_score;
    }

    //Calculos de Score:
    public static function calcularScorePersonaJuridica($score, $porcentaje_por_grupo, $score_ordenado, $tabla_score_con_cantidades, $porcentaje_por_afectacion, $numero_cliente = '')
    {
        $calc_score['score'] = $score;
        $calc_score['afecta_directo'] = [];
        $calc_score['afecta_directo']['total'] = 0;
        $calc_score['afecta_directo']['debug'] = '';
        $calc_score['afecta_indirecto'] = [];
        $calc_score['afecta_indirecto']['debug'] = '';
        $total_indirecto = [];
        $ultima_fuente_cendeu = SQLConnection::backendStoreProcedure('obtener_ultima_fuente', array('cendeu'), 'selectOne');
        foreach ($score_ordenado as $key_grupo => $score_grupo) {

            foreach ($score_grupo as $key_codigo => $score_codigo) {
                if ($key_codigo == 6 || $key_codigo == '') {
                    continue;
                }
                foreach ($score_codigo as $key_item => $score_item) {
                    if ($key_grupo == 2) {
                        foreach ($score_item as $key_fecha => $score_fecha) {
                            $datetime1 = new DateTime($score_fecha->fecha);
                            $datetime2 = new DateTime();
                            $interval = $datetime1->diff($datetime2);
                            $score_fecha->dias = $interval->format('%a');
                            $cantidad = count($score_item);

                            foreach ($tabla_score_con_cantidades[$key_grupo][$key_codigo] as $key_cantidades => $item_cantidades) {

                                if (
                                    $score_fecha->codigo == $item_cantidades->codigo
                                    && ($score_fecha->dias > $item_cantidades->dias_desde
                                        && $score_fecha->dias <= $item_cantidades->dias_hasta)
                                    && ($cantidad >= $item_cantidades->cant_desde
                                        && $cantidad <= $item_cantidades->cant_hasta)
                                ) {

                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidades = $cantidad;
                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidad = $cantidad;
                                    $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->dias = $score_fecha->dias;
                                }
                            }
                        }
                    } else {
                        $datetime1 = new DateTime($score_item->fecha);
                        if ($score_item->grupo == 3) {
                            $datetime2 = new DateTime($ultima_fuente_cendeu->fecha_informacion);
                        } else {
                            $datetime2 = new DateTime();
                        }
                        $interval = $datetime1->diff($datetime2);
                        $score_item->dias = $interval->format('%a');
                        if (isset($tabla_score_con_cantidades[$key_grupo][$key_codigo])) {
                            foreach ($tabla_score_con_cantidades[$key_grupo][$key_codigo] as $key_cantidades => $item_cantidades) {

                                if ($key_grupo == 1 || $key_grupo == 3) {
                                    if (
                                        $score_item->codigo == $item_cantidades->codigo
                                        && $score_item->dias > $item_cantidades->dias_desde
                                        && $score_item->dias <= $item_cantidades->dias_hasta
                                    ) {
                                        $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidades = $score_item->cantidades;
                                        $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidad += 1;
                                        $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->dias = $score_item->dias;
                                    }

                                } else if ($key_grupo == 7 || $key_grupo == 8) {

                                    if (
                                        $score_item->codigo == $item_cantidades->codigo
                                        && $score_item->cantidades >= $item_cantidades->cant_desde
                                        && $score_item->cantidades <= $item_cantidades->cant_hasta
                                    ) {

                                        $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidades = $score_item->cantidades;
                                        $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->cantidad += 1;
                                        $tabla_score_con_cantidades[$key_grupo][$key_codigo][$key_cantidades]->dias = $score_item->dias;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        foreach ($tabla_score_con_cantidades as $key_grupo => $score_grupo) {
            foreach ($score_grupo as $key_codigo => $score_codigo) {
                if ($key_codigo == 6 || $key_codigo == '') {
                    continue;
                }
                foreach ($score_codigo as $key_item => $score_item) {
                    if ($score_item->cantidad > 0 && $score_item->valor != 0) {
                        if ($score_item->afecta_directo == 1) {

                            $calc_score['afecta_directo']['total'] += ($score_item->valor + ((($score_item->cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[1]->porcentaje);

                            $calc_score['afecta_directo']['debug'] .= "<br>Le suma: " . ($score_item->valor + ((($score_item->cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[1]->porcentaje) . " al grupo " . $score_item->id_grupo . " código: " . $score_item->codigo . " cantidad " . $score_item->cantidad . ' días ' . $score_item->dias . ' valores ' . $score_item->cantidades;
                        } else if ($score_item->afecta_directo == 0) {
                            $calc_score['afecta_indirecto'][$key_grupo]['total'][] = -1 * ($score_item->valor + ((($score_item->cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[0]->porcentaje);
                            $calc_score['afecta_indirecto']['debug'] .= "<br>Le suma: " . ($score_item->valor + ((($score_item->cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[0]->porcentaje) . " al grupo " . $score_item->id_grupo . " código: " . $score_item->codigo . " cantidad " . $score_item->cantidad . ' días ' . $score_item->dias . ' valores ' . $score_item->cantidades;
                        }
                    }
                }
            }
        }

        // Se suma el porcentaje solo una vez por cada variable definida en tabla score y solo en caso de situación 1 en todos los bancos.
        if (self::$amerita_situacion_1) {
            /*foreach ($tabla_score_con_cantidades as $key_grupo => $score_grupo) {
                foreach($score_grupo as $key_codigo => $score_codigo) {
                if ($key_codigo == 1){
                    foreach ($score_codigo as $key_item => $score_item) {
                    $cantidad = 1;

                    if($cantidad > 0 && $score_item->valor != 0) {
                        if($score_item->afecta_directo == 1) {
                        $calc_score['afecta_directo']['total'] +=  ($score_item->valor + ((($cantidad - 1) * ($score_item->valor/2))/100) * $porcentaje_por_afectacion[1]->porcentaje);

                        $calc_score['afecta_directo']['debug'][] =  "Le suma: " .($score_item->valor + ((($cantidad - 1) * ($score_item->valor/2))/100) * $porcentaje_por_afectacion[1]->porcentaje) . " al grupo ".$score_item->id_grupo. " código: ".$score_item->codigo. " cantidad ". $cantidad;
                        } elseif($score_item->afecta_directo == 0){
                        $calc_score['afecta_indirecto'][$key_grupo]['total'][] = -1 * ($score_item->valor + ((($cantidad - 1) * ($score_item->valor/2))/100) * $porcentaje_por_afectacion[0]->porcentaje);
                        $calc_score['afecta_indirecto']['debug'][] =  "Le suma: " .($score_item->valor + ((($cantidad - 1) * ($score_item->valor/2))/100) * $porcentaje_por_afectacion[0]->porcentaje) . " al grupo ".$score_item->id_grupo. " código: ".$score_item->codigo. " cantidad ". $cantidad;
                        }
                    }
                    }
                }
                }
            }*/
        } else {
            // Si existe un registro situación 10 en la tabla score será procesado con dicho valor cuando no sea situación 1 en todos los bancos y periodos.
            foreach ($tabla_score_con_cantidades as $key_grupo => $score_grupo) {
                foreach ($score_grupo as $key_codigo => $score_codigo) {
                    if ($key_codigo == 10) {
                        foreach ($score_codigo as $key_item => $score_item) {
                            $cantidad = 1;

                            if ($cantidad > 0 && $score_item->valor != 0) {
                                if ($score_item->afecta_directo == 1) {
                                    $calc_score['afecta_directo']['total'] += ($score_item->valor + ((($cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[1]->porcentaje);

                                    $calc_score['afecta_directo']['debug'] .= "<br>Le suma: " . ($score_item->valor + ((($cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[1]->porcentaje) . " al grupo " . $score_item->id_grupo . " código: " . $score_item->codigo . " cantidad " . $cantidad;
                                } elseif ($score_item->afecta_directo == 0) {
                                    $calc_score['afecta_indirecto'][$key_grupo]['total'][] = -1 * ($score_item->valor + ((($cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[0]->porcentaje);
                                    $calc_score['afecta_indirecto']['debug'] .= "<br>Le suma: " . ($score_item->valor + ((($cantidad - 1) * ($score_item->valor / 2)) / 100) * $porcentaje_por_afectacion[0]->porcentaje) . " al grupo " . $score_item->id_grupo . " código: " . $score_item->codigo . " cantidad " . $cantidad;
                                }
                            }
                        }
                    }
                }
            }
        }

        $calc_score['score'] += $calc_score['afecta_directo']['total'];
        foreach ($calc_score['afecta_indirecto'] as $key_grupo => $score_grupo) {
            if ($key_grupo == 'debug') {
                continue;
            }
            $total_indirecto[$key_grupo] = array_sum($score_grupo['total']);
        }
        /*foreach($total_indirecto as $key_total => $value_total) {

        switch($key_total) {
            case '1':
            if($value_total > $porcentaje_por_grupo->judicial){
                $calc_score['score'] -= $porcentaje_por_grupo->judicial;
            }else{
                $calc_score['score'] -= $value_total;
            }
            break;
            case '2':

            if($value_total > $porcentaje_por_grupo->cheques){
                $calc_score['score'] -= $porcentaje_por_grupo->cheques;
            }else{
                $calc_score['score'] -= $value_total;
            }
            break;
            case '3':

            if($value_total > $porcentaje_por_grupo->cendeu){
                $calc_score['score'] -= $porcentaje_por_grupo->cendeu;
            }else{
                $calc_score['score'] -= $value_total;
            }
            break;
            
            case '4':

            if($value_total > $porcentaje_por_grupo->fiscal){
                $calc_score['score'] -= $porcentaje_por_grupo->fiscal;
            }else{
                $calc_score['score'] -= $value_total;
            }
            break;
        }
        }*/
        foreach ($total_indirecto as $key_total => $value_total) {
            switch ($key_total) {
                case '1':
                    if ($value_total > $porcentaje_por_grupo->judicial) {
                        $total_indirecto[$key_total] = $porcentaje_por_grupo->judicial;
                    }
                    break;
                case '2':
                    if ($value_total > $porcentaje_por_grupo->cheques) {
                        $total_indirecto[$key_total] = $porcentaje_por_grupo->cheques;
                    }
                    break;
                case '3':
                    if ($value_total > $porcentaje_por_grupo->cendeu) {
                        $total_indirecto[$key_total] = $porcentaje_por_grupo->cendeu;
                    }
                    break;
                case '4':
                    if ($value_total > $porcentaje_por_grupo->fiscal) {
                        $total_indirecto[$key_total] = $porcentaje_por_grupo->fiscal;
                    }
                    break;
            }
        }

        if (self::$amerita_situacion_1) {
            $calc_score = Misc::sumaPorSituacionUno($calc_score, self::$cantidad_situacion_1);
        }

        $total_indirecto = Misc::scorePorPreferencias($total_indirecto, $porcentaje_por_grupo, self::$suma_de_grupos, self::$porcentaje_por_grupo_afectado_por_preferencias, self::$score_contables);
        foreach ($total_indirecto as $key => $value) {
            $calc_score['score'] -= $value;
        }

        return $calc_score;
    }

    /*calcula el score del balance, con el segundo parámetro permite calcular sólo el score sobre balances sin tomar en cuenta
    las otras secciones*/
    public static function calcularScoreBalance($respuesta = [], $calcula_solo_sobre_balances = true, $porcentaje = 100, )
    {
        $cuit = Request::input('cuit');
        $id_balance = Request::input('id_balance');
        if (isset($id_balance) && $id_balance > 0) {
            $cuit = null;
        }
        $score_contables = SQLConnection::backendStoreProcedure('obtener_score_contable_full', array($cuit, $id_balance), 'selectOne');
        //dd($score_contables);
        self::$score_contables = $score_contables;
        if (isset($score_contables->fecha_balance) && ! empty($score_contables->fecha_balance)) {
            if ($calcula_solo_sobre_balances == true) {
                $porcentaje = 100;
            }
            $respuesta = self::calcularScoreContable($respuesta, $score_contables, $porcentaje, $calcula_solo_sobre_balances);
        }
        if ($calcula_solo_sobre_balances == true) {
            $respuesta['antiguedad_balance'] = Misc::calcularDiferenciaEnMeses(Misc::convertirFormatoFecha($score_contables->fecha_balance), date('Y-m-d'));
        }
        if ($respuesta) {
            $respuesta['indices'] = $score_contables;
        }
        return $respuesta;
    }

    public static function insertarTyCTrazabilidad()
    {
        $platform_id = Request::input('platform_id');
        $user_agent = Request::input('user_agent');
        $user_ip = Request::input('user_ip');
        $id_terminos = Request::input('id_terminos');
        $user_id = Request::input('user_id');
        $id_padron = Request::input('id_padron');
        $cliente = Request::input('cliente');
        $exec = SQLConnection::backendStoreProcedure('insertar_tyc_trazabilidad', array($platform_id, $user_agent, $user_ip, $id_terminos, $user_id, $id_padron, $cliente), 'selectOne');
        return $exec->respuesta;
    }

    /* CAME INICIO */
    public static function obtenerTipoCredito()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        return json_encode([['idTipoCredito' => 'P', 'DescripcionTipoCredito' => 'Personal'], ['idTipoCredito' => 'T', 'DescripcionTipoCredito' => 'Tarjeta']]);
    }

    public static function obtenerCaracter()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        return json_encode([
            ['DescripcionCaracter' => 'SOLICITANTE', 'idCaracter' => 'D'],
            ['DescripcionCaracter' => 'GARANTE', 'idCaracter' => 'G']
        ]);
    }

    public static function obtenerMotivosRechazo()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        return json_encode([
            ['DescripcionMotivo' => 'No Opero', 'IdMotivo' => 1],
            ['DescripcionMotivo' => 'Referencia Comercial', 'IdMotivo' => 2],
            ['DescripcionMotivo' => 'Referencia Laboral', 'IdMotivo' => 3],
            ['DescripcionMotivo' => 'Pendiente', 'IdMotivo' => 4]
        ]);
    }

    public static function obtenerMotivosAtraso()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        return json_encode([
            ['DescripcionAtraso' => 'CUOTAS ATRASADAS', 'IdAtraso' => 1],
            ['DescripcionAtraso' => 'COBRO JUDICIAL', 'IdAtraso' => 5],
            ['DescripcionAtraso' => 'DESAPARECIDO', 'IdAtraso' => 6]
        ]);
    }

    public static function rechazarInforme()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        $InformeId = Request::input('InformeId');
        $IdMotivo = Request::input('IdMotivo');
        return json_encode([
            'Status' => 'OK',
            'StatusCode' => 0
        ]);
    }

    public static function acordarInforme()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        $id_motivo = Request::input('idMotivo');
        $informe_id = Request::input('InformeId');
        $id_tipo_credito = Request::input('idTipoCredito');
        $id_caracter = Request::input('idCaracter');
        $numero_credito = Request::input('NumeroCredito');
        $importe = Request::input('Importe');
        $cuotas = Request::input('Cuotas');
        $importe_cuota = Request::input('ImporteCuota');
        $FechaVto = Request::input('FechaVto');
        return json_encode([
            'Status' => 'OK',
            'StatusCode' => 0
        ]);
    }


    public static function desafectarInforme()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        $informe_id = Request::input('InformeId');
        return json_encode([
            'Status' => 'OK',
            'StatusCode' => 0
        ]);
    }

    public static function afectarInforme()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        $informe_id = Request::input('InformeId');
        $importe = Request::input('Importe');
        $cuotas = Request::input('Cuotas');
        $importe_cuota = Request::input('ImporteCuota');
        $id_atraso = Request::input('idAtraso');
        return json_encode([
            'Status' => 'OK',
            'StatusCode' => 0
        ]);
    }

    public static function visualizarSemaforo()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        if (empty($usuario_id)) {
            return json_encode([
                'Status' => 'ERROR',
                'StatusCode' => 1
            ]);
        }
        $data = [];
        $listado = SQLConnection::backendStoreProcedure('monitoreo_por_referencia_listar', array($usuario_id));
        foreach ($listado as $key => $value) {
            $data[$key] = new stdClass();
            $data[$key]->Cuil = $value->cuit;
            $data[$key]->Nombre = $value->nombre;
            $data[$key]->Color = $value->color;
            $data[$key]->Localidad = $value->localidad;
            $data[$key]->Provincia = $value->provincia;
            $data[$key]->FechaNacimiento = $value->fecha_nacimiento;
        }
        return json_encode($data);
    }

    public static function registrarCliente()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        $persona_cuil = Request::input('PersonaCuil');

        if (empty($usuario_id) || empty($clave) || empty($persona_cuil)) {
            return json_encode([
                'Status' => 'ERROR',
                'StatusCode' => 1
            ]);
        }
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $client_id = $usuario->cliente['client_id'];
        $respuesta = json_decode(self::obtenerServicioScore($persona_cuil, true, false));
        $score = $respuesta->score;
        $monitoreo = SQLConnection::backendStoreProcedure('monitoreo_por_referencia_agregar', array($usuario_id, $persona_cuil, $client_id, $user_id, $score), true);

        if ($monitoreo->respuesta == 'error') {
            return json_encode([
                'Status' => 'ERROR',
                'StatusCode' => 1
            ]);
        }

        return json_encode([
            'Status' => 'OK',
            'StatusCode' => 0
        ]);
    }

    ///// Informe Comercial JSON V2 /////////
    public static function InformeComercialTradV2()
    {
        $usuario = Session::get('usuario');
        $cliente = $usuario->cliente['client_id'];

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

        if (isset($_POST['cuit'])) {
            $cuit = Request::input('cuit');
            $apikey = Request::input('apikey');
            $json_ic = self::ObtenerInformeComercialCompletoV2($cuit, $apikey, 'ENG');
        }
        /*
              if ( isset($json_ic)){
                  $json_trad = self::ICTranslator($json_ic,'ENG');
              }
              return $json_trad;
              */
        return $json_ic;
    }

    public static function anularRegistro()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        $persona_cuil = Request::input('PersonaCuil');

        if (empty($usuario_id) || empty($clave) || empty($persona_cuil)) {
            return json_encode([
                'Status' => 'ERROR',
                'StatusCode' => 1
            ]);
        }
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $client_id = $usuario->cliente['client_id'];
        $monitoreo = SQLConnection::backendStoreProcedure('monitoreo_por_referencia_eliminar', array($usuario_id, $persona_cuil, $client_id, $user_id), true);

        return json_encode([
            'Status' => 'OK',
            'StatusCode' => 0
        ]);
    }

    public static function listaPersonas()
    {
        $persona_cuil = Request::input('Cuil');
        $persona_nombre = Request::input('Nombre');
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        $busqueda_por_cuit = false;
        $persona_cuil = trim($persona_cuil);
        $persona_nombre = trim($persona_nombre);
        if (empty($persona_cuil) && empty($persona_nombre)) {
            return json_encode([
                'Status' => 'Error cuil o nombre',
                'StatusCode' => 1
            ]);
        }
        if (strlen($persona_cuil) == 11 && is_numeric($persona_cuil)) {
            $busqueda_por_cuit = true;
        }

        $respuesta = [];
        if ($busqueda_por_cuit == true) {
            $respuesta = json_decode(self::obtenerBuscadorCompleto($persona_cuil, '', $usuario_id));
        } else {
            if (strlen($persona_nombre) > 2) {
                $respuesta = json_decode(self::obtenerBuscadorCompleto('', $persona_nombre, $usuario_id));
            } else {
                return json_encode([
                    'Status' => 'la cantidad de caracteres del nombre debe ser igual o mayor a 3 caracteres',
                    'StatusCode' => 1
                ]);
            }
        }
        $data = [];
        foreach ($respuesta as $key => $value) {
            $data[$key] = new stdClass();
            $data[$key]->Cuil = $value->identificacion;
            $data[$key]->Nombre = $value->nombre_persona;
            $data[$key]->Documento = $value->cuerpo_clave;
            $data[$key]->Sexo = $value->sexo;
            $data[$key]->Provincia = $value->provincia;
            $data[$key]->Localidad = $value->localidad;
            $data[$key]->Color = '';
            $data[$key]->FechaNacimiento = $value->fecha_nacimiento;
        }
        return json_encode($data);
    }

    public static function registrarUsuario()
    {
        $usuario_id = Request::input('UsuarioId');
        $clave = Request::input('Clave');
        return json_encode([
            'Status' => 'OK',
            'StatusCode' => 0
        ]);
    }
    /* CAME FIN */

    public static function obtenerBuscadorCompleto($cuit = '', $nombre = '', $user_id = '')
    {
        if (! $cuit) {
            $cuit = trim(Request::input('cuit'));
        }
        if (! $nombre) {
            $nombre = trim(Request::input('name'));
        }
        if (! $user_id) {
            $user_id = trim(Request::input('user_id'));
        }
        $nombre = str_replace("'", "", $nombre);
        $nombre = str_replace('"', '', $nombre);
        $nombre_buscado = $nombre;

        $max_rows = 50;
        $respuesta = [];

        if (! $cuit && ! $nombre) {
            $message = ['error' => true, 'error_message' => 'Se debe envíar almenos 1 cuit o nombre para comenzar la búsqueda.'];
            return json_encode($message);
        }

        //obtenerAFIP.
        if (! empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }

        //CREDITSAFE.
        if ($cuit) {
            $cuit_length = strlen((string) $cuit);
            $message = ['error' => true, 'error_message' => 'el cuit debe tener 11 caracteres para ser válido.'];
            if ($cuit_length < 11) {
                return json_encode($message);
            }
            $respuesta = SQLConnection::backendStoreProcedure('api_busqueda_padron_completa', array('CUIT', $cuit, $max_rows));
            //SQLConnection::consumirServicio($user_id,$cuit,43);
        } elseif ($nombre) {
            $nombre_length = strlen((string) $nombre);
            $message = ['error' => true, 'error_message' => 'El nombre debe contener almenos 3 caracteres para ser válido'];
            if ($nombre_length < 3) {
                return json_encode($message);
            }
            $nombre = Misc::parsearBusquedaPadron($nombre);
            $respuesta = SQLConnection::backendStoreProcedure('api_busqueda_padron_completa', array('NOMBRE', $nombre, $max_rows));
            //SQLConnection::consumirServicio($user_id,substr($nombre_buscado, 0, 19),43);
        }

        return json_encode($respuesta);
    }

    //calcula el score sin tomar en cuenta el balance.
    public static function calcularScoreSinBalance()
    {
        $cuit = Request::input('cuit');
        return self::obtenerServicioScore($cuit, false);
    }

 public static function calcularScoreContable($respuesta,$item,$porcentaje_contable,$calcula_solo_sobre_balances){
        
  
        if(!isset($respuesta['score'])){
            $score = 0;
        }else{
            $score = $respuesta['score'];
        }
    
        if(empty($respuesta['afecta_indirecto']['debug']) || !array($respuesta['afecta_indirecto']['debug'])){
            //$respuesta['afecta_indirecto']['debug'] = []; 
        }
        /* 18/10/2024: arrancamos siempre de 100: Se cambio la forma de como afecta al score el score de balance */
        $porcentaje_contable = 100;
        /**/
        $respuesta['afecta_directo']['debug'] = '<br>--';
        $respuesta['afecta_indirecto']['debug'] = '';
        
        $demeritador = SQLConnection::CalcularScoreContable(
        5,
        $item->liquidez_corriente,
        $item->solvencia_patrimonial,
        $item->endeudamiento_corriente,
        $item->capital_de_trabajo_activo,
        $item->rentabilidad_bruta,
        $item->utilidad_neta
        );
        $res = 0;
        $liquidez_corriente       =0;
        $solvencia_patrimonial =0;
        $endeudamiento_corriente =0;
        $capital_de_trabajo_activo =0;
        $rentabilidad_bruta =0;
        $utilidad_neta =0;
        
    
    
        if($demeritador->liquidez_corriente != 0){
            $liquidez_corriente += (($porcentaje_contable / 100 ) * 17.6/100 * ($demeritador->liquidez_corriente*10));
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . number_format($liquidez_corriente,2) .  " de 17.6 Liquidez Corriente, el valor sobre el puntaje que le dió fue: ".$demeritador->liquidez_corriente." para el grupo 5 Contables";
        if($demeritador->endeudamiento_corriente != 0){
            $endeudamiento_corriente += (($porcentaje_contable / 100) * 16.2/100 * ($demeritador->endeudamiento_corriente*10));
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . number_format($endeudamiento_corriente,2) . " de 16.2 endeudamiento_corriente, el valor sobre el puntaje que le dió fue: ".$demeritador->endeudamiento_corriente."   para el grupo 5 Contables";
            
        if($demeritador->solvencia_patrimonial != 0){
            $solvencia_patrimonial += (($porcentaje_contable / 100) * 22.6/100 * ($demeritador->solvencia_patrimonial*10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$solvencia_patrimonial. " de 22.6 solvencia_patrimonial  , el valor sobre el puntaje que le dió fue: ".$demeritador->solvencia_patrimonial."  para el grupo 5 Contables");
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . number_format($solvencia_patrimonial,2) . " de 22.6 solvencia_patrimonial, el valor sobre el puntaje que le dió fue: ".$demeritador->solvencia_patrimonial." para el grupo 5 Contables";
        
        if($demeritador->capital_de_trabajo_activo != 0){
            $capital_de_trabajo_activo += (($porcentaje_contable / 100) * 10.4/100 * ($demeritador->capital_de_trabajo_activo*10));
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " .number_format($capital_de_trabajo_activo,2) . " de 10.4 capital_de_trabajo_activo, el valor sobre el puntaje que le dió fue: ".$demeritador->capital_de_trabajo_activo." para el grupo 5 Contables";
    
        if($demeritador->rentabilidad_bruta != 0){
            $rentabilidad_bruta += (($porcentaje_contable / 100) * 8.8/100 * ($demeritador->rentabilidad_bruta*10));
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . number_format($rentabilidad_bruta,2) . " de 8.8 rentabilidad_bruta, el valor sobre el puntaje que le dió fue: ".$demeritador->rentabilidad_bruta." para el grupo 5 Contables";
        
        if($demeritador->utilidad_neta != 0){
            $utilidad_neta += (($porcentaje_contable / 100) * 24.5/100 * ($demeritador->utilidad_neta*10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$utilidad_neta. " de 24.5 utilidad_neta  , el valor sobre el puntaje que le dió fue: ".$demeritador->utilidad_neta."  para el grupo 5 Contables");
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . number_format($utilidad_neta,2) . " de 24.5 utilidad_neta, el valor sobre el puntaje que le dió fue: ".$demeritador->utilidad_neta. " para el grupo 5 Contables";
        
        $res = $liquidez_corriente+$solvencia_patrimonial+$endeudamiento_corriente+$capital_de_trabajo_activo+$rentabilidad_bruta+$utilidad_neta;
        if($res > $porcentaje_contable){
            $res = $porcentaje_contable;
        }
        
    
        $respuesta['afecta_indirecto']['debug'] .= "<br>Score Contables : ". number_format($res,2);
    
        if ($calcula_solo_sobre_balances==true)
        {
            $score = number_format($res,2);
            $respuesta = []; 
        }
        else 
        {
            $porcentaje = SQLConnection::backendStoreProcedure('obtener_porcentaje_score_balance',array($res),'selectOne');
            if (isset($porcentaje->valor))
            {
                $respuesta['afecta_indirecto']['debug'] .= " - Afecta: " .  number_format($porcentaje->valor,2) . "%";
                $porcentaje->valor = $porcentaje->valor * (self::$porcentaje_por_grupo_afectado_por_preferencias->contable ?? 1) / 100; 
                $respuesta['afecta_indirecto']['debug'] .= " -> Por preferencias usuario: " . number_format($porcentaje->valor,2) . "%";
                $score += ($score * $porcentaje->valor / 100);
        
            }
            $respuesta['afecta_indirecto']['debug'] .= '<br>Le aplica un ' . (number_format($porcentaje->valor,2) ?? 0). '% al score'; 
        }
        $respuesta['score'] = $score;
        return $respuesta;
    }    

    public static function calcularScoreContable30122024($respuesta, $item, $porcentaje_contable, $calcula_solo_sobre_balances)
    {

        if (! isset($respuesta['score'])) {
            $score = '';
        } else {
            $score = $respuesta['score'];
        }

        if (empty($respuesta['afecta_indirecto']['debug']) || ! array($respuesta['afecta_indirecto']['debug'])) {
            //$respuesta['afecta_indirecto']['debug'] = []; 
        }

        $respuesta['afecta_indirecto']['debug'] .= '<br>BALANCE: Porcentaje: ' . $porcentaje_contable;

        $demeritador = SQLConnection::CalcularScoreContable(
            5,
            $item->liquidez_corriente,
            $item->solvencia_patrimonial,
            $item->endeudamiento_corriente,
            $item->capital_de_trabajo_activo,
            $item->rentabilidad_bruta,
            $item->utilidad_neta
        );
        $res = 0;
        $liquidez_corriente = 0;
        $solvencia_patrimonial = 0;
        $endeudamiento_corriente = 0;
        $capital_de_trabajo_activo = 0;
        $rentabilidad_bruta = 0;
        $utilidad_neta = 0;


        $respuesta['afecta_indirecto']['debug'] .= '<br>liquidez_corriente: ' . $item->liquidez_corriente;
        $respuesta['afecta_indirecto']['debug'] .= '<br>solvencia_patrimonial: ' . $item->solvencia_patrimonial;
        $respuesta['afecta_indirecto']['debug'] .= '<br>endeudamiento_corriente: ' . $item->endeudamiento_corriente;
        $respuesta['afecta_indirecto']['debug'] .= '<br>capital_de_trabajo_activo: ' . $item->capital_de_trabajo_activo;
        $respuesta['afecta_indirecto']['debug'] .= '<br>rentabilidad_bruta: ' . $item->rentabilidad_bruta;
        $respuesta['afecta_indirecto']['debug'] .= '<br>utilidad_net: ' . $item->utilidad_neta;

        $respuesta['afecta_indirecto']['debug'] .= '<br>Demeritador liquidez_corriente: ' . $demeritador->liquidez_corriente;
        $respuesta['afecta_indirecto']['debug'] .= '<br>Demeritador solvencia_patrimonial: ' . $demeritador->solvencia_patrimonial;
        $respuesta['afecta_indirecto']['debug'] .= '<br>Demeritador endeudamiento_corriente: ' . $demeritador->endeudamiento_corriente;
        $respuesta['afecta_indirecto']['debug'] .= '<br>Demeritador capital_de_trabajo_activo: ' . $demeritador->capital_de_trabajo_activo;
        $respuesta['afecta_indirecto']['debug'] .= '<br>Demeritador rentabilidad_bruta: ' . $demeritador->rentabilidad_bruta;
        $respuesta['afecta_indirecto']['debug'] .= '<br>Demeritador utilidad_net: ' . $demeritador->utilidad_neta;


        if ($demeritador->liquidez_corriente != 0) {
            $liquidez_corriente += (($porcentaje_contable / 100) * 17.6 / 100 * ($demeritador->liquidez_corriente * 10));
            //echo(var_dump($respuesta['afecta_indirecto']['debug']));die();
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$liquidez_corriente.  " de 17.6  Liquidez Corriente , el valor sobre el puntaje que le dió fue: ".$demeritador->liquidez_corriente." para el grupo 5 Contables");
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . $liquidez_corriente . " de 17.6  Liquidez Corriente , el valor sobre el puntaje que le dió fue: " . $demeritador->liquidez_corriente . " para el grupo 5 Contables";
        if ($demeritador->endeudamiento_corriente != 0) {
            $endeudamiento_corriente += (($porcentaje_contable / 100) * 16.2 / 100 * ($demeritador->endeudamiento_corriente * 10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$endeudamiento_corriente. " de 16.2 endeudamiento_corriente  , el valor sobre el puntaje que le dió fue: ".$demeritador->endeudamiento_corriente."  para el grupo 5 Contables");
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . $endeudamiento_corriente . " de 16.2 endeudamiento_corriente  , el valor sobre el puntaje que le dió fue: " . $demeritador->endeudamiento_corriente . "  para el grupo 5 Contables";

        if ($demeritador->solvencia_patrimonial != 0) {
            $solvencia_patrimonial += (($porcentaje_contable / 100) * 22.6 / 100 * ($demeritador->solvencia_patrimonial * 10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$solvencia_patrimonial. " de 22.6 solvencia_patrimonial  , el valor sobre el puntaje que le dió fue: ".$demeritador->solvencia_patrimonial."  para el grupo 5 Contables");
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . $solvencia_patrimonial . " de 22.6 solvencia_patrimonial  , el valor sobre el puntaje que le dió fue: " . $demeritador->solvencia_patrimonial . "  para el grupo 5 Contables";

        if ($demeritador->capital_de_trabajo_activo != 0) {
            $capital_de_trabajo_activo += (($porcentaje_contable / 100) * 10.4 / 100 * ($demeritador->capital_de_trabajo_activo * 10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$capital_de_trabajo_activo. " de 10.4 capital_de_trabajo_activo  , el valor sobre el puntaje que le dió fue: ".$demeritador->capital_de_trabajo_activo."  para el grupo 5 Contables");
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . $capital_de_trabajo_activo . " de 10.4 capital_de_trabajo_activo  , el valor sobre el puntaje que le dió fue: " . $demeritador->capital_de_trabajo_activo . "  para el grupo 5 Contables";

        if ($demeritador->rentabilidad_bruta != 0) {
            $rentabilidad_bruta += (($porcentaje_contable / 100) * 8.8 / 100 * ($demeritador->rentabilidad_bruta * 10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$rentabilidad_bruta. " de 8.8 rentabilidad_bruta  , el valor sobre el puntaje que le dió fue: ".$demeritador->rentabilidad_bruta."  para el grupo 5 Contables");
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . $rentabilidad_bruta . " de 8.8 rentabilidad_bruta  , el valor sobre el puntaje que le dió fue: " . $demeritador->rentabilidad_bruta . "  para el grupo 5 Contables";

        if ($demeritador->utilidad_neta != 0) {
            $utilidad_neta += (($porcentaje_contable / 100) * 24.5 / 100 * ($demeritador->utilidad_neta * 10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$utilidad_neta. " de 24.5 utilidad_neta  , el valor sobre el puntaje que le dió fue: ".$demeritador->utilidad_neta."  para el grupo 5 Contables");
        }
        $respuesta['afecta_indirecto']['debug'] .= "<br>Le suma " . $utilidad_neta . " de 24.5 utilidad_neta  , el valor sobre el puntaje que le dió fue: " . $demeritador->utilidad_neta . "  para el grupo 5 Contables";

        $res = $liquidez_corriente + $solvencia_patrimonial + $endeudamiento_corriente + $capital_de_trabajo_activo + $rentabilidad_bruta + $utilidad_neta;
        if ($res > $porcentaje_contable) {
            $res = $porcentaje_contable;
        }

        //array_push($respuesta['afecta_indirecto']['debug'], "Le suma en total a Contables : ".$res);
        $respuesta['afecta_indirecto']['debug'] .= "<br><br>Le suma en total a Contables : " . $res;

        $score += $res;
        $respuesta['score'] = $score;
        return $respuesta;
    }

    public static function consumir_servicio($cuit, $producto = null, $id_externo = null)
    {
        $p_ip = $_SERVER['REMOTE_ADDR'];
        $p_url = $_SERVER['REQUEST_URI'];
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        if ($producto == NULL) {
            $producto = $usuario->producto;
        }
        $resp = SQLConnection::backendStoreProcedure('consumir_servicio_API', array($user_id, $cuit, $producto, $p_ip, $p_url, $id_externo), 'selectOne');
        return $resp;
    }

    // Funcion que compara 2 domicilios 
    public static function funcion_compara_domicilios($street_name1, $street_number1, $floor1, $apartment1, $city1, $state1, $country1, $street_name2, $street_number2, $floor2, $apartment2, $city2, $state2, $country2)
    {
        $street_name1 = self::acentos_enies($street_name1) ?? '';
        $street_number1 = self::acentos_enies($street_number1) ?? '';
        $floor1 = self::acentos_enies($floor1) ?? '';
        $apartment1 = self::acentos_enies($apartment1) ?? '';
        $city1 = self::acentos_enies($city1) ?? '';
        $state1 = self::acentos_enies($state1) ?? '';
        $country1 = self::acentos_enies($country1) ?? '';

        $street_name2 = self::acentos_enies($street_name2) ?? '';
        $street_number2 = self::acentos_enies($street_number2) ?? '';
        $floor2 = self::acentos_enies($floor2) ?? '';
        $apartment2 = self::acentos_enies($apartment2) ?? '';
        $city2 = self::acentos_enies($city2) ?? '';
        $state2 = self::acentos_enies($state2) ?? '';
        $country2 = self::acentos_enies($country2) ?? '';

        $country_validation = '';
        $street_name_validation = '';
        $state_validation = '';
        $city_validation = '';
        $street_number_validation = '';
        $floor_validation = '';
        $apartment_validation = '';

        if ($state1 == 'CIUDAD AUTONOMA DE BUENOS AIRES' || $state1 == 'CIUDAD AUTONOMA BUENOS AIRES' || $state1 == 'CIUDAD DE BUENOS AIRES' || $state1 == 'CIUDAD BUENOS AIRES' || $state1 == 'CABA' || $state1 == 'C.A.B.A.' || $state1 == 'CAPITAL FEDERAL') {
            $state1 = 'CIUDAD AUTONOMA DE BUENOS AIRES';
        }

        if ($state2 == 'CIUDAD AUTONOMA DE BUENOS AIRES' || $state2 == 'CIUDAD AUTONOMA BUENOS AIRES' || $state2 == 'CIUDAD DE BUENOS AIRES' || $state2 == 'CIUDAD BUENOS AIRES' || $state2 == 'CABA' || $state2 == 'C.A.B.A.' || $state2 == 'CAPITAL FEDERAL') {
            $state2 = 'CIUDAD AUTONOMA DE BUENOS AIRES';
        }

        if ($city1 == 'CIUDAD AUTONOMA DE BUENOS AIRES' || $city1 == 'CIUDAD AUTONOMA BUENOS AIRES' || $city1 == 'CIUDAD DE BUENOS AIRES' || $city1 == 'CIUDAD BUENOS AIRES' || $city1 == 'CABA' || $city1 == 'C.A.B.A.' || $city1 == 'CAPITAL FEDERAL') {
            $state1 = 'CIUDAD AUTONOMA DE BUENOS AIRES';
        }

        if ($city2 == 'CIUDAD AUTONOMA DE BUENOS AIRES' || $city2 == 'CIUDAD AUTONOMA BUENOS AIRES' || $city2 == 'CIUDAD DE BUENOS AIRES' || $city2 == 'CIUDAD BUENOS AIRES' || $city2 == 'CABA' || $city2 == 'C.A.B.A.' || $city2 == 'CAPITAL FEDERAL') {
            $state2 = 'CIUDAD AUTONOMA DE BUENOS AIRES';
        }

        try {
            $levenshtein_nombre_calle = levenshtein($street_name1, $street_name2);
            $levenshtein_provincia = levenshtein($state1, $state2);
            $levenshtein_localidad = levenshtein($city1, $city2);

        } catch (\Throwable $th) {
            $levenshtein_nombre_calle = 2;
            $levenshtein_provincia = 2;
            $levenshtein_localidad = 2;
        }

        $country_validation = empty($country1) ? '' : ((($country1 == $country2) || ($country1 == 'AR' && $country2 == 'ARGENTINA') || ($country1 == 'ARGENTINA' && $country2 == 'AR')) ? 'TRUE' : 'FALSE');

        $street_name_validation = empty($street_name1) ? '' : (($levenshtein_nombre_calle == 0 || $levenshtein_nombre_calle == 1) ? 'TRUE' : 'FALSE');

        $state_validation = empty($state1) ? '' : (($levenshtein_provincia == 0 || $levenshtein_provincia == 1) ? 'TRUE' : 'FALSE');

        $city_validation = empty($city1) ? '' : (($levenshtein_localidad == 0 || $levenshtein_localidad == 1) ? 'TRUE' : 'FALSE');

        $street_number_validation = empty($street_number1) ? '' : (($street_number1 == $street_number2) ? 'TRUE' : 'FALSE');

        $floor_validation = empty($floor1) ? '' : (($floor1 == $floor2) ? 'TRUE' : 'FALSE');

        $apartment_validation = empty($apartment1) ? '' : (($apartment1 == $apartment2) ? 'TRUE' : 'FALSE');

        $result = array(
            'country_code_validation' => $country_validation,
            'state_validation' => $state_validation,
            'city_validation' => $city_validation,
            'street_name_validation' => $street_name_validation,
            'street_number_validation' => $street_number_validation,
            'floor_validation' => $floor_validation,
            'apartment_validation' => $apartment_validation

        );

        return $result;
    }

    public static function eliminar_acentos($cadena)
    {
        //Reemplazamos la A y a
        $cadena = str_replace(
            array('Á', 'À', 'Â', 'Ä', 'á', 'à', 'ä', 'â', 'ª'),
            array('A', 'A', 'A', 'A', 'a', 'a', 'a', 'a', 'a'),
            $cadena
        );

        //Reemplazamos la E y e
        $cadena = str_replace(
            array('É', 'È', 'Ê', 'Ë', 'é', 'è', 'ë', 'ê'),
            array('E', 'E', 'E', 'E', 'e', 'e', 'e', 'e'),
            $cadena
        );

        //Reemplazamos la I y i
        $cadena = str_replace(
            array('Í', 'Ì', 'Ï', 'Î', 'í', 'ì', 'ï', 'î'),
            array('I', 'I', 'I', 'I', 'i', 'i', 'i', 'i'),
            $cadena
        );

        //Reemplazamos la O y o
        $cadena = str_replace(
            array('Ó', 'Ò', 'Ö', 'Ô', 'ó', 'ò', 'ö', 'ô'),
            array('O', 'O', 'O', 'O', 'o', 'o', 'o', 'o'),
            $cadena
        );

        //Reemplazamos la U y u
        $cadena = str_replace(
            array('Ú', 'Ù', 'Û', 'Ü', 'ú', 'ù', 'ü', 'û'),
            array('U', 'U', 'U', 'U', 'u', 'u', 'u', 'u'),
            $cadena
        );

        return $cadena;
    }

    //-- SE USA EN COMPLEMENTO CON obtenerPadronForzado 
    private static function BuscarCuit_Forzado($dni, $posibles = 'N')
    {
        /* 01/10/2020 */
        /* Busca CUITs en el padron, para ese dni, y lo pasa por AFIP */
        /* Segundo parametro 'S' busca siempre otros posibles CUITs que no estén en el padrón */
        /* o si no lo encuetra en Padrón busca si o si los posibles CUITs para ese DNI */
        $cuits = SQLConnection::backendStoreProcedure('dni_buscar_cuit_segun_dni', array($dni));
        foreach ($cuits as $key => $value) {
            //echo($value->cuit."<br>");
            AFIPController::obtenerPadronForzado($value->cuit, true, 'AR', false);
        }
        //echo(var_dump($cuits)); die();
        if ($posibles == 'S' && sizeof($cuits) == 0) {
            $cuitp = SQLConnection::backendStoreProcedure('dni_buscar_cuit_posible', array($dni, 'N'));
            foreach ($cuitp as $key => $value) {
                AFIPController::obtenerPadronForzado($value->cuit, true, 'AR', false);
            }
            return $cuitp;
        }
        return $cuits;
    }

    //---------------------------------------------  API SOLO RENAPER  --------------------------------------------------------------------------------------------------------//
    public static function soloRenaperGBG($dni_interno = null, $sexo_interno = null)
    {
        $usuario = Session::get('usuario');
        $res_renaper = null;
        $fechaParaValidar = '';
        $generoParaValidar = '';
        $forzado = 'N';

        //-- Validamos que el usuario tenga el producto habilitado
        //-- Si dni no es null, quiere decir que viene de una llamada interna
        if ($usuario->producto == env('NRO_PRODUCTO_SOLO_RENAPER') || $dni_interno !== null) {
            //-- Parametros minimos requeridos
            if ($dni_interno !== null) {
                $dni = $dni_interno;
                $generoRecibido = trim($sexo_interno);
                $fecha_emision_recivida = '';
                $fecha_expiracion_emitida = '';
                $copia = '';
                $idMainIssue = '';
            } else {
                $dni = trim((isset($_POST['national_id']) ? $_POST['national_id'] : (isset($_POST['NATIONAL_ID']) ? $_POST['NATIONAL_ID'] : '')));
                $generoRecibido = trim((isset($_POST['gender']) ? $_POST['gender'] : (isset($_POST['GENDER']) ? $_POST['GENDER'] : '')));

                //-- Parametros opcionales que se van a evaluar luego a 'TRUE' o 'FALSE' en el Misc.php
                $fecha_emision_recivida = trim((isset($_POST['issue_date']) ? $_POST['issue_date'] : (isset($_POST['ISSUE_DATE']) ? $_POST['ISSUE_DATE'] : '')));
                $fecha_expiracion_emitida = trim((isset($_POST['expiry_date']) ? $_POST['expiry_date'] : (isset($_POST['EXPIRY_DATE']) ? $_POST['EXPIRY_DATE'] : '')));
                $copia = trim((isset($_POST['copy']) ? $_POST['copy'] : (isset($_POST['COPY']) ? $_POST['COPY'] : '')));
                $idMainIssue = trim((isset($_POST['id_main_issue']) ? $_POST['id_main_issue'] : (isset($_POST['ID_MAIN_ISSUE']) ? $_POST['ID_MAIN_ISSUE'] : '')));
            }

            //-- validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
            if (empty($dni) || Misc::noEsPosibleDni($dni)) {
                return json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => 'NATIONAL_ID field cannot be empty. Please use only numbers and complete with trailing zeroes up to eight digits.', 'Response' => []]);
            }

            $fechaParaValidar = Misc::manejadorFechaEmision($fecha_emision_recivida);
            /* 20/12/2022: Si no mandan gender lo hacemos primero con M y despues con F, hacemos un loop con la variable $veces. Si se manda el sexo el loop lo hace solo una vez. */
            $veces = 1;

            if ($generoRecibido == '') {
                $generoRecibido = 'M';
                $veces = 2;
            }


            for ($i = 1; $i <= $veces; $i++) {
                /**/
                $generoParaValidar = Misc::normalizadorGenero($generoRecibido);
                try {
                    //-- si es longitud 7, le agregamos 0 delante.
                    $dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
                    $enviados['national_id'] = $dni;
                    $enviados['issue_date'] = $fecha_emision_recivida;
                    $enviados['gender'] = $generoRecibido;
                    $enviados['expiry_date'] = $fecha_expiracion_emitida;
                    $enviados['copy'] = $copia;
                    $enviados['id_main_issue'] = $idMainIssue;

                    //$response = SQLConnection::backendStoreProcedure('api_get_govcheck',array($dni,$generoParaValidar),'select');  /* lo pasamos abajo 27/06/2023 */				
                    try {
                        //$res_renaper = self::tratamientoSoloRenaper($dni);
                        $res_renaper = self::tratamientoSoloRenaper($dni, $generoParaValidar); /* 27/06/2023: No se mandaba sexo y buscaba siempre primero por 'F' y si habia F y M. Traia siempre el F */
                        $response = SQLConnection::backendStoreProcedure('api_get_govcheck', array($dni, $generoParaValidar), 'select'); /* lo pasamos aca 27/06/2023 */

                        // Modificacion Rami 01/08/2023
                        if (! empty($response)) {
                            if (is_null($response[0]->ultimo_renaper) || Misc::cantidadMeses($response[0]->ultimo_renaper) >= 4) {
                                $res_renaper = self::tratamientoRenaperCla($dni, $response[0]->genero, $response[0]->identificacion);
                            }
                        } else {
                            $res_renaper = self::tratamientoRenaperCla($dni, $generoRecibido, $dni);
                        }


                        $id_consumo = self::consumir_servicio($dni, env('NRO_PRODUCTO_SOLO_RENAPER'))->transaction_id;
                        if (is_null($res_renaper) || empty($res_renaper)) {
                            /* 20/12/2022 */
                            if ($i < $veces) {
                                $generoRecibido = 'F';
                                continue;
                            } else {
                                // antes hacia solo esto
                                return json_encode(['Parameters' => $enviados, 'Status' => '301', 'Message' => '0-The provided national id does not match a valid one and could not be validated. Please review it and try again.', 'Response' => []]);
                            }
                        }
                        /**/
                        $respuestaFormateada = Misc::formatoRespuestaRenaper($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue);
                        return json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);

                    } catch (\Throwable $th) {
                        $id_consumo = self::consumir_servicio($dni, env('NRO_PRODUCTO_SOLO_RENAPER'))->transaction_id;
                        /* 20/12/2022 */


                        if ($i < $veces) {
                            $generoRecibido = 'F';
                            continue;
                        } else {
                            // antes hacia esto solo 
                            $mensaje = 'Ver este caso API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                            Misc::enviarMail_errores_api($mensaje);
                            return json_encode(['Status' => '301', 'Message' => '1-The provided national id does not match a valid one and could not be validated. Please review it and try again.', 'Transaction_id' => $id_consumo]);
                        }
                        /**/
                    }

                } catch (\Throwable $th) {
                    $mensaje = 'Error al consultar API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                    Misc::enviarMail_errores_api($mensaje);
                    return json_encode(['Status' => '301', 'Message' => '2-The provided national id does not match a valid one and could not be validated. Please review it and try again.']);
                }

            }
        }
        return json_encode(['response' => 'No posee acceso al producto.']);
    }

    public static function tratamientoRenaperCla28052025($dni, $sexo, $cuit)
    {
        if (($sexo != 'F' && $sexo != 'M' && $sexo != 'X') || is_null($sexo)) {
            $sexo = Misc::posibleGenero($cuit);
        }
        $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, $sexo, 1))->Response;
        if (empty($r) && $sexo == 'M') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1))->Response;
            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1))->Response;
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r) && $sexo == 'F') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1))->Response;
            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1))->Response;
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r) && $sexo == 'X') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1))->Response;
            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1))->Response;
            }
            return (empty($r)) ? null : $r;
        } else {
            return $r;
        }
    }

    public static function tratamientoRenaperCla($dni, $sexo, $cuit) {
        if (($sexo != 'F' && $sexo != 'M' && $sexo != 'X') || is_null($sexo)) {
            $sexo = Misc::posibleGenero($cuit);
        }
        $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, $sexo, 1));
        if (empty($r->Response) && $sexo == 'M') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1));
            if (empty($r->Response)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1));
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r->Response) && $sexo == 'F') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1));
            if (empty($r->Response)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1));
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r->Response) && $sexo == 'X') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1));
            if (empty($r->Response)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1));
            }
            return (empty($r)) ? null : $r;
        } else {
            return $r;
        }
    }

    /**
     * @deprecated 14-01-2025
     */
    public static function tratamientoSoloRenaperOrg($dni, $sexo = 'F')
    {
        /* Si lo busca con M y no lo encuentra, lo busca con F y X
                 Si lo busca con F y no lo encuentra, lo busca con M y X
                 Si lo busca con X y no lo encuentra, lo busca con M y F */
        $sexo = strtoupper($sexo);
        if (empty($sexo) || (strtoupper($sexo) !== 'M' && strtoupper($sexo) !== 'F' && strtoupper($sexo) !== 'X')) {
            //if (empty($sexo)) {
            $sexo = 'M';
        }

        $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, $sexo, 1))->Response;

        if (empty($r) && $sexo == 'M') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1))->Response;
            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1))->Response;
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r) && $sexo == 'F') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1))->Response;
            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1))->Response;
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r) && $sexo == 'X') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1))->Response;
            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1))->Response;
            }
            return (empty($r)) ? null : $r;
        } else {
            return $r;
        }
    }

    public static function tratamientoSoloRenaper($dni, $sexo = 'F') {
        /* Si lo busca con M y no lo encuentra, lo busca con F y X
                 Si lo busca con F y no lo encuentra, lo busca con M y X
                 Si lo busca con X y no lo encuentra, lo busca con M y F */
        $sexo = strtoupper($sexo);
        if (empty($sexo) || (strtoupper($sexo) !== 'M' && strtoupper($sexo) !== 'F' && strtoupper($sexo) !== 'X')) {
            //if (empty($sexo)) {
            $sexo = 'M';
        }

        $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, $sexo, 1));
                        
        if (!empty($r) && isset($r->Status) && $r->Status == 'ERROR') {
            return $r;            
        }   

        if (!empty($r) && isset($r->Status) && ($r->Status == 407 || $r->Status == 307) ) {
            return $r;
        }


//        $r = $r->Response;

        if (empty($r->Response) && $sexo == 'M') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1));
            if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                return $r;
            }

            //$r = $r->Response;

            if (empty($r->Response)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1));
                if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                    return $r;
                }

                //$r = $r->Response;
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r->Response) && $sexo == 'F') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1));
            if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                return $r;
            }

            //$r = $r->Response;
            if (empty($r->Response)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1));
                if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                    return $r;
                }

                //$r = $r->Response;
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r->Response) && $sexo == 'X') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1));
            if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                return $r;
            }

            //$r = $r->Response;
            if (empty($r->Response)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1));
                if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                    return $r;
                }

                //$r = $r->Response;
            }
            return (empty($r)) ? null : $r;
        } else {
            return $r;
        }
    }


    public static function tratamientoSoloRenaper28052025($dni, $sexo = 'F'){
        /* Si lo busca con M y no lo encuentra, lo busca con F y X
                 Si lo busca con F y no lo encuentra, lo busca con M y X
                 Si lo busca con X y no lo encuentra, lo busca con M y F */
        $sexo = strtoupper($sexo);
        if (empty($sexo) || (strtoupper($sexo) !== 'M' && strtoupper($sexo) !== 'F' && strtoupper($sexo) !== 'X')) {
            //if (empty($sexo)) {
            $sexo = 'M';
        }

        $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, $sexo, 1));        

        if (!empty($r) && isset($r->Status) && $r->Status == 'ERROR') {
            return $r;
        }
        
        if (!empty($r) && isset($r->Status) && ($r->Status == 407 || $r->Status == 307) ) {
            return $r;
        }
        
        $r = $r->Response;         

        if (empty($r) && $sexo == 'M') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1));
            if (!empty($r) && isset($r->Status) && $r->Status == 407 ) {
                return $r;
            }
            
            $r = $r->Response;   

            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1));
                if (!empty($r) && isset($r->Status) && $r->Status == 407 ) {
                    return $r;
                }
                
                $r = $r->Response;   
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r) && $sexo == 'F') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1));
            if (!empty($r) && isset($r->Status) && $r->Status == 407 ) {
                return $r;
            }
            
            $r = $r->Response;   
            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1));
                if (!empty($r) && isset($r->Status) && $r->Status == 407 ) {
                    return $r;
                }
                
                $r = $r->Response;   
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r) && $sexo == 'X') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1));
            if (!empty($r) && isset($r->Status) && $r->Status == 407 ) {
                return $r;
            }
            
            $r = $r->Response;   
            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1));
                if (!empty($r) && isset($r->Status) && $r->Status == 407 ) {
                    return $r;
                }
                
                $r = $r->Response;   
            }
            return (empty($r)) ? null : $r;
        } else {            
            return $r;
        }
    }

    public static function tratamientoSoloRenaperExtended($dni, $sexo = 'F') {
        /* Si lo busca con M y no lo encuentra, lo busca con F y X
                 Si lo busca con F y no lo encuentra, lo busca con M y X
                 Si lo busca con X y no lo encuentra, lo busca con M y F */
        $sexo = strtoupper($sexo);
        if (empty($sexo) || (strtoupper($sexo) !== 'M' && strtoupper($sexo) !== 'F' && strtoupper($sexo) !== 'X')) {
            //if (empty($sexo)) {
            $sexo = 'M';
        }

        $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, $sexo, 1));
                 

        if (!empty($r) && isset($r->Status) && ($r->Status == 407 || $r->Status == 307) ) {
            return $r;
        }

        $r = $r->Response;

        if (empty($r) && $sexo == 'M') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1));
            if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                return $r;
            }

            $r = $r->Response;

            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1));
                if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                    return $r;
                }

                $r = $r->Response;
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r) && $sexo == 'F') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1));
            if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                return $r;
            }

            $r = $r->Response;
            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'X', 1));
                if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                    return $r;
                }

                $r = $r->Response;
            }
            return (empty($r)) ? null : $r;
        } else if (empty($r) && $sexo == 'X') {
            $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'M', 1));
            if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                return $r;
            }

            $r = $r->Response;
            if (empty($r)) {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarCompleto($dni, 'F', 1));
                if (!empty($r) && isset($r->Status) && $r->Status == 407) {
                    return $r;
                }

                $r = $r->Response;
            }
            return (empty($r)) ? null : $r;
        } else {
            return $r;
        }
    }

    static function acentos_enies($n)
    {
        $nuevo = mb_strtoupper($n);
        $nuevo = str_replace('Ñ', 'N', $nuevo);
        $nuevo = self::eliminar_acentos($nuevo);
        $nuevo = strtoupper($nuevo);
        return trim($nuevo);
    }

    //--  FUNCIONES AUXILIARES PARA GBG  ----------------------------------------------------------------------------//

    //--  Elimina todo caracter extraño del nombre o apellido pasado y lo devuelve en mayusculas.
    static function nombre_formateo($n)
    {
        $omitidos = "/^[!\"#$%&\/)(=?¿_*'+-@:.<>]{1}$/";
        $nuevo = '';
        for ($i = 0; $i < strlen($n); $i++) {
            if (preg_match($omitidos, $n[$i]) != 1) {
                $nuevo .= $n[$i];
            }
        }
        $nuevo = mb_strtoupper($nuevo);
        /* 05/12/2023 */
        $nuevo = str_replace('Ñ', 'N', $nuevo);
        $nuevo = self::eliminar_acentos($nuevo);
        /**/
        return trim($nuevo);
    }

    //-- Normaliza el dni en caso de solo tener longitug 7, le agrega un cero delante.
    static function normalizador_dni($d)
    {
        if (strlen($d) == 7) {
            return '0' . $d;
        }
        return $d;
    }

    //-- Slo valida que sea un cuit valido sin guion medio ni puntos.
    static function tax_id_valido($tax)
    {
        $exp = "/^[0-9]{11}$/";
        return (preg_match($exp, $tax) == 1);
    }

    //-- Valida que la fecha ingresada contenga el formato requerido.
    static function fecha_valida($fecha)
    {
        $fv = "/^[0-9]{4}[-]{1}[0-9]{2}[-]{1}[0-9]{2}$/";
        return (preg_match($fv, $fecha) == 1);
    }

    public static function Guardar_resultado_api28052025($user_id, $producto, $dni, $sexo, $transaction_id, $txt, $codigo_resultado = null, $tiempoRespuesta = null) {
        if(!is_null($tiempoRespuesta)) {
            $tiempoRespuesta = floatval(str_replace(',', '.', $tiempoRespuesta));
        }
        $exec = SQLConnection::backendStoreProcedure('resultados_api_', array($user_id, $producto, $dni, $sexo, $transaction_id, $txt, $codigo_resultado, (float)$tiempoRespuesta));
    }

    public static function Guardar_resultado_api($user_id, $producto, $dni, $sexo, $transaction_id, $txt, $codigo_resultado = null, $tiempoRespuesta = null, $proveedor = null, $tiempoProveedor = null) {
        
        if(!is_null($tiempoRespuesta)) {
            $tiempoRespuesta = floatval(str_replace(',', '.', $tiempoRespuesta));
        }
        
        $exec = SQLConnection::backendStoreProcedure('resultados_api_', array($user_id, $producto, $dni, $sexo, $transaction_id, $txt, $codigo_resultado, $tiempoRespuesta, $proveedor, $tiempoProveedor));
    }



    static function dni_valido($dni)
    {
        $exp = "/^[0-9]{7,8}$/";
        return (preg_match($exp, $dni) == 1);
    }

    public static function BuscarCuitPublic($dni, $tipo)
    {
        $data = self::BuscarCuit($dni, 'S');

        return $data;
    }

    public static function obtenerSociosDirectores()
    {
        $cuit = trim(Request::input('cuit'));
        $tipo_persona = (substr($cuit, 0, 1) != '3') ? 'f' : 'j';
        $socios_directores = SQLConnection::obtenerSociosDirectores($cuit, $tipo_persona);
        if (! empty($socios_directores)) {
            foreach ($socios_directores as $key => $value) {
                unset($socios_directores[$key]->idp);
                $socios_directores[$key]->cargo = $socios_directores[$key]->car_nombre;
                unset($socios_directores[$key]->car_nombre);
                unset($socios_directores[$key]->c04_periodo_desde);
                unset($socios_directores[$key]->c04_periodo_hasta);
                unset($socios_directores[$key]->actividad);
                unset($socios_directores[$key]->fecha_cons);
                unset($socios_directores[$key]->fecha_ins_rpc);
                unset($socios_directores[$key]->nacionalidad);
                unset($socios_directores[$key]->estado_civil);
                unset($socios_directores[$key]->tipo_doc1);
                unset($socios_directores[$key]->nrodoc_1);
                unset($socios_directores[$key]->tipo_doc2);
                unset($socios_directores[$key]->nrodoc_2);
                unset($socios_directores[$key]->fecha_nac);
                unset($socios_directores[$key]->c04_periodo_desde);
                unset($socios_directores[$key]->c04_periodo_hasta);
            }
        }
        $info['socios_directores'] = $socios_directores;
        $usuario = Session::get('usuario');
        $producto = $usuario->producto ?? 35;
        self::consumir_servicio($cuit, $producto);
        //SQLConnection::consumirServicio($user_id,$cuit,35);

        return json_encode($info);
    }

    public static function obtenerBuscador()
    {
        $cuit = trim(Request::input('tax_id'));
        $nombre = trim(Request::input('name'));
        $nombre = str_replace("'", "", $nombre);
        $nombre = str_replace('"', '', $nombre);
        $nombre_buscado = $nombre;

        $type = strtoupper(trim(Request::input('type')));

        if ($type == 'PERSON' || $type == 'P' || $type == 'F') {
            $type = 'F';
        } elseif ($type == 'COMPANY' || $type == 'C' || $type == 'J') {
            $type = 'J';
        } else {
            $type = '';
        }

        $max_rows = Request::input('max_rows');
        if (! $max_rows) {
            $max_rows = 50;
        }
        if ($max_rows > 500 || $max_rows < 50) {
            $message = ['error' => true, 'error_message' => 'The MAX_ROWS parameter is out of range. Please input values between 50 and 500'];
            return json_encode($message);
        }
        $respuesta = [];

        if (! $cuit && ! $nombre) {
            $message = ['error' => true, 'error_message' => 'Input either TAX_ID parameter or NAME in order to get results.'];
            return json_encode($message);
        }
        //obtenerAFIP.
        if (! empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }
        //CREDITSAFE.
        $user_id = '308816173';
        if ($cuit) {
            $cuit_length = strlen((string) $cuit);
            $message = ['error' => true, 'error_message' => 'The TAX_ID parameter must be at least 5 characters long for a valid identification number'];
            if ($cuit_length < 5) {
                return json_encode($message);
            }
            $respuesta = SQLConnection::backendStoreProcedure('api_busqueda_padron', array($cuit, $max_rows, $type));

            $usuario = Session::get('usuario');
            $producto = $usuario->producto ?? 43;
            self::consumir_servicio($cuit, $producto);
            //SQLConnection::consumirServicio($user_id,$cuit,43);
        } else if ($nombre) {
            $nombre_length = strlen((string) $nombre);
            $message = ['error' => true, 'error_message' => 'The NAME parameter must be at least 3 characters long for a valid name'];
            if ($nombre_length < 3) {
                return json_encode($message);
            }


            // $nombre = Misc::parsearBusquedaPadron($nombre); 
            // Esto de arriba, hacía el NEAR entre todas las palabras y tardaba mucho,
            // 15/11/2023: lo cambiamos para que lo haga igual que hace el buscar_edictos_homonimos del Informe Comercial 
            // Persona Fisica: Todas las combinaciones de orden posible (maximo 120)
            // Personas Juridica: Saca omitidos del principio y final 
            if ($type == 'F') {
                $razon_social_explode = explode(" ", $nombre);

                //Elimina de las combinaciones los valores que contienen una letra 
                $explode_aux = [];
                foreach ($razon_social_explode as $key => $value) {
                    if (isset($value) && (strlen($value) > 1)) {
                        $explode_aux[] = $value;
                    }
                }
                $razon_social_explode = $explode_aux;

		/*
			Parameter #1 $array (list<non-falsy-string>) of array_values is already a list, call has no effect.\
			🪪  arrayValues.list
			No es necesario, razon_social_explode ya es un array indexado
			$razon_social_explode = array_values($razon_social_explode);
                */
                $razon_social_explode = array_values($razon_social_explode);
                $resultado_razon_social = Misc::resultadoCombinaciones($razon_social_explode);

                //Limita a 120 resultados las combinaciones (es para un maximo de 5 palabras)
                $resultado_razon_social = array_slice($resultado_razon_social, -120);
                $cant_resultado_razon_social = count($resultado_razon_social);
                $razon_social_completa = '';

                if ($cant_resultado_razon_social < 120) {
                    foreach ($resultado_razon_social as $key => $rs) {
                        if (! (end($resultado_razon_social) == $rs)) {
                            $razon_social_completa .= 'NEAR((' . str_replace(" ", ",", $rs) . '),0,true) OR ';
                        } else {
                            $razon_social_completa .= 'NEAR((' . str_replace(" ", ",", $rs) . '),0,true)';
                        }
                    }
                } else {
                    $razon_social_completa = "\"" . $nombre . "\"";
                }
            }


            if ($type !== 'F') {
                $resultado_nombres_ant[] = $nombre;

                $razon_social_completa = '';
                $sinonimos = Misc::diccionarioSinonimosTEST($resultado_nombres_ant);

                $count_sinonimo = count($sinonimos) - 1;
                foreach ($sinonimos as $key => $rs) {
                    if (! ($key == $count_sinonimo)) {
                        $razon_social_completa .= $rs . 'OR';
                    } else {
                        $razon_social_completa .= $rs;
                    }
                }
                if (! $razon_social_completa) {
                    $razon_social_completa = "\"" . $nombre . "\"";
                }

            }

            $nombre = $razon_social_completa;

            $respuesta = SQLConnection::backendStoreProcedure('api_busqueda_padron', array($nombre, $max_rows, $type));

            $usuario = Session::get('usuario');
            $producto = $usuario->producto ?? 43;
            self::consumir_servicio(substr($nombre_buscado, 0, 19), $producto);
            //SQLConnection::consumirServicio($user_id,substr($nombre_buscado, 0, 19),43);
        }

        return json_encode($respuesta);
    }

    public static function calcularScoreAportes($respuesta=[]){
        $cuit = Request::input('cuit');
        if(!isset($respuesta['score'])){
            $score = '';
        }else{
            $score = $respuesta['score'];
        }
        $respuesta['afecta_directo']['debug'] = '<br>--';
        $respuesta['afecta_indirecto']['debug'] = '';
        $porcentaje = SQLConnection::backendStoreProcedure('mis_aportes_empresa_score',array($cuit),'selectOne');
        
        if (isset($porcentaje->score))
        {
            
            $respuesta['afecta_indirecto']['debug'] .= " - Afecta: " .  number_format($porcentaje->score,2) . "%";
            $score += ($score * $porcentaje->score / 100); 
            
        }
        $respuesta['afecta_indirecto']['debug'] .= '<br>Le aplica un ' . (number_format($porcentaje->score,2) ?? 0). '% al score'; 
        $respuesta['score'] = $score;
        return $respuesta;
        
    }

    /**
     * Api que devuelve datos de padron
     * @access public
     * 
     * @return string JSON codificado
     */
    public static function busquedaPadron($tax_id = null, $pais_busqueda = null, $razon_social = null, $filtro_prov = null)
    {
        $data = [];
        if ($pais_busqueda == null) {
            $pais_busqueda = Request::input('pais_busqueda') ?? 'AR';
            if ($pais_busqueda == '') {
                $pais_busqueda = 'AR';
            }
        }
        if ($tax_id == null) {
            $tax_id = Request::input('identificacion') ?? null;

            if ($tax_id == '') {
                $tax_id = null;
            }
        }
        if ($razon_social == null) {
            $razon_social = Request::input('razon_social') ?? null;
            if ($razon_social == '') {
                $razon_social = null;
            }
        }
        if ($filtro_prov == null) {
            $filtro_prov = Request::input('filtro_prov') ?? null;
            if ($filtro_prov == '') {
                $filtro_prov = null;
            }

        }

        //if (!isset($_POST['pais_busqueda']) || !isset($_POST['identificacion']) || !isset($_POST['razon_social'])) {
        //if (!isset($_POST['pais_busqueda']) && (!isset($_POST['identificacion']) || !isset($_POST['razon_social']))) {
        if (empty($tax_id) && empty($razon_social)) {
            // Si no estan seteados alguno de los parámetros principales devuelve error
            return json_encode([
                'Status' => 'ERROR',
                'StatusCode' => 0,
                'Message' => 'Faltan enviar parámetros',
                'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                'Response' => []
            ]);
        } else {
            // Si no está seteado pais_busqueda devuelve error
            if (empty($pais_busqueda)) {
                return json_encode([
                    'Status' => 'ERROR',
                    'StatusCode' => 1,
                    'Message' => 'Debe seleccionar el origen de la consulta (pais_busqueda)',
                    'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                    'Response' => []
                ]);
            }

            if (empty($tax_id) && ! empty($razon_social) && is_numeric($razon_social))
            // en los buscadores genericos, con un solo campo de input lo trae en razon_social aunque sea el taxid (justamente, porque es solo un campo de entrada)
            {
                $tax_id = $razon_social;
                $razon_social = null;
            }            
            // Consulta ARGENINTA
            if ($pais_busqueda == 'AR') {
                $busqueda = ! empty($tax_id) ? $tax_id : $razon_social;
                // $data = SQLConnection::busquedaPadronAutocomplete($busqueda);
                $data = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, $razon_social, $pais_busqueda, 30)); // Consulta a la tabla padrones                                                                
                // $data = SQLConnection::backendStoreProcedure('api_padrones',array($busqueda,null,$pais_busqueda,30)); // Consulta a la tabla padrones
                // Evalúa si se envió el cuit para consulta
                if (! empty($tax_id)) {
                    // Si la consulta viene vacía busca por AFIP
                    if (empty($data)) {
                        $aux_posibles = [];
                        // Si no es cuit busca posibles cuits e inserta en padrón para luego hacer una consulta
                        if (! preg_match('/^[0-9]{11}$/', $tax_id)) {
                            $posibles_cuits = SQLConnection::backendStoreProcedure('dni_buscar_cuit_posible', array($tax_id, 'S'));                            
                                                        
                            if (! empty($posibles_cuits)) {
                                foreach ($posibles_cuits as $id) {
                                    //$desdeAfip = json_decode(AFIPController::obtenerPadron($id->cuit));
                                    AFIPController::obtenerPadron($id->cuit);                                    
                                    $doble_check = SQLConnection::backendStoreProcedure('api_padrones', array($id->cuit, null, $pais_busqueda, 30));                                                                        
                                    if (! empty($doble_check)) {
                                        foreach ($doble_check as $registro) {
                                            array_push($aux_posibles, $registro);
                                        }
                                    }
                                }
                            }
                        } else {
                            //$desdeAfip = json_decode(AFIPController::obtenerPadron($tax_id));
                            AFIPController::obtenerPadron($tax_id);
                            $doble_check = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, null, $pais_busqueda, 30));
                            
                            if (! empty($doble_check)) {
                                foreach ($doble_check as $registro) {
                                    array_push($aux_posibles, $registro);
                                }
                            }
                        }
                        // Si la consulta a Afip devuelve algun error retorna con mensaje y parámetros enviados
                        if (empty($aux_posibles)) {
                            return json_encode([
                                'Status' => 'ERROR',
                                'StatusCode' => 3,
                                'Message' => 'Error en formato de identificación o cuit inexistente',
                                'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                                'Response' => []
                            ]);
                        } else {
                            $data = $aux_posibles;
                        }
                    } else {
                        /* Cuando trae 30 tarda un monton... solo lo hacemos si trajo uno solo (que va a ser cuando buscó exactamente por taxid) */
                        // ---
                        if (count($data) == 1) { // Se agrego solo este if, lo de adentro es lo que antes hacía para toda la lista, ahora solo lo hace si encontro 1
                            // ---
                            // Revisa si los registros de la búsqueda están desactualizados (30 días) para actualizar
                            $flag_mod = 0;
                            foreach ($data as $reg) {
                                $aux_date_now = date_create('now');
                                $aux_date_reg = date_create($reg->ismodified);
                                $dif = date_diff($aux_date_now, $aux_date_reg);                                
                                // ---
                                //var_dump($reg->identificacion . ' - ' . $reg->ismodified);                                 
                                if ($dif->days > 45) {                                    
                                    AFIPController::obtenerPadronSi($reg->identificacion);
                                    $flag_mod++;
                                }
                            }
                            
                            if ($flag_mod != 0) {
                                $data = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, null, $pais_busqueda, 30));                                
                            }
                            // ---
                        }
                        // ---
                    }
                } else if (! empty($razon_social)) {
                    // Si no envió cuit y envió un nombre entra acá
                    $flag_mod = 0;
                    if (! empty($data)) {
                        foreach ($data as $reg) {
                            $aux_date_now = date_create('now');
                            $aux_date_reg = date_create($reg->ismodified);
                            $dif = date_diff($aux_date_now, $aux_date_reg);                            
                            // ---
                            if ($dif->d > 45) {
                                AFIPController::obtenerPadronSi($reg->identificacion);
                                $flag_mod++;
                            }
                        }
                        if ($flag_mod != 0) {
                            $data = $data = SQLConnection::backendStoreProcedure('api_padrones', array(NULL, $razon_social, $pais_busqueda, 30));
                        }
                    }
                } else {
                    // Si no envía ni cuit ni nombre devuelve error
                    return json_encode([
                        'Status' => 'ERROR',
                        'StatusCode' => 4,
                        'Message' => 'Ningun parámetro de búsqueda enviado',
                        'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                        'Response' => []
                    ]);
                }
                // Recorre el resultado para sacar los resultados que no son de origen argentino
                foreach ($data as $k => $reg) {
                    if ($reg->country_code != 'AR') {
                        unset($data[$k]);
                    }
                }

            } elseif ($pais_busqueda == 'OTRO') {
                if (empty($tax_id) && empty($razon_social)) {
                    // Si no envía ni cuit ni nombre devuelve error
                    return json_encode([
                        'Status' => 'ERROR',
                        'StatusCode' => 4,
                        'Message' => 'Ningun parámetro de búsqueda enviado',
                        'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                        'Response' => []
                    ]);
                }
                $servicio = Request::input('servicio');
                $plataforma = Request::input('plataforma');
                //-----
                $expReg_cuit = '/^[A-Za-z0-9ñÑ ]+$/';
                $expReg_nombre = '/^[A-Za-zñÑ ]+$/';
                $expReg_nombre2 = '/^[\s]+$/';
                //---
                $cliente = Session::get('usuario')->cliente['client_id'];
                $pais = Request::input('pais') != '---' ? Request::input('pais') : '';
                $tipo_identificacion = empty(Request::input('tipo_identificacion')) ? '' : Request::input('tipo_identificacion');
                $tipo_persona = Request::input('tipo_persona') != '---' ? Request::input('tipo_persona') : '';
                $sexo = Request::input('sexo') != '---' ? Request::input('sexo') : '';
                // Realiza una primera búsqueda y limpia la consulta para que no aparezcan registros de Argentina
                $aux_consulta = (! empty($tax_id)) ? $tax_id : $razon_social;
                $data = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, $razon_social, null, 30));
                // $data = (!empty($aux_consulta)) ? SQLConnection::busquedaPadronAutocomplete($aux_consulta, true) : null;
                $match_result = 0;
                $fecha = Request::input('fecha');
                $nacionalidad = Request::input('nacionalidad');
                // Limpia el resultado de la búsqueda sacando a los de origen Argentino y de otro país (si está seleccionado)
                if (! empty($data)) {
                    foreach ($data as $k => $reg) {
                        if ($reg->country_code == 'AR' || (! empty($pais) && $pais !== 'OTRO' && $reg->country_code != $pais)) {
                            unset($data[$k]);
                        }
                    }
                }
                // Evalúa si los datos enviados son correctos para insertar en el padrón de Fidelitas
                if (empty($tipo_identificacion) == false && ($sexo == 'F' || $sexo == 'M') && ($tipo_persona == 'F' || $tipo_persona == 'J') && preg_match($expReg_cuit, $tax_id) && preg_match($expReg_nombre, $razon_social)) {
                    // Busca dentro del resultado de padrón si existe el registro para no duplicarlo
                    if (! empty($data)) {
                        foreach ($data as $reg) {
                            if ($reg->nombre_persona == $razon_social && $reg->identificacion == $tax_id && $reg->country_code == $pais && $reg->abreviatura == $tipo_identificacion && $reg->tipo_persona == $tipo_persona) {
                                $match_result++;
                            }
                        }
                    }
                    // Si cumple con las condiciones (Que no exista el registro, que provenga del backend o que tenga el servicio IV) inserta en padrón
                    if ($match_result == 0 && ($servicio == '10' || $plataforma == 'BACKEND')) {
                        // dd('entre');
                        $data[0] = trim($tipo_identificacion);
                        $data[1] = trim($tax_id);
                        $data[2] = trim($razon_social);
                        $data[3] = trim($tipo_persona);
                        $data[4] = trim($sexo);
                        $data[5] = 1;
                        $data[6] = 1;
                        $data[7] = null;
                        $data[8] = $fecha;
                        $data[9] = $nacionalidad;
                        $data[10] = $pais;
                        // //-----
                        // $respuesta = SQLConnection::backendStoreProcedure('backend_insertar_padron',$data); // COMENTADO HASTA QUE TODAS LAS PRUEBAS DEN OK
                        $data = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, $razon_social, $pais, 30));
                    }
                }
            } else {
                // Si está mal seteado el pais_busqueda devuelve error
                return json_encode([
                    'Status' => 'ERROR',
                    'StatusCode' => 2,
                    'Message' => 'El valor de origen de consulta (pais_busqueda) enviado es invalido',
                    'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                    'Response' => $data
                ]);
            }
            // Devuelve los resultados obtenidos
            if (! empty($data)) {
                // Filtro por provincia
                if (! empty($filtro_prov)) {
                    foreach ($data as $k => $reg) {
                        if ($reg->provincia != $filtro_prov) {
                            unset($data[$k]);
                        }
                    }
                }
                // --
                return json_encode([
                    'Status' => 'Ok',
                    'StatusCode' => 5,
                    'Message' => 'Su consulta obtuvo resultados',
                    'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                    'Response' => $data
                ]);
            } else {
                return json_encode([
                    'Status' => 'Ok',
                    'StatusCode' => 6,
                    'Message' => 'La consulta no obtuvo resultados',
                    'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                    'Response' => []
                ]);
            }
        }
    }

    /**
     * Api que devuelve datos de padron
     * @access public
     * @deprecated 14-01-2025
     * @return string JSON codificado
     */
    public static function busquedaPadronOrg($tax_id = null, $pais_busqueda = null, $razon_social = null, $filtro_prov = null)
    {
        $data = [];
        if ($pais_busqueda == null) {
            $pais_busqueda = Request::input('pais_busqueda') ?? 'AR';
            if ($pais_busqueda == '') {
                $pais_busqueda = 'AR';
            }
        }
        if ($tax_id == null) {
            $tax_id = Request::input('identificacion') ?? null;

            if ($tax_id == '') {
                $tax_id = null;
            }
        }
        if ($razon_social == null) {
            $razon_social = Request::input('razon_social') ?? null;
            if ($razon_social == '') {
                $razon_social = null;
            }
        }
        if ($filtro_prov == null) {
            $filtro_prov = Request::input('filtro_prov') ?? null;
            if ($filtro_prov == '') {
                $filtro_prov = null;
            }

        }

        //if (!isset($_POST['pais_busqueda']) || !isset($_POST['identificacion']) || !isset($_POST['razon_social'])) {
        //if (!isset($_POST['pais_busqueda']) && (!isset($_POST['identificacion']) || !isset($_POST['razon_social']))) {
        if (empty($tax_id) && empty($razon_social)) {
            // Si no estan seteados alguno de los parámetros principales devuelve error
            return json_encode([
                'Status' => 'ERROR',
                'StatusCode' => 0,
                'Message' => 'Faltan enviar parámetros',
                'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                'Response' => []
            ]);
        } else {
            // Si no está seteado pais_busqueda devuelve error
            if (empty($pais_busqueda)) {
                return json_encode([
                    'Status' => 'ERROR',
                    'StatusCode' => 1,
                    'Message' => 'Debe seleccionar el origen de la consulta (pais_busqueda)',
                    'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                    'Response' => []
                ]);
            }

            if (empty($tax_id) && ! empty($razon_social) && is_numeric($razon_social))
            // en los buscadores genericos, con un solo campo de input lo trae en razon_social aunque sea el taxid (justamente, porque es solo un campo de entrada)
            {
                $tax_id = $razon_social;
                $razon_social = null;
            }
            // Consulta ARGENINTA
            if ($pais_busqueda == 'AR') {
                $busqueda = ! empty($tax_id) ? $tax_id : $razon_social;
                // $data = SQLConnection::busquedaPadronAutocomplete($busqueda);
                $data = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, $razon_social, $pais_busqueda, 30)); // Consulta a la tabla padrones
                // $data = SQLConnection::backendStoreProcedure('api_padrones',array($busqueda,null,$pais_busqueda,30)); // Consulta a la tabla padrones
                // Evalúa si se envió el cuit para consulta
                if (! empty($tax_id)) {
                    // Si la consulta viene vacía busca por AFIP
                    if (empty($data)) {
                        $aux_posibles = [];
                        // Si no es cuit busca posibles cuits e inserta en padrón para luego hacer una consulta
                        if (! preg_match('/^[0-9]{11}$/', $tax_id)) {
                            $posibles_cuits = SQLConnection::backendStoreProcedure('dni_buscar_cuit_posible', array($tax_id, 'S'));
                            // --
                            if (! empty($posibles_cuits)) {
                                foreach ($posibles_cuits as $id) {
                                    $desdeAfip = json_decode(AFIPController::obtenerPadron($id->cuit));
                                    $doble_check = SQLConnection::backendStoreProcedure('api_padrones', array($id->cuit, null, $pais_busqueda, 30));
                                    if (! empty($doble_check)) {
                                        foreach ($doble_check as $registro) {
                                            array_push($aux_posibles, $registro);
                                        }
                                    }
                                }
                            }
                        } else {
                            $desdeAfip = json_decode(AFIPController::obtenerPadron($tax_id));
                            $doble_check = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, null, $pais_busqueda, 30));
                            if (! empty($doble_check)) {
                                foreach ($doble_check as $registro) {
                                    array_push($aux_posibles, $registro);
                                }
                            }
                        }
                        // Si la consulta a Afip devuelve algun error retorna con mensaje y parámetros enviados
                        if (empty($aux_posibles)) {
                            return json_encode([
                                'Status' => 'ERROR',
                                'StatusCode' => 3,
                                'Message' => 'Error en formato de identificación o cuit inexistente',
                                'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                                'Response' => []
                            ]);
                        } else {
                            $data = $aux_posibles;
                        }
                    } else {
                        /* Cuando trae 30 tarda un monton... solo lo hacemos si trajo uno solo (que va a ser cuando buscó exactamente por taxid) */
                        // ---
                        if (count($data) == 1) { // Se agrego solo este if, lo de adentro es lo que antes hacía para toda la lista, ahora solo lo hace si encontro 1
                            // ---
                            // Revisa si los registros de la búsqueda están desactualizados (30 días) para actualizar
                            $flag_mod = 0;
                            foreach ($data as $reg) {
                                $aux_date_now = date_create('now');
                                $aux_date_reg = date_create($reg->ismodified);
                                $dif = date_diff($aux_date_now, $aux_date_reg);
                                // ---
                                //var_dump($reg->identificacion . ' - ' . $reg->ismodified); 
                                if ($dif->days > 45) {
                                    AFIPController::obtenerPadronSi($reg->identificacion);
                                    $flag_mod++;
                                }
                            }
                            if ($flag_mod != 0) {
                                $data = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, null, $pais_busqueda, 30));
                            }
                            // ---
                        }
                        // ---
                    }
                } else if (! empty($razon_social)) {
                    // Si no envió cuit y envió un nombre entra acá
                    $flag_mod = 0;
                    if (! empty($data)) {
                        foreach ($data as $reg) {
                            $aux_date_now = date_create('now');
                            $aux_date_reg = date_create($reg->ismodified);
                            $dif = date_diff($aux_date_now, $aux_date_reg);
                            // ---
                            if ($dif->days > 45) {
                                AFIPController::obtenerPadronSi($reg->identificacion);
                                $flag_mod++;
                            }
                        }
                        if ($flag_mod != 0) {
                            $data = $data = SQLConnection::backendStoreProcedure('api_padrones', array(NULL, $razon_social, $pais_busqueda, 30));
                        }
                    }
                } else {
                    // Si no envía ni cuit ni nombre devuelve error
                    return json_encode([
                        'Status' => 'ERROR',
                        'StatusCode' => 4,
                        'Message' => 'Ningun parámetro de búsqueda enviado',
                        'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                        'Response' => []
                    ]);
                }
                // Recorre el resultado para sacar los resultados que no son de origen argentino
                foreach ($data as $k => $reg) {
                    if ($reg->country_code != 'AR') {
                        unset($data[$k]);
                    }
                }

            } elseif ($pais_busqueda == 'OTRO') {
                if (empty($tax_id) && empty($razon_social)) {
                    // Si no envía ni cuit ni nombre devuelve error
                    return json_encode([
                        'Status' => 'ERROR',
                        'StatusCode' => 4,
                        'Message' => 'Ningun parámetro de búsqueda enviado',
                        'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                        'Response' => []
                    ]);
                }
                $servicio = Request::input('servicio');
                $plataforma = Request::input('plataforma');
                //-----
                $expReg_cuit = '/^[A-Za-z0-9ñÑ ]+$/';
                $expReg_nombre = '/^[A-Za-zñÑ ]+$/';
                $expReg_nombre2 = '/^[\s]+$/';
                //---
                $cliente = Session::get('usuario')->cliente['client_id'];
                $pais = Request::input('pais') != '---' ? Request::input('pais') : '';
                $tipo_identificacion = empty(Request::input('tipo_identificacion')) ? '' : Request::input('tipo_identificacion');
                $tipo_persona = Request::input('tipo_persona') != '---' ? Request::input('tipo_persona') : '';
                $sexo = Request::input('sexo') != '---' ? Request::input('sexo') : '';
                // Realiza una primera búsqueda y limpia la consulta para que no aparezcan registros de Argentina
                $aux_consulta = (! empty($tax_id)) ? $tax_id : $razon_social;
                $data = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, $razon_social, null, 30));
                // $data = (!empty($aux_consulta)) ? SQLConnection::busquedaPadronAutocomplete($aux_consulta, true) : null;
                $match_result = 0;
                $fecha = Request::input('fecha');
                $nacionalidad = Request::input('nacionalidad');
                // Limpia el resultado de la búsqueda sacando a los de origen Argentino y de otro país (si está seleccionado)
                if (! empty($data)) {
                    foreach ($data as $k => $reg) {
                        if ($reg->country_code == 'AR' || (! empty($pais) && $pais !== 'OTRO' && $reg->country_code != $pais)) {
                            unset($data[$k]);
                        }
                    }
                }
                // Evalúa si los datos enviados son correctos para insertar en el padrón de Fidelitas
                if (empty($tipo_identificacion) == false && ($sexo == 'F' || $sexo == 'M') && ($tipo_persona == 'F' || $tipo_persona == 'J') && preg_match($expReg_cuit, $tax_id) && preg_match($expReg_nombre, $razon_social)) {
                    // Busca dentro del resultado de padrón si existe el registro para no duplicarlo
                    if (! empty($data)) {
                        foreach ($data as $reg) {
                            if ($reg->nombre_persona == $razon_social && $reg->identificacion == $tax_id && $reg->country_code == $pais && $reg->abreviatura == $tipo_identificacion && $reg->tipo_persona == $tipo_persona) {
                                $match_result++;
                            }
                        }
                    }
                    // Si cumple con las condiciones (Que no exista el registro, que provenga del backend o que tenga el servicio IV) inserta en padrón
                    if ($match_result == 0 && ($servicio == '10' || $plataforma == 'BACKEND')) {
                        // dd('entre');
                        $data[0] = trim($tipo_identificacion);
                        $data[1] = trim($tax_id);
                        $data[2] = trim($razon_social);
                        $data[3] = trim($tipo_persona);
                        $data[4] = trim($sexo);
                        $data[5] = 1;
                        $data[6] = 1;
                        $data[7] = null;
                        $data[8] = $fecha;
                        $data[9] = $nacionalidad;
                        $data[10] = $pais;
                        // //-----
                        // $respuesta = SQLConnection::backendStoreProcedure('backend_insertar_padron',$data); // COMENTADO HASTA QUE TODAS LAS PRUEBAS DEN OK
                        $data = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, $razon_social, $pais, 30));
                    }
                }
            } else {
                // Si está mal seteado el pais_busqueda devuelve error
                return json_encode([
                    'Status' => 'ERROR',
                    'StatusCode' => 2,
                    'Message' => 'El valor de origen de consulta (pais_busqueda) enviado es invalido',
                    'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                    'Response' => $data
                ]);
            }
            // Devuelve los resultados obtenidos
            if (! empty($data)) {
                // Filtro por provincia
                if (! empty($filtro_prov)) {
                    foreach ($data as $k => $reg) {
                        if ($reg->provincia != $filtro_prov) {
                            unset($data[$k]);
                        }
                    }
                }
                // --
                return json_encode([
                    'Status' => 'Ok',
                    'StatusCode' => 5,
                    'Message' => 'Su consulta obtuvo resultados',
                    'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                    'Response' => $data
                ]);
            } else {
                return json_encode([
                    'Status' => 'Ok',
                    'StatusCode' => 6,
                    'Message' => 'La consulta no obtuvo resultados',
                    'Parameters' => ['pais_busqueda' => $pais_busqueda, 'identificacion' => $tax_id, 'razon_social' => $razon_social],
                    'Response' => []
                ]);
            }
        }
    }

    public static function valida_la_padrones()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        //$client_id      = Request::input('client_id');
        $client_id = '2982720';// '1811919445';
        $lastName = trim(Request::input('last_name'));
        $firstName = trim(Request::input('first_name'));
        $country = trim(Request::input('country_code'));
        $producto = $usuario->producto ?? 83;

        // transaccionar el nombre buscado porque se busca por texto en este producto
        self::consumir_servicio($client_id, $producto);
        //SQLConnection::consumirServicio($user_id,$client_id,68);

        if (empty($client_id)) {
            return json_encode([
                'Status' => 'ERROR',
                'Message' => 'INVALID CLIENT',
                'Response' => []
            ]);
        }
        $exec = SQLConnection::backendStoreProcedure('peru_worldsys_data', array($lastName, $firstName, $country));
        return json_encode([
            'Status' => 'OK',
            'Message' => 'OK',
            'Response' => $exec
        ]);
    }

    public static function alta_edictos_txt_AI()
    {
        $region = Request::input('region');
        $texto = Request::input('texto');
        $fecha_boletin = Request::input('fecha_boletin');
        $grupo = Request::input('grupo');
        $actiondb = 'ALTA';
        $titulo = null;
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $resp = SQLConnection::backendStoreProcedure('carga_edictos_AI', array($actiondb, $region, $titulo, $texto, $fecha_boletin, $user_id, 1, null, null, $grupo), 'selectOne');
        return json_encode(['Response' => [$resp]]);
    }

    public static function obtenerApiPEP()
    {
        $ip = $_SERVER['REMOTE_ADDR'];
        $country = Request::input('country_code');
        $tax_id = Request::input('tax_id');
        //$surname            = Request::input('surname');
        $name = Request::input('full_name');
        $apikey = Request::input('apikey');
        $url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $enviados = array('country_code' => $country, 'tax_id' => $tax_id, 'full_name' => $name);

        if (empty($tax_id)) {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'TAX_ID CAN BE NOT NULL',
                'Response' => []
            ]);
        }
        //
        if (! empty($tax_id) && strlen($tax_id) !== 11 && ! empty($country) && strtoupper($country) == 'AR') {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'THE NUMBER OF CHARACTERS FOR TAX_ID IS 11 (AR)',
                'Response' => []
            ]);
        }
        //
        if (empty($name) /*|| empty($surname)*/) {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'NAME CAN BE NOT NULL',
                'Response' => []
            ]);
        }
        if (strlen($name) < 2 /*|| strlen($surname) < 2*/) {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'THE MINIMUM NUMBER OF CHARACTERS FOR NAME IS 2',
                'Response' => []
            ]);
        }
        /* Pase por afip, si es CUIT de Argentina */
        if (! empty($tax_id) && strlen($tax_id) == 11 && ! empty($country) && strtoupper($country) == 'AR') {
            if (ENV('SERVICIOS_AFIP') == true) {
                AFIPController::obtenerPadron($tax_id, true, 'AR', false);
            }
        }
        $usuario = Session::get('usuario');
        $producto = $usuario->producto ?? 88;
        self::consumir_servicio($tax_id, $producto);

        $respuesta = [];
        /*$respuesta == LLAMAMOS A PEP */
        $url = env('API_PEP');
        $params = '?cuit=' . $tax_id . '&nombre_persona=' . str_replace(' ', '%20', $name) . '&pais=' . $country;
        $respuesta = Misc::CURLCall(env('API_PEP') . $params, '', 'GET');
        //return $respuesta;
        //--  SE AMPLIA RESULTADO, SE INCORPORAN PARAMETRO DE INGRESO  --//
        $respuesta = json_decode($respuesta);
        return json_encode([
            'parameters' => $enviados,
            'response' => $respuesta
        ]);
    }

    public static function obtenerApiPEP_full()
    {
        $ip = $_SERVER['REMOTE_ADDR'];
        //$country            = Request::input('country_code');
        $tax_id = (Request::input('tax_id') !== null) ? Request::input('tax_id') : 'null';
        $name = Request::input('full_name');
        $apikey = Request::input('apikey');
        //$version 			= Request::input('version');
        $url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        //$enviados = array('country_code' => $country, 'tax_id' => $tax_id, 'full_name' => $name);
        $enviados = [];

        $usuario = Session::get('usuario');
        $producto = $usuario->producto ?? 88;
        //self::consumir_servicio($tax_id,$producto);

        $respuesta = [];
        /*$respuesta == LLAMAMOS A PEP */
        //$url = env('API_PEP');  //--> COMENTAR PARA DEBUG
        $url = env('API_PEP_FULL');  //--> COMENTAR PARA PRODUCCION
        $params = '?cuit=' . $tax_id . '&nombre_persona=' . str_replace(' ', '%20', $name) . '&pais=' . '';
        $respuesta = Misc::CURLCall($url . $params, '', 'GET');
        return $respuesta;

        /* $respuesta = json_decode($respuesta);
        return json_encode([
            'parameters' => $enviados,
            'response' => $respuesta
        ]); */
    }

    //--  NUEVA VERSION A PEDIDO  --//
    public static function obtenerICXML3()
    {
        $nn = self::ICSinGraficos();
        header('Content-Type: application/xml');
        $cuit = Request::input('cuit');
        $apikey = Request::input('apikey');
        $cliente = Request::input('cliente') ?? 110864291;
        $response = '';
        $xml = new \SimpleXMLElement('<?xml version="1.0" encoding="utf-8" standalone="yes"?><data/>');
        $busqueda = $xml->addChild('busqueda');
        $busqueda->addChild('cliente', $cliente);
        $busqueda->addChild('cuit', $cuit);
        $data = $xml->addChild('response');
        self::$revisar_monsanto = true;
        $resp = self::obtenerServicioScore($cuit, true, false);
        $data->addChild('html', $nn);
        $data->addChild('rechazo', self::$monsanto);
        $data->addChild('estado', self::estadoRechazado(self::$monsanto));
        return $xml->asXML();
    }

    public static function estadoRechazado($estado)
    {
        $estado = explode(' ', $estado);
        if ($estado[0] == 'Rechazo') {
            return 'R';
        }
        return 'A';
    }

    //----------------------------------------------------------------------------------------------------------//

    // =================================================
    // ---------- SECCION API IMPERIUM-ACCESO ----------
    // =================================================

    static function imperiumControlAccesoData()
    {
        // CAPTURO DATOS ENVIADO
        $cli = Session::get('usuario')->cliente['client_id'];
        // $cli = Request::input('cli'); // -> TEST
        $usr = Session::get('usuario')->user_id;
        $id_padron = Request::input('id_padron') ?? null;
        $num = Request::input('tax_id') ?? null;
        $dominio = ! empty(Request::input('dominio')) ? Request::input('dominio') : NULL;
        $locacion = Request::input('locacion') ?? null;
        $tipo_acceso = Request::input('tipo_acceso') ?? null;
        $apikey = Request::input('apikey');
        // ARMO EL OBJETO ENVIADOS PARA MOSTRAR AL USUARIO LOS DATOS ENVIADOS		
        $enviados = (object) [];
        $enviados->tax_id_persona = $num;
        $enviados->dominio = $dominio;
        $enviados->punto_acceso = $locacion;
        $enviados->tipo_acceso = $tipo_acceso;
        // VALIDACIÓN INICIAL, QUE EXISTAN LOS DATOS Y QUE SEAN EL TIPO DE DATOS CORRECTO
        if (isset($_POST['apikey']) && (isset($_POST['tax_id']) && is_numeric($_POST['tax_id'])) && (isset($_POST['locacion']) && is_numeric($_POST['locacion'])) && isset($_POST['tipo_acceso'])) {

            // Busco el dato de la identificación fiscal dentro de los contratistas y empleados del cliente
            $acceso = SQLConnection::backendStoreProcedure('Imperium_buscar_identificacion_acceso', array($cli, $id_padron, $num), 'select');
            // if (is_array($acceso)){
            // 	$acceso = $acceso[1];
            // }
            if ($tipo_acceso == 'I') {
                $tipo_acceso = 'Ingreso';
            } elseif ($tipo_acceso == 'E') {
                $tipo_acceso = 'Egreso';
            }
            // $reporte = !empty(Request::input('reporte')) ? Request::input('reporte') : "NO";

            $loc = SQLConnection::backendStoreProcedure('Imperium_buscar_locaciones', array(NULL, NULL, $locacion), 'selectOne');
            $seccion = (! empty($acceso[0])) ? $acceso[0]->led_seccion : null;

            // ID de contratista o ID de empleado y acecso
            $id = null;
            if (! empty($acceso[0])) {
                $id = ($acceso[0]->led_seccion == 'E') ? $acceso[0]->empleado : $acceso[0]->contratista;
            }
            $data_acceso = SQLConnection::backendStoreProcedure('Imperium_Control_Acceso', array($cli, $locacion, $seccion, ($seccion == 'C' ? $id : NULL), ($seccion == 'E' ? $id : NULL)), 'selectOne');
            if ($data_acceso == null) {
                $seccion = (! empty($acceso[1])) ? $acceso[1]->led_seccion : null;
                $id = ($acceso[1]->led_seccion == 'E') ? $acceso[1]->empleado : $acceso[1]->contratista;
                $data_acceso = SQLConnection::backendStoreProcedure('Imperium_Control_Acceso', array($cli, $locacion, $seccion, ($seccion == 'C' ? $id : NULL), ($seccion == 'E' ? $id : NULL)), 'selectOne');
            }
            $acceso_autorizado_empleado = (! is_null($data_acceso) && $data_acceso->acceso == 0) ? 'Rechazado' : 'Aprobado';

            // Docs pendientes del empleado
            $docs = SQLConnection::backendStoreProcedure('Imperium_Control_Acceso_Documentacion', array($seccion, $id), 'select');
            $docs_pendientes = [];
            $pendientes = 0;
            foreach ($docs as $key => $d) {
                $d->estado_doc != 'V' ? $pendientes++ : $pendientes;
                if ($d->estado_doc != 'V') {
                    $doc_pendiente = $d->nombre_tipo_doc . ' - Período ' . substr_replace($d->periodo, '-', 4, 0) . ' - A verificar por ';
                    if ($d->verificacion == 'F') {
                        $doc_pendiente = $doc_pendiente . 'Fidelitas';
                    } elseif ($d->verificacion == 'C') {
                        $doc_pendiente = $doc_pendiente . $d->nombre_cliente;
                    }
                    array_push($docs_pendientes, $doc_pendiente);
                }
            }

            // Datos y acceso del vehículo en caso de haberse ingresado un dominio
            $data_vehiculo = NULL;
            $acceso_vehiculo = NULL;
            $docs_veh = NULL;
            $docs_pendientes_veh = [];
            $pendientes_veh = 0;
            $acceso_autorizado_vehiculo = null;
            if (! empty($dominio)) {
                $data_vehiculo = SQLConnection::backendStoreProcedure('Imperium_buscar_vehiculos', array('search', NULL, NULL, NULL, NULL, NULL, $dominio), 'selectOne');
                if (! empty($data_vehiculo)) {
                    $acceso_vehiculo = SQLConnection::backendStoreProcedure('Imperium_Control_Acceso', array($cli, $locacion, 'V', NULL, NULL, $data_vehiculo->vehiculo), 'selectOne');
                    $docs_veh = SQLConnection::backendStoreProcedure('Imperium_Control_Acceso_Documentacion', array('V', $data_vehiculo->vehiculo), 'select');
                    $acceso_autorizado_vehiculo = (! is_null($acceso_vehiculo) && $acceso_vehiculo->acceso == 0) ? 'Rechazado' : 'Aprobado';
                    if (! is_null($data_vehiculo) && ! is_null($data_acceso) && $data_vehiculo->contratista_1 != $data_acceso->contratista_1) {
                        $acceso_autorizado_vehiculo = 'El dominio indicado no pertenece al contratista';
                    } else {
                        foreach ($docs_veh as $dv) {
                            $dv->estado_doc != 'V' ? $pendientes_veh++ : $pendientes_veh;
                            if ($dv->estado_doc != 'V') {
                                $doc_pendiente = $dv->nombre_tipo_doc . ' - Período ' . substr_replace($dv->periodo, '-', 4, 0) . ' - A verificar por ';
                                if ($dv->verificacion == 'F') {
                                    $doc_pendiente = $doc_pendiente . 'Fidelitas';
                                } elseif ($dv->verificacion == 'C') {
                                    $doc_pendiente = $doc_pendiente . $dv->nombre_cliente;
                                }
                                array_push($docs_pendientes_veh, $doc_pendiente);
                            }
                        }
                    }

                } else {
                    $acceso_autorizado_vehiculo = 'No hay datos de dominio';
                }
            }

            // Genero objetos con los datos recolectados de la persona y el vehículo que desea ingresar y los devuelvo en formato json
            $response = (object) [];
            $personas = (object) [];
            $vehiculo = (object) [];
            // LOCACION
            $personas->punto_acceso = $loc->nombre_locacion;
            $personas->tipo_acceso = $tipo_acceso;
            // CONTRATISTA
            $personas->contratista_nombre = ($data_acceso->nombre_contratista_1) ?? null;
            $personas->contratista_tipo_tax_id = (! is_null($personas->contratista_nombre) && ! is_null($data_acceso->abreviatura_1)) ? $data_acceso->abreviatura_1 : null;
            $personas->contratista_tax_id = (! is_null($personas->contratista_nombre) && ! is_null($data_acceso->identificacion_1)) ? $data_acceso->identificacion_1 : null;
            // SUBCONTRATISTA (SI HUBIERA)
            $personas->subcontratista_nombre = ($data_acceso->nombre_contratista_0) ?? null;
            $personas->subcontratista_tipo_tax_id = (! is_null($personas->subcontratista_nombre) && ! is_null($data_acceso->abreviatura_0)) ? $data_acceso->abreviatura_0 : null;
            $personas->subcontratista_tax_id = (! is_null($personas->subcontratista_nombre) && ! is_null($data_acceso->identificacion_0)) ? $data_acceso->identificacion_0 : null;
            // EMPLEADO
            $personas->empleado_nombre = ($data_acceso->nombre_persona) ?? null;
            $personas->empleado_tipo_tax_id = (! is_null($personas->empleado_nombre) && ! is_null($data_acceso->abreviatura)) ? $data_acceso->abreviatura : null;
            $personas->empleado_tax_id = (! is_null($personas->empleado_nombre) && ! is_null($data_acceso->identificacion)) ? $data_acceso->identificacion : null;
            // DOCUMENTACION PENDIENTE Y ESTADO EMPLEADO
            $personas->cantidad_docs_pendientes = $pendientes;
            $personas->docs_pendientes = $docs_pendientes;
            $personas->estado_acceso_empleado = $acceso_autorizado_empleado;
            // VEHÍCULO
            $vehiculo->dominio = $dominio;
            $vehiculo->vehiculo_nombre = ($data_vehiculo->nombre_vehiculo) ?? null;
            // DOCUMENTACION PENDIENTE Y ESTADO VEHÍCULO
            $vehiculo->vehiculo_cantidad_docs_pendientes = $pendientes_veh;
            $vehiculo->vehiculo_docs = $docs_pendientes_veh;
            $vehiculo->estado_acceso_vehiculo = $acceso_autorizado_vehiculo;
            // ESTRUCTURA FINAL DE JSON
            $response->fecha_consulta = date("Y-m-d H:i:s");
            $response->personas = $personas;
            $response->vehiculo = $vehiculo;
            if ($personas->empleado_nombre == null || $personas->contratista_nombre == null) {
                return json_encode([
                    'Parameters' => $enviados,
                    'Status' => 'ERROR',
                    'Message' => 'Los datos enviados son inválidos',
                    'Response' => []
                ]);
            }
            return (json_encode([
                'Parameters' => $enviados,
                'Status' => 'OK',
                'Message' => 'OK',
                'Response' => $response
            ]));
        } else {
            return json_encode([
                'Parameters' => $enviados,
                'Status' => 'ERROR',
                'Message' => 'Alguno de los datos principales no es correcto o está vacío',
                'Response' => []
            ]);
        }
    }

    // -------------------------------------------------------------------

    // pasaje facturas a tango
    public static function pedidosFacturacionEnc()
    {
        $pedidos = [];
        $param = array();
        $pedidos = SQLConnection::backendStoreProcedure('fide_header_tango_procesar', $param, 'selectAll');
        return json_encode([
            'Response' => $pedidos
        ]);
    }

    public static function pedidosFacturacionDet()
    {
        $pedidos = [];
        $param = array();

        $pedidos = SQLConnection::backendStoreProcedure('fide_detail_tango_procesar', $param, 'selectAll');
        return json_encode([
            'Response' => $pedidos
        ]);
    }

    //obtiene la constancia de inscripcion, primero la busca en afip y luego la devuelve.
    public static function obtenerConstanciaPDF()
    {
        $cuit = Request::input('cuit');
        AFIPController::obtenerConstanciaPDF($cuit);
        return MainController::obtenerConstanciaPDF(true);
    }

    //Nivel SocioEconómico

    public static function obtenerNivelSocioEconomico()
    {
        $cuit = Request::input('cuit');
        $tipo_persona = (substr($cuit, 0, 1) != '3') ? 'f' : 'j';
        /* 22/07/2021 Agregamos que pase por afip */
        if (! empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }

        $nivel_socioeconomico = new stdClass();
        // self::obtenerCuitsNivelSE(); // no estaba en www y si en www2, pero obtenerCuitsNivelSE() no funciona porque no funciona el SP obtener_nivel_socioeconomico_dev

        //$nivel_socioeconomico->respuesta_minima = new stdClass();
        if (! isset($cuit)) {
            return json_encode(['error' => true, 'error_message' => 'El parámetro cuit debe poseer 11 caracteres.']);
        }

        if (strlen($cuit) != 11) {
            return json_encode(['error' => true, 'error_message' => 'El cuit contiene un largo diferente de 11.']);

        }

        //$nivel= SQLConnection::backendStoreProcedure('obtener_nivel_socioeconomico_2021',array($cuit,$tipo_persona),true);
        /* 04/05/2021: Si el score es N/A para personas fisicas, el nivel socioeconomico = N/A */
        $respuesta = json_decode(self::obtenerServicioScore($cuit, true, false));
        $score = $respuesta->score;
        if (strtoupper($tipo_persona) == 'F' && $score == 0) {
            $nivel = new StdClass();
            $nivel->rango_minimo = '0';
            $nivel->rango_maximo = '0';
        } else {
            $nivel = SQLConnection::backendStoreProcedure('obtener_nivel_socioeconomico_2021', array($cuit, $tipo_persona), true);
        }

        if (isset($nivel->rango_minimo)) {
            //  $nivel_socioeconomico->respuesta_minima->rango_minimo = $nivel->rango_minimo;
        }
        if (isset($nivel->rango_maximo)) {
            //  $nivel_socioeconomico->respuesta_minima->rango_maximo = $nivel->rango_maximo;
        }
        //$nivel_socioeconomico->respuesta_completa = $nivel;
        return json_encode($nivel);
    }

    public static function calcularScoreContable_v2($respuesta, $item, $porcentaje_contable)
    {
        if (! isset($respuesta['score'])) {
            $score = 0;
        } else {
            $score = $respuesta['score'];
        }

        if (empty($respuesta['afecta_indirecto']['debug']) || ! array($respuesta['afecta_indirecto']['debug'])) {
            $respuesta['afecta_indirecto']['debug'] = [];
        }

        $demeritador = SQLConnection::CalcularScoreContable(
            5,
            $item->liquidez_corriente,
            $item->solvencia_patrimonial,
            $item->endeudamiento_corriente,
            $item->capital_de_trabajo_activo,
            $item->rentabilidad_bruta,
            $item->utilidad_neta
        );
        $res = 0;
        $liquidez_corriente = 0;
        $solvencia_patrimonial = 0;
        $endeudamiento_corriente = 0;
        $capital_de_trabajo_activo = 0;
        $rentabilidad_bruta = 0;
        $utilidad_neta = 0;

        if ($demeritador->liquidez_corriente != 0) {
            $liquidez_corriente += (($porcentaje_contable / 100) * 17.6 / 100 * ($demeritador->liquidez_corriente * 10));
            //echo(var_dump($respuesta['afecta_indirecto']['debug']));die();
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$liquidez_corriente.  " de 17.6  Liquidez Corriente , el valor sobre el puntaje que le dió fue: ".$demeritador->liquidez_corriente." para el grupo 5 Contables");
            $respuesta['afecta_indirecto']['debug'] = "Le suma " . $liquidez_corriente . " de 17.6  Liquidez Corriente , el valor sobre el puntaje que le dió fue: " . $demeritador->liquidez_corriente . " para el grupo 5 Contables";
        }
        if ($demeritador->endeudamiento_corriente != 0) {
            $endeudamiento_corriente += (($porcentaje_contable / 100) * 16.2 / 100 * ($demeritador->endeudamiento_corriente * 10));
            $respuesta['afecta_indirecto']['debug'] = "Le suma " . $endeudamiento_corriente . " de 16.2 endeudamiento_corriente  , el valor sobre el puntaje que le dió fue: " . $demeritador->endeudamiento_corriente . "  para el grupo 5 Contables";

        }
        if ($demeritador->solvencia_patrimonial != 0) {
            $solvencia_patrimonial += (($porcentaje_contable / 100) * 22.6 / 100 * ($demeritador->solvencia_patrimonial * 10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$solvencia_patrimonial. " de 22.6 solvencia_patrimonial  , el valor sobre el puntaje que le dió fue: ".$demeritador->solvencia_patrimonial."  para el grupo 5 Contables");
            $respuesta['afecta_indirecto']['debug'] = "Le suma " . $solvencia_patrimonial . " de 22.6 solvencia_patrimonial  , el valor sobre el puntaje que le dió fue: " . $demeritador->solvencia_patrimonial . "  para el grupo 5 Contables";
        }

        if ($demeritador->capital_de_trabajo_activo != 0) {
            $capital_de_trabajo_activo += (($porcentaje_contable / 100) * 10.4 / 100 * ($demeritador->capital_de_trabajo_activo * 10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$capital_de_trabajo_activo. " de 10.4 capital_de_trabajo_activo  , el valor sobre el puntaje que le dió fue: ".$demeritador->capital_de_trabajo_activo."  para el grupo 5 Contables");
            $respuesta['afecta_indirecto']['debug'] = "Le suma " . $capital_de_trabajo_activo . " de 10.4 capital_de_trabajo_activo  , el valor sobre el puntaje que le dió fue: " . $demeritador->capital_de_trabajo_activo . "  para el grupo 5 Contables";
        }
        if ($demeritador->rentabilidad_bruta != 0) {
            $rentabilidad_bruta += (($porcentaje_contable / 100) * 8.8 / 100 * ($demeritador->rentabilidad_bruta * 10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$rentabilidad_bruta. " de 8.8 rentabilidad_bruta  , el valor sobre el puntaje que le dió fue: ".$demeritador->rentabilidad_bruta."  para el grupo 5 Contables");
            $respuesta['afecta_indirecto']['debug'] = "Le suma " . $rentabilidad_bruta . " de 8.8 rentabilidad_bruta  , el valor sobre el puntaje que le dió fue: " . $demeritador->rentabilidad_bruta . "  para el grupo 5 Contables";
        }
        if ($demeritador->utilidad_neta != 0) {
            $utilidad_neta += (($porcentaje_contable / 100) * 24.5 / 100 * ($demeritador->utilidad_neta * 10));
            //array_push($respuesta['afecta_indirecto']['debug'], "Le suma " .$utilidad_neta. " de 24.5 utilidad_neta  , el valor sobre el puntaje que le dió fue: ".$demeritador->utilidad_neta."  para el grupo 5 Contables");
            $respuesta['afecta_indirecto']['debug'] = "Le suma " . $utilidad_neta . " de 24.5 utilidad_neta  , el valor sobre el puntaje que le dió fue: " . $demeritador->utilidad_neta . "  para el grupo 5 Contables";
        }
        $res = $liquidez_corriente + $solvencia_patrimonial + $endeudamiento_corriente + $capital_de_trabajo_activo + $rentabilidad_bruta + $utilidad_neta;
        if ($res > $porcentaje_contable) {
            $res = $porcentaje_contable;
        }
        //array_push($respuesta['afecta_indirecto']['debug'], "Le suma en total a Contables : ".$res);
        $respuesta['afecta_indirecto']['debug'] = "Le suma en total a Contables : " . $res;
        $score += $res;
        $respuesta['score'] = $score;
        return $respuesta;
    }

    // ========================================================================
    // ----------------------------- SASS INICIO ------------------------------
    // ========================================================================


    // SASS - Clientes
    public static function insertClienteSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'INSERT';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_cliente = 0;
        $p_cliente = '2254875'; //$usuario->cliente['client_id'];
        $p_cliente_saas = Request::input('cliente_saas');
        $p_id_padron = Request::input('id_padron');
        $p_domicilio = trim(Request::input('domicilio'));
        $p_localidad = trim(Request::input('localidad'));
        $p_provincia = trim(Request::input('provincia'));
        $p_pais = trim(Request::input('pais'));
        $p_codpos = trim(Request::input('codpos'));
        $p_telefono = trim(Request::input('telefono'));
        $p_nombre_contacto = trim(Request::input('nombre_contacto'));
        $p_email_contacto = trim(Request::input('email_contacto'));
        $p_telefono_contacto = trim(Request::input('telefono_contacto'));
        $p_datos_adicionales = trim(Request::input('datos_adicionales'));
        $p_clave = trim(Request::input('clave'));
        $p_clave_temporal = trim(Request::input('clave_temporal'));
        $p_vigencia_desde = trim(Request::input('vigencia_desde'));
        $p_vigencia_hasta = trim(Request::input('vigencia_hasta'));
        $p_activo = 1;

        $insert = SQLConnection::backendStoreProcedure('SAAS_Clientes_', array($accion, $p_user_id, $p_saas_cliente, $p_cliente, $p_cliente_saas, $p_id_padron, $p_domicilio, $p_localidad, $p_provincia, $p_pais, $p_codpos, $p_telefono, $p_nombre_contacto, $p_email_contacto, $p_telefono_contacto, $p_datos_adicionales, $p_clave, $p_clave_temporal, $p_vigencia_desde, $p_vigencia_hasta, $p_activo), 'selectOne');

        if ($insert->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $insert->mensaje, 'saas_cliente' => '0']);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $insert->mensaje,
                'saas_cliente' => $insert->saas_cliente
            ]);
        }
    }

    public static function updateClienteSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'UPDATE';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_cliente = Request::input('saas_cliente');
        $p_cliente = '2254875'; //$usuario->cliente['client_id'];
        $p_cliente_saas = Request::input('cliente_saas');
        $p_id_padron = 0;
        $p_domicilio = trim(Request::input('domicilio'));
        $p_localidad = trim(Request::input('localidad'));
        $p_provincia = trim(Request::input('provincia'));
        $p_pais = trim(Request::input('pais'));
        $p_codpos = trim(Request::input('codpos'));
        $p_telefono = trim(Request::input('telefono'));
        $p_nombre_contacto = trim(Request::input('nombre_contacto'));
        $p_email_contacto = trim(Request::input('email_contacto'));
        $p_telefono_contacto = trim(Request::input('telefono_contacto'));
        $p_datos_adicionales = trim(Request::input('datos_adicionales'));
        $p_clave = trim(Request::input('clave'));
        $p_clave_temporal = trim(Request::input('clave_temporal'));
        $p_vigencia_desde = trim(Request::input('vigencia_desde'));
        $p_vigencia_hasta = trim(Request::input('vigencia_hasta'));
        $p_activo = Request::input('activo');

        $update = SQLConnection::backendStoreProcedure('SAAS_Clientes_', array($accion, $p_user_id, $p_saas_cliente, $p_cliente, $p_cliente_saas, $p_id_padron, $p_domicilio, $p_localidad, $p_provincia, $p_pais, $p_codpos, $p_telefono, $p_nombre_contacto, $p_email_contacto, $p_telefono_contacto, $p_datos_adicionales, $p_clave, $p_clave_temporal, $p_vigencia_desde, $p_vigencia_hasta, $p_activo), 'selectOne');

        if ($update->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $update->mensaje]);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $update->mensaje
            ]);
        }
    }

    public static function deleteClienteSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'DELETE';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_cliente = Request::input('saas_cliente');

        $delete = SQLConnection::backendStoreProcedure('SAAS_Clientes_', array($accion, $p_user_id, $p_saas_cliente), 'selectOne');

        if ($delete->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $delete->mensaje]);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $delete->mensaje
            ]);
        }
    }

    public static function selectClienteSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'SELECT';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_cliente = Request::input('saas_cliente');

        $select = SQLConnection::backendStoreProcedure('SAAS_Clientes_', array($accion, $p_user_id, $p_saas_cliente), 'selectOne');
        return json_encode($select);
    }

    public static function selectAllClienteSaas()
    {

        $accion = 'SELECTALL';

        $select = SQLConnection::backendStoreProcedure('SAAS_Clientes_', array($accion), 'select');
        return json_encode($select);
    }

    public static function insertUsuarioSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'INSERT';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario = 0;
        $p_saas_cliente = Request::input('saas_cliente');
        $p_username = Request::input('username');
        $p_sector = trim(Request::input('sector'));
        $p_nombre = trim(Request::input('nombre'));
        $p_email = trim(Request::input('email'));
        $p_telefono = trim(Request::input('telefono'));
        $p_clave = trim(Request::input('clave'));
        $p_clave_temporal = trim(Request::input('clave_temporal'));
        $p_datos_adicionales = trim(Request::input('datos_adicionales'));
        $p_vigencia_desde = trim(Request::input('vigencia_desde'));
        $p_vigencia_hasta = trim(Request::input('vigencia_hasta'));
        $p_activo = 1;

        $insert = SQLConnection::backendStoreProcedure('SAAS_Usuarios_', array($accion, $p_user_id, $p_saas_usuario, $p_saas_cliente, $p_username, $p_sector, $p_nombre, $p_email, $p_telefono, $p_clave, $p_clave_temporal, $p_datos_adicionales, $p_vigencia_desde, $p_vigencia_hasta, $p_activo), 'selectOne');

        if ($insert->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $insert->mensaje, 'saas_usuario' => '0']);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $insert->mensaje,
                'saas_usuario' => $insert->saas_usuario
            ]);
        }
    }

    public static function updateUsuarioSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'UPDATE';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario = Request::input('saas_usuario');
        $p_saas_cliente = Request::input('saas_cliente');
        $p_username = Request::input('username');
        $p_sector = trim(Request::input('sector'));
        $p_nombre = trim(Request::input('nombre'));
        $p_email = trim(Request::input('email'));
        $p_telefono = trim(Request::input('telefono'));
        $p_clave = trim(Request::input('clave'));
        $p_clave_temporal = trim(Request::input('clave_temporal'));
        $p_datos_adicionales = trim(Request::input('datos_adicionales'));
        $p_vigencia_desde = trim(Request::input('vigencia_desde'));
        $p_vigencia_hasta = trim(Request::input('vigencia_hasta'));
        $p_activo = trim(Request::input('activo'));

        $update = SQLConnection::backendStoreProcedure('SAAS_Usuarios_', array($accion, $p_user_id, $p_saas_usuario, $p_saas_cliente, $p_username, $p_sector, $p_nombre, $p_email, $p_telefono, $p_clave, $p_clave_temporal, $p_datos_adicionales, $p_vigencia_desde, $p_vigencia_hasta, $p_activo), 'selectOne');

        if ($update->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $update->mensaje]);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $update->mensaje
            ]);
        }
    }

    #Version 3 del informe comercial, se cambiaron los errores a una forma estandarizada -TB
    public static function InformeComercialTrad_v3()
    {
        $json_ic = [];
        if (isset($_POST['tax_id']) || isset($_POST['cuit'])) {

            $tax_id = Request::input('tax_id');
            $cuit = Request::input('cuit');
            $apikey = Request::input('apikey');
            if (! empty($cuit)) {
                $json_ic = self::ObtenerInformeComercialCompleto_v3($cuit, $apikey, 'ENG');
            } elseif (! empty($tax_id)) {
                $json_ic = self::ObtenerInformeComercialCompleto_v3($tax_id, $apikey, 'ENG');
            }
        }

        return $json_ic;
    }

    #Version 3 del informe comercial completo, se cambian los errores por una forma estandarizada
    public static function ObtenerInformeComercialCompleto_v3Org($cuit = '', $apikey = '', $idioma = 'ESP')
    {
        //datos básicos y declaraciones de clases y arrays, para que no fallen
        if (! $cuit) {
            $cuit = Request::input('cuit');
        }
        /* 22/07/2021 Agregamos que pase por afip */
        if (! empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }
        // $idioma = (Request::input('idioma') !== NULL ) ? Request::input('idioma') : 'ESP';

        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;

        // AGB por favor transaccionar el ID producto que corresponde a cada APIKEY . Está usando fijo el 55 y ese producto se llama
        // informe comercial Teipesa. Creditsafe y Mati usan esta ruta con diferentes apikey y con el producto 79
        // Luego hay que actualizar la base de datos para que los consumos del 55 se muevan al 79 para estos dos clientes
        // El apikey se controla en api.php pero el producto del apikey se ignora.

        $producto = $usuario->producto ?? 55;
        //$p_ip   = $_SERVER['REMOTE_ADDR'];
        //$csa = SQLConnection::backendStoreProcedure('consumir_servicio_API',array($user_id,$cuit,$producto,$p_ip),'selectOne');
        $csa = self::consumir_servicio($cuit, $producto);

        //SQLConnection::consumirServicio($user_id,$cuit,55);

        if (! $apikey) {
            $apikey = Request::input('apikey');
        }
        $user_id = 0;
        $persona = new stdClass();
        $configuracion = [];
        $cuit_validado = Misc::validarCuit($cuit);

        if (! $cuit_validado) {
            return json_encode(['Status' => '301', 'error' => Misc::error_query(301)]);
        }

        $respuesta = json_decode(self::obtenerServicioScore($cuit, true, false));
        $idp = SQLConnection::obtenerIdPadron($cuit);

        if (is_null($idp) || empty($idp)) {
            return json_encode(['Status' => '401', 'error' => Misc::error_query(401)]);
        }

        $id_padron = $idp->id_padron;

        //obtengo la configuración para este cliente/usuario y veo que secciones le habilito
        if ($apikey) {
            $configuracion = SQLConnection::backendStoreProcedure('api_obtener_configuracion_secciones', array($apikey), true);
            
        }

        // Información Score
        if ($configuracion->score_ic == 1) {
            $score = $respuesta->score;
            if ($idioma == 'ESP') {
                $persona->score = new stdClass();
                $persona->score->valor = $score;
            } elseif ($idioma == 'ENG') {
                $persona->score = new stdClass();
                $persona->score->value = $score;
            }
        }

        //si tiene la configuración de formales, tomamos todos los datos posibles del formales. (defunción, domicilios, datos personales. etc.)
        if ($configuracion->formales == 1) {
            //definicion de variables compartidas.
            $nombre = '';
            $defuncion = SQLConnection::backendStoreProcedure('obtener_defuncion', array($cuit), true);
            $fisica_juridica = Misc::tipoPersona($cuit);
            $p_fisica = ($fisica_juridica == 'F') ? 'FISICA' : 'JURIDICA';
            //
            $legalForm = "";
            if ("F" != $p_fisica) {
                $cardScore = SQLConnection::obtenerCardScore($cuit);
                if (!empty($cardScore) && property_exists($cardScore, 'forma_juridica')) {
                    $legalForm = $cardScore->forma_juridica ?? "";
                }
            } else {
                $cardScorePF = SQLConnection::obtenerCardScorePF($cuit);
                if (!empty($cardScorePF) && property_exists($cardScorePF, 'forma_juridica')) {
                    $legalForm = $cardScorePF->forma_juridica ?? "";
                }
            }                        
            
            if ($idioma == 'ESP') {
                $persona->formales = new stdClass();
                $persona->formales->tipo_persona = $p_fisica;
                $persona->formaldata->forma_legal = $legalForm;
            } elseif ($idioma == 'ENG') {
                $persona->formaldata = new stdClass();
                $persona->formaldata->legal_type = $p_fisica;
                $persona->formaldata->legal_form = $legalForm;
            }

            $telefonos = SQLConnection::backendStoreProcedure('obtener_telefono', array($id_padron));

            if ($idioma == 'ESP') {
                $persona->formales->identificacion = $cuit;
            } elseif ($idioma == 'ENG') {
                $persona->formaldata->taxid = $cuit;
            }

            if ($fisica_juridica == 'F') {
                $datos_persona = SQLConnection::backendStoreProcedure('obtener_persona', array($cuit), true);
                $nombre = $datos_persona->nombre_persona;
                $dni = (int) substr($cuit, 2, -1);
                $empleado_de = SQLConnection::backendStoreProcedure('obtener_empleado_de', array($cuit));
                if ($idioma == 'ESP') {
                    $persona->formales->dni = (string) $dni;
                    $persona->formales->telefonos = $telefonos;
                    $persona->formales->sexo = $datos_persona->sexo;
                    $persona->formales->anio_nacimiento = $datos_persona->anio_nacimiento;
                    //$persona->formales->nacionalidad    = ''; // en www2 estaba sacada esta linea
                    //$persona->formales->ejemplar        = '';
                    $persona->formales->defuncion = new stdClass();
                } elseif ($idioma == 'ENG') {
                    $persona->formaldata->national_id = (string) $dni;
                    $persona->formaldata->phone = $telefonos;
                    $persona->formaldata->gender = $datos_persona->sexo;
                    $persona->formaldata->YOB = $datos_persona->anio_nacimiento;
                    //$persona->formaldata->nacionalidad    = ''; // en www2 estaba sacada esta linea
                    //$persona->formaldata->ejemplar        = '';
                    $persona->formaldata->death_info = new stdClass();
                }

                if (! empty($datos_persona->fecha_nacimiento)) {
                    $edad = Misc::calcularEdad($datos_persona->fecha_nacimiento);
                    if ($edad) {
                        if ($idioma == 'ESP') {
                            $persona->formales->edad = $edad;
                        } elseif ($idioma == 'ENG') {
                            $persona->formaldata->age = $edad;
                        }
                    }
                }
                //
                if ($idioma == 'ESP') {
                    $persona->formales->empleado_de = $empleado_de;
                    $persona->formales->profesion = $datos_persona->profesion;
                    $persona->formales->fecha_nacimiento = $datos_persona->fecha_nacimiento;
                    $persona->formales->estado_civil = $datos_persona->estado_civil;
                    //
                    $persona->formales->defuncion->fuente = ! empty($defuncion->fuente) ? $defuncion->fuente : '-';
                    $persona->formales->defuncion->fecha_deceso = ! empty($defuncion->fecha_deceso) ? $defuncion->fecha_deceso : '-';
                    $persona->formales->defuncion->defuncion = ! empty($defuncion->defuncion) ? $defuncion->defuncion : '-';
                } elseif ($idioma == 'ENG') {
                    // FALTA TRADUCIR
                    $persona->formaldata->employee_of = $empleado_de;
                    $persona->formaldata->profession = $datos_persona->profesion;
                    $persona->formaldata->DOB = $datos_persona->fecha_nacimiento;
                    $persona->formaldata->marital_status = $datos_persona->estado_civil;
                    //
                    $persona->formaldata->death_info->source = ! empty($defuncion->fuente) ? $defuncion->fuente : '-';
                    $persona->formaldata->death_info->DOD = ! empty($defuncion->fecha_deceso) ? $defuncion->fecha_deceso : '-';
                    $persona->formaldata->death_info->isdead = ! empty($defuncion->defuncion) ? $defuncion->defuncion : '-';
                }
            } else {
                $nombre = SQLConnection::obtenerRazonSocial($cuit)->nombre_persona;
                $sociedades = SQLConnection::backendStoreProcedure('obtener_sociedades', array($cuit));
                $info_empresa_formales = [];
                $card_empleados = SQLConnection::backendStoreProcedure('obtener_empleados', array($cuit), 'selectOne');
                //
                if (isset($card_empleados->total)) {
                    if ($idioma == 'ESP') {
                        $card_empleados->total = (int) $card_empleados->total;
                    } elseif ($idioma == 'ENG') {
                        $card_empleados->perc_men = $card_empleados->cantidad_hombres;
                        $card_empleados->perc_women = $card_empleados->cantidad_mujeres;
                        $card_empleados->total_employees = (int) $card_empleados->total;
                        $card_empleados->period = $card_empleados->fecha;
                        //
                        unset($card_empleados->cantidad_mujeres);
                        unset($card_empleados->cantidad_hombres);
                        unset($card_empleados->total);
                        unset($card_empleados->fecha);
                    }
                }
                //
                if ($idioma == 'ESP') {
                    $persona->formales->empleados = $card_empleados;
                } elseif ($idioma == 'ENG') {
                    $persona->formaldata->employees = $card_empleados;
                }
                //
                if ($idioma == 'ESP') {
                    foreach ($sociedades as $key => $value) {
                        $info_empresa_formales[$key] = new stdClass();
                        $info_empresa_formales[$key]->ramo = $value->ramo;
                        $info_empresa_formales[$key]->subramo = $value->subramo;
                        $info_empresa_formales[$key]->fecha_contrato_social = $value->fecha_cons;
                        $info_empresa_formales[$key]->capital = (int) $value->capital;
                    }
                    $persona->formales->mas_info = $info_empresa_formales;
                } elseif ($idioma == 'ENG') {
                    foreach ($sociedades as $key => $value) {
                        $info_empresa_formales[$key] = new stdClass();
                        $info_empresa_formales[$key]->ramo = $value->ramo;
                        $info_empresa_formales[$key]->subramo = $value->subramo;
                        $info_empresa_formales[$key]->social_contract_date = $value->fecha_cons;
                        $info_empresa_formales[$key]->capital = (int) $value->capital;
                    }
                    $persona->formaldata->more_info = $info_empresa_formales;
                }
                //
                $claes_info = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
                $claes = [];
                //
                if ($idioma == 'ESP') {
                    foreach ($claes_info as $key => $value) {
                        $claes[$key] = new stdClass();
                        $claes[$key]->cod_clae = $value->cod_clae;
                        $claes[$key]->descripcion = $value->descripcion;
                    }
                    $persona->formales->claes = $claes;
                } elseif ($idioma == 'ENG') {
                    foreach ($claes_info as $key => $value) {
                        $claes[$key] = new stdClass();
                        $claes[$key]->clae_code = $value->cod_clae;
                        $claes[$key]->description = $value->descripcion;
                    }
                    $persona->formaldata->economic_activity = $claes;
                }
            }
            //
            if ($idioma == 'ESP') {
                $persona->formales->nombre = $nombre;
                $persona->formales->domicilios = new stdClass();
            } elseif ($idioma == 'ENG') {
                $persona->formaldata->legal_name = $nombre;
                $persona->formaldata->addresses = new stdClass();
            }
            //
            $domicilios = SQLConnection::backendStoreProcedure('sp_obtener_domicilios', array($cuit));
            //
            if (! empty($domicilios)) {
                if ($idioma == 'ESP') {
                    foreach ($domicilios as $key => $value) {
                        // $domicilios[$key]->domicilio  = $domicilios[$key]->domicilio;
                        $domicilios[$key]->provincia = $domicilios[$key]->prv_nombre;
                        $domicilios[$key]->localidad = $domicilios[$key]->loc_nombre;
                        $domicilios[$key]->pais = $domicilios[$key]->pai_nombre;
                        $domicilios[$key]->cp = $domicilios[$key]->codpos;
                        // unset($domicilios[$key]->domicilio);
                        unset($domicilios[$key]->prv_nombre);
                        unset($domicilios[$key]->loc_nombre);
                        unset($domicilios[$key]->pai_nombre);
                        unset($domicilios[$key]->codpos);
                        unset($domicilios[$key]->id);
                        unset($domicilios[$key]->tipo_domicilio);
                        unset($domicilios[$key]->created);
                    }
                    //
                    $persona->formales->domicilios = $domicilios;
                } elseif ($idioma == 'ENG') {
                    // nahu
                    foreach ($domicilios as $key => $value) {
                        $domicilios[$key]->address = $domicilios[$key]->domicilio;
                        $domicilios[$key]->state = $domicilios[$key]->prv_nombre;
                        $domicilios[$key]->city = $domicilios[$key]->loc_nombre;
                        $domicilios[$key]->country = $domicilios[$key]->pai_nombre;
                        $domicilios[$key]->zip_code = $domicilios[$key]->codpos;
                        //
                        unset($domicilios[$key]->domicilio);
                        unset($domicilios[$key]->prv_nombre);
                        unset($domicilios[$key]->loc_nombre);
                        unset($domicilios[$key]->pai_nombre);
                        unset($domicilios[$key]->codpos);
                        unset($domicilios[$key]->id);
                        unset($domicilios[$key]->tipo_domicilio);
                        unset($domicilios[$key]->created);
                    }
                    //
                    $persona->formaldata->addresses = $domicilios;
                }
            }
        }

        //Información socios/directores/sociedades.
        if ($configuracion->relaciones == 1) {
            //
            if ($idioma == 'ESP') {
                $persona->relaciones = new stdClass();
                $persona->relaciones->socios = [];
                $persona->relaciones->participaciones = [];
                $persona->relaciones->vinculaciones = [];
                //
                if ($fisica_juridica == 'F') {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));

                } else {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                }
                //
                $i = 0;
                foreach ($participaciones as $key => $value) {
                    $persona->relaciones->participaciones[$i] = new stdClass();
                    $persona->relaciones->participaciones[$i]->razon_social_sociedad = $value->nombre_sociedad;
                    $persona->relaciones->participaciones[$i]->cuit_sociedad = $value->cuit_sociedad;
                    $persona->relaciones->participaciones[$i]->cuit_socio = $value->cuit_socio;
                    $persona->relaciones->participaciones[$i]->nombre_socio = $value->nombre_socio;
                    $persona->relaciones->participaciones[$i]->cargo = $value->cargo;
                    $i++;
                }
                //
                $i = 0;
                foreach ($relaciones as $key => $value) {
                    $persona->relaciones->socios[$i] = new stdClass();
                    $persona->relaciones->socios[$i]->cuit = $value->cuit;
                    $persona->relaciones->socios[$i]->pais = $value->country_name;
                    $persona->relaciones->socios[$i]->nombre_persona = $value->nombre_persona;
                    $persona->relaciones->socios[$i]->cargo = $value->car_nombre;
                    $persona->relaciones->socios[$i]->desde = $value->c04_periodo_desde;
                    $persona->relaciones->socios[$i]->hasta = $value->c04_periodo_hasta;
                    $i++;
                }
                //
                $i = 0;
                foreach ($vinculaciones as $key => $value) {
                    $persona->relaciones->vinculaciones[$i] = new stdClass();
                    $persona->relaciones->vinculaciones[$i]->cuit = $value->cuit_vinculada;
                    $persona->relaciones->vinculaciones[$i]->nombre_persona = $value->nombre_persona;
                    $persona->relaciones->vinculaciones[$i]->tipo = $value->nombre;
                    $persona->relaciones->vinculaciones[$i]->detalle = $value->detalle;
                    $i++;
                }

            } elseif ($idioma == 'ENG') {
                $persona->corporate_realationships = new stdClass();
                $persona->corporate_realationships->partners = [];
                $persona->corporate_realationships->shareholding_activity = [];
                $persona->corporate_realationships->linkages = [];
                //
                if ($fisica_juridica == 'F') {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                } else {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                }
                //
                $i = 0;
                foreach ($participaciones as $key => $value) {
                    $persona->corporate_realationships->shareholding_activity[$i] = new stdClass();
                    $persona->corporate_realationships->shareholding_activity[$i]->legal_name = $value->nombre_sociedad;
                    $persona->corporate_realationships->shareholding_activity[$i]->taxid = $value->cuit_sociedad;
                    $persona->corporate_realationships->shareholding_activity[$i]->taxid_sharheolder = $value->cuit_socio;
                    $persona->corporate_realationships->shareholding_activity[$i]->legal_name_shareholder = $value->nombre_socio;
                    $persona->corporate_realationships->shareholding_activity[$i]->role = $value->cargo;
                    $i++;
                }
                //
                $i = 0;
                foreach ($relaciones as $key => $value) {
                    $persona->corporate_realationships->partners[$i] = new stdClass();
                    $persona->corporate_realationships->partners[$i]->taxid = $value->cuit;
                    $persona->corporate_realationships->partners[$i]->country = $value->country_name;
                    $persona->corporate_realationships->partners[$i]->legal_name = $value->nombre_persona;
                    $persona->corporate_realationships->partners[$i]->position = $value->car_nombre;
                    $persona->corporate_realationships->partners[$i]->from_date = $value->c04_periodo_desde;
                    $persona->corporate_realationships->partners[$i]->to_date = $value->c04_periodo_hasta;
                    $i++;
                }
                //
                $i = 0;
                foreach ($vinculaciones as $key => $value) {
                    $persona->corporate_realationships->linkages[$i] = new stdClass();
                    $persona->corporate_realationships->linkages[$i]->tax_id = $value->cuit_vinculada;
                    $persona->corporate_realationships->linkages[$i]->legal_name = $value->nombre_persona;
                    $persona->corporate_realationships->linkages[$i]->tipo = $value->nombre;
                    $persona->corporate_realationships->linkages[$i]->description = $value->detalle;
                    $i++;
                }
            }
        }

        //Información Comercial.
        if ($configuracion->comerciales == 1) {
            if ($idioma == 'ESP') {
                $persona->comerciales = new stdClass();
            } elseif ($idioma == 'ENG') {
                $persona->commercial_data = new stdClass();
                ;
            }
            //
            $consultas_ramos = SQLConnection::backendStoreProcedure('obtener_consulta_por_ramos', array($cuit, 12));
            $seguros = SQLConnection::backendSeguros($cuit);
            $marcas = SQLConnection::backendStoreProcedure('obtener_marcas', array($cuit));
            $consultas = [];
            //
            if ($consultas_ramos) {
                if ($idioma == 'ESP') {
                    foreach ($consultas_ramos as $key_ramo => $consulta) {
                        $consultas[$key_ramo]['nombre'] = $consulta->descripcion;
                        $consultas[$key_ramo][$consulta->antiguedad] = $consulta->cantidad;
                    }
                    //
                    foreach ($consultas as $key => $consulta) {
                        if (! isset($consultas[$key]['entre_0_1'])) {
                            $consultas[$key]['entre_0_1'] = 0;
                        }
                        //
                        if (! isset($consultas[$key]['entre_1_2'])) {
                            $consultas[$key]['entre_1_2'] = 0;
                        }
                        //
                        if (! isset($consultas[$key]['entre_2_5'])) {
                            $consultas[$key]['entre_2_5'] = 0;
                        }
                        //
                        ksort($consultas[$key]);
                    }
                } elseif ($idioma == 'ENG') {
                    foreach ($consultas_ramos as $key_ramo => $consulta) {
                        $consultas[$key_ramo]['name'] = $consulta->descripcion;
                        $consultas[$key_ramo][$consulta->antiguedad] = $consulta->cantidad;
                    }
                    //
                    foreach ($consultas as $key => $consulta) {
                        if (! isset($consultas[$key]['between_0_1'])) {
                            $consultas[$key]['between_0_1'] = 0;
                        }
                        //
                        if (! isset($consultas[$key]['between_1_2'])) {
                            $consultas[$key]['between_1_2'] = 0;
                        }
                        //
                        if (! isset($consultas[$key]['between_2_5'])) {
                            $consultas[$key]['between_2_5'] = 0;
                        }
                        //
                        ksort($consultas[$key]);
                    }
                }
            }
            //
            if (! empty($marcas)) {
                if ($idioma == 'ESP') {
                    foreach ($marcas as $key => $value) {
                        unset($value->num_boletin);
                        unset($value->directorio);
                        unset($value->web);
                        unset($value->fecha_publicacion);
                        unset($value->encontrada);
                    }
                } elseif ($idioma == 'ENG') {
                    foreach ($marcas as $key => $value) {
                        $marcas[$key]->num_acta = $marcas[$key]->num_acta;
                        $marcas[$key]->type = $marcas[$key]->tipo;
                        $marcas[$key]->brand = $marcas[$key]->marca;
                        $marcas[$key]->class = $marcas[$key]->clase;
                        //
                        unset($marcas[$key]->tipo);
                        unset($marcas[$key]->marca);
                        unset($marcas[$key]->clase);
                        //
                        unset($value->num_boletin);
                        unset($value->directorio);
                        unset($value->web);
                        unset($value->fecha_publicacion);
                        unset($value->encontrada);
                    }
                }
            }
            //
            if (! empty($seguros)) {
                if ($idioma == 'ESP') {
                    foreach ($seguros as $key => $value) {
                        unset($seguros[$key]->seg_codigo);
                        unset($seguros[$key]->rie_codigo);
                        unset($seguros[$key]->id_seguros);
                        unset($seguros[$key]->id_padron);
                        unset($seguros[$key]->visible);
                        unset($seguros[$key]->estado);
                    }
                } elseif ($idioma == 'ENG') {
                    foreach ($seguros as $key => $value) {
                        $seguros[$key]->company_name = $seguros[$key]->seg_nombre;
                        $seguros[$key]->type = $seguros[$key]->rie_nombre;
                        //
                        unset($seguros[$key]->seg_nombre);
                        unset($seguros[$key]->rie_nombre);
                        //
                        unset($seguros[$key]->seg_codigo);
                        unset($seguros[$key]->rie_codigo);
                        unset($seguros[$key]->id_seguros);
                        unset($seguros[$key]->id_padron);
                        unset($seguros[$key]->visible);
                        unset($seguros[$key]->estado);
                    }
                }
            }
            //
            if ($idioma == 'ESP') {
                $persona->comerciales->consultas = $consultas;
                $persona->comerciales->seguros = $seguros;
                $persona->comerciales->marcas = $marcas;
            } elseif ($idioma == 'ENG') {
                $persona->commercial_data->qtyqueries = $consultas;
                $persona->commercial_data->insurances = $seguros;
                $persona->commercial_data->brands = $marcas;
            }
        }

        //Información Contables.
        if ($configuracion->contables == 1) {
            // $MainController = new MainController();
            // $contables      = json_decode($MainController->obtenerContables(true,'','','','','','','','','','',$cuit)->getContent())->info;
            //
            $persona->balance_sheets = new stdClass(); 
            if ($idioma == 'ESP') {
                $persona->balances = [];
                $persona->balances = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
                //
                foreach ($persona->balance_sheets as $key => $value) {
                    unset($persona->balance_sheets[$key]->id_balance);
                    unset($persona->balance_sheets[$key]->cuit);
                    unset($persona->balance_sheets[$key]->fecha_balance);
                    unset($persona->balance_sheets[$key]->ejercicio);
                    unset($persona->balance_sheets[$key]->periodo);
                    unset($persona->balance_sheets[$key]->bal_manifestacion);
                    unset($persona->balance_sheets[$key]->comentarios);
                }
            } elseif ($idioma == 'ENG') {
                //
                $persona->balance_sheets = [];
                $persona->balance_sheets = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
                //
                foreach ($persona->balance_sheets as $key => $value) {
                    $persona->balance_sheets[$key]->currency = $persona->balance_sheets[$key]->moneda;
                    $persona->balance_sheets[$key]->date = $persona->balance_sheets[$key]->fecha_balance_dmy;
                    //
                    unset($persona->balance_sheets[$key]->moneda);
                    unset($persona->balance_sheets[$key]->fecha_balance_dmy);
                    //
                    unset($persona->balance_sheets[$key]->id_balance);
                    unset($persona->balance_sheets[$key]->cuit);
                    unset($persona->balance_sheets[$key]->fecha_balance);
                    unset($persona->balance_sheets[$key]->ejercicio);
                    unset($persona->balance_sheets[$key]->periodo);
                    unset($persona->balance_sheets[$key]->bal_manifestacion);
                    unset($persona->balance_sheets[$key]->comentarios);
                }
            }
        }

        //Información Fiscal.
        if ($configuracion->fiscales == 1) {
            if ($idioma == 'ESP') {
                $persona->fiscales = new stdClass();
            } elseif ($idioma == 'ENG') {
                $persona->fiscal_data = new stdClass();
            }
            //
            $claes = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
            $inscripciones = SQLConnection::backendStoreProcedure('obtener_inscripciones', array($cuit));
            $impuestos = SQLConnection::backendStoreProcedure('obtener_padron_impuestos', array($id_padron));
            $apocrifas = SQLConnection::backendStoreProcedure('obtener_apocrifas', array($cuit));
            $sircreb = SQLConnection::backendStoreProcedure('obtener_sircreb', array($cuit));
            $arba = SQLConnection::backendStoreProcedure('obtener_arba', array($cuit));
            $aportes = SQLConnection::backendStoreProcedure('backend_mis_aportes', array($cuit, NULL, 12, 1), false);
            //
            if ($idioma == 'ESP') {
                $persona->fiscales->aportes = $aportes;
                $persona->fiscales->clae = $claes;
                $persona->fiscales->inscripciones = $inscripciones;
                $persona->fiscales->impuestos = $impuestos;
                $persona->fiscales->facturas_apocrifas = $apocrifas;
                $persona->fiscales->sircreb = $sircreb;
                $persona->fiscales->arba = $arba;
                //
            } elseif ($idioma == 'ENG') {
                $persona->fiscal_data->social_security_contributions = $aportes;//AGB VER CON DATOS
                $persona->fiscal_data->economic_activity_code = $claes;
                //
                foreach ($persona->fiscal_data->economic_activity_code as $key => $clae) {
                    $persona->fiscal_data->economic_activity_code[$key]->code = $clae->cod_clae;
                    $persona->fiscal_data->economic_activity_code[$key]->description = $clae->descripcion;
                    $persona->fiscal_data->economic_activity_code[$key]->start_date = $clae->fecha_inicio_actividad;
                    unset($persona->fiscal_data->economic_activity_code[$key]->cod_clae);
                    unset($persona->fiscal_data->economic_activity_code[$key]->descripcion);
                    unset($persona->fiscal_data->economic_activity_code[$key]->fecha_inicio_actividad);
                }
                //
                foreach ($inscripciones as $key => $value) {
                    $inscripciones[$key]->social_contract_date = $inscripciones[$key]->fecha_contrato_social;
                    $inscripciones[$key]->registration_number = $inscripciones[$key]->numero_inscripcion;
                    $inscripciones[$key]->registration_date = $inscripciones[$key]->fecha_inscripcion;
                    $inscripciones[$key]->monotributo = $inscripciones[$key]->monotributo;
                    $inscripciones[$key]->activity_start_date = $inscripciones[$key]->inicio_actividad;
                    $inscripciones[$key]->employer = $inscripciones[$key]->empleador;
                    //
                    unset($inscripciones[$key]->fecha_contrato_social);
                    unset($inscripciones[$key]->numero_inscripcion);
                    unset($inscripciones[$key]->fecha_inscripcion);
                    unset($inscripciones[$key]->inicio_actividad);
                    unset($inscripciones[$key]->empleador);
                }
                $persona->fiscal_data->registered_taxes = $inscripciones;
                //
                foreach ($impuestos as $key => $value) {
                    $impuestos[$key]->tax_code = $impuestos[$key]->codigo_impuesto;
                    $impuestos[$key]->tax_name = $impuestos[$key]->nombre_impuesto;
                    $impuestos[$key]->registration_date = $impuestos[$key]->fecha_inscripcion;
                    $impuestos[$key]->state = $impuestos[$key]->estado;
                    //
                    unset($impuestos[$key]->codigo_impuesto);
                    unset($impuestos[$key]->nombre_impuesto);
                    unset($impuestos[$key]->fecha_inscripcion);
                    unset($impuestos[$key]->estado);
                }
                //
                $persona->fiscal_data->taxes = $impuestos;
                $persona->fiscal_data->apocryphal_invoices = $apocrifas;
                $persona->fiscal_data->sircreb = $sircreb;
                $persona->fiscal_data->arba = $arba;
            }
        }

        //informacion de bancos
        if ($configuracion->bancos_y_cheques == 1) {
            //
            $bancos = SQLConnection::backendStoreProcedure('backend_central_deudores', array($cuit, 24, 1));
            $periodo = SQLConnection::backendStoreProcedure('obtener_periodo_maximo', array($cuit), 'selectOne');
            if ($idioma == 'ESP') {
                $persona->periodos = new stdClass();
                $persona->periodos->bancos = Misc::convertirFormatoFecha($periodo->periodo_maximo, 'Y-m-d', 'Ym');
                $persona->bancos = [];
                //
                foreach ($bancos as $key => $value) {
                    $persona->bancos[$key] = new stdClass();
                    $persona->bancos[$key]->codigo_entidad = $value->codigo_ent;
                    $persona->bancos[$key]->nombre_entidad = $value->nombre;
                    $persona->bancos[$key]->periodo = $value->fec_inf;
                    $persona->bancos[$key]->situacion = $value->situacion;
                    $persona->bancos[$key]->monto = $value->total;
                    $persona->bancos[$key]->dias_atraso = $value->dia_atraso;
                }
            } elseif ($idioma == 'ENG') {
                $persona->max_bank_information = new stdClass();
                $persona->max_bank_information->period = Misc::convertirFormatoFecha($periodo->periodo_maximo, 'Y-m-d', 'Ym');
                $persona->banks = [];
                //
                foreach ($bancos as $key => $value) {
                    $persona->banks[$key] = new stdClass();
                    $persona->banks[$key]->bank_code = $value->codigo_ent;
                    $persona->banks[$key]->bank_name = $value->nombre;
                    $persona->banks[$key]->period = $value->fec_inf;
                    $persona->banks[$key]->status = $value->situacion;
                    $persona->banks[$key]->amount = $value->total;
                    $persona->banks[$key]->days_late = $value->dia_atraso;
                }
            }
            //
            if ($idioma == 'ESP') {
                $persona->vinculados_segun_bcra = [];
            } elseif ($idioma == 'ENG') {
                $persona->representatives_with_banking_system = [];
            }
            //informacion de cheques
            $cheques = SQLConnection::backendStoreProcedure('obtener_cheques', array($cuit));
            $i = 0;
            foreach ($cheques as $key => $value) {
                if ($value->tipo == 'vinculaciones') {
                    if ($idioma == 'ESP') {
                        $persona->vinculados_segun_bcra[$i] = new stdClass();
                        $persona->vinculados_segun_bcra[$i]->nombre_persona_firmante = $value->nombre_persona_firmante;
                        $persona->vinculados_segun_bcra[$i]->cuit_firmante = $value->cuit_firmante;
                        $persona->vinculados_segun_bcra[$i]->nombre_persona_relacionado = $value->nombre_persona_relacionado;
                        $persona->vinculados_segun_bcra[$i]->cuit_relacionado = $value->Cuit_relacionado;
                        $persona->vinculados_segun_bcra[$i]->cantidad_cheques_firmados = $value->cantidad;
                        $persona->vinculados_segun_bcra[$i]->cantidad_cheques_totales = $value->total_cheques;
                        unset($cheques[$i]);
                        $i += 1;
                    } elseif ($idioma == 'ENG') {
                        //
                        $persona->representatives_with_banking_system[$i] = new stdClass();
                        $persona->representatives_with_banking_system[$i]->signer = $value->nombre_persona_firmante;
                        $persona->representatives_with_banking_system[$i]->signer_tax_id = $value->cuit_firmante;
                        $persona->representatives_with_banking_system[$i]->related = $value->nombre_persona_relacionado;
                        $persona->representatives_with_banking_system[$i]->related_tax_id = $value->Cuit_relacionado;
                        $persona->representatives_with_banking_system[$i]->signed_checks = $value->cantidad;
                        $persona->representatives_with_banking_system[$i]->total_checks = $value->total_cheques;
                        unset($cheques[$i]);
                        $i += 1;
                    }
                } else {
                    unset($cheques[$key]->idp);
                    unset($cheques[$key]->idppr);
                    unset($cheques[$key]->cantidad);
                    unset($cheques[$key]->total_cheques);
                }
            }
            //
            if ($idioma == 'ESP') {
                $persona->cheques = array_values($cheques);
            } elseif ($idioma == 'ENG') {
                $persona->bounced_checks = array_values($cheques);
                //
                foreach ($persona->bounced_checks as $key => $value) {
                    $persona->bounced_checks[$key]->signer = $persona->bounced_checks[$key]->nombre_persona_firmante;
                    $persona->bounced_checks[$key]->signer_tax_id = $persona->bounced_checks[$key]->cuit_firmante;
                    $persona->bounced_checks[$key]->related = $persona->bounced_checks[$key]->nombre_persona_relacionado;
                    $persona->bounced_checks[$key]->related_tax_id = $persona->bounced_checks[$key]->Cuit_relacionado;
                    $persona->bounced_checks[$key]->check_number = $persona->bounced_checks[$key]->nro_cheque;
                    $persona->bounced_checks[$key]->rejection_date = $persona->bounced_checks[$key]->fecha_rechazo;
                    $persona->bounced_checks[$key]->cover_payment_date = $persona->bounced_checks[$key]->fecha_levantamiento;
                    $persona->bounced_checks[$key]->import = $persona->bounced_checks[$key]->importe;
                    $persona->bounced_checks[$key]->cause = $persona->bounced_checks[$key]->causa;
                    $persona->bounced_checks[$key]->type = $persona->bounced_checks[$key]->tipo;
                    $persona->bounced_checks[$key]->payment_date = $persona->bounced_checks[$key]->fecha_pago;
                    //
                    unset($persona->bounced_checks[$key]->fecha_pago);
                    unset($persona->bounced_checks[$key]->nombre_persona_firmante);
                    unset($persona->bounced_checks[$key]->cuit_firmante);
                    unset($persona->bounced_checks[$key]->nombre_persona_relacionado);
                    unset($persona->bounced_checks[$key]->Cuit_relacionado);
                    unset($persona->bounced_checks[$key]->nro_cheque);
                    unset($persona->bounced_checks[$key]->fecha_rechazo);
                    unset($persona->bounced_checks[$key]->fecha_levantamiento);
                    unset($persona->bounced_checks[$key]->importe);
                    unset($persona->bounced_checks[$key]->causa);
                    unset($persona->bounced_checks[$key]->tipo);
                }
            }
        }

        //Información Comex.
        if ($configuracion->comex == 1) {
            if ($idioma == 'ESP') {
                $persona->comex = new stdClass();
            } elseif ($idioma == 'ENG') {
                $persona->comex = new stdClass();
            }
            //
            $impo = SQLConnection::backendStoreProcedure('obtener_comex', array($cuit), 'select');
            $pais = SQLConnection::backendStoreProcedure('obtener_comex_pais', array($cuit), 'select');
            $rubros = SQLConnection::backendStoreProcedure('obtener_comex_rubros', array($cuit), 'select');
            $totales = SQLConnection::backendStoreProcedure('obtener_comex_totales', array($cuit), 'selectOne');
            //
            if ($idioma == 'ESP') {
                $persona->comex->importaciones = [];
                if (! empty($impo)) {
                    foreach ($impo as $key => $value) {
                        $persona->comex->importaciones[$key] = new stdClass();
                        $persona->comex->importaciones[$key]->fecha = $value->date;
                        $persona->comex->importaciones[$key]->consumo = $value->consumo;
                        $persona->comex->importaciones[$key]->deposito = $value->deposito;
                        $persona->comex->importaciones[$key]->zonafranca = $value->zonafranca;
                        $persona->comex->importaciones[$key]->temporal = $value->temporal;
                        $persona->comex->importaciones[$key]->total = $value->total;
                    }
                }
            } elseif ($idioma == 'ENG') {
                //
                $persona->comex->imports = [];
                if (! empty($impo)) {
                    foreach ($impo as $key => $value) {
                        $persona->comex->imports[$key] = new stdClass();
                        $persona->comex->imports[$key]->date = $value->date;
                        $persona->comex->imports[$key]->consumption = $value->consumo;
                        $persona->comex->imports[$key]->deposit = $value->deposito;
                        $persona->comex->imports[$key]->free_trade_zone = $value->zonafranca;
                        $persona->comex->imports[$key]->temporary = $value->temporal;
                        $persona->comex->imports[$key]->total = $value->total;
                    }
                }
            }
            //
            if (! empty($pais)) {
                //
                if ($idioma == 'ESP') {
                    foreach ($pais as $key => $value) {
                        $persona->comex->pais[$key] = new stdClass();
                        $persona->comex->pais[$key]->tipo_operacion = $value->tipo_operacion;
                        $persona->comex->pais[$key]->fob = $value->fob;
                    }
                } elseif ($idioma == 'ENG') {
                    foreach ($pais as $key => $value) {
                        $persona->comex->country[$key] = new stdClass();
                        $persona->comex->country[$key]->operation = $value->tipo_operacion;
                        $persona->comex->country[$key]->fob = $value->fob;
                    }
                }
            }
            //
            if (! empty($rubros)) {
                // FALTA TRADUCIR
                if ($idioma == 'ESP') {
                    foreach ($rubros as $key => $value) {
                        $persona->comex->rubros[$key] = new stdClass();
                        $persona->comex->rubros[$key]->tipo_operacion = $value->tipo_operacion;
                        $persona->comex->rubros[$key]->descripcion = $value->descripcion;
                        $persona->comex->rubros[$key]->fob = $value->fob;
                        $persona->comex->rubros[$key]->posicion = $value->posicion;
                    }
                } elseif ($idioma == 'ENG') {
                    foreach ($rubros as $key => $value) {
                        $persona->comex->category[$key] = new stdClass();
                        $persona->comex->category[$key]->operation = $value->tipo_operacion;
                        $persona->comex->category[$key]->description = $value->descripcion;
                        $persona->comex->category[$key]->fob = $value->fob;
                        $persona->comex->category[$key]->position = $value->posicion;
                    }
                }
            }
            // 
            if (! empty($totales)) {
                if ($idioma == 'ESP') {
                    $persona->comex->totales = new stdClass();
                    $persona->comex->totales->total_impo = $totales->total_impo;
                    $persona->comex->totales->total_expo = $totales->total_expo;
                } elseif ($idioma == 'ENG') {
                    $persona->comex->total = new stdClass();
                    $persona->comex->total->total_imports = $totales->total_impo;
                    $persona->comex->total->total_exports = $totales->total_expo;
                }
            }
        }

        //Información Legales.
        if ($configuracion->legales == 1) {
            $actor = SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null, 'A', $cuit, 60, 1), 'select');
            $demandado = SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null, 'D', $cuit, 60, 1), 'select');
            if ($idioma == 'ESP') {
                $persona->legales = new stdClass();
                $persona->legales->actor = [];
                $persona->legales->demandado = [];
                //
                foreach ($actor as $key => $value) {
                    $persona->legales->actor[$key] = new stdClass();
                    $persona->legales->actor[$key]->fecha_causa = $value->fecha_causa;
                    $persona->legales->actor[$key]->nombre_causa = $value->nombre_causa;
                    $persona->legales->actor[$key]->cuit = $value->cuit_otra_parte;
                    $persona->legales->actor[$key]->nombre = $value->nombre_padron_otra_parte;
                    $persona->legales->actor[$key]->juzgado = $value->juzgado;
                    $persona->legales->actor[$key]->secretaria = $value->secretaria;
                }
                //
                foreach ($demandado as $key => $value) {
                    $persona->legales->demandado[$key] = new stdClass();
                    $persona->legales->demandado[$key]->fecha_causa = $value->fecha_causa;
                    $persona->legales->demandado[$key]->nombre_causa = $value->nombre_causa;
                    $persona->legales->demandado[$key]->cuit = $value->cuit_otra_parte;
                    $persona->legales->demandado[$key]->nombre = $value->nombre_padron_otra_parte;
                    $persona->legales->demandado[$key]->expediente = $value->expediente;
                    $persona->legales->demandado[$key]->juzgado = $value->juzgado;
                    $persona->legales->demandado[$key]->secretaria = $value->secretaria;
                }
            } elseif ($idioma == 'ENG') {
                $persona->legal = new stdClass();
                $persona->legal->plaintiff = [];
                $persona->legal->defendant = [];
                //
                foreach ($actor as $key => $value) {
                    $persona->legal->plaintiff[$key] = new stdClass();
                    $persona->legal->plaintiff[$key]->case_date = $value->fecha_causa;
                    $persona->legal->plaintiff[$key]->process_type = $value->nombre_causa;
                    $persona->legal->plaintiff[$key]->tax_id = $value->cuit_otra_parte;
                    $persona->legal->plaintiff[$key]->name = $value->nombre_padron_otra_parte;
                    $persona->legal->plaintiff[$key]->court = $value->juzgado;
                    $persona->legal->plaintiff[$key]->court_clerk = $value->secretaria;
                }
                //
                foreach ($demandado as $key => $value) {
                    $persona->legal->defendant[$key] = new stdClass();
                    $persona->legal->defendant[$key]->case_date = $value->fecha_causa;
                    $persona->legal->defendant[$key]->process_type = $value->nombre_causa;
                    $persona->legal->defendant[$key]->tax_id = $value->cuit_otra_parte;
                    $persona->legal->defendant[$key]->name = $value->nombre_padron_otra_parte;
                    $persona->legal->defendant[$key]->process_number = $value->expediente;
                    $persona->legal->defendant[$key]->court = $value->juzgado;
                    $persona->legal->defendant[$key]->court_clerk = $value->secretaria;
                }
            }
        }
        //
        return Response::JSON($persona);
    }

    #Version 3 del informe comercial completo, se cambian los errores por una forma estandarizada
    public static function ObtenerInformeComercialCompleto_v3($cuit = '', $apikey = '', $idioma = 'ESP') {
        //datos básicos y declaraciones de clases y arrays, para que no fallen
        if (!$cuit) {
            $cuit = Request::input('cuit');
        }
        /* 22/07/2021 Agregamos que pase por afip */
        if (!empty($cuit) && strlen($cuit) == 11) {
            AFIPController::obtenerPadron($cuit, true, 'AR', false);
        }
        // $idioma = (Request::input('idioma') !== NULL ) ? Request::input('idioma') : 'ESP';

        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;

        // AGB por favor transaccionar el ID producto que corresponde a cada APIKEY . Está usando fijo el 55 y ese producto se llama
        // informe comercial Teipesa. Creditsafe y Mati usan esta ruta con diferentes apikey y con el producto 79
        // Luego hay que actualizar la base de datos para que los consumos del 55 se muevan al 79 para estos dos clientes
        // El apikey se controla en api.php pero el producto del apikey se ignora.

        $producto = $usuario->producto ?? 55;
        //$p_ip   = $_SERVER['REMOTE_ADDR'];
        //$csa = SQLConnection::backendStoreProcedure('consumir_servicio_API',array($user_id,$cuit,$producto,$p_ip),'selectOne');
        $csa = self::consumir_servicio($cuit, $producto);

        //SQLConnection::consumirServicio($user_id,$cuit,55);

        if (!$apikey) {
            $apikey = Request::input('apikey');
        }
        $user_id = 0;
        $persona = new stdClass();
        $configuracion = [];
        $cuit_validado = Misc::validarCuit($cuit);

        if (!$cuit_validado) {

            self::Guardar_resultado_api(
                $user_id,
                $producto,
                $cuit,
                '',
                $csa->transaction_id,
                json_encode(['Status' => '301', 'error' => Misc::error_query(301)]),
                '301',
                Misc::medirTiempoRespuesta()
            );

            return json_encode(['Status' => '301', 'error' => Misc::error_query(301)]);
        }

        $respuesta = json_decode(self::obtenerServicioScore($cuit, true, false));
        $idp = SQLConnection::obtenerIdPadron($cuit);

        if (is_null($idp) || empty($idp)) {

            self::Guardar_resultado_api(
                $user_id,
                $producto,
                $cuit,
                '',
                $csa,
                json_encode(['Status' => '401', 'error' => Misc::error_query(401)]),
                '401',
                Misc::medirTiempoRespuesta()
            );

            return json_encode(['Status' => '401', 'error' => Misc::error_query(401)]);
        }

        $id_padron = $idp->id_padron;

        //obtengo la configuración para este cliente/usuario y veo que secciones le habilito
        if ($apikey) {
            $configuracion = SQLConnection::backendStoreProcedure('api_obtener_configuracion_secciones', array($apikey), true);

        }

        // Información Score
        if ($configuracion->score_ic == 1) {
            $score = $respuesta->score;
            if ($idioma == 'ESP') {
                $persona->score = new stdClass();
                $persona->score->valor = $score;
            } elseif ($idioma == 'ENG') {
                $persona->score = new stdClass();
                $persona->score->value = $score;
            }
        }

        //si tiene la configuración de formales, tomamos todos los datos posibles del formales. (defunción, domicilios, datos personales. etc.)
        if ($configuracion->formales == 1) {

            $nombre = '';
            $defuncion = SQLConnection::backendStoreProcedure('obtener_defuncion', array($cuit), true);
            $fisica_juridica = Misc::tipoPersona($cuit);
            $p_fisica = ($fisica_juridica == 'F') ? 'FISICA' : 'JURIDICA';

            $legalForm = "";
            if ("F" != $p_fisica) {
                $cardScore = SQLConnection::obtenerCardScore($cuit);
                if (!empty($cardScore) && property_exists($cardScore, 'forma_juridica')) {
                    $legalForm = $cardScore->forma_juridica ?? "";
                }
            } else {
                $cardScorePF = SQLConnection::obtenerCardScorePF($cuit);
                if (!empty($cardScorePF) && property_exists($cardScorePF, 'forma_juridica')) {
                    $legalForm = $cardScorePF->forma_juridica ?? "";
                }
            }

            if ($idioma == 'ESP') {
                $persona->formales = new stdClass();
                $persona->formales->tipo_persona = $p_fisica;
                $persona->formaldata->forma_legal = $legalForm;
            } elseif ($idioma == 'ENG') {
                $persona->formaldata = new stdClass();
                $persona->formaldata->legal_type = $p_fisica;
                $persona->formaldata->legal_form = $legalForm;
            }

            $telefonos = SQLConnection::backendStoreProcedure('obtener_telefono', array($id_padron));

            if ($idioma == 'ESP') {
                $persona->formales->identificacion = $cuit;
            } elseif ($idioma == 'ENG') {
                $persona->formaldata->taxid = $cuit;
            }

            if ($fisica_juridica == 'F') {
                $datos_persona = SQLConnection::backendStoreProcedure('obtener_persona', array($cuit), true);
                $nombre = $datos_persona->nombre_persona;
                $dni = (int) substr($cuit, 2, -1);
                $empleado_de = SQLConnection::backendStoreProcedure('obtener_empleado_de', array($cuit));
                if ($idioma == 'ESP') {
                    $persona->formales->dni = (string) $dni;
                    $persona->formales->telefonos = $telefonos;
                    $persona->formales->sexo = $datos_persona->sexo;
                    $persona->formales->anio_nacimiento = $datos_persona->anio_nacimiento;
                    //$persona->formales->nacionalidad    = ''; // en www2 estaba sacada esta linea
                    //$persona->formales->ejemplar        = '';
                    $persona->formales->defuncion = new stdClass();
                } elseif ($idioma == 'ENG') {
                    $persona->formaldata->national_id = (string) $dni;
                    $persona->formaldata->phone = $telefonos;
                    $persona->formaldata->gender = $datos_persona->sexo;
                    $persona->formaldata->YOB = $datos_persona->anio_nacimiento;
                    //$persona->formaldata->nacionalidad    = ''; // en www2 estaba sacada esta linea
                    //$persona->formaldata->ejemplar        = '';
                    $persona->formaldata->death_info = new stdClass();
                }

                if (!empty($datos_persona->fecha_nacimiento)) {
                    $edad = Misc::calcularEdad($datos_persona->fecha_nacimiento);
                    if ($edad) {
                        if ($idioma == 'ESP') {
                            $persona->formales->edad = $edad;
                        } elseif ($idioma == 'ENG') {
                            $persona->formaldata->age = $edad;
                        }
                    }
                }
                //
                if ($idioma == 'ESP') {
                    $persona->formales->empleado_de = $empleado_de;
                    $persona->formales->profesion = $datos_persona->profesion;
                    $persona->formales->fecha_nacimiento = $datos_persona->fecha_nacimiento;
                    $persona->formales->estado_civil = $datos_persona->estado_civil;
                    //
                    $persona->formales->defuncion->fuente = !empty($defuncion->fuente) ? $defuncion->fuente : '-';
                    $persona->formales->defuncion->fecha_deceso = !empty($defuncion->fecha_deceso) ? $defuncion->fecha_deceso : '-';
                    $persona->formales->defuncion->defuncion = !empty($defuncion->defuncion) ? $defuncion->defuncion : '-';
                } elseif ($idioma == 'ENG') {
                    // FALTA TRADUCIR
                    $persona->formaldata->employee_of = $empleado_de;
                    $persona->formaldata->profession = $datos_persona->profesion;
                    $persona->formaldata->DOB = $datos_persona->fecha_nacimiento;
                    $persona->formaldata->marital_status = $datos_persona->estado_civil;
                    //
                    $persona->formaldata->death_info->source = !empty($defuncion->fuente) ? $defuncion->fuente : '-';
                    $persona->formaldata->death_info->DOD = !empty($defuncion->fecha_deceso) ? $defuncion->fecha_deceso : '-';
                    $persona->formaldata->death_info->isdead = !empty($defuncion->defuncion) ? $defuncion->defuncion : '-';
                }
            } else {
                $nombre = SQLConnection::obtenerRazonSocial($cuit)->nombre_persona;
                $sociedades = SQLConnection::backendStoreProcedure('obtener_sociedades', array($cuit));
                $info_empresa_formales = [];
                $card_empleados = SQLConnection::backendStoreProcedure('obtener_empleados', array($cuit), 'selectOne');
                //
                if (isset($card_empleados->total)) {
                    if ($idioma == 'ESP') {
                        $card_empleados->total = (int) $card_empleados->total;
                    } elseif ($idioma == 'ENG') {
                        $card_empleados->perc_men = $card_empleados->cantidad_hombres;
                        $card_empleados->perc_women = $card_empleados->cantidad_mujeres;
                        $card_empleados->total_employees = (int) $card_empleados->total;
                        $card_empleados->period = $card_empleados->fecha;
                        //
                        unset($card_empleados->cantidad_mujeres);
                        unset($card_empleados->cantidad_hombres);
                        unset($card_empleados->total);
                        unset($card_empleados->fecha);
                    }
                }
                //
                if ($idioma == 'ESP') {
                    $persona->formales->empleados = $card_empleados;
                } elseif ($idioma == 'ENG') {
                    $persona->formaldata->employees = $card_empleados;
                }
                //
                if ($idioma == 'ESP') {
                    foreach ($sociedades as $key => $value) {
                        $info_empresa_formales[$key] = new stdClass();
                        $info_empresa_formales[$key]->ramo = $value->ramo;
                        $info_empresa_formales[$key]->subramo = $value->subramo;
                        $info_empresa_formales[$key]->fecha_contrato_social = $value->fecha_cons;
                        $info_empresa_formales[$key]->capital = (int) $value->capital;
                    }
                    $persona->formales->mas_info = $info_empresa_formales;
                } elseif ($idioma == 'ENG') {
                    foreach ($sociedades as $key => $value) {
                        $info_empresa_formales[$key] = new stdClass();
                        $info_empresa_formales[$key]->ramo = $value->ramo;
                        $info_empresa_formales[$key]->subramo = $value->subramo;
                        $info_empresa_formales[$key]->social_contract_date = $value->fecha_cons;
                        $info_empresa_formales[$key]->capital = (int) $value->capital;
                    }
                    $persona->formaldata->more_info = $info_empresa_formales;
                }
                //
                $claes_info = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
                $claes = [];
                //
                if ($idioma == 'ESP') {
                    foreach ($claes_info as $key => $value) {
                        $claes[$key] = new stdClass();
                        $claes[$key]->cod_clae = $value->cod_clae;
                        $claes[$key]->descripcion = $value->descripcion;
                    }
                    $persona->formales->claes = $claes;
                } elseif ($idioma == 'ENG') {
                    foreach ($claes_info as $key => $value) {
                        $claes[$key] = new stdClass();
                        $claes[$key]->clae_code = $value->cod_clae;
                        $claes[$key]->description = $value->descripcion;
                    }
                    $persona->formaldata->economic_activity = $claes;
                }
            }
            //
            if ($idioma == 'ESP') {
                $persona->formales->nombre = $nombre;
                $persona->formales->domicilios = new stdClass();
            } elseif ($idioma == 'ENG') {
                $persona->formaldata->legal_name = $nombre;
                $persona->formaldata->addresses = new stdClass();
            }
            //
            $domicilios = SQLConnection::backendStoreProcedure('sp_obtener_domicilios', array($cuit));
            //
            if (!empty($domicilios)) {
                if ($idioma == 'ESP') {
                    foreach ($domicilios as $key => $value) {
                        // $domicilios[$key]->domicilio  = $domicilios[$key]->domicilio;
                        $domicilios[$key]->provincia = $domicilios[$key]->prv_nombre;
                        $domicilios[$key]->localidad = $domicilios[$key]->loc_nombre;
                        $domicilios[$key]->pais = $domicilios[$key]->pai_nombre;
                        $domicilios[$key]->cp = $domicilios[$key]->codpos;
                        // unset($domicilios[$key]->domicilio);
                        unset($domicilios[$key]->prv_nombre);
                        unset($domicilios[$key]->loc_nombre);
                        unset($domicilios[$key]->pai_nombre);
                        unset($domicilios[$key]->codpos);
                        unset($domicilios[$key]->id);
                        unset($domicilios[$key]->tipo_domicilio);
                        unset($domicilios[$key]->created);
                    }
                    //
                    $persona->formales->domicilios = $domicilios;
                } elseif ($idioma == 'ENG') {
                    // nahu
                    foreach ($domicilios as $key => $value) {
                        $domicilios[$key]->address = $domicilios[$key]->domicilio;
                        $domicilios[$key]->state = $domicilios[$key]->prv_nombre;
                        $domicilios[$key]->city = $domicilios[$key]->loc_nombre;
                        $domicilios[$key]->country = $domicilios[$key]->pai_nombre;
                        $domicilios[$key]->zip_code = $domicilios[$key]->codpos;
                        //
                        unset($domicilios[$key]->domicilio);
                        unset($domicilios[$key]->prv_nombre);
                        unset($domicilios[$key]->loc_nombre);
                        unset($domicilios[$key]->pai_nombre);
                        unset($domicilios[$key]->codpos);
                        unset($domicilios[$key]->id);
                        unset($domicilios[$key]->tipo_domicilio);
                        unset($domicilios[$key]->created);
                    }
                    //
                    $persona->formaldata->addresses = $domicilios;
                }
            }
        }

        //Información socios/directores/sociedades.
        if ($configuracion->relaciones == 1) {
            //
            if ($idioma == 'ESP') {
                $persona->relaciones = new stdClass();
                $persona->relaciones->socios = [];
                $persona->relaciones->participaciones = [];
                $persona->relaciones->vinculaciones = [];
                //
                if ($fisica_juridica == 'F') {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));

                } else {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                }
                //
                $i = 0;
                foreach ($participaciones as $key => $value) {
                    $persona->relaciones->participaciones[$i] = new stdClass();
                    $persona->relaciones->participaciones[$i]->razon_social_sociedad = $value->nombre_sociedad;
                    $persona->relaciones->participaciones[$i]->cuit_sociedad = $value->cuit_sociedad;
                    $persona->relaciones->participaciones[$i]->cuit_socio = $value->cuit_socio;
                    $persona->relaciones->participaciones[$i]->nombre_socio = $value->nombre_socio;
                    $persona->relaciones->participaciones[$i]->cargo = $value->cargo;
                    $i++;
                }
                //
                $i = 0;
                foreach ($relaciones as $key => $value) {
                    $persona->relaciones->socios[$i] = new stdClass();
                    $persona->relaciones->socios[$i]->cuit = $value->cuit;
                    $persona->relaciones->socios[$i]->pais = $value->country_name;
                    $persona->relaciones->socios[$i]->nombre_persona = $value->nombre_persona;
                    $persona->relaciones->socios[$i]->cargo = $value->car_nombre;
                    $persona->relaciones->socios[$i]->desde = $value->c04_periodo_desde;
                    $persona->relaciones->socios[$i]->hasta = $value->c04_periodo_hasta;
                    $i++;
                }
                //
                $i = 0;
                foreach ($vinculaciones as $key => $value) {
                    $persona->relaciones->vinculaciones[$i] = new stdClass();
                    $persona->relaciones->vinculaciones[$i]->cuit = $value->cuit_vinculada;
                    $persona->relaciones->vinculaciones[$i]->nombre_persona = $value->nombre_persona;
                    $persona->relaciones->vinculaciones[$i]->tipo = $value->nombre;
                    $persona->relaciones->vinculaciones[$i]->detalle = $value->detalle;
                    $i++;
                }

            } elseif ($idioma == 'ENG') {
                $persona->corporate_realationships = new stdClass();
                $persona->corporate_realationships->partners = [];
                $persona->corporate_realationships->shareholding_activity = [];
                $persona->corporate_realationships->linkages = [];
                //
                if ($fisica_juridica == 'F') {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                } else {
                    $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                    $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                    $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                }
                //
                $i = 0;
                foreach ($participaciones as $key => $value) {
                    $persona->corporate_realationships->shareholding_activity[$i] = new stdClass();
                    $persona->corporate_realationships->shareholding_activity[$i]->legal_name = $value->nombre_sociedad;
                    $persona->corporate_realationships->shareholding_activity[$i]->taxid = $value->cuit_sociedad;
                    $persona->corporate_realationships->shareholding_activity[$i]->taxid_sharheolder = $value->cuit_socio;
                    $persona->corporate_realationships->shareholding_activity[$i]->legal_name_shareholder = $value->nombre_socio;
                    $persona->corporate_realationships->shareholding_activity[$i]->role = $value->cargo;
                    $i++;
                }
                //
                $i = 0;
                foreach ($relaciones as $key => $value) {
                    $persona->corporate_realationships->partners[$i] = new stdClass();
                    $persona->corporate_realationships->partners[$i]->taxid = $value->cuit;
                    $persona->corporate_realationships->partners[$i]->country = $value->country_name;
                    $persona->corporate_realationships->partners[$i]->legal_name = $value->nombre_persona;
                    $persona->corporate_realationships->partners[$i]->position = $value->car_nombre;
                    $persona->corporate_realationships->partners[$i]->from_date = $value->c04_periodo_desde;
                    $persona->corporate_realationships->partners[$i]->to_date = $value->c04_periodo_hasta;
                    $i++;
                }
                //
                $i = 0;
                foreach ($vinculaciones as $key => $value) {
                    $persona->corporate_realationships->linkages[$i] = new stdClass();
                    $persona->corporate_realationships->linkages[$i]->tax_id = $value->cuit_vinculada;
                    $persona->corporate_realationships->linkages[$i]->legal_name = $value->nombre_persona;
                    $persona->corporate_realationships->linkages[$i]->tipo = $value->nombre;
                    $persona->corporate_realationships->linkages[$i]->description = $value->detalle;
                    $i++;
                }
            }
        }

        //Información Comercial.
        if ($configuracion->comerciales == 1) {
            if ($idioma == 'ESP') {
                $persona->comerciales = new stdClass();
            } elseif ($idioma == 'ENG') {
                $persona->commercial_data = new stdClass();
                ;
            }
            //
            $consultas_ramos = SQLConnection::backendStoreProcedure('obtener_consulta_por_ramos', array($cuit, 12));
            $seguros = SQLConnection::backendSeguros($cuit);
            $marcas = SQLConnection::backendStoreProcedure('obtener_marcas', array($cuit));
            $consultas = [];
            //
            if ($consultas_ramos) {
                if ($idioma == 'ESP') {
                    foreach ($consultas_ramos as $key_ramo => $consulta) {
                        $consultas[$key_ramo]['nombre'] = $consulta->descripcion;
                        $consultas[$key_ramo][$consulta->antiguedad] = $consulta->cantidad;
                    }
                    //
                    foreach ($consultas as $key => $consulta) {
                        if (!isset($consultas[$key]['entre_0_1'])) {
                            $consultas[$key]['entre_0_1'] = 0;
                        }
                        //
                        if (!isset($consultas[$key]['entre_1_2'])) {
                            $consultas[$key]['entre_1_2'] = 0;
                        }
                        //
                        if (!isset($consultas[$key]['entre_2_5'])) {
                            $consultas[$key]['entre_2_5'] = 0;
                        }
                        //
                        ksort($consultas[$key]);
                    }
                } elseif ($idioma == 'ENG') {
                    foreach ($consultas_ramos as $key_ramo => $consulta) {
                        $consultas[$key_ramo]['name'] = $consulta->descripcion;
                        $consultas[$key_ramo][$consulta->antiguedad] = $consulta->cantidad;
                    }
                    //
                    foreach ($consultas as $key => $consulta) {
                        if (!isset($consultas[$key]['between_0_1'])) {
                            $consultas[$key]['between_0_1'] = 0;
                        }
                        //
                        if (!isset($consultas[$key]['between_1_2'])) {
                            $consultas[$key]['between_1_2'] = 0;
                        }
                        //
                        if (!isset($consultas[$key]['between_2_5'])) {
                            $consultas[$key]['between_2_5'] = 0;
                        }
                        //
                        ksort($consultas[$key]);
                    }
                }
            }
            //
            if (!empty($marcas)) {
                if ($idioma == 'ESP') {
                    foreach ($marcas as $key => $value) {
                        unset($value->num_boletin);
                        unset($value->directorio);
                        unset($value->web);
                        unset($value->fecha_publicacion);
                        unset($value->encontrada);
                    }
                } elseif ($idioma == 'ENG') {
                    foreach ($marcas as $key => $value) {
                        $marcas[$key]->num_acta = $marcas[$key]->num_acta;
                        $marcas[$key]->type = $marcas[$key]->tipo;
                        $marcas[$key]->brand = $marcas[$key]->marca;
                        $marcas[$key]->class = $marcas[$key]->clase;
                        //
                        unset($marcas[$key]->tipo);
                        unset($marcas[$key]->marca);
                        unset($marcas[$key]->clase);
                        //
                        unset($value->num_boletin);
                        unset($value->directorio);
                        unset($value->web);
                        unset($value->fecha_publicacion);
                        unset($value->encontrada);
                    }
                }
            }
            //
            if (!empty($seguros)) {
                if ($idioma == 'ESP') {
                    foreach ($seguros as $key => $value) {
                        unset($seguros[$key]->seg_codigo);
                        unset($seguros[$key]->rie_codigo);
                        unset($seguros[$key]->id_seguros);
                        unset($seguros[$key]->id_padron);
                        unset($seguros[$key]->visible);
                        unset($seguros[$key]->estado);
                    }
                } elseif ($idioma == 'ENG') {
                    foreach ($seguros as $key => $value) {
                        $seguros[$key]->company_name = $seguros[$key]->seg_nombre;
                        $seguros[$key]->type = $seguros[$key]->rie_nombre;
                        //
                        unset($seguros[$key]->seg_nombre);
                        unset($seguros[$key]->rie_nombre);
                        //
                        unset($seguros[$key]->seg_codigo);
                        unset($seguros[$key]->rie_codigo);
                        unset($seguros[$key]->id_seguros);
                        unset($seguros[$key]->id_padron);
                        unset($seguros[$key]->visible);
                        unset($seguros[$key]->estado);
                    }
                }
            }
            //
            if ($idioma == 'ESP') {
                $persona->comerciales->consultas = $consultas;
                $persona->comerciales->seguros = $seguros;
                $persona->comerciales->marcas = $marcas;
            } elseif ($idioma == 'ENG') {
                $persona->commercial_data->qtyqueries = $consultas;
                $persona->commercial_data->insurances = $seguros;
                $persona->commercial_data->brands = $marcas;
            }
        }

        //Información Contables.
        if ($configuracion->contables == 1) {
            // $MainController = new MainController();
            // $contables      = json_decode($MainController->obtenerContables(true,'','','','','','','','','','',$cuit)->getContent())->info;
            //
            $persona->balance_sheets = new stdClass();
            if ($idioma == 'ESP') {
                $persona->balances = [];
                $persona->balances = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
                //
                foreach ($persona->balance_sheets as $key => $value) {
                    unset($persona->balance_sheets[$key]->id_balance);
                    unset($persona->balance_sheets[$key]->cuit);
                    unset($persona->balance_sheets[$key]->fecha_balance);
                    unset($persona->balance_sheets[$key]->ejercicio);
                    unset($persona->balance_sheets[$key]->periodo);
                    unset($persona->balance_sheets[$key]->bal_manifestacion);
                    unset($persona->balance_sheets[$key]->comentarios);
                }
            } elseif ($idioma == 'ENG') {
                //
                $persona->balance_sheets = [];
                $persona->balance_sheets = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
                //
                foreach ($persona->balance_sheets as $key => $value) {
                    $persona->balance_sheets[$key]->currency = $persona->balance_sheets[$key]->moneda;
                    $persona->balance_sheets[$key]->date = $persona->balance_sheets[$key]->fecha_balance_dmy;
                    //
                    unset($persona->balance_sheets[$key]->moneda);
                    unset($persona->balance_sheets[$key]->fecha_balance_dmy);
                    //
                    unset($persona->balance_sheets[$key]->id_balance);
                    unset($persona->balance_sheets[$key]->cuit);
                    unset($persona->balance_sheets[$key]->fecha_balance);
                    unset($persona->balance_sheets[$key]->ejercicio);
                    unset($persona->balance_sheets[$key]->periodo);
                    unset($persona->balance_sheets[$key]->bal_manifestacion);
                    unset($persona->balance_sheets[$key]->comentarios);
                }
            }
        }

        //Información Fiscal.
        if ($configuracion->fiscales == 1) {
            if ($idioma == 'ESP') {
                $persona->fiscales = new stdClass();
            } elseif ($idioma == 'ENG') {
                $persona->fiscal_data = new stdClass();
            }
            //
            $claes = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
            $inscripciones = SQLConnection::backendStoreProcedure('obtener_inscripciones', array($cuit));
            $impuestos = SQLConnection::backendStoreProcedure('obtener_padron_impuestos', array($id_padron));
            $apocrifas = SQLConnection::backendStoreProcedure('obtener_apocrifas', array($cuit));
            $sircreb = SQLConnection::backendStoreProcedure('obtener_sircreb', array($cuit));
            $arba = SQLConnection::backendStoreProcedure('obtener_arba', array($cuit));
            $aportes = SQLConnection::backendStoreProcedure('backend_mis_aportes', array($cuit, NULL, 12, 1), false);
            //
            if ($idioma == 'ESP') {
                $persona->fiscales->aportes = $aportes;
                $persona->fiscales->clae = $claes;
                $persona->fiscales->inscripciones = $inscripciones;
                $persona->fiscales->impuestos = $impuestos;
                $persona->fiscales->facturas_apocrifas = $apocrifas;
                $persona->fiscales->sircreb = $sircreb;
                $persona->fiscales->arba = $arba;
                //
            } elseif ($idioma == 'ENG') {
                $persona->fiscal_data->social_security_contributions = $aportes;//AGB VER CON DATOS
                $persona->fiscal_data->economic_activity_code = $claes;
                //
                foreach ($persona->fiscal_data->economic_activity_code as $key => $clae) {
                    $persona->fiscal_data->economic_activity_code[$key]->code = $clae->cod_clae;
                    $persona->fiscal_data->economic_activity_code[$key]->description = $clae->descripcion;
                    $persona->fiscal_data->economic_activity_code[$key]->start_date = $clae->fecha_inicio_actividad;
                    unset($persona->fiscal_data->economic_activity_code[$key]->cod_clae);
                    unset($persona->fiscal_data->economic_activity_code[$key]->descripcion);
                    unset($persona->fiscal_data->economic_activity_code[$key]->fecha_inicio_actividad);
                }
                //
                foreach ($inscripciones as $key => $value) {
                    $inscripciones[$key]->social_contract_date = $inscripciones[$key]->fecha_contrato_social;
                    $inscripciones[$key]->registration_number = $inscripciones[$key]->numero_inscripcion;
                    $inscripciones[$key]->registration_date = $inscripciones[$key]->fecha_inscripcion;
                    $inscripciones[$key]->monotributo = $inscripciones[$key]->monotributo;
                    $inscripciones[$key]->activity_start_date = $inscripciones[$key]->inicio_actividad;
                    $inscripciones[$key]->employer = $inscripciones[$key]->empleador;
                    //
                    unset($inscripciones[$key]->fecha_contrato_social);
                    unset($inscripciones[$key]->numero_inscripcion);
                    unset($inscripciones[$key]->fecha_inscripcion);
                    unset($inscripciones[$key]->inicio_actividad);
                    unset($inscripciones[$key]->empleador);
                }
                $persona->fiscal_data->registered_taxes = $inscripciones;
                //
                foreach ($impuestos as $key => $value) {
                    $impuestos[$key]->tax_code = $impuestos[$key]->codigo_impuesto;
                    $impuestos[$key]->tax_name = $impuestos[$key]->nombre_impuesto;
                    $impuestos[$key]->registration_date = $impuestos[$key]->fecha_inscripcion;
                    $impuestos[$key]->state = $impuestos[$key]->estado;
                    //
                    unset($impuestos[$key]->codigo_impuesto);
                    unset($impuestos[$key]->nombre_impuesto);
                    unset($impuestos[$key]->fecha_inscripcion);
                    unset($impuestos[$key]->estado);
                }
                //
                $persona->fiscal_data->taxes = $impuestos;
                $persona->fiscal_data->apocryphal_invoices = $apocrifas;
                $persona->fiscal_data->sircreb = $sircreb;
                $persona->fiscal_data->arba = $arba;
            }
        }

        //informacion de bancos
        if ($configuracion->bancos_y_cheques == 1) {
            //
            $bancos = SQLConnection::backendStoreProcedure('backend_central_deudores', array($cuit, 24, 1));
            $periodo = SQLConnection::backendStoreProcedure('obtener_periodo_maximo', array($cuit), 'selectOne');
            if ($idioma == 'ESP') {
                $persona->periodos = new stdClass();
                $persona->periodos->bancos = Misc::convertirFormatoFecha($periodo->periodo_maximo, 'Y-m-d', 'Ym');
                $persona->bancos = [];
                //
                foreach ($bancos as $key => $value) {
                    $persona->bancos[$key] = new stdClass();
                    $persona->bancos[$key]->codigo_entidad = $value->codigo_ent;
                    $persona->bancos[$key]->nombre_entidad = $value->nombre;
                    $persona->bancos[$key]->periodo = $value->fec_inf;
                    $persona->bancos[$key]->situacion = $value->situacion;
                    $persona->bancos[$key]->monto = $value->total;
                    $persona->bancos[$key]->dias_atraso = $value->dia_atraso;
                }
            } elseif ($idioma == 'ENG') {
                $persona->max_bank_information = new stdClass();
                $persona->max_bank_information->period = Misc::convertirFormatoFecha($periodo->periodo_maximo, 'Y-m-d', 'Ym');
                $persona->banks = [];
                //
                foreach ($bancos as $key => $value) {
                    $persona->banks[$key] = new stdClass();
                    $persona->banks[$key]->bank_code = $value->codigo_ent;
                    $persona->banks[$key]->bank_name = $value->nombre;
                    $persona->banks[$key]->period = $value->fec_inf;
                    $persona->banks[$key]->status = $value->situacion;
                    $persona->banks[$key]->amount = $value->total;
                    $persona->banks[$key]->days_late = $value->dia_atraso;
                }
            }
            //
            if ($idioma == 'ESP') {
                $persona->vinculados_segun_bcra = [];
            } elseif ($idioma == 'ENG') {
                $persona->representatives_with_banking_system = [];
            }
            //informacion de cheques
            $cheques = SQLConnection::backendStoreProcedure('obtener_cheques', array($cuit));
            $i = 0;
            foreach ($cheques as $key => $value) {
                if ($value->tipo == 'vinculaciones') {
                    if ($idioma == 'ESP') {
                        $persona->vinculados_segun_bcra[$i] = new stdClass();
                        $persona->vinculados_segun_bcra[$i]->nombre_persona_firmante = $value->nombre_persona_firmante;
                        $persona->vinculados_segun_bcra[$i]->cuit_firmante = $value->cuit_firmante;
                        $persona->vinculados_segun_bcra[$i]->nombre_persona_relacionado = $value->nombre_persona_relacionado;
                        $persona->vinculados_segun_bcra[$i]->cuit_relacionado = $value->Cuit_relacionado;
                        $persona->vinculados_segun_bcra[$i]->cantidad_cheques_firmados = $value->cantidad;
                        $persona->vinculados_segun_bcra[$i]->cantidad_cheques_totales = $value->total_cheques;
                        unset($cheques[$i]);
                        $i += 1;
                    } elseif ($idioma == 'ENG') {
                        //
                        $persona->representatives_with_banking_system[$i] = new stdClass();
                        $persona->representatives_with_banking_system[$i]->signer = $value->nombre_persona_firmante;
                        $persona->representatives_with_banking_system[$i]->signer_tax_id = $value->cuit_firmante;
                        $persona->representatives_with_banking_system[$i]->related = $value->nombre_persona_relacionado;
                        $persona->representatives_with_banking_system[$i]->related_tax_id = $value->Cuit_relacionado;
                        $persona->representatives_with_banking_system[$i]->signed_checks = $value->cantidad;
                        $persona->representatives_with_banking_system[$i]->total_checks = $value->total_cheques;
                        unset($cheques[$i]);
                        $i += 1;
                    }
                } else {
                    unset($cheques[$key]->idp);
                    unset($cheques[$key]->idppr);
                    unset($cheques[$key]->cantidad);
                    unset($cheques[$key]->total_cheques);
                }
            }
            //
            if ($idioma == 'ESP') {
                $persona->cheques = array_values($cheques);
            } elseif ($idioma == 'ENG') {
                $persona->bounced_checks = array_values($cheques);
                //
                foreach ($persona->bounced_checks as $key => $value) {
                    $persona->bounced_checks[$key]->signer = $persona->bounced_checks[$key]->nombre_persona_firmante;
                    $persona->bounced_checks[$key]->signer_tax_id = $persona->bounced_checks[$key]->cuit_firmante;
                    $persona->bounced_checks[$key]->related = $persona->bounced_checks[$key]->nombre_persona_relacionado;
                    $persona->bounced_checks[$key]->related_tax_id = $persona->bounced_checks[$key]->Cuit_relacionado;
                    $persona->bounced_checks[$key]->check_number = $persona->bounced_checks[$key]->nro_cheque;
                    $persona->bounced_checks[$key]->rejection_date = $persona->bounced_checks[$key]->fecha_rechazo;
                    $persona->bounced_checks[$key]->cover_payment_date = $persona->bounced_checks[$key]->fecha_levantamiento;
                    $persona->bounced_checks[$key]->import = $persona->bounced_checks[$key]->importe;
                    $persona->bounced_checks[$key]->cause = $persona->bounced_checks[$key]->causa;
                    $persona->bounced_checks[$key]->type = $persona->bounced_checks[$key]->tipo;
                    $persona->bounced_checks[$key]->payment_date = $persona->bounced_checks[$key]->fecha_pago;
                    //
                    unset($persona->bounced_checks[$key]->fecha_pago);
                    unset($persona->bounced_checks[$key]->nombre_persona_firmante);
                    unset($persona->bounced_checks[$key]->cuit_firmante);
                    unset($persona->bounced_checks[$key]->nombre_persona_relacionado);
                    unset($persona->bounced_checks[$key]->Cuit_relacionado);
                    unset($persona->bounced_checks[$key]->nro_cheque);
                    unset($persona->bounced_checks[$key]->fecha_rechazo);
                    unset($persona->bounced_checks[$key]->fecha_levantamiento);
                    unset($persona->bounced_checks[$key]->importe);
                    unset($persona->bounced_checks[$key]->causa);
                    unset($persona->bounced_checks[$key]->tipo);
                }
            }
        }

        //Información Comex.
        if ($configuracion->comex == 1) {
            if ($idioma == 'ESP') {
                $persona->comex = new stdClass();
            } elseif ($idioma == 'ENG') {
                $persona->comex = new stdClass();
            }
            //
            $impo = SQLConnection::backendStoreProcedure('obtener_comex', array($cuit), 'select');
            $pais = SQLConnection::backendStoreProcedure('obtener_comex_pais', array($cuit), 'select');
            $rubros = SQLConnection::backendStoreProcedure('obtener_comex_rubros', array($cuit), 'select');
            $totales = SQLConnection::backendStoreProcedure('obtener_comex_totales', array($cuit), 'selectOne');
            //
            if ($idioma == 'ESP') {
                $persona->comex->importaciones = [];
                if (!empty($impo)) {
                    foreach ($impo as $key => $value) {
                        $persona->comex->importaciones[$key] = new stdClass();
                        $persona->comex->importaciones[$key]->fecha = $value->date;
                        $persona->comex->importaciones[$key]->consumo = $value->consumo;
                        $persona->comex->importaciones[$key]->deposito = $value->deposito;
                        $persona->comex->importaciones[$key]->zonafranca = $value->zonafranca;
                        $persona->comex->importaciones[$key]->temporal = $value->temporal;
                        $persona->comex->importaciones[$key]->total = $value->total;
                    }
                }
            } elseif ($idioma == 'ENG') {
                //
                $persona->comex->imports = [];
                if (!empty($impo)) {
                    foreach ($impo as $key => $value) {
                        $persona->comex->imports[$key] = new stdClass();
                        $persona->comex->imports[$key]->date = $value->date;
                        $persona->comex->imports[$key]->consumption = $value->consumo;
                        $persona->comex->imports[$key]->deposit = $value->deposito;
                        $persona->comex->imports[$key]->free_trade_zone = $value->zonafranca;
                        $persona->comex->imports[$key]->temporary = $value->temporal;
                        $persona->comex->imports[$key]->total = $value->total;
                    }
                }
            }
            //
            if (!empty($pais)) {
                //
                if ($idioma == 'ESP') {
                    foreach ($pais as $key => $value) {
                        $persona->comex->pais[$key] = new stdClass();
                        $persona->comex->pais[$key]->tipo_operacion = $value->tipo_operacion;
                        $persona->comex->pais[$key]->fob = $value->fob;
                    }
                } elseif ($idioma == 'ENG') {
                    foreach ($pais as $key => $value) {
                        $persona->comex->country[$key] = new stdClass();
                        $persona->comex->country[$key]->operation = $value->tipo_operacion;
                        $persona->comex->country[$key]->fob = $value->fob;
                    }
                }
            }
            //
            if (!empty($rubros)) {
                // FALTA TRADUCIR
                if ($idioma == 'ESP') {
                    foreach ($rubros as $key => $value) {
                        $persona->comex->rubros[$key] = new stdClass();
                        $persona->comex->rubros[$key]->tipo_operacion = $value->tipo_operacion;
                        $persona->comex->rubros[$key]->descripcion = $value->descripcion;
                        $persona->comex->rubros[$key]->fob = $value->fob;
                        $persona->comex->rubros[$key]->posicion = $value->posicion;
                    }
                } elseif ($idioma == 'ENG') {
                    foreach ($rubros as $key => $value) {
                        $persona->comex->category[$key] = new stdClass();
                        $persona->comex->category[$key]->operation = $value->tipo_operacion;
                        $persona->comex->category[$key]->description = $value->descripcion;
                        $persona->comex->category[$key]->fob = $value->fob;
                        $persona->comex->category[$key]->position = $value->posicion;
                    }
                }
            }
            // 
            if (!empty($totales)) {
                if ($idioma == 'ESP') {
                    $persona->comex->totales = new stdClass();
                    $persona->comex->totales->total_impo = $totales->total_impo;
                    $persona->comex->totales->total_expo = $totales->total_expo;
                } elseif ($idioma == 'ENG') {
                    $persona->comex->total = new stdClass();
                    $persona->comex->total->total_imports = $totales->total_impo;
                    $persona->comex->total->total_exports = $totales->total_expo;
                }
            }
        }

        //Información Legales.
        if ($configuracion->legales == 1) {
            $actor = SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null, 'A', $cuit, 60, 1), 'select');
            $demandado = SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null, 'D', $cuit, 60, 1), 'select');
            if ($idioma == 'ESP') {
                $persona->legales = new stdClass();
                $persona->legales->actor = [];
                $persona->legales->demandado = [];
                //
                foreach ($actor as $key => $value) {
                    $persona->legales->actor[$key] = new stdClass();
                    $persona->legales->actor[$key]->fecha_causa = $value->fecha_causa;
                    $persona->legales->actor[$key]->nombre_causa = $value->nombre_causa;
                    $persona->legales->actor[$key]->cuit = $value->cuit_otra_parte;
                    $persona->legales->actor[$key]->nombre = $value->nombre_padron_otra_parte;
                    $persona->legales->actor[$key]->juzgado = $value->juzgado;
                    $persona->legales->actor[$key]->secretaria = $value->secretaria;
                }
                //
                foreach ($demandado as $key => $value) {
                    $persona->legales->demandado[$key] = new stdClass();
                    $persona->legales->demandado[$key]->fecha_causa = $value->fecha_causa;
                    $persona->legales->demandado[$key]->nombre_causa = $value->nombre_causa;
                    $persona->legales->demandado[$key]->cuit = $value->cuit_otra_parte;
                    $persona->legales->demandado[$key]->nombre = $value->nombre_padron_otra_parte;
                    $persona->legales->demandado[$key]->expediente = $value->expediente;
                    $persona->legales->demandado[$key]->juzgado = $value->juzgado;
                    $persona->legales->demandado[$key]->secretaria = $value->secretaria;
                }
            } elseif ($idioma == 'ENG') {
                $persona->legal = new stdClass();
                $persona->legal->plaintiff = [];
                $persona->legal->defendant = [];
                //
                foreach ($actor as $key => $value) {
                    $persona->legal->plaintiff[$key] = new stdClass();
                    $persona->legal->plaintiff[$key]->case_date = $value->fecha_causa;
                    $persona->legal->plaintiff[$key]->process_type = $value->nombre_causa;
                    $persona->legal->plaintiff[$key]->tax_id = $value->cuit_otra_parte;
                    $persona->legal->plaintiff[$key]->name = $value->nombre_padron_otra_parte;
                    $persona->legal->plaintiff[$key]->court = $value->juzgado;
                    $persona->legal->plaintiff[$key]->court_clerk = $value->secretaria;
                }
                //
                foreach ($demandado as $key => $value) {
                    $persona->legal->defendant[$key] = new stdClass();
                    $persona->legal->defendant[$key]->case_date = $value->fecha_causa;
                    $persona->legal->defendant[$key]->process_type = $value->nombre_causa;
                    $persona->legal->defendant[$key]->tax_id = $value->cuit_otra_parte;
                    $persona->legal->defendant[$key]->name = $value->nombre_padron_otra_parte;
                    $persona->legal->defendant[$key]->process_number = $value->expediente;
                    $persona->legal->defendant[$key]->court = $value->juzgado;
                    $persona->legal->defendant[$key]->court_clerk = $value->secretaria;
                }
            }
        }
        //        
        return Response::JSON($persona);
    }

    public static function deleteUsuarioSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'DELETE';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario = Request::input('saas_usuario');

        $delete = SQLConnection::backendStoreProcedure('SAAS_Usuarios_', array($accion, $p_user_id, $p_saas_usuario), 'selectOne');

        if ($delete->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $delete->mensaje]);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $delete->mensaje
            ]);
        }
    }

    public static function selectUsuarioSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'SELECT';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario = Request::input('saas_usuario');

        $select = SQLConnection::backendStoreProcedure('SAAS_Usuarios_', array($accion, $p_user_id, $p_saas_usuario), 'selectOne');
        return json_encode($select);
    }

    public static function selectAllUsuarioSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'SELECTALL';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario = '0';
        $p_saas_cliente = Request::input('saas_cliente');
        $select = SQLConnection::backendStoreProcedure('SAAS_Usuarios_', array($accion, $p_user_id, $p_saas_usuario, $p_saas_cliente), 'select');
        return json_encode($select);
    }

    // SAAS - Contratos
    public static function insertContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'INSERT';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_contrato = 0;
        $p_saas_cliente = Request::input('saas_cliente');
        $p_nro_contrato = trim(Request::input('nro_contrato'));
        $p_nro_poliza = trim(Request::input('nro_poliza'));
        $p_datos_adicionales = trim(Request::input('datos_adicionales'));
        $p_vigencia_desde = trim(Request::input('vigencia_desde'));
        $p_vigencia_hasta = trim(Request::input('vigencia_hasta'));
        $p_activo = 1;

        $insert = SQLConnection::backendStoreProcedure('SAAS_Contratos_', array($accion, $p_user_id, $p_saas_contrato, $p_saas_cliente, $p_nro_contrato, $p_nro_poliza, $p_datos_adicionales, $p_vigencia_desde, $p_vigencia_hasta, $p_activo), 'selectOne');

        if ($insert->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $insert->mensaje, 'sass_contrato' => '0']);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $insert->mensaje,
                'sass_contrato' => $insert->saas_contrato
            ]);
        }
    }

    public static function updateContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'UPDATE';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_contrato = Request::input('saas_contrato');
        $p_saas_cliente = Request::input('saas_cliente');
        $p_nro_contrato = trim(Request::input('nro_contrato'));
        $p_nro_poliza = trim(Request::input('nro_poliza'));
        $p_datos_adicionales = trim(Request::input('datos_adicionales'));
        $p_vigencia_desde = trim(Request::input('vigencia_desde'));
        $p_vigencia_hasta = trim(Request::input('vigencia_hasta'));
        $p_activo = Request::input('activo');

        $update = SQLConnection::backendStoreProcedure('SAAS_Contratos_', array($accion, $p_user_id, $p_saas_contrato, $p_saas_cliente, $p_nro_contrato, $p_nro_poliza, $p_datos_adicionales, $p_vigencia_desde, $p_vigencia_hasta, $p_activo), 'selectOne');

        if ($update->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $update->mensaje]);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $update->mensaje
            ]);
        }
    }

    public static function deleteContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'DELETE';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_contrato = Request::input('saas_contrato');

        $delete = SQLConnection::backendStoreProcedure('SAAS_Contratos_', array($accion, $p_user_id, $p_saas_contrato), 'selectOne');

        if ($delete->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $delete->mensaje]);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $delete->mensaje
            ]);
        }
    }

    public static function selectContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'SELECT';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_contrato = Request::input('saas_contrato');

        $select = SQLConnection::backendStoreProcedure('SAAS_Contratos_', array($accion, $p_user_id, $p_saas_contrato), 'selectOne');
        return json_encode($select);
    }

    public static function selectAllContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'SELECTALL';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_contrato = '0';
        $p_saas_cliente = Request::input('saas_cliente');
        $select = SQLConnection::backendStoreProcedure('SAAS_Contratos_', array($accion, $p_user_id, $p_saas_contrato, $p_saas_cliente), 'select');
        return json_encode($select);
    }

    // SAAS - Usuarios_Contratos
    public static function insertUsuarioContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'INSERT';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario_contrato = 0;
        $p_saas_cliente = Request::input('saas_cliente');
        $p_saas_usuario = Request::input('saas_usuario');
        $p_saas_contrato = Request::input('saas_contrato');
        $p_datos_adicionales = trim(Request::input('datos_adicionales'));
        $p_vigencia_desde = trim(Request::input('vigencia_desde'));
        $p_vigencia_hasta = trim(Request::input('vigencia_hasta'));
        $p_activo = 1;


        $insert = SQLConnection::backendStoreProcedure('SAAS_Usuarios_Contratos_', array($accion, $p_user_id, $p_saas_usuario_contrato, $p_saas_cliente, $p_saas_usuario, $p_saas_contrato, $p_datos_adicionales, $p_vigencia_desde, $p_vigencia_hasta, $p_activo), 'selectOne');

        if ($insert->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $insert->mensaje, 'sass_usuario_contrato' => '0']);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $insert->mensaje,
                'sass_contrato' => $insert->saas_usuario_contrato
            ]);
        }
    }

    public static function updateUsuarioContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'UPDATE';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario_contrato = Request::input('saas_usuario_contrato');
        $p_saas_cliente = Request::input('saas_cliente');
        $p_saas_usuario = Request::input('saas_usuario');
        $p_saas_contrato = Request::input('saas_contrato');
        $p_datos_adicionales = trim(Request::input('datos_adicionales'));
        $p_vigencia_desde = trim(Request::input('vigencia_desde'));
        $p_vigencia_hasta = trim(Request::input('vigencia_hasta'));
        $p_activo = Request::input('activo');

        $update = SQLConnection::backendStoreProcedure('SAAS_Usuarios_Contratos_', array($accion, $p_user_id, $p_saas_usuario_contrato, $p_saas_cliente, $p_saas_usuario, $p_saas_contrato, $p_datos_adicionales, $p_vigencia_desde, $p_vigencia_hasta, $p_activo), 'selectOne');

        if ($update->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $update->mensaje]);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $update->mensaje
            ]);
        }
    }

    public static function deleteUsuarioContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'DELETE';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario_contrato = Request::input('saas_usuario_contrato');

        $delete = SQLConnection::backendStoreProcedure('SAAS_Usuarios_Contratos_', array($accion, $p_user_id, $p_saas_usuario_contrato), 'selectOne');

        if ($delete->error == '1') {
            return json_encode(['Status' => 'ERROR', 'StatusCode' => 1, 'mensaje' => $delete->mensaje]);
        } else {
            return json_encode([
                'Status' => 'OK',
                'StatusCode' => 0,
                'mensaje' => $delete->mensaje
            ]);
        }
    }

    public static function selectUsuarioContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'SELECT';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario_contrato = Request::input('saas_usuario_contrato');

        $select = SQLConnection::backendStoreProcedure('SAAS_Usuarios_Contratos_', array($accion, $p_user_id, $p_saas_usuario_contrato), 'selectOne');
        return json_encode($select);
    }

    public static function selectAllUsuarioContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'SELECTALL';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario_contrato = '0';
        $p_saas_cliente = Request::input('saas_cliente');
        $select = SQLConnection::backendStoreProcedure('SAAS_Usuarios_Contratos_', array($accion, $p_user_id, $p_saas_usuario_contrato, $p_saas_cliente), 'select');
        return json_encode($select);
    }

    public static function selectAllUsuarioContratoXContratoSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'SELECTALL-CONTRATO';
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario_contrato = '0';
        $p_saas_cliente = '0';
        $p_saas_usuario = '0';
        $p_saas_contrato = Request::input('saas_contrato');

        $select = SQLConnection::backendStoreProcedure('SAAS_Usuarios_Contratos_', array($accion, $p_user_id, $p_saas_usuario_contrato, $p_saas_cliente, $p_saas_usuario, $p_saas_contrato), 'select');
        return json_encode($select);
    }

    public static function selectAllUsuarioContratoXUsuarioSaas()
    {
        //$usuario = Session::get('usuario');
        $accion = 'SELECTALL-USUARIO';
        $p_user_id = Request::input('user_id');
        $p_saas_usuario_contrato = '0';
        $p_saas_cliente = Request::input('saas_cliente');
        $p_saas_usuario = Request::input('saas_usuario');
        $p_saas_contrato = '0';

        $select = SQLConnection::backendStoreProcedure('SAAS_Usuarios_Contratos_', array($accion, $p_user_id, $p_saas_usuario_contrato, $p_saas_cliente, $p_saas_usuario, $p_saas_contrato), 'select');

        return json_encode($select);
    }

    public static function consultaCUITSaas()
    {
        //$usuario = Session::get('usuario');
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario_contrato = Request::input('saas_usuario_contrato');
        $p_cuit = Request::input('cuit');
        $p_id_padron = '0';
        $p_familia = Request::input('familia');
        // Calculo Score de Balance para el CUIT
        $scb = 100;
        $apikey = env('API_KEY');
        /* 22/07/2021 Agregamos que pase por afip */
        if (! empty($p_cuit) && strlen($p_cuit) == 11) {
            AFIPController::obtenerPadron($p_cuit, true, 'AR', false);
        }

        $params = 'apikey=' . $apikey . '&cuit=' . $p_cuit;
        $balance = self::CURLCall(env('API_SCORE_BALANCE'), $params);
        if (! empty($balance)) {
            $bal = json_decode($balance);
            if (isset($bal->score)) {
                $scb = ($bal->score >= 0) ? round($bal->score, 1) : 0;
            }
        }

        $select = SQLConnection::backendStoreProcedure('SAAS_Consulta_CUIT', array($p_user_id, $p_saas_usuario_contrato, $p_cuit, $p_id_padron, $p_familia, $scb), 'selectOne');
        return json_encode($select);
    }

    public static function CURLCall($url, $params, $type = "POST")
    {
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => $type,
            CURLOPT_POSTFIELDS => $params,
            CURLOPT_HTTPHEADER => array(
                "cache-control: no-cache",
                "content-type: application/x-www-form-urlencoded"
            ),
        ));

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

        curl_close($curl);

        if ($err) {
            return json_encode(array('error' => true));
        } else {
            return $response;
        }
    }

    public static function verificaCuitSaas()
    {
        //$usuario = Session::get('usuario');
        $p_user_id = '94437923'; //$usuario->user_id;
        $p_saas_usuario_contrato = Request::input('saas_usuario_contrato');
        $p_cuit = Request::input('cuit');
        /* 22/07/2021 Agregamos que pase por afip */
        if (! empty($p_cuit) && strlen($p_cuit) == 11) {
            AFIPController::obtenerPadron($p_cuit, true, 'AR', false);
        }
        $p_id_padron = '0';
        $select = SQLConnection::backendStoreProcedure('SAAS_Verifica_CUIT', array($p_user_id, $p_saas_usuario_contrato, $p_cuit, $p_id_padron), 'selectOne');
        return json_encode($select);
    }

    //obtiene el monitoreo del servicio y lo avisa por mail ( por ahora sólo AFIP A4 )
    //modificado el 29/8 ahora se agrega el A5
    public static function obtenerMonitoreoServicios()
    {
        $respuesta['A4'] = self::getUrl(ENV('AFIP_URL_PADRON_A4'));
        $respuesta['A5'] = self::getUrl(ENV('AFIP_URL_PADRON_A5'));
        $content = '';
        foreach ($respuesta as $key => $value) {
            if ($value['headers'][0] != 'HTTP/1.1 200 OK') {
                $content .= "el Servicio $key " . $value['headers'][0] . ' el ' . date('d/n/Y h:i:s') . "\r\n" . "<br>";
                SQLConnection::backendStoreProcedure('actualizar_estado_servicio_afip', array('obtenerWSPadron' . $key, 0), true);
            } else {
                $content .= "el Servicio $key " . $value['headers'][0] . ' el ' . date('d/n/Y h:i:s') . "\r\n" . "<br>";
                SQLConnection::backendStoreProcedure('actualizar_estado_servicio_afip', array('obtenerWSPadron' . $key, 1), true);
            }

        }
        echo Misc::enviarMail('mails/servicios/caido', 'soporte$fidelitas.com.ar', $content, 'Monitoreo de Servicios', false);

    }

    //obtiene la URL,devuelve separado header y content en un array.
    private static function getUrl($url)
    {
        $content = file_get_contents($url);
        // you can add some code to extract/parse response number from first header. 
        // For example from "HTTP/1.1 200 OK" string.
        return array(
            'headers' => $http_response_header,
            'content' => $content
        );
    }

    // ========================================================================
    // ------------------------------- SASS FIN -------------------------------
    // ========================================================================

    public function htmlToPdf()
    {
        $file_path = Request::input('file_path');
        $file_name = Request::input('file_name');
        //$file_content = utf8_decode(Request::input('file_content'));
        $file_content = mb_convert_encoding(Request::input('file_content'), 'ISO-8859-1', 'UTF-8');

        $local_file_name = '/var/www/html/fidelitas2/public/documentos/temp/pepe.html';
        file_put_contents($local_file_name, $file_content);
        if (! file_exists($file_path)) {
            mkdir($file_path, 0777, true);
        }
        chmod($local_file_name, 0777);
        exec("/usr/local/bin/wkhtmltopdf.Original -d 300 -L 10 -R 10 -T 10 -B 10 --header-font-size 8 --header-right ' [page] de [toPage]'  --viewport-size 1920x1080 --zoom 1 " . $local_file_name . " " . $file_path . $file_name);
    }

    public static function calcularScoreBalance_v2()
    {
        $usuario = Session::get('usuario');
        if ($usuario->producto == env('NRO_PRODUCTO_BALANCE')) {
            try {
                $respuesta = [];
                $calcula_solo_sobre_balances = true;
                $porcentaje = 100;
                $expRegCuit = '/^[0-9]{11}$/';
                $expRegBalance = '/^[0-9]{1,3}$/';

                if (isset($_POST['cuit']) && preg_match($expRegCuit, $_POST['cuit'])) {
                    $cuit = $_POST['cuit'];
                } else {
                    return json_encode(['notificacion' => 'Error en el formato de cuit']);
                }
                if (isset($_POST['id_balance']) && preg_match($expRegBalance, $_POST['id_balance'])) {
                    $id_balance = $_POST['id_balance'];
                } else {
                    $id_balance = null;
                }

                $id_consumo = self::consumir_servicio($cuit, env('NRO_PRODUCTO_BALANCE'));
                $score_contables = SQLConnection::backendStoreProcedure('obtener_score_contable_full', array($cuit, $id_balance), 'selectOne');

                self::$score_contables = $score_contables;

                if (isset($score_contables->fecha_balance) && ! empty($score_contables->fecha_balance)) {
                    if ($calcula_solo_sobre_balances == true) {
                        $porcentaje = 100;
                    }
                    $respuesta = self::calcularScoreContable_v2($respuesta, $score_contables, $porcentaje);
                }
                if ($calcula_solo_sobre_balances == true) {
                    $respuesta['antiguedad_balance'] = Misc::calcularDiferenciaEnMeses(Misc::convertirFormatoFecha($score_contables->fecha_balance), date('Y-m-d'));
                }
                if ($respuesta) {
                    $respuesta['indices'] = $score_contables;
                }
                return json_encode([$score_contables, 'Transaction_id' => $id_consumo->transaction_id]);
            } catch (\Throwable $th) {
                return json_encode(['notificacion' => 'No se encuentra información para el tax_id: ' . $cuit, 'Transaction_id' => $id_consumo->transaction_id]);
            }
        } else {
            return json_encode(['Response' => 'No posee acceso al producto.']);
        }
    }

    public static function govcheck()
    {
        $usuario = Session::get('usuario');
        $cliente = $usuario->cliente['client_id'];

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

        //-- Validamos que el usuario tenga el producto habilitado		
        if ($usuario->producto == env('NRO_PRODUCTO_GOVCHECK')) {
            $dni = trim((isset($_POST['national_id']) ? $_POST['national_id'] : (isset($_POST['NATIONAL_ID']) ? $_POST['NATIONAL_ID'] : '')));

            //-- validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
            if (empty($dni) || Misc::noEsPosibleDni($dni)) {
                return json_encode(['Parameters' => $dni, 'Status' => 'ERROR', 'Message' => 'El campo dni no puede estar vacío y debe ser un número de 8 dígitos', 'Response' => []]);
            }

            try {
                //-- si es longitud 7, le agregamos 0 delante.
                $dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
                $enviados['National_id'] = $dni;
                $res2 = SQLConnection::backendStoreProcedure('api_get_govcheck', array($dni), 'select');
                $response = Misc::conversorApisGovcheck($res2);

                if (count($res2) == 0 || is_null($res2[0]->fecha_nacimiento) || is_null($res2[0]->ultimo_afip) || Misc::cantidadMeses($res2[0]->ultimo_afip) >= 1) {
                    //self::BuscarCuit($dni,'S');
                    self::BuscarCuit_Forzado($dni, 'S');
                    $response = Misc::conversorApisGovcheck(SQLConnection::backendStoreProcedure('api_get_govcheck', array($dni), 'select'));
                }

                try {
                    $tid = (! is_null($response[0]->Tax_id_number)) ? $response[0]->Tax_id_number : $dni;
                    $id_consumo = self::consumir_servicio($tid, env('NRO_PRODUCTO_GOVCHECK'));
                    //-- ESTA SECCION SE AGREGA PARA IDENTIFICAR ERROR QUE GENERA EL STORE 'consumir_servicio_api'
                    if ($id_consumo->transaction_id == 0 || $id_consumo->transaction_id == '0' || is_null($id_consumo)) {
                        $data = (is_null($id_consumo)) ? 'NULL' : $id_consumo->error;
                        $mensaje = 'API GOVCHECK fidelitasprod.int - ERROR - DNI consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine() . '<br>Error store dentro de consumir_servicio: ' . $data;
                        Misc::enviarMail_errores_api($mensaje);
                    }
                    return json_encode(['Parameters' => $enviados, 'Results' => count($response), 'Notification' => Misc::gestorNotificacionGovcheck($response), 'Response' => $response, 'Transaction_id' => $id_consumo->transaction_id]);

                } catch (\Throwable $th) {
                    $id_consumo = self::consumir_servicio($dni, env('NRO_PRODUCTO_GOVCHECK'));
                    if ($id_consumo->transaction_id == 0 || $id_consumo->transaction_id == '0' || is_null($id_consumo)) {
                        $data = (is_null($id_consumo)) ? 'NULL' : $id_consumo->error;
                        $mensaje = 'API GOVCHECK fidelitasprod.int - ERROR - DNI consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine() . '<br>Error store dentro de consumir_servicio: ' . $data;
                        Misc::enviarMail_errores_api($mensaje);
                    } else {
                        $mensaje = 'API GOVCHECK fidelitasprod.int - MIRAR ESTE CASO - DNI consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                        Misc::enviarMail_errores_api($mensaje);
                    }

                    return json_encode(['Status' => 'ERROR', 'Message' => 'The provided national id does not match a valid tax id and could not be validated. Please review it and try again.', 'Transaction_id' => $id_consumo->transaction_id]);
                }
            } catch (\Throwable $th) {
                $mensaje = 'Error al consultar API GOVCHECK fidelitasprod.int - DNI consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                Misc::enviarMail_errores_api($mensaje);
                return json_encode(['Status' => 'INTERNAL ERROR', 'Message' => 'TIMEOUT EXCEEDED.']);

            }
        }
        return json_encode(['Response' => 'No posee acceso al producto.']);
    }

    //-- Nueva version mejorada govcheck_v2
    public static function govcheck_v2()
    {
        $usuario = Session::get('usuario');
        //-- Validamos que el usuario tenga el producto habilitado
        if ($usuario->producto == env('NRO_PRODUCTO_GOVCHECK')) {
            $dni = trim((isset($_POST['national_id']) ? $_POST['national_id'] : (isset($_POST['NATIONAL_ID']) ? $_POST['NATIONAL_ID'] : '')));

            //-- validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
            if (empty($dni) || Misc::noEsPosibleDni($dni)) {
                return json_encode(['Parameters' => $dni, 'Status' => 'ERROR', 'Message' => 'El campo dni no puede estar vacío y debe ser un número de 8 dígitos', 'Response' => []]);
            }

            try {
                //-- si es longitud 7, le agregamos 0 delante.
                $dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
                $enviados['National_id'] = $dni;
                $res2 = SQLConnection::backendStoreProcedure('api_get_govcheck', array($dni), 'select');
                if (count($res2) > 0) {
                    $response = Misc::conversorApisGovcheck($res2);
                } else {
                    $id_consumo = self::consumir_servicio($dni, env('NRO_PRODUCTO_GOVCHECK'))->transaction_id;
                    return json_encode(['Status' => 'ERROR', 'Message' => 'The provided national id does not match a valid tax id and could not be validated. Please review it and try again.', 'Transaction_id' => $id_consumo]);
                }

                try {
                    $tid = (! is_null($response[0]->Tax_id_number)) ? $response[0]->Tax_id_number : $dni;
                    $id_consumo = self::consumir_servicio($tid, env('NRO_PRODUCTO_GOVCHECK'))->transaction_id;
                    return json_encode(['Parameters' => $enviados, 'Results' => count($response), 'Notification' => Misc::gestorNotificacionGovcheck($response), 'Response' => $response, 'Transaction_id' => $id_consumo]);

                } catch (\Throwable $th) {
                    $id_consumo = self::consumir_servicio($dni, env('NRO_PRODUCTO_GOVCHECK'))->transaction_id;
                    $mensaje = 'API GOVCHECK_V2 fidelitas-www - MIRAR ESTE CASO - DNI consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                    Misc::enviarMail_errores_api($mensaje);
                    return json_encode(['Status' => 'ERROR', 'Message' => 'The provided national id does not match a valid tax id and could not be validated. Please review it and try again.', 'Transaction_id' => $id_consumo]);
                }


            } catch (\Throwable $th) {
                $mensaje = 'Error al consultar API GOVCHECK_V2 fidelitas-www - DNI consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                Misc::enviarMail_errores_api($mensaje);
                return json_encode(['Status' => 'INTERNAL ERROR', 'Message' => 'TIMEOUT EXCEEDED.']);

            }
        }
        return json_encode(['Response' => 'No posee acceso al producto.']);
    }

    //--  Funcion principal para EXTENDED
    public static function extended()
    {
        $usuario = Session::get('usuario');
        $cliente = $usuario->cliente['client_id'];

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

        $res_renaper = null;
        //-- Validamos que el usuario tenga el producto habilitado
        if ($usuario->producto == env('NRO_PRODUCTO_EXTENDED')) {
            $dni = trim((isset($_POST['national_id']) ? $_POST['national_id'] : (isset($_POST['NATIONAL_ID']) ? $_POST['NATIONAL_ID'] : '')));

/* 02/12/2024: Cuando no anda Renaper */
            return json_encode(['Parameters'=>$dni,'Status'=>'404','Message'=> 'The service is currently unavailable due to maintenance','Response'=>[]]);
/**/
            //-- validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
            if (empty($dni) || Misc::noEsPosibleDni($dni)) {
                return json_encode(['Parameters' => $dni, 'Status' => 'ERROR', 'Message' => 'El campo NATIONAL_ID no puede estar vacío y debe ser un número de 8 dígitos', 'Response' => []]);
            }

            try {
                //-- si es longitud 7, le agregamos 0 delante.
                $dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
                $enviados['National_id'] = $dni;

                $response = SQLConnection::backendStoreProcedure('api_get_govcheck', array($dni), 'select');

                if (count($response) == 0) {
                    self::BuscarCuit($dni, 'S');
                    $response = SQLConnection::backendStoreProcedure('api_get_govcheck', array($dni), 'select');
                }

                try {
                    $tid = (! is_null($response[0]->identificacion)) ? $response[0]->identificacion : $dni;
                    $id_consumo = self::consumir_servicio($tid, env('NRO_PRODUCTO_EXTENDED'))->transaction_id;

                    //-- Validamos que solo tengamos un solo registro o no este vacio ni fallecido
                    if (count($response) > 1 || count($response) == 0 || ! is_null($response[0]->fecha_defuncion)) {
                        $response = Misc::conversorApisGovcheck($response);
                        return json_encode(['parameters' => $enviados, 'results' => count($response), 'notification' => Misc::gestorNotificacionGovcheck($response), 'response' => $response, 'Transaction_id' => $id_consumo]);
                    }

                    //-- aca debe ir afip  ----------------------------------------------------------
                    if (is_null($response[0]->ultimo_afip) || Misc::cantidadMeses($response[0]->ultimo_afip) >= 4) {
                        AFIPController::obtenerPadron($response[0]->identificacion, true, 'AR', false);
                    }
                    //-------------------------------------------------------------------------------
                    //-- desde aca llamada logica para renaper y ws.
                    $res_renaper = self::tratamientoRenaperExtend($response[0]->ultimo_renaper, $dni, $response[0]->genero, $response[0]->identificacion);

                    if (! is_null($res_renaper) && count($res_renaper) == 0) {
                        return json_encode(['parameters' => $enviados, 'results' => 0, 'notification' => Misc::gestorNotificacionGovcheck(null), 'Transaction_id' => $id_consumo]);
                    }

                    $res_ws = self::resFidecheckExtend($response[0]->dni, $response[0]->nombre_persona, $response[0]->identificacion);
                    $response_v2 = Misc::conversorApisExtended($response, $res_renaper, $res_ws);

                    return json_encode(['parameters' => $enviados, 'results' => count($response), 'notification' => Misc::gestorNotificacionGovcheck($response), 'response' => $response_v2, 'Transaction_id' => $id_consumo]);

                } catch (\Throwable $th) {
                    $id_consumo = self::consumir_servicio($dni, env('NRO_PRODUCTO_EXTENDED'))->transaction_id;
                    $mensaje = 'Ver este caso API EXTENDED fidelitas2 - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                    Misc::enviarMail_errores_api($mensaje);
                    return json_encode(['Status' => 'INTERNAL ERROR', 'Message' => 'The provided national id does not match a valid tax id and could not be validated. Please review it and try again.', 'Transaction_id' => $id_consumo]);
                }

            } catch (\Throwable $th) {

                $mensaje = 'Error al consultar API EXTENDED fidelitas2 <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                Misc::enviarMail_errores_api($mensaje);
                return json_encode(['Status' => 'INTERNAL ERROR', 'Message' => 'TIMEOUT EXCEEDED']);
            }

        }

        return json_encode(['response' => 'No posee acceso al producto.']);
    }

    public static function extended_v2()
    {
        $usuario = Session::get('usuario');
        $res_renaper = null;
        //-- Validamos que el usuario tenga el producto habilitado
        if ($usuario->producto == env('NRO_PRODUCTO_EXTENDED')) {
            $dni = trim((isset($_POST['national_id']) ? $_POST['national_id'] : (isset($_POST['NATIONAL_ID']) ? $_POST['NATIONAL_ID'] : '')));
            /* 02/12/2024: Cuando no anda Renaper */
            return json_encode(['Parameters'=>$dni,'Status'=>'404','Message'=> 'The service is currently unavailable due to maintenance','Response'=>[]]);
            /**/
            //-- validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
            if (empty($dni) || Misc::noEsPosibleDni($dni)) {
                return json_encode(['Parameters' => $dni, 'Status' => 'ERROR', 'Message' => 'El campo NATIONAL_ID no puede estar vacío y debe ser un número de 8 dígitos', 'Response' => []]);
            }

            try {
                //-- si es longitud 7, le agregamos 0 delante.
                $dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
                $enviados['National_id'] = $dni;

                $response = SQLConnection::backendStoreProcedure('api_get_govcheck', array($dni), 'select');
                try {
                    //$tid = (!is_null($response[0]->identificacion)) ? $response[0]->identificacion : $dni;
                    if (count($response) == 0) {
                        $tid = $dni;
                        /* Funcion inexistente
                        $res_renaper = self::tratamientoRenaperExtend_v2($dni); */
                    } else {
                        $tid = $response[0]->identificacion;
                        $res_renaper = self::tratamientoRenaperExtend($response[0]->ultimo_renaper, $dni, $response[0]->genero, $response[0]->identificacion);
                    }
                    $id_consumo = self::consumir_servicio($tid, env('NRO_PRODUCTO_EXTENDED'))->transaction_id;
                    //-- Validamos que solo tengamos un solo registro o no este vacio ni fallecido
                    if (count($response) == 0 && is_null($res_renaper)) {
                        $response_v2 = Misc::conversorApisExtended_vacio();
                        return json_encode(['parameters' => $enviados, 'results' => count($response), 'notification' => Misc::gestorNotificacionGovcheck_v2($response, 0), 'response' => $response_v2, 'Transaction_id' => $id_consumo]);
                    }

                    if (count($response) == 0) {
                        $res_ws = self::resFidecheckExtend($dni, $res_renaper->apellido . ' ' . $res_renaper->nombres, $dni);
                        $response_v2 = Misc::conversorApisExtended_v2($res_renaper, $res_renaper, $res_ws);
                    } else {
                        $res_ws = self::resFidecheckExtend($response[0]->dni, $response[0]->nombre_persona, $response[0]->identificacion);
                        $response_v2 = Misc::conversorApisExtended($response, $res_renaper, $res_ws);
                    }

                    return json_encode(['parameters' => $enviados, 'results' => count($response), 'notification' => Misc::gestorNotificacionGovcheck($response), 'response' => $response_v2, 'Transaction_id' => $id_consumo]);

                } catch (\Throwable $th) {
                    $id_consumo = self::consumir_servicio($dni, env('NRO_PRODUCTO_EXTENDED'))->transaction_id;
                    $mensaje = 'Ver este caso API EXTENDED_V2 fidelitas-www - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                    Misc::enviarMail_errores_api($mensaje);
                    return json_encode(['Status' => 'INTERNAL ERROR', 'Message' => 'The provided national id does not match a valid tax id and could not be validated. Please review it and try again.', 'Transaction_id' => $id_consumo]);
                }


            } catch (\Throwable $th) {
                $mensaje = 'Error al consultar API EXTENDED_V2 fidelitas-www - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                Misc::enviarMail_errores_api($mensaje);
                return json_encode(['Status' => 'INTERNAL ERROR', 'Message' => 'TIMEOUT EXCEEDED.']);

            }

        }
        return json_encode(['response' => 'No posee acceso al producto.']);
    }

    //---------------------------------------------  API SOLO RENAPER  --------------------------------------------------------------------------------------------------------//
    public static function soloRenaper($dni_interno = null, $sexo_interno = null)
    {
        $usuario = Session::get('usuario');
        $cliente = $usuario->cliente['client_id'];

        $res_renaper = null;
        $fechaParaValidar = '';
        $generoParaValidar = '';
        $forzado = 'N';

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


        //-- Validamos que el usuario tenga el producto habilitado
        //-- Si dni no es null, quiere decir que viene de una llamada interna
        if ($usuario->producto == env('NRO_PRODUCTO_SOLO_RENAPER') || $dni_interno !== null) {
            //-- Parametros minimos requeridos
            if ($dni_interno !== null) {
                $dni = $dni_interno;
                $generoRecibido = trim($sexo_interno);
                $fecha_emision_recivida = '';
                $fecha_expiracion_emitida = '';
                $copia = '';
                $idMainIssue = '';
            } else {
                $dni = trim((isset($_POST['national_id']) ? $_POST['national_id'] : (isset($_POST['NATIONAL_ID']) ? $_POST['NATIONAL_ID'] : '')));
                $generoRecibido = trim((isset($_POST['gender']) ? $_POST['gender'] : (isset($_POST['GENDER']) ? $_POST['GENDER'] : '')));

                //-- Parametros opcionales que se van a evaluar luego a 'TRUE' o 'FALSE' en el Misc.php
                $fecha_emision_recivida = trim((isset($_POST['issue_date']) ? $_POST['issue_date'] : (isset($_POST['ISSUE_DATE']) ? $_POST['ISSUE_DATE'] : '')));
                $fecha_expiracion_emitida = trim((isset($_POST['expiry_date']) ? $_POST['expiry_date'] : (isset($_POST['EXPIRY_DATE']) ? $_POST['EXPIRY_DATE'] : '')));
                $copia = trim((isset($_POST['copy']) ? $_POST['copy'] : (isset($_POST['COPY']) ? $_POST['COPY'] : '')));
                $idMainIssue = trim((isset($_POST['id_main_issue']) ? $_POST['id_main_issue'] : (isset($_POST['ID_MAIN_ISSUE']) ? $_POST['ID_MAIN_ISSUE'] : '')));
            }

            //-- validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
            if (empty($dni) || Misc::noEsPosibleDni($dni)) {
                return json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => 'NATIONAL_ID field cannot be empty. Please use only numbers and complete with trailing zeroes up to eight digits.', 'Response' => []]);
            }

            $fechaParaValidar = Misc::manejadorFechaEmision($fecha_emision_recivida);
            /* 20/12/2022: Si no mandan gender lo hacemos primero con M y despues con F, hacemos un loop con la variable $veces. Si se manda el sexo el loop lo hace solo una vez. */
            $veces = 1;

            if ($generoRecibido == '') {
                $generoRecibido = 'M';
                $veces = 2;
            }


            for ($i = 1; $i <= $veces; $i++) {
                /**/
                $generoParaValidar = Misc::normalizadorGenero($generoRecibido);
                try {
                    //-- si es longitud 7, le agregamos 0 delante.
                    $dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
                    $enviados['national_id'] = $dni;
                    $enviados['issue_date'] = $fecha_emision_recivida;
                    $enviados['gender'] = $generoRecibido;
                    $enviados['expiry_date'] = $fecha_expiracion_emitida;
                    $enviados['copy'] = $copia;
                    $enviados['id_main_issue'] = $idMainIssue;

                    //$response = SQLConnection::backendStoreProcedure('api_get_govcheck',array($dni,$generoParaValidar),'select');  /* lo pasamos abajo 27/06/2023 */				
                    try {
                        //$res_renaper = self::tratamientoSoloRenaper($dni);
                        $res_renaper = self::tratamientoSoloRenaper($dni, $generoParaValidar); /* 27/06/2023: No se mandaba sexo y buscaba siempre primero por 'F' y si habia F y M. Traia siempre el F */
                        $response = SQLConnection::backendStoreProcedure('api_get_govcheck', array($dni, $generoParaValidar), 'select'); /* lo pasamos aca 27/06/2023 */

                        // Modificacion Rami 01/08/2023
                        if (! empty($response)) {
                            if (is_null($response[0]->ultimo_renaper) || Misc::cantidadMeses($response[0]->ultimo_renaper) >= 4) {
                                $res_renaper = self::tratamientoRenaperCla($dni, $response[0]->genero, $response[0]->identificacion);
                            }
                        } else {
                            $res_renaper = self::tratamientoRenaperCla($dni, $generoRecibido, $dni);
                        }


                        $id_consumo = self::consumir_servicio($dni, env('NRO_PRODUCTO_SOLO_RENAPER'))->transaction_id;
                        if (is_null($res_renaper) || empty($res_renaper)) {
                            /* 20/12/2022 */
                            if ($i < $veces) {
                                $generoRecibido = 'F';
                                continue;
                            } else {
                                // antes hacia solo esto
                                return json_encode(['Parameters' => $enviados, 'Status' => '301', 'Message' => '0-The provided national id does not match a valid one and could not be validated. Please review it and try again.', 'Response' => []]);
                            }
                        }
                        /**/
                        $respuestaFormateada = Misc::formatoRespuestaRenaper($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue);

                        return json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);

                    } catch (\Throwable $th) {
                        $id_consumo = self::consumir_servicio($dni, env('NRO_PRODUCTO_SOLO_RENAPER'))->transaction_id;
                        /* 20/12/2022 */


                        if ($i < $veces) {
                            $generoRecibido = 'F';
                            continue;
                        } else {
                            // antes hacia esto solo 
                            $mensaje = 'Ver este caso API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                            Misc::enviarMail_errores_api($mensaje);
                            return json_encode(['Status' => '301', 'Message' => '1-The provided national id does not match a valid one and could not be validated. Please review it and try again.', 'Transaction_id' => $id_consumo]);
                        }
                        /**/
                    }

                } catch (\Throwable $th) {
                    $mensaje = 'Error al consultar API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                    Misc::enviarMail_errores_api($mensaje);
                    return json_encode(['Status' => '301', 'Message' => '2-The provided national id does not match a valid one and could not be validated. Please review it and try again.']);
                }

            }
        }
        return json_encode(['response' => 'No posee acceso al producto.']);
    }

    /*
        Llamada a WS solo para EXTENDED 
    */
    public static function resFidecheckExtend($dni, $nombre_completo, $cuit, $id_consumo=null) {
		//-- llamada a WS
		//$url = env('API_PEP_FULL');
		//$params = '?cuit=' . $dni . '&nombre_persona=' .  str_replace(' ','%20',$nombre_completo) . '&pais=' . '';
		
		$arreglo = array();

		$obj = new StdClass();
		$so = array();
		$pep = array();
		$sancionado = array();

		//$res = json_decode(Misc::CURLCall($url . $params, '', 'GET'));
		$resp = json_decode(self::consultaWs($cuit,$nombre_completo,'AR',$id_consumo)); 
		
		$nombre_completo = self::acentos_enies($nombre_completo); 
		$n2 = explode(' ', trim(strtoupper($nombre_completo)));
		
    	$res = ($resp->response);		
		
		for ($i=0; $i<count($res); $i++) {

	 
			$res[$i]->nombre = self::acentos_enies($res[$i]->nombre);
			$n1 = explode(' ', trim(strtoupper($res[$i]->nombre)));
			
			if((Misc::esElMismoNombre($n1, $n2) && $cuit == $res[$i]->taxid) || (strtoupper($res[$i]->pais) == 'ARGENTINA' && Misc::esElMismoNombre($n1, $n2) && $res[$i]->fidecheck == 'SUJETO OBLIGADO')) {
			//if((Misc::esElMismoNombre($n1, $n2) || $cuit == $res[$i]->taxid) && strtoupper($res[$i]->pais) == 'ARGENTINA') {
				//$arreglo[$i] = $res[$i];
				switch ($res[$i]->fidecheck) {
					case 'SANCIONADO':
						$sancionado[] = array('Position'=>$res[$i]->cargo,'Institution'=>$res[$i]->institucion,'Description'=>$res[$i]->DescripcionFuente);
						break;
					case 'PEP':
						$pep[] = array('Position'=>$res[$i]->cargo,'Institution'=>$res[$i]->institucion,'Description'=>$res[$i]->DescripcionFuente);
						break;
					case 'SUJETO OBLIGADO':
						$so[] = array('Position'=>$res[$i]->cargo,'Institution'=>$res[$i]->institucion,'Description'=>$res[$i]->DescripcionFuente);
						break;
					default:
						# code...
						break;
				}
			}
		}
		
		$obj->Sanctions_search = (count($sancionado)>0) ? $sancionado : null;
		$obj->Pep_search = (count($pep)>0) ? $pep : null;
		$obj->So_search = (count($so)>0) ? $so : null;
		return $obj;
	}

    /*
        Funcion consulta RENAPER para EXTENDED
    */
    public static function tratamientoRenaperExtend($fecha_ultima_renaper, $dni, $sexo, $cuit)
    {
        if (is_null($fecha_ultima_renaper) || Misc::cantidadMeses($fecha_ultima_renaper) >= 4) {
            if (($sexo != 'F' && $sexo != 'M' || is_null($sexo))) {
                $sexo = Misc::posibleGenero($cuit);
            }
            //return json_decode(RenaperController::obtenerUltimoEjemplarUno($dni, $sexo, 1))->Response;
            $r = json_decode(RenaperController::obtenerUltimoEjemplarUno($dni, $sexo, 1))->Response;
            if (count($r) == 0 && $sexo == 'M') {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarUno($dni, 'F', 1))->Response;
                return (count($r) == 0) ? null : $r;
                //return json_decode(RenaperController::obtenerUltimoEjemplarUno($dni, 'F', 1))->Response;
            } else if (count($r) == 0 && $sexo == 'F') {
                $r = json_decode(RenaperController::obtenerUltimoEjemplarUno($dni, 'M', 1))->Response;
                return (count($r) == 0) ? null : $r;
                //return json_decode(RenaperController::obtenerUltimoEjemplarUno($dni, 'M', 1))->Response;
            } else {
                return $r;
            }
        }
        return null;
    }

    public static function icNse()
    {
        $usuario = Session::get('usuario');
        //
        $cuit = trim(isset($_POST['tax_id']) ? $_POST['tax_id'] : (isset($_POST['TAX_ID']) ? $_POST['TAX_ID'] : ''));
        $apikey = trim(isset($_POST['apikey']) ? $_POST['apikey'] : (isset($_POST['APIKEY']) ? $_POST['APIKEY'] : ''));
        //
        if ($usuario->producto == env('NRO_PRODUCTO_NSE')) {
            try {

                $tipo_persona_nse = (substr($cuit, 0, 1) != '3') ? 'f' : 'j';
                /* 22/07/2021 Agregamos que pase por afip */
                if (! empty($cuit) && strlen($cuit) == 11) {
                    AFIPController::obtenerPadron($cuit, true, 'AR', false);
                }
                //				
                $user_id = $usuario->user_id;

                // AGB por favor transaccionar el ID producto que corresponde a cada APIKEY . Está usando fijo el 55 y ese producto se llama
                // informe comercial Teipesa. Creditsafe y Mati usan esta ruta con diferentes apikey y con el producto 79
                // Luego hay que actualizar la base de datos para que los consumos del 55 se muevan al 79 para estos dos clientes
                // El apikey se controla en api.php pero el producto del apikey se ignora.

                $producto = $usuario->producto ?? 55;
                //$p_ip   = $_SERVER['REMOTE_ADDR'];
                //$csa = SQLConnection::backendStoreProcedure('consumir_servicio_API',array($user_id,$cuit,$producto,$p_ip),'selectOne');
                $csa = self::consumir_servicio($cuit, $producto);

                //SQLConnection::consumirServicio($user_id,$cuit,55);

                if (! $apikey) {
                    $apikey = Request::input('apikey');
                }
                $user_id = 0;
                $persona = new stdClass();
                $configuracion = [];
                $cuit_validado = Misc::validarCuit($cuit);

                if (! $cuit_validado) {
                    return json_encode(['error' => 'Cuit Inválido']);
                }

                $respuesta = json_decode(self::obtenerServicioScore_Cla($cuit, true, false));
                $idp = SQLConnection::obtenerIdPadron($cuit);
                $id_padron = $idp->id_padron;

                //obtengo la configuración para este cliente/usuario y veo que secciones le habilito
                if ($apikey) {
                    $configuracion = SQLConnection::backendStoreProcedure('api_obtener_configuracion_secciones', array($apikey), true);
                }

                //si tiene la configuración de formales, tomamos todos los datos posibles del formales. (defunción, domicilios, datos personales. etc.)
                if ($configuracion !== NULL && $configuracion->formales == true) {
                    //definicion de variables compartidas.
                    $nombre = '';
                    $defuncion = SQLConnection::backendStoreProcedure('obtener_defuncion', array($cuit), true);
                    $fisica_juridica = Misc::tipoPersona($cuit);
                    $p_fisica = ($fisica_juridica == 'F') ? 'FISICA' : 'JURIDICA';
                    $persona->formales = new stdClass();
                    $persona->formales->tipo_persona = $p_fisica;

                    $telefonos = SQLConnection::backendStoreProcedure('obtener_telefono', array($id_padron));
                    $persona->formales->identificacion = $cuit;
                    if ($fisica_juridica == 'F') {
                        $datos_persona = SQLConnection::backendStoreProcedure('obtener_persona', array($cuit), true);
                        //$nombre                             = $datos_persona->nombre_persona;
                        //-- Modificacion separacion de nombre, pedido del cliente. ------------------
                        $nombre_completo = $datos_persona->nombre_persona;
                        $apellidos_c = $datos_persona->apellidos;
                        $nombres_c = $datos_persona->nombres;
                        //-----------------------------------------------------------------------------
                        $dni = (int) substr($cuit, 2, -1);
                        $empleado_de = SQLConnection::backendStoreProcedure('obtener_empleado_de', array($cuit));
                        $persona->formales->dni = (string) $dni;
                        $persona->formales->telefonos = $telefonos;
                        $persona->formales->sexo = $datos_persona->sexo;
                        $persona->formales->anio_nacimiento = $datos_persona->anio_nacimiento;
                        $persona->formales->nacionalidad = ''; // en www2 estaba sacada esta linea
                        $persona->formales->ejemplar = '';
                        $persona->formales->defuncion = new stdClass();

                        if (! empty($datos_persona->fecha_nacimiento)) {
                            $edad = Misc::calcularEdad($datos_persona->fecha_nacimiento);
                            if ($edad) {
                                $persona->formales->edad = $edad;
                            }
                        }

                        $persona->formales->empleado_de = $empleado_de;
                        $persona->formales->profesion = $datos_persona->profesion;
                        $persona->formales->fecha_nacimiento = $datos_persona->fecha_nacimiento;
                        $persona->formales->estado_civil = $datos_persona->estado_civil;

                        $persona->formales->defuncion->fuente = ! empty($defuncion->fuente) ? $defuncion->fuente : '-';
                        $persona->formales->defuncion->fecha_deceso = ! empty($defuncion->fecha_deceso) ? $defuncion->fecha_deceso : '-';
                        $persona->formales->defuncion->defuncion = ! empty($defuncion->defuncion) ? $defuncion->defuncion : '-';

                    } else {
                        $nombre = SQLConnection::obtenerRazonSocial($cuit)->nombre_persona;
                        $sociedades = SQLConnection::backendStoreProcedure('obtener_sociedades', array($cuit));
                        $info_empresa_formales = [];
                        $card_empleados = SQLConnection::backendStoreProcedure('obtener_empleados', array($cuit), 'selectOne');

                        if (isset($card_empleados->total)) {
                            $card_empleados->total = (int) $card_empleados->total;
                        }
                        $persona->formales->empleados = $card_empleados;

                        foreach ($sociedades as $key => $value) {
                            $info_empresa_formales[$key] = new stdClass();
                            $info_empresa_formales[$key]->ramo = $value->ramo;
                            $info_empresa_formales[$key]->subramo = $value->subramo;
                            $info_empresa_formales[$key]->fecha_contrato_social = $value->fecha_cons;
                            $info_empresa_formales[$key]->capital = (int) $value->capital;
                        }
                        $persona->formales->mas_info = $info_empresa_formales;
                        $claes_info = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
                        $claes = [];
                        foreach ($claes_info as $key => $value) {
                            $claes[$key] = new stdClass();
                            $claes[$key]->cod_clae = $value->cod_clae;
                            $claes[$key]->descripcion = $value->descripcion;
                        }
                        $persona->formales->claes = $claes;
                    }
                    //-- Modificacion separacion de nombre, pedido del cliente. ------------------
                    if ($fisica_juridica == 'F') {
                        $persona->formales->nombre = $nombre_completo;
                        $persona->formales->apellidos_persona = $apellidos_c;
                        $persona->formales->nombres_persona = $nombres_c;
                    } else {
                        $persona->formales->nombre = $nombre;
                        $persona->formales->apellidos_persona = 'null';
                        $persona->formales->nombres_persona = 'null';
                    }
                    //$persona->formales->nombre  = $nombre;
                    //----------------------------------------------------------------------------

                    $persona->formales->domicilios = new stdClass();
                    $domicilios = SQLConnection::backendStoreProcedure('sp_obtener_domicilios', array($cuit));

                    if (! empty($domicilios)) {
                        foreach ($domicilios as $key => $value) {
                            $domicilios[$key]->provincia = $domicilios[$key]->prv_nombre;
                            $domicilios[$key]->localidad = $domicilios[$key]->loc_nombre;
                            $domicilios[$key]->pais = $domicilios[$key]->pai_nombre;
                            $domicilios[$key]->cp = $domicilios[$key]->codpos;
                            unset($domicilios[$key]->prv_nombre);
                            unset($domicilios[$key]->loc_nombre);
                            unset($domicilios[$key]->pai_nombre);
                            unset($domicilios[$key]->codpos);
                            unset($domicilios[$key]->id);
                            unset($domicilios[$key]->tipo_domicilio);
                            unset($domicilios[$key]->created);
                        }
                        $persona->formales->domicilios = $domicilios;
                    }
                    //      $persona->formales->defuncion->defuncion    = empty($defuncion->defuncion) ? '-' : $defuncion ;
                }

                $participaciones = [];
                //$vinculaciones    = []; // estaba wn www2
                //$relaciones       = []; // estaba wn www2 

                //--  Información socios/directores/sociedades.  --//
                if ($configuracion !== NULL && $configuracion->relaciones == true) {
                    $persona->relaciones = new stdClass();
                    $persona->relaciones->socios = [];
                    $persona->relaciones->participaciones = [];
                    $persona->relaciones->vinculaciones = [];
                    if ($fisica_juridica == 'F') {
                        $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                        $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                        $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));

                    } else {
                        $relaciones = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit, $fisica_juridica));
                        $participaciones = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
                        $vinculaciones = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
                    }
                    $i = 0;
                    foreach ($participaciones as $key => $value) {
                        $persona->relaciones->participaciones[$i] = new stdClass();
                        $persona->relaciones->participaciones[$i]->razon_social_sociedad = $value->nombre_sociedad;
                        $persona->relaciones->participaciones[$i]->cuit_sociedad = $value->cuit_sociedad;
                        $persona->relaciones->participaciones[$i]->cuit_socio = $value->cuit_socio;
                        $persona->relaciones->participaciones[$i]->nombre_socio = $value->nombre_socio;
                        $persona->relaciones->participaciones[$i]->cargo = $value->cargo;
                        $i++;
                    }

                    $i = 0;
                    foreach ($relaciones as $key => $value) {
                        $persona->relaciones->socios[$i] = new stdClass();
                        $persona->relaciones->socios[$i]->cuit = $value->cuit;
                        $persona->relaciones->socios[$i]->pais = $value->country_name;
                        $persona->relaciones->socios[$i]->nombre_persona = $value->nombre_persona;
                        $persona->relaciones->socios[$i]->cargo = $value->car_nombre;
                        $persona->relaciones->socios[$i]->desde = $value->c04_periodo_desde;
                        $persona->relaciones->socios[$i]->hasta = $value->c04_periodo_hasta;
                        $i++;
                    }
                    $i = 0;
                    foreach ($vinculaciones as $key => $value) {
                        $persona->relaciones->vinculaciones[$i] = new stdClass();
                        $persona->relaciones->vinculaciones[$i]->cuit = $value->cuit_vinculada;
                        $persona->relaciones->vinculaciones[$i]->nombre_persona = $value->nombre_persona;
                        $persona->relaciones->vinculaciones[$i]->tipo = $value->nombre;
                        $persona->relaciones->vinculaciones[$i]->detalle = $value->detalle;
                        $i++;
                    }
                }

                //--  comerciales  --//
                if ($configuracion !== NULL && $configuracion->comerciales == true) {
                    $persona->comerciales = new stdClass();
                    $consultas_ramos = SQLConnection::backendStoreProcedure('obtener_consulta_por_ramos', array($cuit, 12));
                    $seguros = SQLConnection::backendSeguros($cuit);
                    $marcas = SQLConnection::backendStoreProcedure('obtener_marcas', array($cuit));
                    $consultas = [];
                    if ($consultas_ramos) {
                        foreach ($consultas_ramos as $key_ramo => $consulta) {
                            $consultas[$key_ramo]['nombre'] = $consulta->descripcion;
                            $consultas[$key_ramo][$consulta->antiguedad] = $consulta->cantidad;
                        }
                        foreach ($consultas as $key => $consulta) {
                            if (! isset($consultas[$key]['entre_0_1'])) {
                                $consultas[$key]['entre_0_1'] = 0;
                            }
                            if (! isset($consultas[$key]['entre_1_2'])) {
                                $consultas[$key]['entre_1_2'] = 0;
                            }
                            if (! isset($consultas[$key]['entre_2_5'])) {
                                $consultas[$key]['entre_2_5'] = 0;
                            }
                            ksort($consultas[$key]);
                        }
                    }
                    if (! empty($marcas)) {
                        foreach ($marcas as $key => $value) {
                            unset($value->num_boletin);
                            unset($value->directorio);
                            unset($value->web);
                            unset($value->fecha_publicacion);
                            unset($value->encontrada);
                        }
                    }
                    foreach ($seguros as $key => $value) {
                        unset($seguros[$key]->seg_codigo);
                        unset($seguros[$key]->rie_codigo);
                        unset($seguros[$key]->id_seguros);
                        unset($seguros[$key]->id_padron);
                        unset($seguros[$key]->visible);
                        unset($seguros[$key]->estado);
                    }
                    $persona->comerciales->consultas = $consultas;
                    $persona->comerciales->seguros = $seguros;
                    $persona->comerciales->marcas = $marcas;
                }

                //--  balances  --//
                if ($configuracion !== NULL && $configuracion->contables == true) {
                    //$MainController = new MainController();
                    $persona->balances = [];
                    $persona->balances = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
                }

                //--  fiscales  --//
                if ($configuracion !== NULL && $configuracion->fiscales == true) {
                    $persona->fiscales = new stdClass();
                    $claes = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
                    $inscripciones = SQLConnection::backendStoreProcedure('obtener_inscripciones', array($cuit));
                    $impuestos = SQLConnection::backendStoreProcedure('obtener_padron_impuestos', array($id_padron));
                    $apocrifas = SQLConnection::backendStoreProcedure('obtener_apocrifas', array($cuit));
                    $sircreb = SQLConnection::backendStoreProcedure('obtener_sircreb', array($cuit));
                    $arba = SQLConnection::backendStoreProcedure('obtener_arba', array($cuit));
                    $aportes = SQLConnection::backendStoreProcedure('backend_mis_aportes', array($cuit, NULL, 12, 1), false);

                    $persona->fiscales->aportes = $aportes;
                    $persona->fiscales->clae = $claes;
                    $persona->fiscales->inscripciones = $inscripciones;
                    $persona->fiscales->impuestos = $impuestos;
                    $persona->fiscales->facturas_apocrifas = $apocrifas;
                    $persona->fiscales->sircreb = $sircreb;
                    $persona->fiscales->arba = $arba;
                }

                //--  informacion de bancos y cheques  --//
                if ($configuracion !== NULL && $configuracion->bancos_y_cheques == true) {
                    $bancos = SQLConnection::backendStoreProcedure('backend_central_deudores', array($cuit, 24, 1));
                    $persona->periodos = new stdClass();
                    $periodo = SQLConnection::backendStoreProcedure('obtener_periodo_maximo', array($cuit), 'selectOne');
                    $persona->periodos->bancos = Misc::convertirFormatoFecha($periodo->periodo_maximo, 'Y-m-d', 'Ym');
                    $persona->bancos = [];
                    foreach ($bancos as $key => $value) {

                        $persona->bancos[$key] = new stdClass();
                        $persona->bancos[$key]->codigo_entidad = $value->codigo_ent;
                        $persona->bancos[$key]->nombre_entidad = $value->nombre;
                        $persona->bancos[$key]->periodo = $value->fec_inf;
                        $persona->bancos[$key]->situacion = $value->situacion;
                        $persona->bancos[$key]->monto = $value->total;
                        $persona->bancos[$key]->dias_atraso = $value->dia_atraso;
                    }
                    //}
                    $persona->vinculados_segun_bcra = [];

                    //informacion de cheques
                    $cheques = SQLConnection::backendStoreProcedure('obtener_cheques', array($cuit));
                    $i = 0;
                    foreach ($cheques as $key => $value) {
                        if ($value->tipo == 'vinculaciones') {
                            $persona->vinculados_segun_bcra[$i] = new stdClass();
                            $persona->vinculados_segun_bcra[$i]->nombre_persona_firmante = $value->nombre_persona_firmante;
                            $persona->vinculados_segun_bcra[$i]->cuit_firmante = $value->cuit_firmante;
                            $persona->vinculados_segun_bcra[$i]->nombre_persona_relacionado = $value->nombre_persona_relacionado;
                            $persona->vinculados_segun_bcra[$i]->Cuit_relacionado = $value->Cuit_relacionado;
                            $persona->vinculados_segun_bcra[$i]->cantidad_cheques_firmados = $value->cantidad;
                            $persona->vinculados_segun_bcra[$i]->cantidad_cheques_totales = $value->total_cheques;
                            unset($cheques[$i]);
                            $i += 1;
                        } else {
                            unset($cheques[$key]->idp);
                            unset($cheques[$key]->idppr);
                            unset($cheques[$key]->cantidad);
                            unset($cheques[$key]->total_cheques);
                        }
                    }
                    $persona->cheques = $cheques;
                }

                //--  score_ic  --//
                $score = $respuesta->score;
                if ($configuracion !== NULL && $configuracion->score_ic == true) {
                    $persona->score = new stdClass();
                    $persona->score->valor = $score;
                }

                //--  comex  --//
                if ($configuracion !== NULL && $configuracion->comex == true) {
                    $persona->comex = new stdClass();
                    $impo = SQLConnection::backendStoreProcedure('obtener_comex', array($cuit), 'select');
                    $pais = SQLConnection::backendStoreProcedure('obtener_comex_pais', array($cuit), 'select');
                    $rubros = SQLConnection::backendStoreProcedure('obtener_comex_rubros', array($cuit), 'select');
                    $totales = SQLConnection::backendStoreProcedure('obtener_comex_totales', array($cuit), 'selectOne');
                    $persona->comex->importaciones = [];
                    if (! empty($impo)) {
                        foreach ($impo as $key => $value) {
                            $persona->comex->importaciones[$key] = new stdClass();
                            $persona->comex->importaciones[$key]->fecha = $value->date;
                            $persona->comex->importaciones[$key]->consumo = $value->consumo;
                            $persona->comex->importaciones[$key]->deposito = $value->deposito;
                            $persona->comex->importaciones[$key]->zonafranca = $value->zonafranca;
                            $persona->comex->importaciones[$key]->temporal = $value->temporal;
                            $persona->comex->importaciones[$key]->total = $value->total;
                        }
                    }
                    if (! empty($pais)) {
                        foreach ($pais as $key => $value) {
                            $persona->comex->pais[$key] = new stdClass();
                            $persona->comex->pais[$key]->tipo_operacion = $value->tipo_operacion;
                            $persona->comex->pais[$key]->fob = $value->fob;
                            // $persona->comex->pais[$key]->nombre             = $value->nombre; // estaba en www2
                        }
                    }
                    if (! empty($rubros)) {
                        foreach ($rubros as $key => $value) {
                            $persona->comex->rubros[$key] = new stdClass();
                            $persona->comex->rubros[$key]->tipo_operacion = $value->tipo_operacion;
                            $persona->comex->rubros[$key]->descripcion = $value->descripcion;
                            $persona->comex->rubros[$key]->fob = $value->fob;
                            $persona->comex->rubros[$key]->posicion = $value->posicion;
                        }
                    }
                    if (! empty($totales)) {
                        $persona->comex->totales = new stdClass();
                        $persona->comex->totales->total_impo = $totales->total_impo;
                        $persona->comex->totales->total_expo = $totales->total_expo;
                    }
                }

                //-- Legales.. ??
                if ($configuracion !== NULL && $configuracion->legales == true) {
                    $actor = SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null, 'A', $cuit, 60, 1), 'select');
                    $demandado = SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null, 'D', $cuit, 60, 1), 'select');
                    $persona->legales = new stdClass();
                    $persona->legales->actor = [];
                    $persona->legales->demandado = [];

                    foreach ($actor as $key => $value) {
                        $persona->legales->actor[$key] = new stdClass();
                        $persona->legales->actor[$key]->fecha_causa = $value->fecha_causa;
                        $persona->legales->actor[$key]->nombre_causa = $value->nombre_causa;
                        $persona->legales->actor[$key]->cuit = $value->cuit_otra_parte;
                        $persona->legales->actor[$key]->nombre = $value->nombre_padron_otra_parte;
                        $persona->legales->actor[$key]->juzgado = $value->juzgado;
                        $persona->legales->actor[$key]->secretaria = $value->secretaria;
                    }

                    foreach ($demandado as $key => $value) {
                        $persona->legales->demandado[$key] = new stdClass();
                        $persona->legales->demandado[$key]->fecha_causa = $value->fecha_causa;
                        $persona->legales->demandado[$key]->nombre_causa = $value->nombre_causa;
                        $persona->legales->demandado[$key]->cuit = $value->cuit_otra_parte;
                        $persona->legales->demandado[$key]->nombre = $value->nombre_padron_otra_parte;
                        $persona->legales->demandado[$key]->expediente = $value->expediente;
                        $persona->legales->demandado[$key]->juzgado = $value->juzgado;
                        $persona->legales->demandado[$key]->secretaria = $value->secretaria;
                    }
                }
                //-------------------------------------------  NIVEL SOCIO ECONOMICO  ---------------------------------------------------------------//

                //$respuesta  = json_decode(self::obtenerServicioScore($cuit,true,false));
                $score_nse = $respuesta->score;
                /*if (strtoupper($tipo_persona_nse) == 'F' && $score_nse == 0){
                                $nivel = new StdClass();
                                $nivel->rango_minimo = '0';
                                $nivel->rango_maximo = '0';
                            } else {
                                $nivel= SQLConnection::backendStoreProcedure('obtener_nivel_socioeconomico_2021',array($cuit,$tipo_persona_nse,0,$usuario->cliente['client_id']),true);
                                //$nivel= SQLConnection::backendStoreProcedure('obtener_nivel_socioeconomico',array($cuit,$tipo_persona_nse),true);
                            }*/

                $nivel = SQLConnection::backendStoreProcedure('obtener_nivel_socioeconomico_2021', array($cuit, $tipo_persona_nse, 0, $usuario->cliente['client_id']), true);

                // si vienen null se los pasa directo a 0
                $nivel->rango_minimo = (is_null($nivel->rango_minimo)) ? '0' : $nivel->rango_minimo;
                $nivel->rango_maximo = (is_null($nivel->rango_maximo)) ? '0' : $nivel->rango_maximo;

                $rangos = array('rango_minimo' => $nivel->rango_minimo, 'rango_maximo' => $nivel->rango_maximo);
                //$persona->NSE = $nivel;
                //$persona->NSE = $rangos;
                //AGB TRUCHADA PARA WORLDSYS

                /*if ($tipo_persona_nse == 'f'){
                                $persona->NSE = $rangos;
                            }
                            else{
                                $persona->NSE = array();
                            }*/
                //
                $rangosFAE = array('fae_min' => $nivel->rango_minimo, 'fae_max' => $nivel->rango_maximo);
                if ($tipo_persona_nse == 'f') {
                    $persona->NSE = $rangos;
                    $persona->FAE = array();
                } else {
                    $persona->NSE = array();
                    $persona->FAE = $rangosFAE;
                }
                //------------------------------------------------------------------------------------------------------------------------------------//
                return json_encode($persona);

            } catch (\Throwable $th) {
                $mensaje = 'Error al consultar API NSE fidelitas-wwww (posible cuit inexistente) <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Cuit Consultado: ' . $cuit . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                Misc::enviarMail_errores_api($mensaje);
                return json_encode(['Status' => 'ERROR', 'Message' => 'The provided national id does not match a valid tax id and could not be validated. Please review it and try again.']);
            }
        }
        return json_encode(['response' => 'No posee acceso al producto.']);
    }

    /* 
        ESTA FUNCION SE DESACTIVA EL LLAMADO A obtenerPadron PORQUE YA SE ESTA USANDO EN LA FUNCION QUE LO ESTA LLAMANDO Y GENERA UNA DEMORA IMPORTANTE
        HASTA EL MOMENTO 17-02-2022 SOLO LA ESTAN USANDO obtenerInformeComercialCompleto Y icNse.
        SI SE DECIDE AGREGAR EN OTRAS, VERIFICAR QUE PREVIO SE LLAMADO A obtenerPadron
    */
    public static function obtenerServicioScore_Cla($cuit = '', $calcular_balance = true, $constancia_afip = true)
    {
        // PARCHE PARA EVITAR QUE SE ROMPA, NO SE DETECTA PROBLEMA DE EL PORQUE FALLA LA LLAMADA AL STORE  --//
        // SI FALLA ESTO, QUE DIOS SE APIADE DE NOSOTROS.
        //$porcentaje_por_grupo_alternativo = SQLConnection::obtenerPorcentajePorGrupo('20177260909');
        $porcentaje_por_grupo_alternativo = new stdClass();
        $porcentaje_por_grupo_alternativo->judicial = '24,4';
        $porcentaje_por_grupo_alternativo->cendeu = '26,8';
        $porcentaje_por_grupo_alternativo->cheques = '31,0';
        $porcentaje_por_grupo_alternativo->fiscal = '11,9';
        $porcentaje_por_grupo_alternativo->formal = '5,9';
        //---------------------------------------------------------------------------------------------------//
        if (! $cuit) {
            $cuit = Request::input('cuit');
        }
        $numero_cliente = Request::input('cliente');
        MainController::verificarMongo($cuit);
        $user_id = 0;
        //$p_fisica = (substr($cuit,0,1) == 3) ? false : true;
        $fisica_juridica = Misc::tipoPersona($cuit);
        $p_fisica = ($fisica_juridica == 'F') ? true : false;
        $resp_constancia = [];
        //Si afip es true pasa por afip. 
        //-------------------------------------------------  INICIO  --------------------------------------------------------//
        try {
            if (ENV('SERVICIOS_AFIP') == true) {
                SQLConnection::busquedaPadron($cuit, 1);
                //AFIPController::obtenerPadron($cuit,false,'AR',$constancia_afip); //--> SE COMENTA ESTO PORQUE YA ESTA SIENDO USADA POR LA FUNCION QUE LLAMA A ESTA.
                $resp_constancia = AFIPController::obtenerConstanciaPDF($cuit);
            } else {
                $resp_constancia['response'] = 'constancia deshabilitado';
                $resp_constancia['constancia_error'] = false;
                // Si es persona fisica y no tenemos ni año ni fecha de nacimiento, y no se la puede completar con el padron electoral, entonces SI va a afip
                if ($p_fisica) {
                    $tiene_nac = SQLConnection::obtenerTieneNacimiento($cuit);
                    if (isset($tiene_nac->tiene_nacimiento) && $tiene_nac->tiene_nacimiento == 0) {
                        $actualiza = SQLConnection::actualizarDatosConPadron($cuit, $user_id);
                        if (! isset($actualiza->respuesta) || $actualiza->respuesta != 'ok') {
                            SQLConnection::busquedaPadron($cuit, 1);
                            //AFIPController::obtenerPadron($cuit,false,'AR',$constancia_afip); //--> SE COMENTA ESTO PORQUE YA ESTA SIENDO USADA POR LA FUNCION QUE LLAMA A ESTA.
                        }
                    }
                }
            }
            //--  SE AGREGAR CAPTURA DE ERROR PARA EVITAR LA ROTURA TOTAL, EXISTE PROBLEMA PARA VERIFICAR LOS MOTIVOS DE RECHAZOS  --//
            try {
                if (self::$revisar_monsanto == true) {
                    //$resp = SQLConnection::backendStoreProcedure('obtener_contraparte_cuit',array($cuit,110864291),'selectOne');  //-->  LINEA ORIGINAL, SE COMENTA PORQUE ESA FUNCION NO ES OPTIMA
                    /* Funcion inexistente
                    $respA = SQLConnection::obtenerContraparteCla($cuit, '110864291'); */
                    //echo(var_dump($respA[0]->contraparte));die();
                    /* $contraparte = $respA[0]->contraparte; */
                    //$resp = SQLConnection::backendStoreProcedure('LN_panel_control_excel',array(110864291,$contraparte),'selectOne'); //-->  LINEA ORIGINAL, SE COMENTA PORQUE ESA FUNCION NO ES OPTIMA
                    /* $resp = SQLConnection::controlExcelCla('110864291', $contraparte); */
                    /* if (isset($resp[0]->detalle_killer) && $resp[0]->detalle_killer !== '') {
                        self::$monsanto = 'Rechazo por ' . $resp[0]->detalle_killer;
                    } */
                }
            } catch (\Throwable $th) {
                self::$monsanto = 'Rechazo por No se pudieron obtener los motivos de rechazo. ';//.$th->getMessage();
            }
            /* Si está fallecido o Sintomas de vitalidad = 0, el score da cero */
            $defuncion = SQLConnection::obtenerDefuncion($cuit);
            if (isset($defuncion->fecha_deceso)) {
                self::$monsanto = 'Rechazo por defunción';
                return json_encode(['score' => 0, 'debug_score' => 'Fecha Deceso', 'resp_constancia' => $resp_constancia]);
            }
            $vitalidad = SQLConnection::obtenerSintomasDeVitalidad($cuit);
            if (isset($vitalidad->vitalidad) && $vitalidad->vitalidad == 0) {
                return json_encode(['score' => 0, 'debug_score' => 'Sintomas de Vitalidad', 'resp_constancia' => $resp_constancia]);
            }

            $debug_score = '';
            // Obtener Bancos para calcular si amerita por situación uno y sumar al score
            // Se almacenan en variable de clase para ser reutilizadas en la pestaña de bancos
            $obtener_bancos = SQLConnection::obtenerBancos($cuit);
            $situacion_1 = Misc::ameritaPorSituacionUno($obtener_bancos);
            self::$amerita_situacion_1 = $situacion_1['amerita'];
            self::$cantidad_situacion_1 = $situacion_1['cantidad'];

            $tabla_score = SQLConnection::obtenerTablaScore();

            $tabla_score_ordenada = [];
            $score_ordenado = [];

            foreach ($tabla_score as $score) {
                $score->cantidad = 0;
                $tabla_score_ordenada[$score->id_grupo][$score->codigo][] = $score;
            }
            $tabla_score_con_cantidades = $tabla_score_ordenada;
            $array_score_general = SQLConnection::obtenerScore($cuit, $p_fisica);
            $score_fiscales = SQLConnection::obtenerScoreFiscales($cuit, $p_fisica);
            $score = 70;
            foreach ($array_score_general as $score_general) {
                if ($score_general->grupo == 2) {
                    $score_ordenado[$score_general->grupo][$score_general->codigo][$score_general->fecha][] = $score_general;
                } else {
                    $score_ordenado[$score_general->grupo][$score_general->codigo][] = $score_general;
                }
            }
            //echo($cuit." - ");
            $porcentaje_por_grupo = SQLConnection::obtenerPorcentajePorGrupo($cuit);
            //echo(var_dump($porcentaje_por_grupo)); die();

            //------------------  SE AGREGA ESTA SECCION PORQUE DABA ERROR AL CLONAR OBJETO  --------------------//
            try {
                self::$porcentaje_por_grupo_afectado_por_preferencias = clone $porcentaje_por_grupo;
            } catch (\Throwable $th) {
                $porcentaje_por_grupo = $porcentaje_por_grupo_alternativo;
                self::$porcentaje_por_grupo_afectado_por_preferencias = clone $porcentaje_por_grupo_alternativo;
            }
            //---------------------------------------------------------------------------------------------------//

            //self::$porcentaje_por_grupo_afectado_por_preferencias = clone $porcentaje_por_grupo;  //--> LINEA ORIGINAL

            $afectacion_score = SQLConnection::obtenerPorcentajeScorePorAfectacion();
            //----------------------------------------------------------------------------------------------//
            $afectacion_score_ordenada = [];
            foreach ($afectacion_score as $key => $value) {
                $afectacion_score_ordenada[$value->afecta_directo] = $value;
            }
            $link_pdf = env('HOST_NAS') . '/' . substr($cuit, 0, 2) . '/' . substr($cuit, 2, 3) . '/' . substr($cuit, 5, 3) . '/' . $cuit . '.pdf';
            self::$tiene_pdf = file_exists($link_pdf);
            $card_fiscales = '';
            if ($p_fisica) {
                $card_fiscales = SQLConnection::obtenerCardFiscalesPF($cuit);
            } else {
                $card_fiscales = SQLConnection::obtenerCardFiscales($cuit);
            }
            if (! self::$tiene_pdf && sizeof(array($card_fiscales)) == 0) {
                self::$observado = true;
            }

            if ($calcular_balance == true) {
                $score_contables = SQLConnection::obtenerScoreContable($cuit);
                self::$score_contables = $score_contables;
            }
            if ($calcular_balance == true && isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable)) {
                $score = 65.8;
            }


            if (! $p_fisica) {
                $respuesta = self::calcularScorePersonaJuridica($score, $porcentaje_por_grupo, $score_ordenado, $tabla_score_con_cantidades, $afectacion_score_ordenada, $numero_cliente);
            } else {
                self::$cuit = $cuit;
                self::$edad = Misc::obtenerEdadPersonaFisica($cuit);
                if (self::$edad >= 18 || self::$edad == null) {
                    $respuesta = self::calcularScorePersonaFisica($score, $porcentaje_por_grupo, $score_ordenado, $tabla_score_con_cantidades, $afectacion_score_ordenada, $numero_cliente);
                    $menor_de_edad = false;
                } else {
                    $respuesta['score'] = 0;
                    $respuesta['afecta_directo'] = [];
                    $respuesta['afecta_directo']['total'] = 0;
                    $respuesta['afecta_directo']['debug'] = [];
                    $respuesta['afecta_indirecto'] = [];
                    $respuesta['afecta_indirecto']['debug'] = [];
                    $menor_de_edad = true;
                }
            }

            if ($calcular_balance == true && isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable)) {
                $respuesta = self::calcularScoreBalance($respuesta, false, self::$porcentaje_por_grupo_afectado_por_preferencias->contable);
            }

            if (is_array($respuesta['afecta_indirecto']['debug'])) {
                array_push($respuesta['afecta_indirecto']['debug'], "------------------------------------------------------------");
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Judicial Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->judicial);
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Cheques Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cheques);
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Cendeu Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cendeu);
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Fiscal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->fiscal);
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Formal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->formal);
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Contable Indirecto: " . (isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable) ? self::$porcentaje_por_grupo_afectado_por_preferencias->contable : 0));
            } else {
                $respuesta['afecta_indirecto']['debug'] .= "------------------------------------------------------------";
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Judicial Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->judicial;
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Cheques Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cheques;
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Cendeu Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cendeu;
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Fiscal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->fiscal;
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Formal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->formal;
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Contable Indirecto: " . (isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable) ? self::$porcentaje_por_grupo_afectado_por_preferencias->contable : 0);
            }
            $score = $respuesta["score"];
            if (isset($respuesta['afecta_directo']['debug']) && $respuesta['afecta_directo']['debug'] != '') {
                $debug_score = "Afectaciones Directas";
                $debug_score .= "<br> Monsanto: " . self::$monsanto . "<br>";
                $debug_score .= "<br>";
                //echo(var_dump(array($respuesta['afecta_directo']['debug'])));die();
                //$debug_score .= implode('<br>',$respuesta['afecta_directo']['debug']);
                //echo(var_dump($respuesta['afecta_directo']['debug'])); die(); //--> debug
                //$debug_score .= implode('<br>',array($respuesta['afecta_directo']['debug'])); //--> original
                try {
                    $debug_score .= implode('<br>', array($respuesta['afecta_directo']['debug']));
                } catch (\Throwable $th) {
                    $debug_score .= implode('<br>', $respuesta['afecta_directo']['debug']);
                }

                $debug_score .= "<br>";
            }
            if (isset($respuesta['afecta_indirecto']['debug']) && $respuesta['afecta_indirecto']['debug'] != '') {
                $debug_score .= "Afectaciones Indirectas";
                $debug_score .= "<br>";
                $debug_score .= implode('<br>', array($respuesta['afecta_indirecto']['debug']));
            }

            $score = number_format($score, 1);
            $score = ($score >= 100) ? 100 : $score;
            $score = ($score < 0) ? 0 : $score;
            if ($score == 100) {
                $score = 98;
            }
            //return $debug_score;
            return json_encode(['score' => $score, 'debug_score' => $debug_score, 'resp_constancia' => $resp_constancia]);

        } catch (\Throwable $th) {
            // \Throwable $th
            //die("ddd");
            if (ENV('SERVICIOS_AFIP') != true) {
                SQLConnection::busquedaPadron($cuit, 1);
                //AFIPController::obtenerPadron($cuit,false,'AR',$constancia_afip);
                $resp_constancia = AFIPController::obtenerConstanciaPDF($cuit);
            } else {
                $mensaje = $th->getMessage() . " L: " . $th->getLine();
                SQLConnection::control_erores($seccion = 'COD: 5.11 -> ApiControllerV1', $nombre_funcion = 'obtenerServicioScore', $mensaje);
                // 'constancia deshabilitado'
                $resp_constancia['response'] = 'ERROR INTERNO SERVER COD: 5.11';
                $resp_constancia['constancia_error'] = false;
                // Si es persona fisica y no tenemos ni año ni fecha de nacimiento, y no se la puede completar con el padron electoral, entonces SI va a afip
                if ($p_fisica) {
                    $tiene_nac = SQLConnection::obtenerTieneNacimiento($cuit);
                    if (isset($tiene_nac->tiene_nacimiento) && $tiene_nac->tiene_nacimiento == 0) {
                        $actualiza = SQLConnection::actualizarDatosConPadron($cuit, $user_id);
                        if (! isset($actualiza->respuesta) || $actualiza->respuesta != 'ok') {
                            SQLConnection::busquedaPadron($cuit, 1);
                            //AFIPController::obtenerPadron($cuit,false,'AR',$constancia_afip);
                        }
                    }
                }
            }
            //--  SE AGREGAR CAPTURA DE ERROR PARA EVITAR LA ROTURA TOTAL, EXISTE PROBLEMA PARA VERIFICAR LOS MOTIVOS DE RECHAZOS  --//
            try {
                if (self::$revisar_monsanto == true) {
                    /* $resp = SQLConnection::obtenerContraparteCla($cuit, 110864291);
                    $contraparte = $resp->contraparte;
                    $resp = SQLConnection::controlExcelCla(110864291, $contraparte);

                    if (isset($resp->detalle_killer) && $resp->detalle_killer != '') {
                        self::$monsanto = 'Rechazo por ' . $resp->detalle_killer;
                    } */
                }
            } catch (\Throwable $th) {
                self::$monsanto = 'Rechazo por No se pudieron obtener los motivos de rechazos.';
            }

            /* Si está fallecido o Sintomas de vitalidad = 0, el score da cero */
            $defuncion = SQLConnection::obtenerDefuncion($cuit);
            if (isset($defuncion->fecha_deceso)) {
                self::$monsanto = 'Rechazo por defunción';
                //echo("sale"); die();
                return json_encode(['score' => 0, 'debug_score' => 'Fecha Deceso', 'resp_constancia' => $resp_constancia]);
            }

            $vitalidad = SQLConnection::obtenerSintomasDeVitalidad($cuit);

            if (isset($vitalidad->vitalidad) && $vitalidad->vitalidad == 0) {
                return json_encode(['score' => 0, 'debug_score' => 'Sintomas de Vitalidad', 'resp_constancia' => $resp_constancia]);
            }

            $debug_score = '';
            // Obtener Bancos para calcular si amerita por situación uno y sumar al score
            // Se almacenan en variable de clase para ser reutilizadas en la pestaña de bancos
            $obtener_bancos = SQLConnection::obtenerBancos($cuit);
            $situacion_1 = Misc::ameritaPorSituacionUno($obtener_bancos);
            self::$amerita_situacion_1 = $situacion_1['amerita'];
            self::$cantidad_situacion_1 = $situacion_1['cantidad'];

            $tabla_score = SQLConnection::obtenerTablaScore();

            $tabla_score_ordenada = [];
            $score_ordenado = [];

            foreach ($tabla_score as $score) {
                $score->cantidad = 0;
                $tabla_score_ordenada[$score->id_grupo][$score->codigo][] = $score;
            }

            $tabla_score_con_cantidades = $tabla_score_ordenada;
            $array_score_general = SQLConnection::obtenerScore($cuit, $p_fisica);
            $score_fiscales = SQLConnection::obtenerScoreFiscales($cuit, $p_fisica);
            $score = 70;
            foreach ($array_score_general as $score_general) {
                if ($score_general->grupo == 2) {
                    $score_ordenado[$score_general->grupo][$score_general->codigo][$score_general->fecha][] = $score_general;
                } else {
                    $score_ordenado[$score_general->grupo][$score_general->codigo][] = $score_general;
                }
            }
            //echo($cuit." - ");
            $porcentaje_por_grupo = SQLConnection::obtenerPorcentajePorGrupo($cuit);

            //self::$porcentaje_por_grupo_afectado_por_preferencias = clone $porcentaje_por_grupo;  //--> LINEA ORIGINAL

            //------------------  SE AGREGA ESTA SECCION PORQUE DABA ERROR AL CLONAR OBJETO  --------------------//
            try {
                self::$porcentaje_por_grupo_afectado_por_preferencias = clone $porcentaje_por_grupo;
            } catch (\Throwable $th) {
                $porcentaje_por_grupo = $porcentaje_por_grupo_alternativo;
                self::$porcentaje_por_grupo_afectado_por_preferencias = clone $porcentaje_por_grupo_alternativo;
            }
            //---------------------------------------------------------------------------------------------------//
            $afectacion_score = SQLConnection::obtenerPorcentajeScorePorAfectacion();
            //----------------------------------------------------------------------------------------------//
            $afectacion_score_ordenada = [];
            foreach ($afectacion_score as $key => $value) {
                $afectacion_score_ordenada[$value->afecta_directo] = $value;
            }
            $link_pdf = env('HOST_NAS') . '/' . substr($cuit, 0, 2) . '/' . substr($cuit, 2, 3) . '/' . substr($cuit, 5, 3) . '/' . $cuit . '.pdf';
            self::$tiene_pdf = file_exists($link_pdf);
            $card_fiscales = '';
            if ($p_fisica) {
                $card_fiscales = SQLConnection::obtenerCardFiscalesPF($cuit);
            } else {
                $card_fiscales = SQLConnection::obtenerCardFiscales($cuit);
            }

            if (! self::$tiene_pdf && sizeof(array($card_fiscales)) == 0) {
                self::$observado = true;
            }

            if ($calcular_balance == true) {
                $score_contables = SQLConnection::obtenerScoreContable($cuit);
                self::$score_contables = $score_contables;
            }

            if ($calcular_balance == true && isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable)) {
                $score = 65.8;
            }


            if (! $p_fisica) {
                $respuesta = self::calcularScorePersonaJuridica($score, $porcentaje_por_grupo, $score_ordenado, $tabla_score_con_cantidades, $afectacion_score_ordenada, $numero_cliente);
            } else {
                self::$cuit = $cuit;
                self::$edad = Misc::obtenerEdadPersonaFisica($cuit);
                if (self::$edad >= 18 || self::$edad == null) {
                    $respuesta = self::calcularScorePersonaFisica($score, $porcentaje_por_grupo, $score_ordenado, $tabla_score_con_cantidades, $afectacion_score_ordenada, $numero_cliente);
                    $menor_de_edad = false;
                } else {
                    $respuesta['score'] = 0;
                    $respuesta['afecta_directo'] = [];
                    $respuesta['afecta_directo']['total'] = 0;
                    $respuesta['afecta_directo']['debug'] = '';
                    $respuesta['afecta_indirecto'] = [];
                    $respuesta['afecta_indirecto']['debug'] = '';
                    $menor_de_edad = true;
                }
            }
            if ($calcular_balance == true && isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable)) {
                $respuesta = self::calcularScoreBalance($respuesta, false, self::$porcentaje_por_grupo_afectado_por_preferencias->contable);
            }

            if (is_array($respuesta['afecta_indirecto']['debug'])) {
                array_push($respuesta['afecta_indirecto']['debug'], "------------------------------------------------------------");
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Judicial Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->judicial);
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Cheques Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cheques);
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Cendeu Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cendeu);
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Fiscal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->fiscal);
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Formal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->formal);
                array_push($respuesta['afecta_indirecto']['debug'], "Máximo Contable Indirecto: " . (isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable) ? self::$porcentaje_por_grupo_afectado_por_preferencias->contable : 0));
            } else {
                $respuesta['afecta_indirecto']['debug'] .= "------------------------------------------------------------";
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Judicial Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->judicial ?? '-';
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Cheques Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cheques ?? '-';
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Cendeu Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->cendeu ?? '-';
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Fiscal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->fiscal ?? '-';
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Formal Indirecto: " . self::$porcentaje_por_grupo_afectado_por_preferencias->formal ?? '-';
                $respuesta['afecta_indirecto']['debug'] .= "Máximo Contable Indirecto: " . (isset(self::$porcentaje_por_grupo_afectado_por_preferencias->contable) ? self::$porcentaje_por_grupo_afectado_por_preferencias->contable : 0);
            }


            $score = $respuesta["score"];

            if (isset($respuesta['afecta_directo']['debug']) && $respuesta['afecta_directo']['debug'] != '') {
                $debug_score = "Afectaciones Directas";
                $debug_score .= "<br> Monsanto: " . self::$monsanto . "<br>";
                $debug_score .= "<br>";
                //echo(var_dump(array($respuesta['afecta_directo']['debug'])));die();
                //$debug_score .= implode('<br>',$respuesta['afecta_directo']['debug']);
                //echo(var_dump($respuesta['afecta_directo']['debug'])); die(); //--> debug
                //$debug_score .= implode('<br>',array($respuesta['afecta_directo']['debug'])); //--> original
                try {
                    $debug_score .= implode('<br>', array($respuesta['afecta_directo']['debug']));
                } catch (\Throwable $th) {
                    $debug_score .= implode('<br>', $respuesta['afecta_directo']['debug']);
                }

                $debug_score .= "<br>";
            }
            if (isset($respuesta['afecta_indirecto']['debug']) && $respuesta['afecta_indirecto']['debug'] != '') {
                $debug_score .= "Afectaciones Indirectas";
                $debug_score .= "<br>";
                $debug_score .= implode('<br>', array($respuesta['afecta_indirecto']['debug']));
            }

            $score = number_format($score, 1);
            $score = ($score >= 100) ? 100 : $score;
            $score = ($score < 0) ? 0 : $score;
            if ($score == 100) {
                $score = 98;
            }
            //return $debug_score;
            return json_encode(['score' => $score, 'debug_score' => $debug_score, 'resp_constancia' => $resp_constancia]);
        }
        //-------------------------------------------------  FIN  --------------------------------------------------------//
    }

    static function consultaWs($idTributaria=null,$nombre=null,$pais=null,$id_consumo=null) {
        //Cuando mandamos el parametro id_consumo, es porque ya registramos el consumo, y no queremos registrarlo otra vez
    
        //-- Datos del usuario en session.
        $usuario        = Session::get('usuario');
        $cliente = $usuario->cliente['client_id'];
        
        //-- Lista que contendra los datos finales.
        $lista = array();

        //-- Variable para el codigo de status
        $codigo = '';

        //-- Variables recibidas.
        if ($idTributaria==null){
            $idTributaria = trim(isset($_POST['tax_id']) ? $_POST['tax_id'] : (isset($_POST['TAX_ID']) ? $_POST['TAX_ID'] : ''));
            //$dni = trim(isset($_POST['dni']) ? $_POST['dni'] : (isset($_POST['DNI']) ? $_POST['DNI'] : ''));
            $nombre = trim(isset($_POST['full_name']) ? $_POST['full_name'] : (isset($_POST['FULL_NAME']) ? $_POST['FULL_NAME'] : ''));
            $pais = strtoupper(trim(isset($_POST['country_code']) ? $_POST['country_code'] : (isset($_POST['COUNTRY_CODE']) ? $_POST['COUNTRY_CODE'] : '')));
        }

        $dni = $idTributaria;
        $nombre = self::nombre_formateo($nombre);

        //--  PARAMETROS AGREGADOS PARA CONTRAPARTE Y GESTION  --//
        $nroContraparte = strtoupper(trim(isset($_POST['contraparte']) ? $_POST['contraparte'] : (isset($_POST['CONTRAPARTE']) ? $_POST['CONTRAPARTE'] : '')));
        $nroGestion = strtoupper(trim(isset($_POST['gestion']) ? $_POST['gestion'] : (isset($_POST['GESTION']) ? $_POST['GESTION'] : '')));
        $nroContraparte = $nroContraparte == '' ? null : $nroContraparte;
        $nroGestion = $nroGestion == '' ? null : $nroGestion; 
        //-------------------------------------------------------//
        
        $nroProducto = $usuario->producto;
        if ($id_consumo==null)
        {
            $id_consumo = self::obtenerIdConsumos($idTributaria, $dni, $nombre, $nroProducto);
        }
        $paraBusqueda = $idTributaria;
        $ruta = $_SERVER['REQUEST_URI'];
        

        try {
            
            //-- Seccion para validaciones varias.
            if($pais == 'AR' && !self::tax_id_valido($idTributaria)) {
                $idTributaria = '';
            }

            if(strlen($pais) > 2) {
                $codigo = 100;
            } else if($idTributaria == '' and $dni == '' and $nombre == '') {
                $codigo = 300;
            } else if($idTributaria != '' and !self::tax_id_valido($idTributaria) and $dni == '' and $nombre == '') {
                $codigo = 301;
            } else if($idTributaria == '' and $dni != '' and !self::dni_valido($dni) and $nombre == '') {
                $codigo = 302;
            } else if($idTributaria != '' and self::tax_id_valido($idTributaria) and $dni == '' and $nombre == '' and $pais != 'AR') {
                $codigo = 303;
            } else if($idTributaria == '' and $dni != '' and self::dni_valido($dni) and $nombre == '' and $pais != 'AR') {
                $codigo = 303;
            }

            if($codigo != '') {
                return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
            }


            //-- Seccion donde se deberia componer el dni en cuit
            //-- ESTO VER QUE SUCEDE CUANDO NO EXISTE EL CUIT  --//
            if($dni != '' and $idTributaria == '') {
                $idTributaria = SQLConnection::backendStoreProcedure('api_get_govcheck',array($dni),'select')[0]->identificacion;
                $paraBusqueda = $idTributaria;
            }
            
            if($paraBusqueda == '' and $nombre !== '') {
                $paraBusqueda = $nombre;
            }

            //echo($paraBusqueda.' - '.env('PEP_NV_TOPE_DIAS')); die();
            //--  Seccion donde se verifica si el pedido ya fue consultado dentro de los N dias a WS. Sino va a WS.
            $r = SQLConnection::backendStoreProcedure('LN_Fidecheck_API', array($paraBusqueda,env('PEP_NV_TOPE_DIAS')));

            //$r = array();
            if(count($r) > 0 and !isset($_POST['debug'])) {				
                foreach ($r as $key) {
                    $persona = new stdClass;
                    //$persona->id_resultado = $key->id_resultado;  //-> ese es al antiguo id, era solo de uso interno en la vieja estructura.
                    $persona->cuit = $key->cuit;
                    $persona->nombre_persona = $key->nombre_persona;
                    //$persona->id_padron = $key->id_padron; //-> Esto se comenta dado que la estructura anterio siempre lo ponia en 0.
                    $persona->StatusCode = $key->StatusCode;
                    $persona->Status = $key->Status;
                    $persona->Reason = $key->Reason;
                    $persona->Id = $key->Id;
                    $persona->Fuente = $key->Fuente;
                    $persona->NombreModificado = $key->NombreModificado;
                    $persona->DocumentoBuscado = $key->DocumentoBuscado;
                    $persona->NombreBuscado = $key->NombreBuscado;
                    $persona->Documento = $key->Documento;
                    $persona->Residencia = $key->Residencia;
                    $persona->DescripcionPais = $key->DescripcionPais;
                    //$persona->PaisNoColaborativo = $key->PaisNoColaborativo; //-> se comenta dado que en la nueva estructura de ws no esta incluido.
                    //$persona->Hallazgos = $key->Hallazgos; //-> se comenta dado que en la nueva estructura de ws no esta incluido.
                    //$persona->ExisteDocumentacion = $key->ExisteDocumentacion; //-> se comenta dado que en la nueva estructura de ws no esta incluido.
                    $persona->PorcentajeSimilitud = $key->PorcentajeSimilitud;
                    $persona->fidecheck = $key->fidecheck;
                    $persona->Codigo = $key->Codigo;
                    $persona->FechaNovedad = $key->FechaNovedad;
                    $persona->FechaNovedaddmy = $key->FechaNovedaddmy;
                    $persona->Cargo = $key->Cargo;
                    $persona->Institucion = $key->Institucion;
                    $persona->Domicilio = $key->Domicilio;
                    $persona->NumeroDocumento = $key->NumeroDocumento;
                    $persona->NumeroIdTributaria = $key->NumeroIdTributaria;
                    $persona->Url = $key->Url;
                    $persona->Relacion = $key->Relacion;
                    $persona->orden = $key->orden;
                    $persona->TipoFuente = $key->TipoFuente;
                    $persona->DescripcionFuente = $key->PrincipalLista;
                    //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                    $persona->fecha = $key->fecha;
                    $persona->visible = $key->visible;
                    $lista[] = $persona;
                }
                $lista = self::manejadoRespuesta($lista, $nroProducto);
                $codigo = 200;
                return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
            
            } else {
                //echo("debe ir a WS."); die();
                //--  SECCION PARA LA VALIDACION DEL TOKEN EN CASO QUE DEBA IR A WS.  --//

                //-- Se pide el token a la DB, sino se encuentra vigente se solicita uno nuevo. Esta funcion ya informa en caso de no poder obtenerlo.
                $token = self::pedirToken();

                if(!isset($token) || is_null($token)) {
                    $codigo = 400;
                }

                if($codigo != '') {
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
                }

                //---------------------------------------------------------------------//

                //-- Variables de entorno.
                $identificacion = env('PEP_NV_IDENTIFICACION');
                $confBusqueda = env('PEP_NV_BUSQUEDA');

                //-- Armado de datos para la consulta a WS.
                //$data = json_encode(array("Identification" => $identificacion, "Nombre" => $nombre, "Documento" => $dni, "IdTributaria" => $idTributaria, "ConfigurationName" => $confBusqueda));
                /* 03/11/2022: Si es de argentina no manda el nombre en la consulta, para que solo busque el CUIT exacto */
                                if($pais == 'AR')
                {
                    $data = json_encode(array("Identification" => $identificacion, "Nombre" => '', "Documento" => $dni, "IdTributaria" => $idTributaria, "ConfigurationName" => $confBusqueda));
                }
                else 
                {
                    $data = json_encode(array("Identification" => $identificacion, "Nombre" => $nombre, "Documento" => $dni, "IdTributaria" => $idTributaria, "ConfigurationName" => $confBusqueda));
                }
                
                //-- inicio del cURL. ---------------------------------------------------------------------//
                $curl = curl_init();

                curl_setopt_array($curl, array(
                    CURLOPT_URL => env('PEP_NV_URL_CONSULTA'),
                    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 => $data,
                    CURLOPT_HTTPHEADER => array(
                        'Authorization: Bearer '.$token,
                        'Content-Type: application/json'
                    ),
                ));

                $response = curl_exec($curl);
                curl_close($curl);
                //-- Fin del cURL. -------------------------------------------------------------------------//

                /* 03/11/2022: Guardo Consulta ws */
                $cons = SQLConnection::backendStoreProcedure('Consultas_worldsys_', array($idTributaria, $nombre, $pais, $response), 'selectOne');

                /**/



                //-- Se convierte a json la respuesta doda que viene como un String.
                $response = json_decode($response, true)['hits'];

                //-- > SECCION PARA DEBUG, MUESTRA EL DATO EN CRUDO DE WS.  --//
                /*if(isset($_POST['debug']) and $_POST['debug'] == 1) {
                    echo('linea 9691');	
                    echo(json_encode($response)); //die();	
                }*/
                //------------------------------------------------------------//

                if($pais == 'AR' and self::tax_id_valido($idTributaria) and $nombre !== '') {
                    //-- BUsqueda por cuit/cuil
                    foreach ($response as $key) {
                        
                        if(($pais == $key['residencia'] and $key['idTributaria'] == $idTributaria) || ($pais == $key['residencia'] and $key['idTributaria'] == '' and Misc::esElMismoNombreWs($nombre, $key['nombre']) and $key['fuente']['kind']['code'] == 'SAN')) {	
                            $datosParaGuardar = array();
                            $persona = new stdClass;

                            //-- Esta variables son tipo swap, no tocar  --//
                            $persona->tipoFuente = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $persona->relacion = isset($key['relacion']) ? $key['relacion'] : '';
                            $persona->FechaNovedad = isset($key['fechaNovedad']) ? $key['fechaNovedad'] : '';
                            //---------------------------------------------//

                            //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 
                            $persona->cuit = isset($key['idTributaria']) ? $key['idTributaria'] : ''; //-> ok
                            $datosParaGuardar[0] = $persona->cuit; 
                            $persona->nombre_persona = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[1] = $persona->nombre_persona;
                            $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
                            $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
                            $persona->StatusCode = '200'; //-> ok
                            $datosParaGuardar[4] = $persona->StatusCode;
                            $persona->Status = 'OK'; //-> ok
                            $datosParaGuardar[5] = $persona->Status;
                            $persona->Reason = isset($key['fuente']['kind']['legend']) ? $key['fuente']['kind']['legend'] : ''; //-> ok
                            $datosParaGuardar[6] = $persona->Reason;
                            $persona->Id = isset($key['sdnId']) ? $key['sdnId'] : ''; //-> ok
                            $datosParaGuardar[7] = $persona->Id;
                            $persona->Fuente = isset($key['fuente']['name']) ? $key['fuente']['name'] : ''; //-> ok
                            $datosParaGuardar[8] = $persona->Fuente;
                            $persona->NombreModificado = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[9] = $persona->NombreModificado;
                            $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
                            $datosParaGuardar[10] = $persona->DocumentoBuscado;
                            $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
                            $datosParaGuardar[11] = $persona->NombreBuscado;
                            $persona->Documento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[12] = $persona->Documento;
                            $persona->Residencia = isset($key['residencia']) ? $key['residencia'] : ''; //-> ok
                            $datosParaGuardar[14] = $persona->Residencia;
                            $persona->DescripcionPais = isset($key['pais']) ? $key['pais'] : ''; //-> ok
                            $datosParaGuardar[15] = $persona->DescripcionPais;
                            $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
                            $datosParaGuardar[17] = '1'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
                            $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
                            $persona->PorcentajeSimilitud = isset($key['score']) ? $key['score'] : ''; //-> ok
                            $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
                            $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
                            $datosParaGuardar[20] = $persona->fidecheck;
                            $persona->Codigo = isset($key['id']) ? $key['id'] : ''; //-> ok
                            $datosParaGuardar[21] = $persona->Codigo;
                            $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
                            $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
                            $datosParaGuardar[23] = $persona->FechaNovedad;
                            $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
                            $persona->Cargo = isset($key['cargo']) ? $key['cargo'] : ''; //-> ok
                            $datosParaGuardar[24] = $persona->Cargo;
                            $persona->Institucion = isset($key['institucion']) ? $key['institucion'] : ''; //-> ok
                            $datosParaGuardar[25] = $persona->Institucion;
                            $persona->Domicilio = isset($key['domicilio']) ? $key['domicilio'] : ''; //-> ok
                            $datosParaGuardar[26] = $persona->Domicilio;
                            $persona->NumeroDocumento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[27] = $persona->NumeroDocumento;
                            $persona->NumeroIdTributaria = $persona->cuit; //-> ok
                            $datosParaGuardar[28] = $persona->NumeroIdTributaria;
                            $persona->Url = isset($key['url']) ? $key['url'] : ''; //-> ok
                            $datosParaGuardar[29] = $persona->Url;
                            $persona->Relacion = $persona->relacion; //->ok
                            $datosParaGuardar[30] = $persona->Relacion;
                            $persona->orden = ''; //-> ver esto para que se esta usando.
                            $persona->TipoFuente = $persona->tipoFuente; //-> ok
                            $datosParaGuardar[13] = $persona->TipoFuente;
                            //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
                            $persona->DescripcionFuente = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; 
                            //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                            $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
                            $persona->visible = '1'; //-> se e coloca 1 por default.
                            
                            $principalLista = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : ''; //-> ok
                            $datosParaGuardar[31] = $principalLista;
                            //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
                            //----- $principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
                            //---- $datosParaGuardar[32] = $principalListaDescripcion;
                            $datosParaGuardar[32] = $persona->DescripcionFuente;
                            $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[33] = $paisSwift;
                            $tipoNovedad = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $datosParaGuardar[34] = $tipoNovedad;
                            $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[35] = $idOrigRel;
                            $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[36] = $principalFuente;
                            $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[37] = $observaciones;
                            $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
                            $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[39] = $urlNew;
                            $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[40] = $normaUif;
                            $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[41] = $normaUifDescripcion;
                            $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[42] = $fuenteLista;
                            $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[43] = $fuenteActiva;
                            //--> $fuenteDescripcion = $persona->PrincipalLista;
                            $fuenteDescripcion = $principalLista;
                            $datosParaGuardar[44] = $fuenteDescripcion;
                            $fuenteDescripcionLarga = $persona->DescripcionFuente;
                            $datosParaGuardar[45] = $fuenteDescripcionLarga;
                            $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[46] = $fuenteTipo;
                            $fuenteImagen = isset($key['fuente']['logoUrl']) ? $key['fuente']['logoUrl'] : '';
                            $datosParaGuardar[47] = $fuenteImagen;
                            $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[48] = $fuenteActualizaxml;
                            $lista[] = $persona;
                            //echo("aca tarda"); die();
                            $rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);
                        }
                    }
                    $codigo = 200;
                    if(count($lista) < 1) {
                        $lista = self::auxiliarParaFidechek($idTributaria,$nombre);
                    }
                    $lista = self::manejadoRespuesta($lista, $nroProducto);
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);

                } else if($pais == 'AR' and self::tax_id_valido($idTributaria) and $nombre == '') {
                    //-- BUsqueda por cuit/cuil
                    foreach ($response as $key) {
                        if($pais == $key['residencia'] and $key['idTributaria'] == $idTributaria) {
                            $datosParaGuardar = array();
                            $persona = new stdClass;

                            //-- Esta variables son tipo swap, no tocar  --//
                            $persona->tipoFuente = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $persona->relacion = isset($key['relacion']) ? $key['relacion'] : '';
                            $persona->FechaNovedad = isset($key['fechaNovedad']) ? $key['fechaNovedad'] : '';
                            //---------------------------------------------//

                            //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 
                            $persona->cuit = isset($key['idTributaria']) ? $key['idTributaria'] : ''; //-> ok
                            $datosParaGuardar[0] = $persona->cuit; 
                            $persona->nombre_persona = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[1] = $persona->nombre_persona;
                            $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
                            $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
                            $persona->StatusCode = '200'; //-> ok
                            $datosParaGuardar[4] = $persona->StatusCode;
                            $persona->Status = 'OK'; //-> ok
                            $datosParaGuardar[5] = $persona->Status;
                            $persona->Reason = isset($key['fuente']['kind']['legend']) ? $key['fuente']['kind']['legend'] : ''; //-> ok
                            $datosParaGuardar[6] = $persona->Reason;
                            $persona->Id = isset($key['sdnId']) ? $key['sdnId'] : ''; //-> ok
                            $datosParaGuardar[7] = $persona->Id;
                            $persona->Fuente = isset($key['fuente']['name']) ? $key['fuente']['name'] : ''; //-> ok
                            $datosParaGuardar[8] = $persona->Fuente;
                            $persona->NombreModificado = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[9] = $persona->NombreModificado;
                            $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
                            $datosParaGuardar[10] = $persona->DocumentoBuscado;
                            $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
                            $datosParaGuardar[11] = $persona->NombreBuscado;
                            $persona->Documento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[12] = $persona->Documento;
                            $persona->Residencia = isset($key['residencia']) ? $key['residencia'] : ''; //-> ok
                            $datosParaGuardar[14] = $persona->Residencia;
                            $persona->DescripcionPais = isset($key['pais']) ? $key['pais'] : ''; //-> ok
                            $datosParaGuardar[15] = $persona->DescripcionPais;
                            $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
                            $datosParaGuardar[17] = '1'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
                            $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
                            $persona->PorcentajeSimilitud = isset($key['score']) ? $key['score'] : ''; //-> ok
                            $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
                            $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
                            $datosParaGuardar[20] = $persona->fidecheck;
                            $persona->Codigo = isset($key['id']) ? $key['id'] : ''; //-> ok
                            $datosParaGuardar[21] = $persona->Codigo;
                            $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
                            $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
                            $datosParaGuardar[23] = $persona->FechaNovedad;
                            $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
                            $persona->Cargo = isset($key['cargo']) ? $key['cargo'] : ''; //-> ok
                            $datosParaGuardar[24] = $persona->Cargo;
                            $persona->Institucion = isset($key['institucion']) ? $key['institucion'] : ''; //-> ok
                            $datosParaGuardar[25] = $persona->Institucion;
                            $persona->Domicilio = isset($key['domicilio']) ? $key['domicilio'] : ''; //-> ok
                            $datosParaGuardar[26] = $persona->Domicilio;
                            $persona->NumeroDocumento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[27] = $persona->NumeroDocumento;
                            $persona->NumeroIdTributaria = $persona->cuit; //-> ok
                            $datosParaGuardar[28] = $persona->NumeroIdTributaria;
                            $persona->Url = isset($key['url']) ? $key['url'] : ''; //-> ok
                            $datosParaGuardar[29] = $persona->Url;
                            $persona->Relacion = $persona->relacion; //->ok
                            $datosParaGuardar[30] = $persona->Relacion;
                            $persona->orden = ''; //-> ver esto para que se esta usando.
                            $persona->TipoFuente = $persona->tipoFuente; //-> ok
                            $datosParaGuardar[13] = $persona->TipoFuente;
                            //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
                            $persona->DescripcionFuente = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; 
                            //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                            $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
                            $persona->visible = '1'; //-> se e coloca 1 por default.
                            
                            $principalLista = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : ''; //-> ok
                            $datosParaGuardar[31] = $principalLista;
                            //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
                            //----- $persona->DescripcionFuente$principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
                            //---- $datosParaGuardar[32] = $principalListaDescripcion;
                            $datosParaGuardar[32] = $persona->DescripcionFuente;
                            $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[33] = $paisSwift;
                            $tipoNovedad = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $datosParaGuardar[34] = $tipoNovedad;
                            $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[35] = $idOrigRel;
                            $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[36] = $principalFuente;
                            $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[37] = $observaciones;
                            $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
                            $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[39] = $urlNew;
                            $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[40] = $normaUif;
                            $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[41] = $normaUifDescripcion;
                            $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[42] = $fuenteLista;
                            $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[43] = $fuenteActiva;
                            //--> $fuenteDescripcion = $persona->PrincipalLista;
                            $fuenteDescripcion = $principalLista;
                            $datosParaGuardar[44] = $fuenteDescripcion;
                            $fuenteDescripcionLarga = $persona->DescripcionFuente;
                            $datosParaGuardar[45] = $fuenteDescripcionLarga;
                            $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[46] = $fuenteTipo;
                            $fuenteImagen = isset($key['fuente']['logoUrl']) ? $key['fuente']['logoUrl'] : '';
                            $datosParaGuardar[47] = $fuenteImagen;
                            $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[48] = $fuenteActualizaxml;
                            $lista[] = $persona;
                            //echo("aca tarda"); die();
                            $rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);
                        }
                    }
                    $codigo = 200;
                    if(count($lista) < 1) {
                        $lista = self::auxiliarParaFidechek($idTributaria,$nombre);
                    }
                    $lista = self::manejadoRespuesta($lista, $nroProducto);
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
                } else if($pais !== '' and strlen($nombre) > 2) {
                    //-- Busqueda por pais y nombre
                    foreach ($response as $key) {
                        if($pais == $key['residencia'] and Misc::esElMismoNombreWs($nombre, $key['nombre'])) {
                            $datosParaGuardar = array();
                            $persona = new stdClass;

                            ///-- Esta variables son tipo swap, no tocar  --//
                            $persona->tipoFuente = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $persona->relacion = isset($key['relacion']) ? $key['relacion'] : '';
                            $persona->FechaNovedad = isset($key['fechaNovedad']) ? $key['fechaNovedad'] : '';
                            //---------------------------------------------//

                            //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 
                            $persona->cuit = isset($key['idTributaria']) ? $key['idTributaria'] : ''; //-> ok
                            $datosParaGuardar[0] = $persona->cuit; 
                            $persona->nombre_persona = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[1] = $persona->nombre_persona;
                            $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
                            $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
                            $persona->StatusCode = '200'; //-> ok
                            $datosParaGuardar[4] = $persona->StatusCode;
                            $persona->Status = 'OK'; //-> ok
                            $datosParaGuardar[5] = $persona->Status;
                            $persona->Reason = isset($key['fuente']['kind']['legend']) ? $key['fuente']['kind']['legend'] : ''; //-> ok
                            $datosParaGuardar[6] = $persona->Reason;
                            $persona->Id = isset($key['sdnId']) ? $key['sdnId'] : ''; //-> ok
                            $datosParaGuardar[7] = $persona->Id;
                            $persona->Fuente = isset($key['fuente']['name']) ? $key['fuente']['name'] : ''; //-> ok
                            $datosParaGuardar[8] = $persona->Fuente;
                            $persona->NombreModificado = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[9] = $persona->NombreModificado;
                            $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
                            $datosParaGuardar[10] = $persona->DocumentoBuscado;
                            $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
                            $datosParaGuardar[11] = $persona->NombreBuscado;
                            $persona->Documento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[12] = $persona->Documento;
                            $persona->Residencia = isset($key['residencia']) ? $key['residencia'] : ''; //-> ok
                            $datosParaGuardar[14] = $persona->Residencia;
                            $persona->DescripcionPais = isset($key['pais']) ? $key['pais'] : ''; //-> ok
                            $datosParaGuardar[15] = $persona->DescripcionPais;
                            $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
                            $datosParaGuardar[17] = '1'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
                            $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
                            $persona->PorcentajeSimilitud = isset($key['score']) ? $key['score'] : ''; //-> ok
                            $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
                            $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
                            $datosParaGuardar[20] = $persona->fidecheck;
                            $persona->Codigo = isset($key['id']) ? $key['id'] : ''; //-> ok
                            $datosParaGuardar[21] = $persona->Codigo;
                            $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
                            $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
                            $datosParaGuardar[23] = $persona->FechaNovedad;
                            $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
                            $persona->Cargo = isset($key['cargo']) ? $key['cargo'] : ''; //-> ok
                            $datosParaGuardar[24] = $persona->Cargo;
                            $persona->Institucion = isset($key['institucion']) ? $key['institucion'] : ''; //-> ok
                            $datosParaGuardar[25] = $persona->Institucion;
                            $persona->Domicilio = isset($key['domicilio']) ? $key['domicilio'] : ''; //-> ok
                            $datosParaGuardar[26] = $persona->Domicilio;
                            $persona->NumeroDocumento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[27] = $persona->NumeroDocumento;
                            $persona->NumeroIdTributaria = $persona->cuit; //-> ok
                            $datosParaGuardar[28] = $persona->NumeroIdTributaria;
                            $persona->Url = isset($key['url']) ? $key['url'] : ''; //-> ok
                            $datosParaGuardar[29] = $persona->Url;
                            $persona->Relacion = $persona->relacion; //->ok
                            $datosParaGuardar[30] = $persona->Relacion;
                            $persona->orden = ''; //-> ver esto para que se esta usando.
                            $persona->TipoFuente = $persona->tipoFuente; //-> ok
                            $datosParaGuardar[13] = $persona->TipoFuente;
                            //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
                            $persona->DescripcionFuente = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; 
                            //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                            $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
                            $persona->visible = '1'; //-> se e coloca 1 por default.
                            
                            $principalLista = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : ''; //-> ok
                            $datosParaGuardar[31] = $principalLista;
                            //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
                            //----- $principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
                            //---- $datosParaGuardar[32] = $principalListaDescripcion;
                            $datosParaGuardar[32] = $persona->DescripcionFuente;
                            $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[33] = $paisSwift;
                            $tipoNovedad = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $datosParaGuardar[34] = $tipoNovedad;
                            $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[35] = $idOrigRel;
                            $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[36] = $principalFuente;
                            $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[37] = $observaciones;
                            $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
                            $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[39] = $urlNew;
                            $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[40] = $normaUif;
                            $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[41] = $normaUifDescripcion;
                            $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[42] = $fuenteLista;
                            $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[43] = $fuenteActiva;
                            //--> $fuenteDescripcion = $persona->PrincipalLista;
                            $fuenteDescripcion = $principalLista;
                            $datosParaGuardar[44] = $fuenteDescripcion;
                            $fuenteDescripcionLarga = $persona->DescripcionFuente;
                            $datosParaGuardar[45] = $fuenteDescripcionLarga;
                            $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[46] = $fuenteTipo;
                            $fuenteImagen = isset($key['fuente']['logoUrl']) ? $key['fuente']['logoUrl'] : '';
                            $datosParaGuardar[47] = $fuenteImagen;
                            $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[48] = $fuenteActualizaxml;
                            $lista[] = $persona;
                            //echo("aca tarda"); die();
                            $rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);
                        }
                    }
                    $codigo = 200;
                    if(count($lista) < 1) {
                        $lista = self::auxiliarParaFidechek($idTributaria,$nombre);
                    }
                    $lista = self::manejadoRespuesta($lista, $nroProducto);
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);

                } else {
                    //-- Busqueda libre por nombre
                    foreach ($response as $key) {
                        if(Misc::esElMismoNombreWs($nombre, $key['nombre'])) {
                            $datosParaGuardar = array();
                            $persona = new stdClass;

                            //-- Esta variables son tipo swap, no tocar  --//
                            $persona->tipoFuente = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $persona->relacion = isset($key['relacion']) ? $key['relacion'] : '';
                            $persona->FechaNovedad = isset($key['fechaNovedad']) ? $key['fechaNovedad'] : '';
                            //---------------------------------------------//

                            //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 
                            $persona->cuit = isset($key['idTributaria']) ? $key['idTributaria'] : ''; //-> ok
                            $datosParaGuardar[0] = $persona->cuit; 
                            $persona->nombre_persona = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[1] = $persona->nombre_persona;
                            $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
                            $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
                            $persona->StatusCode = '200'; //-> ok
                            $datosParaGuardar[4] = $persona->StatusCode;
                            $persona->Status = 'OK'; //-> ok
                            $datosParaGuardar[5] = $persona->Status;
                            $persona->Reason = isset($key['fuente']['kind']['legend']) ? $key['fuente']['kind']['legend'] : ''; //-> ok
                            $datosParaGuardar[6] = $persona->Reason;
                            $persona->Id = isset($key['sdnId']) ? $key['sdnId'] : ''; //-> ok
                            $datosParaGuardar[7] = $persona->Id;
                            $persona->Fuente = isset($key['fuente']['name']) ? $key['fuente']['name'] : ''; //-> ok
                            $datosParaGuardar[8] = $persona->Fuente;
                            $persona->NombreModificado = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[9] = $persona->NombreModificado;
                            $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
                            $datosParaGuardar[10] = $persona->DocumentoBuscado;
                            $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
                            $datosParaGuardar[11] = $persona->NombreBuscado;
                            $persona->Documento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[12] = $persona->Documento;
                            $persona->Residencia = isset($key['residencia']) ? $key['residencia'] : ''; //-> ok
                            $datosParaGuardar[14] = $persona->Residencia;
                            $persona->DescripcionPais = isset($key['pais']) ? $key['pais'] : ''; //-> ok
                            $datosParaGuardar[15] = $persona->DescripcionPais;
                            $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
                            $datosParaGuardar[17] = '1'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
                            $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
                            $persona->PorcentajeSimilitud = isset($key['score']) ? $key['score'] : ''; //-> ok
                            $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
                            $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
                            $datosParaGuardar[20] = $persona->fidecheck;
                            $persona->Codigo = isset($key['id']) ? $key['id'] : ''; //-> ok
                            $datosParaGuardar[21] = $persona->Codigo;
                            $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
                            $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
                            $datosParaGuardar[23] = $persona->FechaNovedad;
                            $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
                            $persona->Cargo = isset($key['cargo']) ? $key['cargo'] : ''; //-> ok
                            $datosParaGuardar[24] = $persona->Cargo;
                            $persona->Institucion = isset($key['institucion']) ? $key['institucion'] : ''; //-> ok
                            $datosParaGuardar[25] = $persona->Institucion;
                            $persona->Domicilio = isset($key['domicilio']) ? $key['domicilio'] : ''; //-> ok
                            $datosParaGuardar[26] = $persona->Domicilio;
                            $persona->NumeroDocumento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[27] = $persona->NumeroDocumento;
                            $persona->NumeroIdTributaria = $persona->cuit; //-> ok
                            $datosParaGuardar[28] = $persona->NumeroIdTributaria;
                            $persona->Url = isset($key['url']) ? $key['url'] : ''; //-> ok
                            $datosParaGuardar[29] = $persona->Url;
                            $persona->Relacion = $persona->relacion; //->ok
                            $datosParaGuardar[30] = $persona->Relacion;
                            $persona->orden = ''; //-> ver esto para que se esta usando.
                            $persona->TipoFuente = $persona->tipoFuente; //-> ok
                            $datosParaGuardar[13] = $persona->TipoFuente;
                            //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
                            $persona->DescripcionFuente = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; 
                            //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                            $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
                            $persona->visible = '1'; //-> se e coloca 1 por default.
                            
                            $principalLista = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : ''; //-> ok
                            $datosParaGuardar[31] = $principalLista;
                            //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
                            //----- $principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
                            //---- $datosParaGuardar[32] = $principalListaDescripcion;
                            $datosParaGuardar[32] = $persona->DescripcionFuente;
                            $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[33] = $paisSwift;
                            $tipoNovedad = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $datosParaGuardar[34] = $tipoNovedad;
                            $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[35] = $idOrigRel;
                            $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[36] = $principalFuente;
                            $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[37] = $observaciones;
                            $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
                            $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[39] = $urlNew;
                            $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[40] = $normaUif;
                            $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[41] = $normaUifDescripcion;
                            $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[42] = $fuenteLista;
                            $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[43] = $fuenteActiva;
                            //--> $fuenteDescripcion = $persona->PrincipalLista;
                            $fuenteDescripcion = $principalLista;
                            $datosParaGuardar[44] = $fuenteDescripcion;
                            $fuenteDescripcionLarga = $persona->DescripcionFuente;
                            $datosParaGuardar[45] = $fuenteDescripcionLarga;
                            $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[46] = $fuenteTipo;
                            $fuenteImagen = isset($key['fuente']['logoUrl']) ? $key['fuente']['logoUrl'] : '';
                            $datosParaGuardar[47] = $fuenteImagen;
                            $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[48] = $fuenteActualizaxml;
                            $lista[] = $persona;
                            //echo("aca tarda"); die();
                            $rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);
                        }
                    }
                    $codigo = 200;
                    if(count($lista) < 1) {
                        $lista = self::auxiliarParaFidechek($idTributaria,$nombre);
                    }
                    $lista = self::manejadoRespuesta($lista, $nroProducto);
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);

                }
                //-- EVALUAR SI ESTE if SIGUE SIENDO NECESARIO  --//
                if(count($lista) == 0) {
                    $datosParaGuardar = array();
                    $persona = new stdClass;

                    //-- Esta variables son tipo swap, no tocar  --//
                    $persona->tipoFuente = '';
                    $persona->relacion = '';
                    $persona->FechaNovedad = '';
                    //---------------------------------------------//

                    //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 
                    $persona->cuit = ''; //-> ok
                    $datosParaGuardar[0] = $persona->cuit; 
                    $persona->nombre_persona = ''; //-> ok
                    $datosParaGuardar[1] = $persona->nombre_persona;
                    $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
                    $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
                    $persona->StatusCode = '200'; //-> ok
                    $datosParaGuardar[4] = $persona->StatusCode;
                    $persona->Status = 'OK'; //-> ok
                    $datosParaGuardar[5] = $persona->Status;
                    $persona->Reason = ''; //-> ok
                    $datosParaGuardar[6] = $persona->Reason;
                    $persona->Id = ''; //-> ok
                    $datosParaGuardar[7] = $persona->Id;
                    $persona->Fuente = ''; //-> ok
                    $datosParaGuardar[8] = $persona->Fuente;
                    $persona->NombreModificado = ''; //-> ok
                    $datosParaGuardar[9] = $persona->NombreModificado;
                    $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
                    $datosParaGuardar[10] = $persona->DocumentoBuscado;
                    $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
                    $datosParaGuardar[11] = $persona->NombreBuscado;
                    $persona->Documento = ''; //-> ok
                    $datosParaGuardar[12] = $persona->Documento;
                    $persona->Residencia = ''; //-> ok
                    $datosParaGuardar[14] = $persona->Residencia;
                    $persona->DescripcionPais = ''; //-> ok
                    $datosParaGuardar[15] = $persona->DescripcionPais;
                    $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
                    $datosParaGuardar[17] = '1'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
                    $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
                    $persona->PorcentajeSimilitud = ''; //-> ok
                    $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
                    $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
                    $datosParaGuardar[20] = $persona->fidecheck;
                    $persona->Codigo = ''; //-> ok
                    $datosParaGuardar[21] = $persona->Codigo;
                    $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
                    $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
                    $datosParaGuardar[23] = $persona->FechaNovedad;
                    $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
                    $persona->Cargo = ''; //-> ok
                    $datosParaGuardar[24] = $persona->Cargo;
                    $persona->Institucion = ''; //-> ok
                    $datosParaGuardar[25] = $persona->Institucion;
                    $persona->Domicilio = ''; //-> ok
                    $datosParaGuardar[26] = $persona->Domicilio;
                    $persona->NumeroDocumento = ''; //-> ok
                    $datosParaGuardar[27] = $persona->NumeroDocumento;
                    $persona->NumeroIdTributaria = $persona->cuit; //-> ok
                    $datosParaGuardar[28] = $persona->NumeroIdTributaria;
                    $persona->Url = ''; //-> ok
                    $datosParaGuardar[29] = $persona->Url;
                    $persona->Relacion = $persona->relacion; //->ok
                    $datosParaGuardar[30] = $persona->Relacion;
                    $persona->orden = ''; //-> ver esto para que se esta usando.
                    $persona->TipoFuente = $persona->tipoFuente; //-> ok
                    $datosParaGuardar[13] = $persona->TipoFuente;
                    //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
                    $persona->DescripcionFuente = ''; 
                    //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                    $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
                    $persona->visible = '1'; //-> se e coloca 1 por default.
                    
                    $principalLista = ''; //-> ok
                    $datosParaGuardar[31] = $principalLista;
                    //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
                    //----- $principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
                    //---- $datosParaGuardar[32] = $principalListaDescripcion;
                    $datosParaGuardar[32] = $persona->DescripcionFuente;
                    $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[33] = $paisSwift;
                    $tipoNovedad = '';
                    $datosParaGuardar[34] = $tipoNovedad;
                    $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[35] = $idOrigRel;
                    $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[36] = $principalFuente;
                    $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[37] = $observaciones;
                    $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
                    $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[39] = $urlNew;
                    $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[40] = $normaUif;
                    $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[41] = $normaUifDescripcion;
                    $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[42] = $fuenteLista;
                    $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[43] = $fuenteActiva;
                    //--> $fuenteDescripcion = $persona->PrincipalLista;
                    $fuenteDescripcion = $principalLista;
                    $datosParaGuardar[44] = $fuenteDescripcion;
                    $fuenteDescripcionLarga = $persona->DescripcionFuente;
                    $datosParaGuardar[45] = $fuenteDescripcionLarga;
                    $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[46] = $fuenteTipo;
                    $fuenteImagen = '';
                    $datosParaGuardar[47] = $fuenteImagen;
                    $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[48] = $fuenteActualizaxml;
                    $lista[] = $persona;
                    //echo("aca tarda"); die();
                    //$rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);
                    $codigo = 200;
                    $lista = self::manejadoRespuesta($lista, $nroProducto);
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
                }
                // $codigo = 200;
                // $lista = self::manejadoRespuesta($lista, $nroProducto);
                // return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
            }
        } catch (\Throwable $th) {
            $mensaje = 'Error al consultar nueva api ws fidelitas-www. <br> Error: '.$th->getMessage().'<br>Linea: '.$th->getLine();
            Misc::enviarMail_errores_api($mensaje);
            $codigo = 401;
            return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'PAIS' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
        }
        
    }

    //-- Funcion encargada de manejar los errores.
    static function erroresWsV2($codigo)
    {
        $errores = [
            200 => 'Ok',
            100 => 'El codigo pais solo permite 2 caracteres. Ej: AR, BR, ES',
            300 => 'Debe ingresar al menos un tax_id, dni o nombre',
            400 => 'Error de coenxión, intentelo nuevamente.',
            401 => 'Sin resultados para los datos provistos. Intentelo nuevamente.',
            301 => 'Debe ingresar un taxid valido.',
            302 => 'Debe ingresar un dni valido.',
            303 => 'Las busqueda por taxid o dni solo son validad para Argentina'
        ];
        return $errores[$codigo];
    }

    static function auxiliarParaFidechek($idTributaria, $nombre)
    {
        $datosParaGuardar = array();
        $lista = array();
        $persona = new stdClass;

        //-- Esta variables son tipo swap, no tocar  --//
        $persona->tipoFuente = '';
        $persona->relacion = '';
        $persona->FechaNovedad = '';
        //---------------------------------------------//

        //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 

        //$persona->cuit = ''; //-> ok
        $persona->cuit = $idTributaria; //-> ok
        $datosParaGuardar[0] = $persona->cuit;
        //$persona->nombre_persona = ''; //-> ok
        $persona->nombre_persona = $nombre; //-> ok
        $datosParaGuardar[1] = $persona->nombre_persona;

        $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
        $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
        $persona->StatusCode = '200'; //-> ok
        $datosParaGuardar[4] = $persona->StatusCode;
        $persona->Status = 'OK'; //-> ok
        $datosParaGuardar[5] = $persona->Status;
        $persona->Reason = ''; //-> ok
        $datosParaGuardar[6] = $persona->Reason;
        $persona->Id = ''; //-> ok
        $datosParaGuardar[7] = $persona->Id;
        $persona->Fuente = ''; //-> ok
        $datosParaGuardar[8] = $persona->Fuente;
        $persona->NombreModificado = ''; //-> ok
        $datosParaGuardar[9] = $persona->NombreModificado;
        $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
        $datosParaGuardar[10] = $persona->DocumentoBuscado;
        $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
        $datosParaGuardar[11] = $persona->NombreBuscado;
        $persona->Documento = ''; //-> ok
        $datosParaGuardar[12] = $persona->Documento;
        $persona->Residencia = ''; //-> ok
        $datosParaGuardar[14] = $persona->Residencia;
        $persona->DescripcionPais = ''; //-> ok
        $datosParaGuardar[15] = $persona->DescripcionPais;
        $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
        $datosParaGuardar[17] = '0'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
        $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
        $persona->PorcentajeSimilitud = ''; //-> ok
        $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
        $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
        $datosParaGuardar[20] = $persona->fidecheck;
        $persona->Codigo = ''; //-> ok
        $datosParaGuardar[21] = $persona->Codigo;
        $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
        $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
        $datosParaGuardar[23] = $persona->FechaNovedad;
        $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
        $persona->Cargo = ''; //-> ok
        $datosParaGuardar[24] = $persona->Cargo;
        $persona->Institucion = ''; //-> ok
        $datosParaGuardar[25] = $persona->Institucion;
        $persona->Domicilio = ''; //-> ok
        $datosParaGuardar[26] = $persona->Domicilio;
        $persona->NumeroDocumento = ''; //-> ok
        $datosParaGuardar[27] = $persona->NumeroDocumento;
        $persona->NumeroIdTributaria = $persona->cuit; //-> ok
        $datosParaGuardar[28] = $persona->NumeroIdTributaria;
        $persona->Url = ''; //-> ok
        $datosParaGuardar[29] = $persona->Url;
        $persona->Relacion = $persona->relacion; //->ok
        $datosParaGuardar[30] = $persona->Relacion;
        $persona->orden = ''; //-> ver esto para que se esta usando.
        $persona->TipoFuente = $persona->tipoFuente; //-> ok
        $datosParaGuardar[13] = $persona->TipoFuente;
        //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
        $persona->DescripcionFuente = '';
        //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
        $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
        $persona->visible = '1'; //-> se e coloca 1 por default.

        $principalLista = ''; //-> ok
        $datosParaGuardar[31] = $principalLista;
        //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
        //----- $principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
        //---- $datosParaGuardar[32] = $principalListaDescripcion;
        $datosParaGuardar[32] = $persona->DescripcionFuente;
        $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[33] = $paisSwift;
        $tipoNovedad = '';
        $datosParaGuardar[34] = $tipoNovedad;
        $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[35] = $idOrigRel;
        $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[36] = $principalFuente;
        $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[37] = $observaciones;
        $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
        $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[39] = $urlNew;
        $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[40] = $normaUif;
        $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[41] = $normaUifDescripcion;
        $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[42] = $fuenteLista;
        $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[43] = $fuenteActiva;
        //--> $fuenteDescripcion = $persona->PrincipalLista;
        $fuenteDescripcion = $principalLista;
        $datosParaGuardar[44] = $fuenteDescripcion;
        $fuenteDescripcionLarga = $persona->DescripcionFuente;
        $datosParaGuardar[45] = $fuenteDescripcionLarga;
        $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[46] = $fuenteTipo;
        $fuenteImagen = '';
        $datosParaGuardar[47] = $fuenteImagen;
        $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
        $datosParaGuardar[48] = $fuenteActualizaxml;
        $lista[] = $persona;
        /* 03/11/2022: Para guardar las consultas que ws no devuelve resultado */

        $rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);

        return $lista;
        // return array($lista,$datosParaGuardar);
    }

    //-- Funcion encargada de guardar el consumo con la siguiente prioridad: cuit, dni o nombre. Retornando el id_consumo
    static function obtenerIdConsumos($idTributaria, $dni, $nombre, $id_producto)
    {
        //$id_producto = env('PEP_NV_PRODUCTO');
        $idTributaria = self::limpiarCuit($idTributaria);
        $dni = self::limpiarCuit($dni);
        $nombre = (strlen($nombre) > 20) ? substr($nombre, 0, 19) : $nombre;

        if ($idTributaria != '') {
            return self::consumir_servicio($idTributaria, $id_producto)->transaction_id;
        } else if ($dni != '') {
            return self::consumir_servicio($dni, $id_producto)->transaction_id;
        } else {
            return self::consumir_servicio($nombre, $id_producto)->transaction_id;
        }
    }

    static function limpiarCuit($n)
    {
        $omitidos = "/^[0-9]{1}$/";
        $nuevo = '';

        for ($i = 0; $i < strlen($n); $i++) {
            if (preg_match($omitidos, $n[$i])) {
                $nuevo .= $n[$i];
            }
        }

        return $nuevo;
    }

    //-- Funcion para el manejo de respuestas segun el producto y url 
    static function manejadoRespuesta($lista, $nroProducto)
    {
        if ($nroProducto != env('PEP_NV_PRODUCTO')) {
            //return array('cambio formato');
            $nuevaLista = array();
            foreach ($lista as $key) {
                $pn = new stdClass;
                $pn->error = $key->Status;
                $pn->taxid = $key->cuit;
                $pn->nombre = $key->nombre_persona;
                $pn->fidecheck = self::etiquetaFidecheck($key->fidecheck);
                $pn->DescripcionFuente = $key->DescripcionFuente;
                $pn->lista = $key->TipoFuente;
                $pn->pais = $key->DescripcionPais;
                $pn->cargo = $key->Cargo;
                $pn->institucion = $key->Institucion;
                $pn->relacion = $key->Relacion;
                $nuevaLista[] = $pn;
            }
            return $nuevaLista;
        }
        return $lista;
    }

    //-- Funcion para determinar el la etiquete segun el color de fidecheck
    static function etiquetaFidecheck($letra)
    {
        $etiquetas = array('R' => 'RELACIONADO', 'E' => 'PEP', 'P' => 'SANCIONADO', 'S' => 'SUJETO OBLIGADO', 'N' => 'NEGATIVO');
        try {
            return $etiquetas[$letra];
        } catch (\Throwable $th) {
            return 'null';
        }
    }

    //-- Funcion para determinar fidecheck color
    static function colorFidecheck($tipoFuente, $relacion)
    {
        $posibleDni = "/[0-9]{7,8}/";

        if ($tipoFuente == 'PEP' && preg_match($posibleDni, $relacion)) {
            return 'R';
        } else if ($tipoFuente == 'PEP' && ! preg_match($posibleDni, $relacion)) {
            return 'E';
        } else if ($tipoFuente == 'TER' || $tipoFuente == 'SAN') {
            return 'P';
        } else if ($tipoFuente == 'SO') {
            return 'S';
        } else {
            return 'N';
        }
    }

    //-----------------------  SECCION PARA NUEVA API FIDECHECK  -----------------------------------------------//
    //-- Todo el codigo referido al nuevo sistema de consultas para WS se encuentra aca, pasar todo lo que se encuentre dentro de la seccion.  --//

    //-- Funcion encargada de tomar los segundos de vigencia del token que devuelve WS convertirlo en una fecha valida.
    static function fechaVencimientoToken($segundos)
    {
        date_default_timezone_set('America/Argentina/Buenos_Aires');
        $segundos = (int) $segundos;
        return date('Y-m-d H:i:s', time() + $segundos);
    }

    //-- Funcion para limpiar la fecha devuelta por ws.
    static function limpiarFechaWs($fecha)
    {
        try {
            $fecha = explode('-', $fecha);
            return $fecha[0] . '-' . $fecha[1] . '-' . substr($fecha[2], 0, 2);
        } catch (\Throwable $th) {
            return '';
        }
    }

    //-- Funcion para ordenar fecha formato argentina
    static function formatoArgentina($fecha)
    {
        try {
            $fecha = explode('-', $fecha);
            return $fecha[2] . '/' . $fecha[1] . '/' . $fecha[0];
        } catch (\Throwable $th) {
            return '';
        }
    }

    //-- Funcion encargada de solicitar el token valido a la DB, sino lo obtiene pide uno nuevo a WS.
    //-- Esta funcion ya incluye una notificacion en caso de error al loguearse a WS.
    static function pedirToken()
    {
        try {
            $metodo = env('PEP_NV_SERVICIO');
            $credenciales = SQLConnection::backendStoreProcedure('PEP_obtener_datos_login', array($metodo), 'selectOne');

            $token = '';
            $expiracion = '';

            $user = env('PEP_NV_USERNAME');
            $pass = env('PEP_NV_PASSWORD');

            $data = json_encode(array("userNameOrEmailAddress" => $user, "password" => $pass));

            if (! is_null($credenciales)) {
                return $credenciales->token;
                //return $credenciales;
            } else {
                $curl = curl_init();

                curl_setopt_array($curl, array(
                    CURLOPT_URL => env('PEP_NV_URL_LOGIN'),
                    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 => $data,
                    CURLOPT_HTTPHEADER => array(
                        'Content-Type: application/json'
                    ),
                ));

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

                $resp = json_decode($response)->result;
                $token = $resp->accessToken;
                $expiracion = self::fechaVencimientoToken($resp->expireInSeconds);
                SQLConnection::backendStoreProcedure('PEP_guardar_autenticacion', array($token, '', $expiracion, $metodo));

                return $token;
            }
        } catch (\Throwable $th) {
            $mensaje = 'Error al generar token para nuevo servicio de ws Desarrollo. <br> Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
            Misc::enviarMail_errores_api($mensaje);
            return null;
        }
    }

    // 29/11/2022 

    public static function soloRenaperGovcheckPlus()
    {
        $usuario = Session::get('usuario');
        $cliente = $usuario->cliente['client_id'];

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

        $res_renaper = null;
        $fechaParaValidar = '';
        $generoParaValidar = '';
        $apiPersonalData = 'N';
        $apiGobcheckPlus = 'N';
        if ($usuario->producto == env('NRO_PRODUCTO_SOLO_RENAPER')) {
            $apiPersonalData = 'S';
        }
        if ($usuario->producto == env('NRO_PRODUCTO_GOVCHECKPLUS')) {
            $apiGobcheckPlus = 'S';
        }

        //-- Validamos que el usuario tenga el producto habilitado
        if ($usuario->producto == env('NRO_PRODUCTO_SOLO_RENAPER') || $usuario->producto == env('NRO_PRODUCTO_GOVCHECKPLUS')) {
            $dni = trim((isset($_POST['national_id']) ? $_POST['national_id'] : (isset($_POST['NATIONAL_ID']) ? $_POST['NATIONAL_ID'] : '')));
            $fecha_emision_recivida = trim((isset($_POST['issue_date']) ? $_POST['issue_date'] : (isset($_POST['ISSUE_DATE']) ? $_POST['ISSUE_DATE'] : '')));
            $generoRecibido = trim((isset($_POST['gender']) ? $_POST['gender'] : (isset($_POST['GENDER']) ? $_POST['GENDER'] : '')));

            //-- validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
            if (empty($dni) || Misc::noEsPosibleDni($dni)) {
                return json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => 'NATIONAL_ID field cannot be empty. Please use only numbers and complete with trailing zeroes up to eight digits.', 'Response' => []]);
            }
            if (empty($generoRecibido) || $generoRecibido == '') {
                return json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => 'GENDER field cannot be empty.', 'Response' => []]);
            }
            if ($apiPersonalData == 'S') {
                $fechaParaValidar = Misc::manejadorFechaEmision($fecha_emision_recivida);
            }
            $generoParaValidar = Misc::normalizadorGenero($generoRecibido);
            try {
                //-- si es longitud 7, le agregamos 0 delante.
                $dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
                $enviados['national_id'] = $dni;
                if ($apiPersonalData == 'S') {
                    $enviados['issue_date'] = $fecha_emision_recivida;
                }
                $enviados['gender'] = $generoRecibido;
                //$response = SQLConnection::backendStoreProcedure('api_get_govcheck',array($dni,$generoRecibido),'select'); /* lo pasamos abajo 27/06/2023 */

                try {
                    //$res_renaper = self::tratamientoSoloRenaper($dni);
                    $res_renaper = self::tratamientoSoloRenaper($dni, $generoRecibido);
                    /* 27/06/2023: No se mandaba sexo y buscaba siempre primero por 'F' 
                    y si habia F y M. Traia siempre el F */
                    $response = SQLConnection::backendStoreProcedure('api_get_govcheck', array($dni, $generoRecibido), 'select'); /* lo pasamos aca 27/06/2023 */
                    if (is_null($response[0]->ultimo_renaper) || Misc::cantidadMeses($response[0]->ultimo_renaper) >= 4) {
                        $res_renaper = self::tratamientoRenaperCla($dni, $response[0]->genero, $response[0]->identificacion);
                    }

                    //$id_consumo = self::consumir_servicio($dni,env('NRO_PRODUCTO_SOLO_RENAPER'))->transaction_id;
                    $id_consumo = self::consumir_servicio($dni, $usuario->producto)->transaction_id;

                    if (is_null($res_renaper) || empty($res_renaper)) {
                        return json_encode(['Parameters' => $enviados, 'Status' => '301', 'Message' => 'The provided national id does not match a valid tax id and could not be validated. Please review it and try again.', 'Response' => []]);
                    }

                    if ($apiPersonalData == 'S') {
                        $respuestaFormateada = Misc::formatoRespuestaRenaper($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, '', '', '', '');
                    }
                    //if ($apiGobcheckPlus == 'S') 
                    else {
                        $respuestaFormateada = Misc::conversorApisGovcheckPlus($response[0], $res_renaper);
                    }
                    return json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);
                } catch (\Throwable $th) {
                    //$id_consumo = self::consumir_servicio($dni,env('NRO_PRODUCTO_SOLO_RENAPER'))->transaction_id;
                    $id_consumo = self::consumir_servicio($dni, $usuario->producto)->transaction_id;
                    $mensaje = 'Ver este caso API SOLO RENAPER o GOVCHECKPLUS fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                    Misc::enviarMail_errores_api($mensaje);
                    return json_encode(['Status' => '301', 'Message' => 'The provided national id does not match a valid tax id and could not be validated. Please review it and try again.', 'Transaction_id' => $id_consumo]);
                }
            } catch (\Throwable $th) {
                $mensaje = 'Error al consultar API SOLO RENAPER o GOVCHECKPLUS fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                Misc::enviarMail_errores_api($mensaje);
                return json_encode(['Status' => '301', 'Message' => 'The provided national id does not match a valid tax id and could not be validated. Please review it and try again.']);

            }
        }
        return json_encode(['response' => 'No posee acceso al producto.']);
    }

    //---------------------------------------------------------------------------------------------------------------//

    public static function idphone()
    {
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;
        $phonenumber = trim(Request::input('phonenumber'));
        //---
        $enviados['phonenumber'] = $phonenumber;
        //------

        if (empty($phonenumber)) {
            return json_encode(['Parameters' => $enviados, 'Status' => '0', 'Message' => 'PHONENUMBER CANNOT BE NULL', 'Response' => []]);
        }

        $producto = $usuario->producto ?? 100;
        $resp = self::consumir_servicio($phonenumber, $producto);

        /* Para cada cuit encontrado */
        /*
              name,
              surname,
              national_ID,
              tax_id,
              legal_address,
              fiscal_address,
              business_activity  (code and description),
              date of birth (DOB),
              date of decease (DOD),
              email,
              credit_score (0 to 100)
              */

        $cuits = SQLConnection::backendStoreProcedure('api_idphone', array($phonenumber));

        $persona = [];
        foreach ($cuits as $key => $value) {
            //AFIPController::obtenerPadron($value->identificacion,true,'AR',false);
            $score = json_decode(self::obtenerServicioScore($value->identificacion, true, false)); // Aca adentro esta la llamada a AFIP

            $datos_persona = SQLConnection::backendStoreProcedure('obtener_persona', array($value->identificacion), true);

            $persona[$key] = new StdClass();
            if ($datos_persona->tipo_persona == 'J') {
                $datos_persona->apellidos = '';
                $datos_persona->nombres = $datos_persona->nombre_persona;
                $datos_persona->cuerpo_clave = '';
            } else {
                if ($datos_persona->nombres == null && $datos_persona->apellidos == null) {
                    $datos_persona->apellidos = $datos_persona->nombre_persona;
                }
                if ($datos_persona->nombres == null && $datos_persona->apellidos !== null) {
                    $separada = explode(' ', $datos_persona->apellidos);
                    $datos_persona->apellidos = $separada[0];
                    unset($separada[0]);
                    $datos_persona->nombres = implode(' ', $separada);
                }
            }
            $persona[$key]->name = $datos_persona->nombres ?? '';
            $persona[$key]->surname = $datos_persona->apellidos ?? '';
            $persona[$key]->national_ID = $datos_persona->cuerpo_clave ?? '';
            ;
            $persona[$key]->tax_id = $datos_persona->identificacion ?? '';
            ;
            $persona[$key]->legal_address = new StdClass();
            $persona[$key]->fiscal_address = new StdClass();
            $persona[$key]->business_activity = new StdClass();
            $persona[$key]->business_activity->code = '';
            $persona[$key]->business_activity->description = '';
            $persona[$key]->DOB = $datos_persona->c02_fecha_nac ?? '';
            ;
            $persona[$key]->DOD = $datos_persona->fecha_defuncion ?? '';

            $emails = [];
            $emails = SQLConnection::backendStoreProcedure('emails_', array($value->identificacion));
            $persona[$key]->email = $emails;

            $claes = [];
            $claes = SQLConnection::backendStoreProcedure('obtener_clae', array($value->identificacion));
            foreach ($claes as $keyd => $clae) {
                if ($clae->principal == 1) {
                    $persona[$key]->business_activity->code = $clae->cod_clae ?? '';
                    $persona[$key]->business_activity->description = $clae->descripcion ?? '';
                    break;
                }
            }

            $domicilios = [];
            $domicilios = SQLConnection::backendStoreProcedure('sp_obtener_domicilios', array($value->identificacion));
            foreach ($domicilios as $keyd => $dom) {
                if (strpos($dom->tipo_domicilio, 'L') !== false) {
                    $persona[$key]->legal_address->address = $dom->domicilio ?? '';
                    $persona[$key]->legal_address->state = $dom->prv_nombre ?? '';
                    $persona[$key]->legal_address->city = $dom->loc_nombre ?? '';
                    $persona[$key]->legal_address->country = $dom->pai_nombre ?? '';
                    $persona[$key]->legal_address->zip_code = $dom->codpos ?? '';
                }
                if (strpos($dom->tipo_domicilio, 'F') !== false) {
                    $persona[$key]->fiscal_address->address = $dom->domicilio ?? '';
                    $persona[$key]->fiscal_address->state = $dom->prv_nombre ?? '';
                    $persona[$key]->fiscal_address->city = $dom->loc_nombre ?? '';
                    $persona[$key]->fiscal_address->country = $dom->pai_nombre ?? '';
                    $persona[$key]->fiscal_address->zip_code = $dom->codpos ?? '';
                }
            }
            // Si no hay domicilio legal tomamos el tipo D o E
            if (empty($persona[$key]->legal_address->address)) {
                foreach ($domicilios as $keyd => $dom) {
                    if ((strpos($dom->tipo_domicilio, 'D') !== false || strpos($dom->tipo_domicilio, 'E') !== false) && ($dom->prv_nombre !== null || $dom->loc_nombre !== null)) {
                        $persona[$key]->legal_address->address = $dom->domicilio ?? '';
                        $persona[$key]->legal_address->state = $dom->prv_nombre ?? '';
                        $persona[$key]->legal_address->city = $dom->loc_nombre ?? '';
                        $persona[$key]->legal_address->country = $dom->pai_nombre ?? '';
                        $persona[$key]->legal_address->zip_code = $dom->codpos ?? '';
                        break;
                    }
                }
            }
            // Sigue vacio?, le pongo el O
            if (empty($persona[$key]->legal_address->address)) {
                foreach ($domicilios as $keyd => $dom) {
                    if ((strpos($dom->tipo_domicilio, 'O') !== false) && ($dom->prv_nombre !== null || $dom->loc_nombre !== null)) {
                        $persona[$key]->legal_address->address = $dom->domicilio ?? '';
                        $persona[$key]->legal_address->state = $dom->prv_nombre ?? '';
                        $persona[$key]->legal_address->city = $dom->loc_nombre ?? '';
                        $persona[$key]->legal_address->country = $dom->pai_nombre ?? '';
                        $persona[$key]->legal_address->zip_code = $dom->codpos ?? '';
                        break;
                    }
                }
            }

            $persona[$key]->credit_score = $score->score ?? '';

            if ($key == 4) {
                break;
            } //Muestra maximo 5 registros
        }
        if (empty($persona)) {
            return json_encode(['Parameters' => $enviados, 'Status' => '100', 'Message' => 'NO DATA FOUND', 'Response' => $persona]);
        } else {
            return json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $persona]);
        }
    }


public static function personalCred($dni_interno = null, $sexo_interno = null) {
        // Se definen variables para usar despues
        $usuario = Session::get('usuario');
        $respuestaRenaper = null;
        $fechaParaValidar = '';
        $generoParaValidar = '';
        $forzado = 'N';
        $sexos = array('m', 'f', 'x', 'M', 'F', 'X');

        $producto = $usuario->producto;

        // Obtenemos los parametros de entrada dependiendo de si la llamada es interna o por api
        $dni = $dni_interno !== null ? $dni_interno : trim($_POST['national_id'] ?? $_POST['National_id'] ?? $_POST['NATIONAL_ID'] ?? '');
        $dni = (strlen($dni) == 7) ? '0' . $dni : $dni;

        $generoRecibido = $sexo_interno !== null ? trim($sexo_interno) : trim($_POST['gender'] ?? $_POST['Gender'] ?? $_POST['GENDER'] ?? '');
        $generoRecibido = strtoupper($generoRecibido);

        $fecha_emision_recivida = trim($_POST['issue_date'] ?? $_POST['Issue_date'] ?? $_POST['ISSUE_DATE'] ?? '');
        $fecha_expiracion_emitida = trim($_POST['expiry_date'] ?? $_POST['Expiry_date'] ?? $_POST['EXPIRY_DATE'] ?? '');
        $copia = trim($_POST['copy'] ?? $_POST['Copy'] ?? $_POST['COPY'] ?? '');
        $idMainIssue = trim($_POST['id_main_issue'] ?? $_POST['Id_main_issue'] ?? $_POST['ID_MAIN_ISSUE'] ?? '');


        $id_consumo = null;
        if (!empty($dni)) {
            $consumo = self::consumir_servicio($dni, $producto);
            $id_consumo = $consumo->transaction_id;
            $fecha_consumo = $consumo->transaction_date;
        }

        // Validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
        if (empty($dni) || Misc::noEsPosibleDni($dni)) {
            self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => Misc::error_query('300'), 'Response' => []]), "300", Misc::medirTiempoRespuesta());
            return json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => Misc::error_query('300'), 'Response' => []]);
        }

        if (!in_array($generoRecibido, $sexos)) {
            self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $generoRecibido, 'Status' => '304', 'Message' => Misc::error_query('304'), 'Response' => []]), "304", Misc::medirTiempoRespuesta());
            return json_encode(['Parameters' => $generoRecibido, 'Status' => '304', 'Message' => Misc::error_query('304'), 'Response' => []]);
        }

        self::BusquedaPadron($dni, 'AR', null, null);

        // Buscamos los datos del dni consultado para poder obtener la fecha de nacimineto y calcular su edad
        $persona = SQLConnection::backendStoreProcedure('api_padrones', array($dni, NULL, 'AR'));

        if (empty($persona)) {
            self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'), 'Response' => []]), "401", Misc::medirTiempoRespuesta());
            return json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'), 'Response' => []]);
        }


        // Calculamos la edad de la persona
        $fechaNacimiento = '';
        $edad = '';
        if (!empty($persona) && isset($persona[0]->fecha_nacimiento)) {
            $fechaNacimiento = $persona[0]->fecha_nacimiento;
            $fechaNacimientoDt = new DateTime($fechaNacimiento);
            $fechaActualDt = new DateTime();

            // Calculamos la diferencia entre las dos fechas
            $diferencia = $fechaNacimientoDt->diff($fechaActualDt);

            // Obtenemos la edad en años
            $edad = $diferencia->y;
        }

        /* 
                  // Lo movimos arriba de todo, para que guarde el consumo aunque haya errores en los datos, 
                  // ya que nosotros recibimos y trabajamos la consulta
                  $consumo = self::consumir_servicio($dni,$producto);
                  $id_consumo = $consumo->transaction_id;
                  $fecha_consumo = $consumo->transaction_date;
              */

        // Verificamos que sea mayor de edad, en el caso que no lo sea, se termina la consulta
        if ((!empty($edad) && $edad < 18) || (empty($edad) &&
            (((int) $dni > 48000000 && (int) $dni < 60000000) ||
                ((int) $dni > 70000000 && (int) $dni < 90000000)))) {

            self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Response' => []]), "313", Misc::medirTiempoRespuesta());
            return json_encode(['Parameters' => $dni, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Transaction_id' => $id_consumo]);
        }

        $res_renaper = self::tratamientoSoloRenaper($dni, $generoRecibido);
        $tiempo_curl = $res_renaper->tiempo_curl;
        $proveedor   = $res_renaper->proveedor;
        $res_renaper = $res_renaper->Response;
        /*var_dump(12194); 
        var_dump($tiempo_curl); 
        var_dump($proveedor); 
        var_dump($res_renaper);
        die();
        */

        if (empty($res_renaper)) {
            self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '305', 'Message' => Misc::error_query('305'), 'Transaction_id' => $consumo->transaction_id]), "305", 
                                        Misc::medirTiempoRespuesta(),$proveedor,$tiempo_curl);
            return json_encode(['Parameters' => $dni, 'Status' => '305', 'Message' => Misc::error_query('305'), 'Transaction_id' => $consumo->transaction_id]);
        }

        if (isset($res_renaper->Status) && $res_renaper->Status == 407) {
            self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '407', 'Message' => $res_renaper->Response, 'Transaction_id' => $consumo->transaction_id]), "407", 
                                        Misc::medirTiempoRespuesta(),$proveedor,$tiempo_curl);
            return json_encode(['Parameters' => $dni, 'Status' => '407', 'Message' => $res_renaper->Response, 'Transaction_id' => $consumo->transaction_id]);
        }

        if (isset($res_renaper->Status) && $res_renaper->Status == 307 ) {
            self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni,'Status' => '307','Message' => Misc::error_query('307'),'Transaction_id' => $consumo->transaction_id]),"307",
                                        Misc::medirTiempoRespuesta(),$proveedor,$tiempo_curl);
            return json_encode(['Parameters' => $dni,'Status' => '307','Message' => Misc::error_query('307'),'Transaction_id' => $consumo->transaction_id]);
        }

        //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];

            self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => $status, 'Message' => $message, 'Response' => $response]), "305", 
                                        Misc::medirTiempoRespuesta(),$proveedor,$tiempo_curl);

            return json_encode(['Parameters' => $dni, 'Status' => $status, 'Message' => $message, 'Response' => $response]);
        }

        $fechaParaValidar = Misc::manejadorFechaEmision($fecha_emision_recivida);

        // Si no mandan género lo hacemos primero con M y después con F y después con X
        $veces = 1;
        if ($generoRecibido == '') {
            $generoRecibido = 'M';
            $veces = 3;
        }

        for ($i = 1; $i <= $veces; $i++) {
            $generoParaValidar = Misc::normalizadorGenero($generoRecibido);
            try {
                // Si es longitud 7, le agregamos 0 delante.
                $dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
                $enviados['national_id'] = $dni;
                $enviados['issue_date'] = $fecha_emision_recivida;
                $enviados['gender'] = $generoRecibido;
                $enviados['expiry_date'] = $fecha_expiracion_emitida;
                $enviados['copy'] = $copia;
                $enviados['id_main_issue'] = $idMainIssue;
                try {
                    // Se intenta realizar una consulta a RENAPER
                    try {
                        if ($veces!==1) // Si es igual a 1, quiere decir que ya lo consultamos más arriba, no hace falta volver a consultarlo
                        {
                            $res_renaper = self::tratamientoSoloRenaper($dni, $generoParaValidar);
                            $tiempo_curl = $res_renaper->tiempo_curl;
                            $proveedor   = $res_renaper->proveedor;
                            $res_renaper = $res_renaper->Response;
                        }
                        /*var_dump(12262);
                        var_dump($tiempo_curl); 
                        var_dump($proveedor); 
                        var_dump($res_renaper); 
                        die(); */

                        $response = SQLConnection::backendStoreProcedure('api_get_govcheck_2024', array($persona[0]->identificacion), 'select');
                        if (!empty($response)) {
                            if (is_null($response[0]->ultimo_renaper) || Misc::cantidadMeses($response[0]->ultimo_renaper) >= 4) {
                                $res_renaper = self::tratamientoRenaperCla($dni, $response[0]->genero, $response[0]->identificacion);
                                $tiempo_curl = $res_renaper->tiempo_curl;
                                $proveedor   = $res_renaper->proveedor;
                                $res_renaper = $res_renaper->Response;
                            }
                        } else {
                            $res_renaper = self::tratamientoRenaperCla($dni, $generoRecibido, $dni);
                            $tiempo_curl = $res_renaper->tiempo_curl;
                            $proveedor   = $res_renaper->proveedor;
                            $res_renaper = $res_renaper->Response;
                        }
                    } catch (Exception $e) {
                        $res_renaper = "";
                        $response = SQLConnection::backendStoreProcedure('api_get_govcheck_2024', array($cuit_encontrado), 'select');
                    }

                    // Formatear respuesta en caso de éxito
                    $tax_id_type = (!empty($response) && isset($response[0]->tipo_clave)) ? $response[0]->tipo_clave : '';
                    $fechaDefuncion = (!empty($response) && isset($response[0]->fecha_defuncion)) ? $response[0]->fecha_defuncion : '';

                    $error_consulta_renaper = 0;
                    if (empty($res_renaper) && !empty($response)) {
                        $res_renaper = SQLConnection::backendStoreProcedure('RENAPER_BUSCAR', array($response[0]->dni, $response[0]->genero), 'selectOne');
                        $error_consulta_renaper = 1;
                    }

                    if (empty($res_renaper)) {
                        self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]), "301", 
                                                    Misc::medirTiempoRespuesta(),$proveedor,$tiempo_curl);
                        return json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]);
                    }

                    if (!empty($res_renaper) && isset($res_renaper->nroError) && $res_renaper->nroError == 407) {
                        self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Status' => '407', 'Message' => $res_renaper->descripcionError, 'Transaction_id' => $id_consumo]), "407", 
                                                    Misc::medirTiempoRespuesta(),$proveedor,$tiempo_curl);
                        return json_encode(['Status' => '407', 'Message' => $res_renaper->descripcionError, 'Transaction_id' => $id_consumo]);
                    }

                    if (!empty($fechaDefuncion)) {
                        $fechaDefuncion = !empty($res_renaper) && isset($res_renaper->fechaf) ? $res_renaper->fechaf : '';
                    }

                    //Datos Bancos
                    $antiguedad_situacion_1 = "";
                    if (!empty($response) && isset($response[0]->identificacion)) {
                        $antiguedad_situacion_1 = SQLConnection::backendStoreProcedure('obtener_cendeu_sit1_desde', array($response[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($dni), 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));
                    }
                    //Termina seccion bancos

                    // Si no tenemos error en la consulta de RENAPER
                    if ($error_consulta_renaper == 0) {
                        $datosGenerales = Misc::respuestaRenaperGenerica($res_renaper, $tax_id_type, $antiguedad_situacion_1, $fechaDefuncion, $ultima_formateada, $maxima_formateada, $chequesRechazados, $cantidadBancosUnicos, $fechaNacimiento);
                        $datosValidados = Misc::validacionDatosRenaper($res_renaper, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue);


                        $respuestaFormateada = [$datosValidados, $datosGenerales];
                        //$respuestaFormateada = Misc::formatoRespuestaRenaper_v4($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue, $tax_id_type, $antiguedad_situacion_1, $fechaDefuncion, $ultima_formateada, $maxima_formateada, $chequesRechazados, $cantidadBancosUnicos);                      
                        self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]), "200", 
                                                   Misc::medirTiempoRespuesta(),$proveedor,$tiempo_curl);
                        return json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);
                    } else {
                        // Si tenemos un error en la consulta a RENAPER
                        $respuestaFormateada = Misc::formatoRespuestaRenaperParcial($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue, $tax_id_type, $antiguedad_situacion_1);


                        self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $enviados, 'Status' => '201', 'Message' => 'Respuesta parcial - Error consulta al sistema gubernamental', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]), "201", 
                                                    Misc::medirTiempoRespuesta(),$proveedor,$tiempo_curl);
                        return json_encode(['Parameters' => $enviados, 'Status' => '201', 'Message' => 'Respuesta parcial - Error consulta al sistema gubernamental', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);
                    }
                } catch (\Throwable $th) {
                    $id_consumo = self::consumir_servicio($dni, $producto)->transaction_id;

                    if ($i < $veces) {
                        if ($i == 1) {
                            $generoRecibido = 'F';
                            continue;
                        }
                        if ($i == 2) {
                            $generoRecibido = 'X';
                            continue;
                        }
                    } else {
                        $mensaje = 'Ver este caso API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                        Misc::enviarMail_errores_api($mensaje);

                        self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]), "301", 
                                                    Misc::medirTiempoRespuesta(),$proveedor,$tiempo_curl);
                        return json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]);
                    }
                }
            } catch (\Throwable $th) {
                $mensaje = 'Error al consultar API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
                Misc::enviarMail_errores_api($mensaje);

                self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Status' => '301', 'Message' => Misc::error_query('301')]), "301", 
                                            Misc::medirTiempoRespuesta(),$proveedor,$tiempo_curl);
                return json_encode(['Status' => '301', 'Message' => Misc::error_query('301')]);
            }
        }
    }


    public static function personalCred28052025($dni_interno = null, $sexo_interno = null){        
		// Se definen variables para usar despues
		$usuario = Session::get('usuario');	
		$respuestaRenaper = null;
		$fechaParaValidar = '';
		$generoParaValidar = '';
		$forzado = 'N';
		$sexos = array('m', 'f', 'x', 'M', 'F', 'X');
		$producto = $usuario->producto;
	
		// Obtenemos los parametros de entrada dependiendo de si la llamada es interna o por api
		$dni = $dni_interno !== null ? $dni_interno : trim($_POST['national_id'] ?? $_POST['National_id'] ?? $_POST['NATIONAL_ID'] ?? '');
		$dni = (strlen($dni) == 7) ? '0'.$dni : $dni;
	
		$generoRecibido = $sexo_interno !== null ? trim($sexo_interno) : trim($_POST['gender'] ?? $_POST['Gender'] ?? $_POST['GENDER'] ?? '');
		$generoRecibido = strtoupper($generoRecibido);
	
		$fecha_emision_recivida = trim($_POST['issue_date'] ?? $_POST['Issue_date'] ?? $_POST['ISSUE_DATE'] ?? '');
		$fecha_expiracion_emitida = trim($_POST['expiry_date'] ?? $_POST['Expiry_date'] ?? $_POST['EXPIRY_DATE'] ?? '');
		$copia = trim($_POST['copy'] ?? $_POST['Copy'] ?? $_POST['COPY'] ?? '');
		$idMainIssue = trim($_POST['id_main_issue'] ?? $_POST['Id_main_issue'] ?? $_POST['ID_MAIN_ISSUE'] ?? '');
        
	
		$id_consumo = null; 
		if (!empty($dni)){
			$consumo = self::consumir_servicio($dni,$producto);
			$id_consumo = $consumo->transaction_id;
			$fecha_consumo = $consumo->transaction_date;
		}
        
		// Validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
		if (empty($dni) || Misc::noEsPosibleDni($dni)) {			
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => Misc::error_query('300'), 'Response' => []]), "300", Misc::medirTiempoRespuesta());
			return json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => Misc::error_query('300'), 'Response' => []]);
		}

		if (!in_array($generoRecibido, $sexos)) {			
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'), 'Response' => []]), "401", Misc::medirTiempoRespuesta());
			return json_encode(['Parameters' => $generoRecibido, 'Status' => '304', 'Message' => Misc::error_query('304'), 'Response' => []]);
		}
        
		self::BusquedaPadron($dni,'AR', null, null);
        
        // Buscamos los datos del dni consultado para poder obtener la fecha de nacimineto y calcular su edad
		$persona = SQLConnection::backendStoreProcedure('api_padrones', array($dni, NULL, 'AR'));                             
        
		if (empty($persona)) {
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'), 'Response' => []]),"401");
			return json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'),'Response' => []]);
		}
        

		// Calculamos la edad de la persona
        $fechaNacimiento = '';
		$edad = '';
		if (!empty($persona) && isset($persona[0]->fecha_nacimiento)) {
			$fechaNacimiento = $persona[0]->fecha_nacimiento;
			$fechaNacimientoDt = new DateTime($fechaNacimiento);
			$fechaActualDt = new DateTime();

			// Calculamos la diferencia entre las dos fechas
			$diferencia = $fechaNacimientoDt->diff($fechaActualDt);

			// Obtenemos la edad en años
			$edad = $diferencia->y;
		}

		/* 
		    // Lo movimos arriba de todo, para que guarde el consumo aunque haya errores en los datos, 
		    // ya que nosotros recibimos y trabajamos la consulta
		    $consumo = self::consumir_servicio($dni,$producto);
		    $id_consumo = $consumo->transaction_id;
		    $fecha_consumo = $consumo->transaction_date;
		*/

		// Verificamos que sea mayor de edad, en el caso que no lo sea, se termina la consulta
		if ((!empty($edad) && $edad < 18) || (empty($edad) &&
			(((int)$dni > 48000000 && (int)$dni < 60000000) || 
			((int)$dni > 70000000 && (int)$dni < 90000000)))) {
			
                self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Response' => []]), "313", Misc::medirTiempoRespuesta());
			return json_encode(['Parameters' => $dni, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Transaction_id' => $id_consumo]);
		}
	
		$res_renaper = self::tratamientoSoloRenaper($dni, $generoRecibido); 
                        
        
		if (empty($res_renaper)) { 
		    self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '305', 'Message' => Misc::error_query('305'), 'Transaction_id' => $consumo->transaction_id]), "305", Misc::medirTiempoRespuesta());
		    return json_encode(['Parameters' => $dni,'Status' => '305','Message' => Misc::error_query('305'),'Transaction_id' => $consumo->transaction_id]);
		}

        if (isset($res_renaper->Status) && $res_renaper->Status == 407 ) {
            self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '407', 'Message' => $res_renaper->Response, 'Transaction_id' => $consumo->transaction_id]), "407", Misc::medirTiempoRespuesta());
            return json_encode(['Parameters' => $dni,'Status' => '407','Message' => $res_renaper->Response,'Transaction_id' => $consumo->transaction_id]);
        }

        if (isset($res_renaper->Status) && $res_renaper->Status == 307 ) {
            self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni,'Status' => '307','Message' => Misc::error_query('307'),'Transaction_id' => $consumo->transaction_id]),"307",Misc::medirTiempoRespuesta());
            return json_encode(['Parameters' => $dni,'Status' => '307','Message' => Misc::error_query('307'),'Transaction_id' => $consumo->transaction_id]);
        }
        
		//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];
		  	
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => $status, 'Message' => $message, 'Response' => $response]), "305", Misc::medirTiempoRespuesta());
			return json_encode(['Parameters' => $dni,'Status' => $status,'Message' => $message,'Response' => $response]);
		}        

		$fechaParaValidar = Misc::manejadorFechaEmision($fecha_emision_recivida);
		
		// Si no mandan género lo hacemos primero con M y después con F y después con X
		$veces = 1;
		if ($generoRecibido == '') {
			$generoRecibido = 'M';
			$veces = 3;
		}

		for ($i = 1; $i <= $veces; $i++) {
			$generoParaValidar = Misc::normalizadorGenero($generoRecibido);
			try {
				// Si es longitud 7, le agregamos 0 delante.
				$dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
				$enviados['national_id'] = $dni;
				$enviados['issue_date'] = $fecha_emision_recivida;
				$enviados['gender'] = $generoRecibido;
				$enviados['expiry_date'] = $fecha_expiracion_emitida;
				$enviados['copy'] = $copia;
				$enviados['id_main_issue'] = $idMainIssue;
				try {
					// Se intenta realizar una consulta a RENAPER
					try {
						$res_renaper = self::tratamientoSoloRenaper($dni, $generoParaValidar);
						$response = SQLConnection::backendStoreProcedure('api_get_govcheck_2024', array($persona[0]->identificacion), 'select');						
						if (!empty($response)) {
							if (is_null($response[0]->ultimo_renaper) || Misc::cantidadMeses($response[0]->ultimo_renaper) >= 4) {
								$res_renaper = self::tratamientoRenaperCla($dni, $response[0]->genero, $response[0]->identificacion);
							}
						} else {
							$res_renaper = self::tratamientoRenaperCla($dni, $generoRecibido, $dni);
						}
					} catch (Exception $e) {
						$res_renaper = "";
						$response = SQLConnection::backendStoreProcedure('api_get_govcheck_2024', array($cuit_encontrado), 'select');
					}
					// Formatear respuesta en caso de éxito
					$tax_id_type = (!empty($response) && isset($response[0]->tipo_clave)) ? $response[0]->tipo_clave : '';
					$fechaDefuncion = (!empty($response) && isset($response[0]->fecha_defuncion)) ? $response[0]->fecha_defuncion : '';					
					
					$error_consulta_renaper = 0;					
					if (empty($res_renaper) && !empty($response)) {
						$res_renaper = SQLConnection::backendStoreProcedure('RENAPER_BUSCAR', array($response[0]->dni, $response[0]->genero), 'selectOne');						
						$error_consulta_renaper = 1;
					}

					if (empty($res_renaper)) {
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]), "301", Misc::medirTiempoRespuesta());
						return json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]);
					}
					
					if(!empty($res_renaper) && isset($res_renaper->nroError) && $res_renaper->nroError == 11 ){
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Status' => '11', 'Message' => $res_renaper->descripcionError, 'Transaction_id' => $id_consumo]), "11", Misc::medirTiempoRespuesta());
						return json_encode(['Status' => '11', 'Message' => $res_renaper->descripcionError, 'Transaction_id' => $id_consumo]);
					}
										
					if(!empty($fechaDefuncion)){
						$fechaDefuncion = !empty($res_renaper) && isset($res_renaper->fechaf) ? $res_renaper->fechaf : '';
					}

					//Datos Bancos
                    $antiguedad_situacion_1 = "";
					if (!empty($response) && isset($response[0]->identificacion)) {
						$antiguedad_situacion_1 = SQLConnection::backendStoreProcedure('obtener_cendeu_sit1_desde', array($response[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($dni), 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));
                    }                   
                    //Termina seccion bancos

					// Si no tenemos error en la consulta de RENAPER
					if ($error_consulta_renaper == 0) {                        
                        $datosGenerales = Misc::respuestaRenaperGenerica($res_renaper, $tax_id_type, $antiguedad_situacion_1, $fechaDefuncion, $ultima_formateada, $maxima_formateada, $chequesRechazados, $cantidadBancosUnicos,$fechaNacimiento);                        
                        $datosValidados = Misc::validacionDatosRenaper($res_renaper, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue);
                        

                        $respuestaFormateada = [$datosValidados, $datosGenerales];                        
						//$respuestaFormateada = Misc::formatoRespuestaRenaper_v4($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue, $tax_id_type, $antiguedad_situacion_1, $fechaDefuncion, $ultima_formateada, $maxima_formateada, $chequesRechazados, $cantidadBancosUnicos);						
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]), "200", Misc::medirTiempoRespuesta());
						return json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);
					} else {						
						// Si tenemos un error en la consulta a RENAPER
						$respuestaFormateada = Misc::formatoRespuestaRenaperParcial($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue, $tax_id_type, $antiguedad_situacion_1);

                        
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Parameters' => $enviados, 'Status' => '201', 'Message' => 'Respuesta parcial - Error consulta al sistema gubernamental', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]), "201", Misc::medirTiempoRespuesta());
						return json_encode(['Parameters' => $enviados, 'Status' => '201', 'Message' => 'Respuesta parcial - Error consulta al sistema gubernamental', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);
					}
				} catch (\Throwable $th) {
					$id_consumo = self::consumir_servicio($dni, $producto)->transaction_id;

					if ($i < $veces) {
						if ($i == 1) {$generoRecibido = 'F';continue;}
						if ($i == 2) {$generoRecibido = 'X';continue;}
					} else {
						$mensaje = 'Ver este caso API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
						Misc::enviarMail_errores_api($mensaje);
						
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]), "301", Misc::medirTiempoRespuesta());
						return json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]);
					}
				}
			} catch (\Throwable $th) {
				$mensaje = 'Error al consultar API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
				Misc::enviarMail_errores_api($mensaje);

				self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo, json_encode(['Status' => '301', 'Message' => Misc::error_query('301')]), "301", Misc::medirTiempoRespuesta());
				return json_encode(['Status' => '301', 'Message' => Misc::error_query('301')]);
			}
		}
	}
    
    /**
     * @deprecated 14-01-2025
     */
    public static function personalCredBKP($dni_interno = null, $sexo_interno = null){
		// Se definen variables para usar despues
		$usuario = Session::get('usuario');	
		$respuestaRenaper = null;
		$fechaParaValidar = '';
		$generoParaValidar = '';
		$forzado = 'N';
		$sexos = array('m', 'f', 'x', 'M', 'F', 'X');
		$producto = $usuario->producto;
	
		// Obtenemos los parametros de entrada dependiendo de si la llamada es interna o por api
		$dni = $dni_interno !== null ? $dni_interno : trim($_POST['national_id'] ?? $_POST['National_id'] ?? $_POST['NATIONAL_ID'] ?? '');
		$dni = (strlen($dni) == 7) ? '0'.$dni : $dni;
	
		$generoRecibido = $sexo_interno !== null ? trim($sexo_interno) : trim($_POST['gender'] ?? $_POST['Gender'] ?? $_POST['GENDER'] ?? '');
		$generoRecibido = strtoupper($generoRecibido);
	
		$fecha_emision_recivida = trim($_POST['issue_date'] ?? $_POST['Issue_date'] ?? $_POST['ISSUE_DATE'] ?? '');
		$fecha_expiracion_emitida = trim($_POST['expiry_date'] ?? $_POST['Expiry_date'] ?? $_POST['EXPIRY_DATE'] ?? '');
		$copia = trim($_POST['copy'] ?? $_POST['Copy'] ?? $_POST['COPY'] ?? '');
		$idMainIssue = trim($_POST['id_main_issue'] ?? $_POST['Id_main_issue'] ?? $_POST['ID_MAIN_ISSUE'] ?? '');
	
		$id_consumo = null; 
		if (!empty($dni))
		{
			$consumo = self::consumir_servicio($dni,$producto);
			$id_consumo = $consumo->transaction_id;
			$fecha_consumo = $consumo->transaction_date;
		}
	
		// Validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
		if (empty($dni) || Misc::noEsPosibleDni($dni)) {			
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => Misc::error_query('300'), 'Response' => []]),"300");			
			return json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => Misc::error_query('300'), 'Response' => []]);
		}

		if (!in_array($generoRecibido, $sexos)) {			
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $generoRecibido, 'Status' => '304', 'Message' => Misc::error_query('304'), 'Response' => []]),"304");
			return json_encode(['Parameters' => $generoRecibido, 'Status' => '304', 'Message' => Misc::error_query('304'), 'Response' => []]);
		}
		
		self::BusquedaPadron($dni,'AR', null, null);
		// Buscamos los datos del dni consultado para poder obtener la fecha de nacimineto y calcular su edad
		$persona = SQLConnection::backendStoreProcedure('api_padrones', array($dni, NULL, 'AR'));

		if (empty($persona)) {
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'), 'Response' => []]),"401");
			return json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'),'Response' => []]);
		}
		// Calculamos la edad de la persona
		$edad = '';
		if (!empty($persona) && isset($persona[0]->fecha_nacimiento)) {
			$fechaNacimiento = $persona[0]->fecha_nacimiento;
			$fechaNacimientoDt = new DateTime($fechaNacimiento);
			$fechaActualDt = new DateTime();

			// Calculamos la diferencia entre las dos fechas
			$diferencia = $fechaNacimientoDt->diff($fechaActualDt);

			// Obtenemos la edad en años
			$edad = $diferencia->y;
		}
		/* 
		// Lo movimos arriba de todo, para que guarde el consumo aunque haya errores en los datos, 
		// ya que nosotros recibimos y trabajamos la consulta
		$consumo = self::consumir_servicio($dni,$producto);
		$id_consumo = $consumo->transaction_id;
		$fecha_consumo = $consumo->transaction_date;
		*/
	
		// Verificamos que sea mayor de edad, en el caso que no lo sea, se termina la consulta
		if ((!empty($edad) && $edad < 18) || (empty($edad) &&
						(((int)$dni > 48000000 && (int)$dni < 60000000) || 
						((int)$dni > 70000000 && (int)$dni < 90000000)))) {
			
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Response' => []]),"313");
			return json_encode(['Parameters' => $dni, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Transaction_id' => $id_consumo]);
		}
	
		$res_renaper = ApiControllerV1::tratamientoSoloRenaper($dni, $generoRecibido); 
		if (empty($res_renaper)) { 
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni,'Status' => '305','Message' => Misc::error_query('305'),'Transaction_id' => $consumo->transaction_id]),"305");   
		  return json_encode(['Parameters' => $dni,'Status' => '305','Message' => Misc::error_query('305'),'Transaction_id' => $consumo->transaction_id]);
		}
	
		//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];
		  	
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni,'Status' => $status,'Message' => $message,'Response' => $response]),"305");   
			return json_encode(['Parameters' => $dni,'Status' => $status,'Message' => $message,'Response' => $response]);
		}

		$fechaParaValidar = Misc::manejadorFechaEmision($fecha_emision_recivida);
		
		// Si no mandan género lo hacemos primero con M y después con F y después con X
		$veces = 1;
		if ($generoRecibido == '') {
			$generoRecibido = 'M';
			$veces = 3;
		}

		for ($i = 1; $i <= $veces; $i++) {
			$generoParaValidar = Misc::normalizadorGenero($generoRecibido);
			try {
				// Si es longitud 7, le agregamos 0 delante.
				$dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
				$enviados['national_id'] = $dni;
				$enviados['issue_date'] = $fecha_emision_recivida;
				$enviados['gender'] = $generoRecibido;
				$enviados['expiry_date'] = $fecha_expiracion_emitida;
				$enviados['copy'] = $copia;
				$enviados['id_main_issue'] = $idMainIssue;
				try {
					// Se intenta realizar una consulta a RENAPER
					try {
						$res_renaper = self::tratamientoSoloRenaper($dni, $generoParaValidar);
						$response = SQLConnection::backendStoreProcedure('api_get_govcheck_2024', array($persona[0]->identificacion), 'select');						
						if (!empty($response)) {
							if (is_null($response[0]->ultimo_renaper) || Misc::cantidadMeses($response[0]->ultimo_renaper) >= 4) {
								$res_renaper = self::tratamientoRenaperCla($dni, $response[0]->genero, $response[0]->identificacion);
							}
						} else {
							$res_renaper = self::tratamientoRenaperCla($dni, $generoRecibido, $dni);
						}
					} catch (Exception $e) {
						$res_renaper = "";
						$response = SQLConnection::backendStoreProcedure('api_get_govcheck_2024', array($cuit_encontrado), 'select');
					}
					// Formatear respuesta en caso de éxito
					$tax_id_type = (!empty($response) && isset($response[0]->tipo_clave)) ? $response[0]->tipo_clave : '';
					$fechaDefuncion = (!empty($response) && isset($response[0]->fecha_defuncion)) ? $response[0]->fecha_defuncion : '';					
					
					$error_consulta_renaper = 0;					
					if (empty($res_renaper) && !empty($response)) {
						$res_renaper = SQLConnection::backendStoreProcedure('RENAPER_BUSCAR', array($response[0]->dni, $response[0]->genero), 'selectOne');						
						$error_consulta_renaper = 1;
					}

					if (empty($res_renaper)) {
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]),"301");   
						return json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]);
					}
					
					if(!empty($res_renaper) && isset($res_renaper->nroError) && $res_renaper->nroError == 11 ){
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Status' => '11', 'Message' => $res_renaper->descripcionError, 'Transaction_id' => $id_consumo]),"11");   
						return json_encode(['Status' => '11', 'Message' => $res_renaper->descripcionError, 'Transaction_id' => $id_consumo]);
					}
										
					if(!empty($fechaDefuncion)){
						$fechaDefuncion = !empty($res_renaper) && isset($res_renaper->fechaf) ? $res_renaper->fechaf : '';
					}
					
					//Datos Bancos
                    $antiguedad_situacion_1 = "";
					if (!empty($response) && isset($response[0]->identificacion)) {
						$antiguedad_situacion_1 = SQLConnection::backendStoreProcedure('obtener_cendeu_sit1_desde', array($response[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($dni), 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));
                    }                   
                    //Termina seccion bancos

					// Si no tenemos error en la consulta de RENAPER
					if ($error_consulta_renaper == 0) {
						$respuestaFormateada = Misc::formatoRespuestaRenaper_v4($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue, $tax_id_type, $antiguedad_situacion_1, $fechaDefuncion, $ultima_formateada, $maxima_formateada, $chequesRechazados, $cantidadBancosUnicos);						
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]),"200");   
						return json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);
					} else {						
						// Si tenemos un error en la consulta a RENAPER
						$respuestaFormateada = Misc::formatoRespuestaRenaperParcial($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue, $tax_id_type, $antiguedad_situacion_1);

						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $enviados, 'Status' => '201', 'Message' => 'Respuesta parcial - Error consulta al sistema gubernamental', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]),"201");   
						return json_encode(['Parameters' => $enviados, 'Status' => '201', 'Message' => 'Respuesta parcial - Error consulta al sistema gubernamental', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);
					}
				} catch (\Throwable $th) {
					$id_consumo = self::consumir_servicio($dni, $producto)->transaction_id;

					if ($i < $veces) {
						if ($i == 1) {$generoRecibido = 'F';continue;}
						if ($i == 2) {$generoRecibido = 'X';continue;}
					} else {
						$mensaje = 'Ver este caso API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
						Misc::enviarMail_errores_api($mensaje);
						
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]),"301");   
						return json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]);
					}
				}
			} catch (\Throwable $th) {
				$mensaje = 'Error al consultar API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
				Misc::enviarMail_errores_api($mensaje);

				self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Status' => '301', 'Message' => Misc::error_query('301')]),"301");   
				return json_encode(['Status' => '301', 'Message' => Misc::error_query('301')]);
			}
		}
	}

    public static function personalCredOrg($dni_interno = null, $sexo_interno = null){
		// Se definen variables para usar despues
		$usuario = Session::get('usuario');	
		$respuestaRenaper = null;
		$fechaParaValidar = '';
		$generoParaValidar = '';
		$forzado = 'N';
		$sexos = array('m', 'f', 'x', 'M', 'F', 'X');
		$producto = $usuario->producto;
	
		// Obtenemos los parametros de entrada dependiendo de si la llamada es interna o por api
		$dni = $dni_interno !== null ? $dni_interno : trim($_POST['national_id'] ?? $_POST['National_id'] ?? $_POST['NATIONAL_ID'] ?? '');
		$dni = (strlen($dni) == 7) ? '0'.$dni : $dni;
	
		$generoRecibido = $sexo_interno !== null ? trim($sexo_interno) : trim($_POST['gender'] ?? $_POST['Gender'] ?? $_POST['GENDER'] ?? '');
		$generoRecibido = strtoupper($generoRecibido);
	
		$fecha_emision_recivida = trim($_POST['issue_date'] ?? $_POST['Issue_date'] ?? $_POST['ISSUE_DATE'] ?? '');
		$fecha_expiracion_emitida = trim($_POST['expiry_date'] ?? $_POST['Expiry_date'] ?? $_POST['EXPIRY_DATE'] ?? '');
		$copia = trim($_POST['copy'] ?? $_POST['Copy'] ?? $_POST['COPY'] ?? '');
		$idMainIssue = trim($_POST['id_main_issue'] ?? $_POST['Id_main_issue'] ?? $_POST['ID_MAIN_ISSUE'] ?? '');
	
		$id_consumo = null; 
		if (!empty($dni))
		{

            /* //02/12/2024: Cuando no anda Renaper 

            return json_encode(['Parameters' => $dni, 'Status' => '404', 'Message' => 'The service is currently unavailable due to maintenance.', 'Response' => []]);

            */
			$consumo = self::consumir_servicio($dni,$producto);
			$id_consumo = $consumo->transaction_id;
			$fecha_consumo = $consumo->transaction_date;
		}
	
		// Validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
		if (empty($dni) || Misc::noEsPosibleDni($dni)) {			
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => Misc::error_query('300'), 'Response' => []]),"300");			
			return json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => Misc::error_query('300'), 'Response' => []]);
		}

		if (!in_array($generoRecibido, $sexos)) {			
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $generoRecibido, 'Status' => '304', 'Message' => Misc::error_query('304'), 'Response' => []]),"304");
			return json_encode(['Parameters' => $generoRecibido, 'Status' => '304', 'Message' => Misc::error_query('304'), 'Response' => []]);
		}
		
		self::BusquedaPadron($dni,'AR', null, null);
		// Buscamos los datos del dni consultado para poder obtener la fecha de nacimineto y calcular su edad
		$persona = SQLConnection::backendStoreProcedure('api_padrones', array($dni, NULL, 'AR'));

		if (empty($persona)) {
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'), 'Response' => []]),"401");
			return json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'),'Response' => []]);
		}
		// Calculamos la edad de la persona
		$edad = '';
		if (!empty($persona) && isset($persona[0]->fecha_nacimiento)) {
			$fechaNacimiento = $persona[0]->fecha_nacimiento;
			$fechaNacimientoDt = new DateTime($fechaNacimiento);
			$fechaActualDt = new DateTime();

			// Calculamos la diferencia entre las dos fechas
			$diferencia = $fechaNacimientoDt->diff($fechaActualDt);

			// Obtenemos la edad en años
			$edad = $diferencia->y;
		}
		/* 
		// Lo movimos arriba de todo, para que guarde el consumo aunque haya errores en los datos, 
		// ya que nosotros recibimos y trabajamos la consulta
		$consumo = self::consumir_servicio($dni,$producto);
		$id_consumo = $consumo->transaction_id;
		$fecha_consumo = $consumo->transaction_date;
		*/
	
		// Verificamos que sea mayor de edad, en el caso que no lo sea, se termina la consulta
		if ((!empty($edad) && $edad < 18) || (empty($edad) &&
						(((int)$dni > 48000000 && (int)$dni < 60000000) || 
						((int)$dni > 70000000 && (int)$dni < 90000000)))) {
			
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Response' => []]),"313");
			return json_encode(['Parameters' => $dni, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Transaction_id' => $id_consumo]);
		}
	
		$res_renaper = ApiControllerV1::tratamientoSoloRenaper($dni, $generoRecibido); 
		if (empty($res_renaper)) { 
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni,'Status' => '305','Message' => Misc::error_query('305'),'Transaction_id' => $consumo->transaction_id]),"305");   
		  return json_encode(['Parameters' => $dni,'Status' => '305','Message' => Misc::error_query('305'),'Transaction_id' => $consumo->transaction_id]);
		}
	
		//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];
		  	
			self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $dni,'Status' => $status,'Message' => $message,'Response' => $response]),"305");   
			return json_encode(['Parameters' => $dni,'Status' => $status,'Message' => $message,'Response' => $response]);
		}

		$fechaParaValidar = Misc::manejadorFechaEmision($fecha_emision_recivida);
		
		// Si no mandan género lo hacemos primero con M y después con F y después con X
		$veces = 1;
		if ($generoRecibido == '') {
			$generoRecibido = 'M';
			$veces = 3;
		}

		for ($i = 1; $i <= $veces; $i++) {
			$generoParaValidar = Misc::normalizadorGenero($generoRecibido);
			try {
				// Si es longitud 7, le agregamos 0 delante.
				$dni = (strlen($dni) == 7) ? '0' . $dni : $dni;
				$enviados['national_id'] = $dni;
				$enviados['issue_date'] = $fecha_emision_recivida;
				$enviados['gender'] = $generoRecibido;
				$enviados['expiry_date'] = $fecha_expiracion_emitida;
				$enviados['copy'] = $copia;
				$enviados['id_main_issue'] = $idMainIssue;
				try {
					// Se intenta realizar una consulta a RENAPER
					try {
						$res_renaper = self::tratamientoSoloRenaper($dni, $generoParaValidar);
						$response = SQLConnection::backendStoreProcedure('api_get_govcheck_2024', array($persona[0]->identificacion), 'select');						
						if (!empty($response)) {
							if (is_null($response[0]->ultimo_renaper) || Misc::cantidadMeses($response[0]->ultimo_renaper) >= 4) {
								$res_renaper = self::tratamientoRenaperCla($dni, $response[0]->genero, $response[0]->identificacion);
							}
						} else {
							$res_renaper = self::tratamientoRenaperCla($dni, $generoRecibido, $dni);
						}
					} catch (Exception $e) {
						$res_renaper = "";
						$response = SQLConnection::backendStoreProcedure('api_get_govcheck_2024', array($cuit_encontrado), 'select');
					}
					// Formatear respuesta en caso de éxito
					$tax_id_type = (!empty($response) && isset($response[0]->tipo_clave)) ? $response[0]->tipo_clave : '';
					$fechaDefuncion = (!empty($response) && isset($response[0]->fecha_defuncion)) ? $response[0]->fecha_defuncion : '';					
					
					$error_consulta_renaper = 0;					
					if (empty($res_renaper) && !empty($response)) {
						$res_renaper = SQLConnection::backendStoreProcedure('RENAPER_BUSCAR', array($response[0]->dni, $response[0]->genero), 'selectOne');						
						$error_consulta_renaper = 1;
					}

					if (empty($res_renaper)) {
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]),"301");   
						return json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]);
					}
					
					if(!empty($res_renaper) && isset($res_renaper->nroError) && $res_renaper->nroError == 11 ){
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Status' => '11', 'Message' => $res_renaper->descripcionError, 'Transaction_id' => $id_consumo]),"11");   
						return json_encode(['Status' => '11', 'Message' => $res_renaper->descripcionError, 'Transaction_id' => $id_consumo]);
					}
										
					if(!empty($fechaDefuncion)){
						$fechaDefuncion = !empty($res_renaper) && isset($res_renaper->fechaf) ? $res_renaper->fechaf : '';
					}
					
					$antiguedad_situacion_1 = "";
					if (!empty($response) && isset($response[0]->identificacion)) {
						$antiguedad_situacion_1 = SQLConnection::backendStoreProcedure('obtener_cendeu_sit1_desde', array($response[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($dni), 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');
						}
					}
					// Si no tenemos error en la consulta de RENAPER
					if ($error_consulta_renaper == 0) {
						$respuestaFormateada = Misc::formatoRespuestaRenaper_v4($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue, $tax_id_type, $antiguedad_situacion_1, $fechaDefuncion);						
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]),"200");   
						return json_encode(['Parameters' => $enviados, 'Status' => '200', 'Message' => 'OK', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);
					} else {						
						// Si tenemos un error en la consulta a RENAPER
						$respuestaFormateada = Misc::formatoRespuestaRenaperParcial($res_renaper, $dni, $fechaParaValidar, $generoParaValidar, $fecha_emision_recivida, $fecha_expiracion_emitida, $copia, $idMainIssue, $tax_id_type, $antiguedad_situacion_1);

						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Parameters' => $enviados, 'Status' => '201', 'Message' => 'Respuesta parcial - Error consulta al sistema gubernamental', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]),"201");   
						return json_encode(['Parameters' => $enviados, 'Status' => '201', 'Message' => 'Respuesta parcial - Error consulta al sistema gubernamental', 'Response' => $respuestaFormateada, 'Transaction_id' => $id_consumo]);
					}
				} catch (\Throwable $th) {
					$id_consumo = self::consumir_servicio($dni, $producto)->transaction_id;

					if ($i < $veces) {
						if ($i == 1) {$generoRecibido = 'F';continue;}
						if ($i == 2) {$generoRecibido = 'X';continue;}
					} else {
						$mensaje = 'Ver este caso API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
						Misc::enviarMail_errores_api($mensaje);
						
						self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]),"301");   
						return json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]);
					}
				}
			} catch (\Throwable $th) {
				$mensaje = 'Error al consultar API SOLO RENAPER fidelitas-test - Dni consultado: ' . $dni . ' <br>Producto: ' . $usuario->producto . '<br>Cliente: ' . $usuario->cliente['client_id'] . '<br>User_Id: ' . $usuario->user_id . '<br>Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
				Misc::enviarMail_errores_api($mensaje);

				self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $generoRecibido, $id_consumo,json_encode(['Status' => '301', 'Message' => Misc::error_query('301')]),"301");   
				return json_encode(['Status' => '301', 'Message' => Misc::error_query('301')]);
			}
		}
	}

    public static function extended_v3(){
		$usuario = Session::get('usuario');
		$producto = $usuario->producto;
		$user_id = $usuario->user_id;
		
		if ($producto != env('NRO_PRODUCTO_EXTENDED')) {
			return json_encode(['Status'=>'ERROR PRODUCTO','Message'=>Misc::error_query('ERROR_PRODUCTO')]);
		}

		$dni = $_POST['national_id'] ?? $_POST['National_id'] ?? $_POST['NATIONAL_ID'] ?? '';
		$tax_id = $_POST['tax_id'] ?? $_POST['Tax_id'] ?? $_POST['TAX_ID'] ?? '';
		$gender = $_POST['gender'] ?? $_POST['Gender'] ?? $_POST['GENDER'] ?? '';						
		$gender = strtoupper($gender);
		$sexos = array('M','m','F','f','X','x');
		
		// Parametros opcionales para validacion
		$nationality = $_POST['nationality'] ?? $_POST['Nationality'] ?? $_POST['NATIONALITY'] ?? '';										
		$issue_date = $_POST['issue_date'] ?? $_POST['Issue_date'] ?? $_POST['ISSUE_DATE'] ?? '';
		$expiry_date = $_POST['expiry_date'] ?? $_POST['Expiry_date'] ?? $_POST['EXPIRY_DATE'] ?? '';					
		$internal_id = $_POST['internal_id'] ?? $_POST['Internal_id'] ?? $_POST['INTERNAL_ID'] ?? '';					 
		$copy = $_POST['copy'] ?? $_POST['Copy'] ?? $_POST['COPY'] ?? ''; 

/* 02/12/2024: Cuando no anda Renaper */
//        return json_encode(['Parameters'=>$dni,'Status'=>'404','Message'=> 'The service is currently unavailable due to maintenance','Response'=>[]]);
/**/
		// Esta parte es para permitir que ingresen dni o cuit/cuil
		if (empty($dni) && !empty($tax_id)) {
			$persona = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, null, 'AR'));
            if (!empty($persona) && isset($persona[0]->cuerpo_clave)) {
                $dni = $persona[0]->cuerpo_clave;
            }
			$enviados['tax_id'] = $dni;

		}elseif (!empty($dni) && !empty($tax_id)) {
			$persona = SQLConnection::backendStoreProcedure('api_padrones', array($tax_id, null, 'AR'));
            if (!empty($persona) && isset($persona[0]->cuerpo_clave)) {
                $dni = $persona[0]->cuerpo_clave;
            }
			$enviados['tax_id'] = $dni;

		}else {
			// Validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
			if(empty($dni) || Misc::noEsPosibleDni($dni)) {
				self::Guardar_resultado_api($user_id, $producto, $dni, $gender, null, json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => Misc::error_query('300'), 'Response' => []]), "300", Misc::medirTiempoRespuesta());
				return json_encode(['Parameters'=>$dni,'Status'=>'300','Message'=>Misc::error_query('300'),'Response'=>[]]);
			}

			// Si es longitud 7, le agregamos 0 delante.
			$dni = (strlen($dni) == 7) ? '0'.$dni : $dni;
			$enviados['national_id'] = $dni;
		}

		$consumo = ApiControllerV1::consumir_servicio($dni,$producto);
		$id_consumo = $consumo->transaction_id;
		$fecha_consumo = $consumo->transaction_date;			
		
		if (!in_array($gender, $sexos)) {
			self::Guardar_resultado_api($user_id, $producto, $dni, $gender, $id_consumo ?? null, json_encode(['Parameters' => $dni, 'Status' => '304', 'Message' => Misc::error_query('304'), 'Response' => []]), "304", Misc::medirTiempoRespuesta());
			return json_encode(['Parameters'=>$dni,'Status'=>'304','Message'=>Misc::error_query('304'),'Response'=>[]]);
		}
		
		try {
            self::BusquedaPadron($dni, 'AR', null, null);            
            // Buscamos los datos del dni consultado para poder obtener la fecha de nacimineto y calcular su edad
			$persona = SQLConnection::backendStoreProcedure('api_padrones', array($dni, null, 'AR'));
			
			if (empty($persona)) {
				self::Guardar_resultado_api($user_id, $producto, $dni, $gender, $id_consumo ?? null, json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'), 'Response' => []]), "401", Misc::medirTiempoRespuesta());
				return json_encode(['Parameters' => $dni, 'Status' => '401', 'Message' => Misc::error_query('401'),'Response' => []]);
			}

			$edad = '';
			if (!empty($persona) && isset($persona[0]->fecha_nacimiento)) {
				$fechaNacimiento = $persona[0]->fecha_nacimiento;
				$fechaNacimientoDt = new DateTime($fechaNacimiento);
				$fechaActualDt = new DateTime();

				// Calculamos la diferencia entre las dos fechas
				$diferencia = $fechaNacimientoDt->diff($fechaActualDt);

				// Obtenemos la edad en años
				$edad = $diferencia->y;
			}
		/* lo subimos
			$consumo = ApiControllerV1::consumir_servicio($dni,$producto);
			$id_consumo = $consumo->transaction_id;
			$fecha_consumo = $consumo->transaction_date;
		*/
			// Verificamos que sea mayor de edad, en el caso que no lo sea, se termina la consulta
			if ((!empty($edad) && $edad < 18) || (empty($edad) &&
						(((int)$dni > 48000000 && (int)$dni < 60000000) || 
						((int)$dni > 70000000 && (int)$dni < 90000000)))) {
				self::Guardar_resultado_api($user_id, $producto, $dni, $gender, $id_consumo ?? null, json_encode(['Parameters' => $dni, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Transaction_id' => $id_consumo]), "313", Misc::medirTiempoRespuesta());
				return json_encode(['Parameters' => $dni, 'Status' => '313', 'Message' => Misc::error_query('313'), 'Transaction_id' => $id_consumo]);
			}

			$response = SQLConnection::backendStoreProcedure('api_get_govcheck_2024',array($dni),'select');	
			
			try {
				if (count($response) == 0) {
					self::BuscarCuit($dni, 'S');
					$response = SQLConnection::backendStoreProcedure('api_get_govcheck_2024', [$dni], 'select');
				}
			} catch (Exception $ex) {
				// No hacer nada y continuar la ejecución normalmente
			}

			try {
				
			
				if(count($response) > 1 || count($response) == 0 || !is_null($response[0]->fecha_defuncion)) {
					$response = Misc::conversorApisGovcheck($response);
					self::Guardar_resultado_api(
                        $user_id,
                        $producto,
                        $dni,
                        $gender,
                        $id_consumo ?? null,
                        json_encode(['parameters' => $enviados, 'results' => count($response), 'notification' => Misc::gestorNotificacionGovcheck($response), 'response' => $response, 'Transaction_id' => $id_consumo]),
                        "",
                        Misc::medirTiempoRespuesta()
                    );

					return json_encode(['parameters'=>$enviados, 'results'=>count($response), 'notification'=>Misc::gestorNotificacionGovcheck($response), 'response'=>$response, 'Transaction_id'=>$id_consumo]);
				}
				
				try {
					if (!empty($response) && is_object($response[0]) && 
						(is_null($response[0]->ultimo_afip) || Misc::cantidadMeses($response[0]->ultimo_afip) >= 4)) {
						AFIPController::obtenerPadron($response[0]->identificacion, true, 'AR', false);
					}
				} catch (Exception $ex) {
					// No hacer nada y continuar la ejecución normalmente
				}


				/*$res_renaper = '';
				try {
					if($res_renaper == 11){
						$res_renaper = self::tratamientoSoloRenaper($response[0]->dni, $gender); 
					}else{
						$res_renaper = self::tratamientoSoloRenaper($dni, $gender);
					}																									
					//$res_renaper = self::tratamientoRenaperExtend($response[0]->ultimo_renaper, $dni, $response[0]->genero, $response[0]->identificacion);																			
				} catch (Exception $e) {
					$res_renaper = ''; 							
				}*/
                $res_renaper = self::tratamientoSoloRenaperExtended($dni, $gender);

                if (empty($res_renaper)) {
                    self::Guardar_resultado_api($user_id, $producto, $dni, $gender, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '305', 'Message' => Misc::error_query('305'), 'Transaction_id' => $id_consumo]), "305", Misc::medirTiempoRespuesta());
                    return json_encode(['Parameters' => $dni, 'Status' => '305', 'Message' => Misc::error_query('305'), 'Transaction_id' => $consumo->transaction_id]);
                }
        
                if (isset($res_renaper->Status) && $res_renaper->Status == 407) {     
                    self::Guardar_resultado_api($user_id, $producto, $dni, $gender, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => '407', 'Message' => $res_renaper->Response, 'Transaction_id' => $id_consumo]), "407", Misc::medirTiempoRespuesta());
                    return json_encode(['Parameters' => $dni, 'Status' => '407', 'Message' => $res_renaper->Response, 'Transaction_id' => $id_consumo]);
                }
        
                if (isset($res_renaper->Status) && $res_renaper->Status == 307 ) {
                    self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $gender, $id_consumo,json_encode(['Parameters' => $dni,'Status' => '307','Message' => Misc::error_query('307'),'Transaction_id' => $id_consumo]),"307",Misc::medirTiempoRespuesta());
                    return json_encode(['Parameters' => $dni,'Status' => '307','Message' => Misc::error_query('307'),'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];
        
                    self::Guardar_resultado_api($usuario->user_id, $producto, $dni, $gender, $id_consumo, json_encode(['Parameters' => $dni, 'Status' => $status, 'Message' => $message, 'Response' => $response]), "305", Misc::medirTiempoRespuesta());
                    return json_encode(['Parameters' => $dni, 'Status' => $status, 'Message' => $message, 'Response' => $response]);
                }

                if (isset($res_renaper->Status) && $res_renaper->Status === 'ERROR') {
                    self::Guardar_resultado_api($user_id, $producto, $dni, $gender, $id_consumo ?? null, json_encode(['Status' => '307', 'Message' => Misc::error_query(307)]), 307, Misc::medirTiempoRespuesta());
                    return json_encode(['Status' => '307', 'Message' => Misc::error_query(307)]);
                }

				$res_ws = self::resFidecheckExtend($response[0]->dni, $response[0]->nombre_persona, $response[0]->identificacion,$id_consumo ?? null);

				$response_v2 = Misc::conversorApisExtended_v3($response, $res_renaper, $res_ws,$nationality,$gender,$issue_date,$expiry_date,$internal_id,$copy);	

				self::Guardar_resultado_api($user_id, $producto, $dni, $gender, $id_consumo ?? null, json_encode(['parameters' => $enviados, 'results' => count($response), 'notification' => Misc::gestorNotificacionGovcheck($response), 'response' => $response_v2, 'Transaction_id' => $id_consumo]), "200", Misc::medirTiempoRespuesta());
				
				return json_encode(['parameters'=>$enviados, 'results'=>count($response), 'notification'=>Misc::gestorNotificacionGovcheck($response), 'response'=>$response_v2, 'Transaction_id'=>$id_consumo]);
			} catch (\Throwable $th) {
				$id_consumo = self::consumir_servicio($dni,env('NRO_PRODUCTO_EXTENDED'))->transaction_id;
				$mensaje = 'Ver este caso API EXTENDED fidelitas2 - Dni consultado: '.$dni.' <br>Producto: '.$usuario->producto.'<br>Cliente: '.$usuario->cliente['client_id'].'<br>User_Id: '.$usuario->user_id.'<br>Error: '.$th->getMessage().'<br>Linea: '.$th->getLine();
				Misc::enviarMail_errores_api($mensaje);

				self::Guardar_resultado_api($user_id, $producto, $dni, $gender, $id_consumo ?? null, json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo]), "301", Misc::medirTiempoRespuesta());
				return json_encode(['Status'=>'301','Message'=>Misc::error_query('301'), 'Transaction_id'=>$id_consumo]);
			}
		} catch (\Throwable $th) {
			$mensaje = 'Error al consultar API EXTENDED fidelitas2 <br>Producto: '.$usuario->producto.'<br>Cliente: '.$usuario->cliente['client_id'].'<br>User_Id: '.$usuario->user_id.'<br>Error: '.$th->getMessage().'<br>Linea: '.$th->getLine();
			Misc::enviarMail_errores_api($mensaje);

			self::Guardar_resultado_api($user_id, $producto, $dni, $gender, $id_consumo ?? null, json_encode(['Status' => 'INTERNAL ERROR', 'Message' => Misc::error_query('INTERNAL_ERROR')]), "INTERNAL_ERROR", Misc::medirTiempoRespuesta());
			return json_encode(['Status'=>'INTERNAL ERROR','Message'=>Misc::error_query('INTERNAL_ERROR')]);
		}
	}

    static function consultaWs_v3($idTributaria = null, $nombre = null, $pais = null)
    {
        //echo(var_dump(SQLConnection::backendStoreProcedure('LN_Fidecheck_ws_select', array('20132146234'),'select'))); die();
        //-- Datos del usuario en session.
        $usuario = Session::get('usuario');
        $user_id = $usuario->user_id;

        //-- Lista que contendra los datos finales.
        $lista = array();

        //-- Variable para el codigo de status
        $codigo = '';

        //-- Variables recibidas.
        if ($idTributaria == null) {
            $idTributaria = trim(isset($_POST['tax_id']) ? $_POST['tax_id'] : (isset($_POST['TAX_ID']) ? $_POST['TAX_ID'] : ''));
            //$dni = trim(isset($_POST['dni']) ? $_POST['dni'] : (isset($_POST['DNI']) ? $_POST['DNI'] : ''));
            $nombre = trim(isset($_POST['full_name']) ? $_POST['full_name'] : (isset($_POST['FULL_NAME']) ? $_POST['FULL_NAME'] : ''));
            $pais = strtoupper(trim(isset($_POST['country_code']) ? $_POST['country_code'] : (isset($_POST['COUNTRY_CODE']) ? $_POST['COUNTRY_CODE'] : '')));
        }

        $dni = $idTributaria;
        $nombre = self::nombre_formateo($nombre);

        //--  PARAMETROS AGREGADOS PARA CONTRAPARTE Y GESTION  --//
        $nroContraparte = strtoupper(trim(isset($_POST['contraparte']) ? $_POST['contraparte'] : (isset($_POST['CONTRAPARTE']) ? $_POST['CONTRAPARTE'] : '')));
        $nroGestion = strtoupper(trim(isset($_POST['gestion']) ? $_POST['gestion'] : (isset($_POST['GESTION']) ? $_POST['GESTION'] : '')));
        $nroContraparte = $nroContraparte == '' ? null : $nroContraparte;
        $nroGestion = $nroGestion == '' ? null : $nroGestion;

        $nroProducto = $usuario->producto;
        $id_consumo = self::obtenerIdConsumos($idTributaria, $dni, $nombre, $nroProducto);
        $paraBusqueda = $idTributaria;
        $ruta = $_SERVER['REQUEST_URI'];
        try {

            //-- Seccion para validaciones varias.
            if ($pais == 'AR' && ! self::tax_id_valido($idTributaria)) {
                $idTributaria = '';
            }


            if (strlen($pais) > 2) {
                $codigo = '100';
            } else if ($idTributaria == '' && $dni == '' && $nombre == '') {
                $codigo = '308';
            } else if ($idTributaria != '' && ! self::tax_id_valido($idTributaria) && $dni == '' && $nombre == '') {
                $codigo = '302';
            } else if ($idTributaria == '' && $dni != '' && ! self::dni_valido($dni) && $nombre == '') {
                $codigo = '300';
            } else if ($idTributaria != '' && self::tax_id_valido($idTributaria) && $dni == '' && $nombre == '' && $pais != 'AR') {
                $codigo = '309';
            } else if ($idTributaria == '' && $dni != '' && self::dni_valido($dni) && $nombre == '' && $pais != 'AR') {
                $codigo = '309';
            }

            if ($codigo != '') {
                self::Guardar_resultado_api(
                    $user_id,
                    $nroProducto,
                    $dni,
                    '',
                    $id_consumo ?? null,
                    json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]),
                    $codigo,
                    Misc::medirTiempoRespuesta()
                );
                return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
            }

            //-- Seccion donde se deberia componer el dni en cuit
            //-- ESTO VER QUE SUCEDE CUANDO NO EXISTE EL CUIT  --//
            if ($dni != '' && $idTributaria == '') {
                $idTributaria = SQLConnection::backendStoreProcedure('api_get_govcheck', array($dni), 'select')[0]->identificacion;
                $paraBusqueda = $idTributaria;
            }

            if ($paraBusqueda == '' && $nombre !== '') {
                $paraBusqueda = $nombre;
            }

            //--  Seccion donde se verifica si el pedido ya fue consultado dentro de los N dias a WS. Sino va a WS.
            $r = SQLConnection::backendStoreProcedure('LN_Fidecheck_API', array($paraBusqueda, env('PEP_NV_TOPE_DIAS')));
            //echo(var_dump($r)); die();
            //$r = array();
            if (count($r) > 0 && ! isset($_POST['debug'])) {
                foreach ($r as $key) {
                    $persona = new stdClass;
                    //$persona->id_resultado = $key->id_resultado;  //-> ese es al antiguo id, era solo de uso interno en la vieja estructura.
                    $persona->cuit = $key->cuit;
                    $persona->nombre_persona = $key->nombre_persona;
                    //$persona->id_padron = $key->id_padron; //-> Esto se comenta dado que la estructura anterio siempre lo ponia en 0.
                    $persona->StatusCode = $key->StatusCode;
                    $persona->Status = $key->Status;
                    $persona->Reason = $key->Reason;
                    $persona->Id = $key->Id;
                    $persona->Fuente = $key->Fuente;
                    $persona->NombreModificado = $key->NombreModificado;
                    $persona->DocumentoBuscado = $key->DocumentoBuscado;
                    $persona->NombreBuscado = $key->NombreBuscado;
                    $persona->Documento = $key->Documento;
                    $persona->Residencia = $key->Residencia;
                    $persona->DescripcionPais = $key->DescripcionPais;
                    //$persona->PaisNoColaborativo = $key->PaisNoColaborativo; //-> se comenta dado que en la nueva estructura de ws no esta incluido.
                    //$persona->Hallazgos = $key->Hallazgos; //-> se comenta dado que en la nueva estructura de ws no esta incluido.
                    //$persona->ExisteDocumentacion = $key->ExisteDocumentacion; //-> se comenta dado que en la nueva estructura de ws no esta incluido.
                    $persona->PorcentajeSimilitud = $key->PorcentajeSimilitud;
                    $persona->fidecheck = $key->fidecheck;
                    $persona->Codigo = $key->Codigo;
                    $persona->FechaNovedad = $key->FechaNovedad;
                    $persona->FechaNovedaddmy = $key->FechaNovedaddmy;
                    $persona->Cargo = $key->Cargo;
                    $persona->Institucion = $key->Institucion;
                    $persona->Domicilio = $key->Domicilio;
                    $persona->NumeroDocumento = $key->NumeroDocumento;
                    $persona->NumeroIdTributaria = $key->NumeroIdTributaria;
                    $persona->Url = $key->Url;
                    $persona->Relacion = $key->Relacion;
                    $persona->orden = $key->orden;
                    $persona->TipoFuente = $key->TipoFuente;
                    $persona->DescripcionFuente = $key->PrincipalLista;
                    //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                    $persona->fecha = $key->fecha;
                    $persona->visible = $key->visible;
                    $lista[] = $persona;
                }
                $lista = self::manejadoRespuesta($lista, $nroProducto);
                $codigo = '200';

                self::Guardar_resultado_api(
                    $user_id,
                    $nroProducto,
                    $dni,
                    '',
                    $id_consumo ?? null,
                    json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]), Misc::error_query($codigo),
                    $codigo,
                    Misc::medirTiempoRespuesta()
                );

                return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);

            } else {
                //echo("debe ir a WS."); die();
                //--  SECCION PARA LA VALIDACION DEL TOKEN EN CASO QUE DEBA IR A WS.  --//

                //-- Se pide el token a la DB, sino se encuentra vigente se solicita uno nuevo. Esta funcion ya informa en caso de no poder obtenerlo.
                $token = self::pedirToken();

                if (! isset($token) || is_null($token)) {
                    $codigo = '400';
                }

                if ($codigo != '') {
                    self::Guardar_resultado_api(
                        $user_id,
                        $nroProducto,
                        $dni,
                        '',
                        $id_consumo ?? null,
                        json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]), Misc::error_query($codigo),
                        $codigo,
                        Misc::medirTiempoRespuesta()
                    );
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
                }

                //---------------------------------------------------------------------//

                //-- Variables de entorno.
                $identificacion = env('PEP_NV_IDENTIFICACION');
                $confBusqueda = env('PEP_NV_BUSQUEDA');

                //-- Armado de datos para la consulta a WS.
                //$data = json_encode(array("Identification" => $identificacion, "Nombre" => $nombre, "Documento" => $dni, "IdTributaria" => $idTributaria, "ConfigurationName" => $confBusqueda));
                /* 03/11/2022: Si es de argentina no manda el nombre en la consulta, para que solo busque el CUIT exacto */
                if ($pais == 'AR') {
                    $data = json_encode(array("Identification" => $identificacion, "Nombre" => '', "Documento" => $dni, "IdTributaria" => $idTributaria, "ConfigurationName" => $confBusqueda));
                } else {
                    $data = json_encode(array("Identification" => $identificacion, "Nombre" => $nombre, "Documento" => $dni, "IdTributaria" => $idTributaria, "ConfigurationName" => $confBusqueda));
                }

                //-- inicio del cURL. ---------------------------------------------------------------------//
                $curl = curl_init();

                curl_setopt_array($curl, array(
                    CURLOPT_URL => env('PEP_NV_URL_CONSULTA'),
                    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 => $data,
                    CURLOPT_HTTPHEADER => array(
                        'Authorization: Bearer ' . $token,
                        'Content-Type: application/json'
                    ),
                ));

                $response = curl_exec($curl);
                curl_close($curl);
                //-- Fin del cURL. -------------------------------------------------------------------------//

                /* 03/11/2022: Guardo Consulta ws */
                $cons = SQLConnection::backendStoreProcedure('Consultas_worldsys_', array($idTributaria, $nombre, $pais, $response), 'selectOne');

                /**/



                //-- Se convierte a json la respuesta doda que viene como un String.
                $response = json_decode($response, true)['hits'];

                //-- > SECCION PARA DEBUG, MUESTRA EL DATO EN CRUDO DE WS.  --//
                /*if(isset($_POST['debug']) and $_POST['debug'] == 1) {
                               echo('linea 9691');	
                               echo(json_encode($response)); //die();	
                            }*/
                //------------------------------------------------------------//

                if ($pais == 'AR' && self::tax_id_valido($idTributaria) && $nombre !== '') {
                    //-- BUsqueda por cuit/cuil
                    foreach ($response as $key) {

                        if (($pais == $key['residencia'] && $key['idTributaria'] == $idTributaria) || ($pais == $key['residencia'] && $key['idTributaria'] == '' && Misc::esElMismoNombreWs($nombre, $key['nombre']) && $key['fuente']['kind']['code'] == 'SAN')) {
                            $datosParaGuardar = array();
                            $persona = new stdClass;

                            //-- Esta variables son tipo swap, no tocar  --//
                            $persona->tipoFuente = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $persona->relacion = isset($key['relacion']) ? $key['relacion'] : '';
                            $persona->FechaNovedad = isset($key['fechaNovedad']) ? $key['fechaNovedad'] : '';
                            //---------------------------------------------//

                            //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 
                            $persona->cuit = isset($key['idTributaria']) ? $key['idTributaria'] : ''; //-> ok
                            $datosParaGuardar[0] = $persona->cuit;
                            $persona->nombre_persona = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[1] = $persona->nombre_persona;
                            $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
                            $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
                            $persona->StatusCode = '200'; //-> ok
                            $datosParaGuardar[4] = $persona->StatusCode;
                            $persona->Status = 'OK'; //-> ok
                            $datosParaGuardar[5] = $persona->Status;
                            $persona->Reason = isset($key['fuente']['kind']['legend']) ? $key['fuente']['kind']['legend'] : ''; //-> ok
                            $datosParaGuardar[6] = $persona->Reason;
                            $persona->Id = isset($key['sdnId']) ? $key['sdnId'] : ''; //-> ok
                            $datosParaGuardar[7] = $persona->Id;
                            $persona->Fuente = isset($key['fuente']['name']) ? $key['fuente']['name'] : ''; //-> ok
                            $datosParaGuardar[8] = $persona->Fuente;
                            $persona->NombreModificado = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[9] = $persona->NombreModificado;
                            $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
                            $datosParaGuardar[10] = $persona->DocumentoBuscado;
                            $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
                            $datosParaGuardar[11] = $persona->NombreBuscado;
                            $persona->Documento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[12] = $persona->Documento;
                            $persona->Residencia = isset($key['residencia']) ? $key['residencia'] : ''; //-> ok
                            $datosParaGuardar[14] = $persona->Residencia;
                            $persona->DescripcionPais = isset($key['pais']) ? $key['pais'] : ''; //-> ok
                            $datosParaGuardar[15] = $persona->DescripcionPais;
                            $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
                            $datosParaGuardar[17] = '1'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
                            $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
                            $persona->PorcentajeSimilitud = isset($key['score']) ? $key['score'] : ''; //-> ok
                            $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
                            $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
                            $datosParaGuardar[20] = $persona->fidecheck;
                            $persona->Codigo = isset($key['id']) ? $key['id'] : ''; //-> ok
                            $datosParaGuardar[21] = $persona->Codigo;
                            $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
                            $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
                            $datosParaGuardar[23] = $persona->FechaNovedad;
                            $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
                            $persona->Cargo = isset($key['cargo']) ? $key['cargo'] : ''; //-> ok
                            $datosParaGuardar[24] = $persona->Cargo;
                            $persona->Institucion = isset($key['institucion']) ? $key['institucion'] : ''; //-> ok
                            $datosParaGuardar[25] = $persona->Institucion;
                            $persona->Domicilio = isset($key['domicilio']) ? $key['domicilio'] : ''; //-> ok
                            $datosParaGuardar[26] = $persona->Domicilio;
                            $persona->NumeroDocumento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[27] = $persona->NumeroDocumento;
                            $persona->NumeroIdTributaria = $persona->cuit; //-> ok
                            $datosParaGuardar[28] = $persona->NumeroIdTributaria;
                            $persona->Url = isset($key['url']) ? $key['url'] : ''; //-> ok
                            $datosParaGuardar[29] = $persona->Url;
                            $persona->Relacion = $persona->relacion; //->ok
                            $datosParaGuardar[30] = $persona->Relacion;
                            $persona->orden = ''; //-> ver esto para que se esta usando.
                            $persona->TipoFuente = $persona->tipoFuente; //-> ok
                            $datosParaGuardar[13] = $persona->TipoFuente;
                            //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
                            $persona->DescripcionFuente = isset($key['fuente']['description']) ? $key['fuente']['description'] : '';
                            //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                            $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
                            $persona->visible = '1'; //-> se e coloca 1 por default.

                            $principalLista = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : ''; //-> ok
                            $datosParaGuardar[31] = $principalLista;
                            //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
                            //----- $principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
                            //---- $datosParaGuardar[32] = $principalListaDescripcion;
                            $datosParaGuardar[32] = $persona->DescripcionFuente;
                            $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[33] = $paisSwift;
                            $tipoNovedad = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $datosParaGuardar[34] = $tipoNovedad;
                            $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[35] = $idOrigRel;
                            $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[36] = $principalFuente;
                            $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[37] = $observaciones;
                            $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
                            $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[39] = $urlNew;
                            $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[40] = $normaUif;
                            $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[41] = $normaUifDescripcion;
                            $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[42] = $fuenteLista;
                            $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[43] = $fuenteActiva;
                            //--> $fuenteDescripcion = $persona->PrincipalLista;
                            $fuenteDescripcion = $principalLista;
                            $datosParaGuardar[44] = $fuenteDescripcion;
                            $fuenteDescripcionLarga = $persona->DescripcionFuente;
                            $datosParaGuardar[45] = $fuenteDescripcionLarga;
                            $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[46] = $fuenteTipo;
                            $fuenteImagen = isset($key['fuente']['logoUrl']) ? $key['fuente']['logoUrl'] : '';
                            $datosParaGuardar[47] = $fuenteImagen;
                            $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[48] = $fuenteActualizaxml;
                            $lista[] = $persona;
                            //echo("aca tarda"); die();
                            $rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);
                        }
                    }
                    $codigo = '200';
                    if (count($lista) < 1) {
                        $lista = self::auxiliarParaFidechek($idTributaria, $nombre);
                    }
                    $lista = self::manejadoRespuesta($lista, $nroProducto);
                    self::Guardar_resultado_api(
                        $user_id,
                        $nroProducto,
                        $dni,
                        '',
                        $id_consumo ?? null,
                        json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]),
                        $codigo,
                        Misc::medirTiempoRespuesta()
                    );
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);

                } else if ($pais == 'AR' && self::tax_id_valido($idTributaria) && $nombre == '') {
                    //-- BUsqueda por cuit/cuil
                    foreach ($response as $key) {
                        if ($pais == $key['residencia'] && $key['idTributaria'] == $idTributaria) {
                            $datosParaGuardar = array();
                            $persona = new stdClass;

                            //-- Esta variables son tipo swap, no tocar  --//
                            $persona->tipoFuente = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $persona->relacion = isset($key['relacion']) ? $key['relacion'] : '';
                            $persona->FechaNovedad = isset($key['fechaNovedad']) ? $key['fechaNovedad'] : '';
                            //---------------------------------------------//

                            //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 
                            $persona->cuit = isset($key['idTributaria']) ? $key['idTributaria'] : ''; //-> ok
                            $datosParaGuardar[0] = $persona->cuit;
                            $persona->nombre_persona = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[1] = $persona->nombre_persona;
                            $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
                            $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
                            $persona->StatusCode = '200'; //-> ok
                            $datosParaGuardar[4] = $persona->StatusCode;
                            $persona->Status = 'OK'; //-> ok
                            $datosParaGuardar[5] = $persona->Status;
                            $persona->Reason = isset($key['fuente']['kind']['legend']) ? $key['fuente']['kind']['legend'] : ''; //-> ok
                            $datosParaGuardar[6] = $persona->Reason;
                            $persona->Id = isset($key['sdnId']) ? $key['sdnId'] : ''; //-> ok
                            $datosParaGuardar[7] = $persona->Id;
                            $persona->Fuente = isset($key['fuente']['name']) ? $key['fuente']['name'] : ''; //-> ok
                            $datosParaGuardar[8] = $persona->Fuente;
                            $persona->NombreModificado = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[9] = $persona->NombreModificado;
                            $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
                            $datosParaGuardar[10] = $persona->DocumentoBuscado;
                            $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
                            $datosParaGuardar[11] = $persona->NombreBuscado;
                            $persona->Documento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[12] = $persona->Documento;
                            $persona->Residencia = isset($key['residencia']) ? $key['residencia'] : ''; //-> ok
                            $datosParaGuardar[14] = $persona->Residencia;
                            $persona->DescripcionPais = isset($key['pais']) ? $key['pais'] : ''; //-> ok
                            $datosParaGuardar[15] = $persona->DescripcionPais;
                            $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
                            $datosParaGuardar[17] = '1'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
                            $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
                            $persona->PorcentajeSimilitud = isset($key['score']) ? $key['score'] : ''; //-> ok
                            $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
                            $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
                            $datosParaGuardar[20] = $persona->fidecheck;
                            $persona->Codigo = isset($key['id']) ? $key['id'] : ''; //-> ok
                            $datosParaGuardar[21] = $persona->Codigo;
                            $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
                            $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
                            $datosParaGuardar[23] = $persona->FechaNovedad;
                            $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
                            $persona->Cargo = isset($key['cargo']) ? $key['cargo'] : ''; //-> ok
                            $datosParaGuardar[24] = $persona->Cargo;
                            $persona->Institucion = isset($key['institucion']) ? $key['institucion'] : ''; //-> ok
                            $datosParaGuardar[25] = $persona->Institucion;
                            $persona->Domicilio = isset($key['domicilio']) ? $key['domicilio'] : ''; //-> ok
                            $datosParaGuardar[26] = $persona->Domicilio;
                            $persona->NumeroDocumento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[27] = $persona->NumeroDocumento;
                            $persona->NumeroIdTributaria = $persona->cuit; //-> ok
                            $datosParaGuardar[28] = $persona->NumeroIdTributaria;
                            $persona->Url = isset($key['url']) ? $key['url'] : ''; //-> ok
                            $datosParaGuardar[29] = $persona->Url;
                            $persona->Relacion = $persona->relacion; //->ok
                            $datosParaGuardar[30] = $persona->Relacion;
                            $persona->orden = ''; //-> ver esto para que se esta usando.
                            $persona->TipoFuente = $persona->tipoFuente; //-> ok
                            $datosParaGuardar[13] = $persona->TipoFuente;
                            //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
                            $persona->DescripcionFuente = isset($key['fuente']['description']) ? $key['fuente']['description'] : '';
                            //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                            $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
                            $persona->visible = '1'; //-> se e coloca 1 por default.

                            $principalLista = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : ''; //-> ok
                            $datosParaGuardar[31] = $principalLista;
                            //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
                            //----- $persona->DescripcionFuente$principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
                            //---- $datosParaGuardar[32] = $principalListaDescripcion;
                            $datosParaGuardar[32] = $persona->DescripcionFuente;
                            $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[33] = $paisSwift;
                            $tipoNovedad = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $datosParaGuardar[34] = $tipoNovedad;
                            $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[35] = $idOrigRel;
                            $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[36] = $principalFuente;
                            $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[37] = $observaciones;
                            $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
                            $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[39] = $urlNew;
                            $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[40] = $normaUif;
                            $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[41] = $normaUifDescripcion;
                            $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[42] = $fuenteLista;
                            $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[43] = $fuenteActiva;
                            //--> $fuenteDescripcion = $persona->PrincipalLista;
                            $fuenteDescripcion = $principalLista;
                            $datosParaGuardar[44] = $fuenteDescripcion;
                            $fuenteDescripcionLarga = $persona->DescripcionFuente;
                            $datosParaGuardar[45] = $fuenteDescripcionLarga;
                            $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[46] = $fuenteTipo;
                            $fuenteImagen = isset($key['fuente']['logoUrl']) ? $key['fuente']['logoUrl'] : '';
                            $datosParaGuardar[47] = $fuenteImagen;
                            $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[48] = $fuenteActualizaxml;
                            $lista[] = $persona;
                            //echo("aca tarda"); die();
                            $rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);
                        }
                    }
                    $codigo = '200';
                    if (count($lista) < 1) {
                        $lista = self::auxiliarParaFidechek($idTributaria, $nombre);
                    }
                    $lista = self::manejadoRespuesta($lista, $nroProducto);
                    self::Guardar_resultado_api(
                        $user_id,
                        $nroProducto,
                        $dni,
                        '',
                        $id_consumo ?? null,
                        json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]),
                        $codigo,
                        Misc::medirTiempoRespuesta()
                    );
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
                } else if ($pais !== '' && strlen($nombre) > 2) {
                    //-- Busqueda por pais y nombre
                    foreach ($response as $key) {
                        if ($pais == $key['residencia'] && Misc::esElMismoNombreWs($nombre, $key['nombre'])) {
                            $datosParaGuardar = array();
                            $persona = new stdClass;

                            ///-- Esta variables son tipo swap, no tocar  --//
                            $persona->tipoFuente = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $persona->relacion = isset($key['relacion']) ? $key['relacion'] : '';
                            $persona->FechaNovedad = isset($key['fechaNovedad']) ? $key['fechaNovedad'] : '';
                            //---------------------------------------------//

                            //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 
                            $persona->cuit = isset($key['idTributaria']) ? $key['idTributaria'] : ''; //-> ok
                            $datosParaGuardar[0] = $persona->cuit;
                            $persona->nombre_persona = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[1] = $persona->nombre_persona;
                            $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
                            $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
                            $persona->StatusCode = '200'; //-> ok
                            $datosParaGuardar[4] = $persona->StatusCode;
                            $persona->Status = 'OK'; //-> ok
                            $datosParaGuardar[5] = $persona->Status;
                            $persona->Reason = isset($key['fuente']['kind']['legend']) ? $key['fuente']['kind']['legend'] : ''; //-> ok
                            $datosParaGuardar[6] = $persona->Reason;
                            $persona->Id = isset($key['sdnId']) ? $key['sdnId'] : ''; //-> ok
                            $datosParaGuardar[7] = $persona->Id;
                            $persona->Fuente = isset($key['fuente']['name']) ? $key['fuente']['name'] : ''; //-> ok
                            $datosParaGuardar[8] = $persona->Fuente;
                            $persona->NombreModificado = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[9] = $persona->NombreModificado;
                            $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
                            $datosParaGuardar[10] = $persona->DocumentoBuscado;
                            $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
                            $datosParaGuardar[11] = $persona->NombreBuscado;
                            $persona->Documento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[12] = $persona->Documento;
                            $persona->Residencia = isset($key['residencia']) ? $key['residencia'] : ''; //-> ok
                            $datosParaGuardar[14] = $persona->Residencia;
                            $persona->DescripcionPais = isset($key['pais']) ? $key['pais'] : ''; //-> ok
                            $datosParaGuardar[15] = $persona->DescripcionPais;
                            $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
                            $datosParaGuardar[17] = '1'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
                            $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
                            $persona->PorcentajeSimilitud = isset($key['score']) ? $key['score'] : ''; //-> ok
                            $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
                            $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
                            $datosParaGuardar[20] = $persona->fidecheck;
                            $persona->Codigo = isset($key['id']) ? $key['id'] : ''; //-> ok
                            $datosParaGuardar[21] = $persona->Codigo;
                            $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
                            $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
                            $datosParaGuardar[23] = $persona->FechaNovedad;
                            $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
                            $persona->Cargo = isset($key['cargo']) ? $key['cargo'] : ''; //-> ok
                            $datosParaGuardar[24] = $persona->Cargo;
                            $persona->Institucion = isset($key['institucion']) ? $key['institucion'] : ''; //-> ok
                            $datosParaGuardar[25] = $persona->Institucion;
                            $persona->Domicilio = isset($key['domicilio']) ? $key['domicilio'] : ''; //-> ok
                            $datosParaGuardar[26] = $persona->Domicilio;
                            $persona->NumeroDocumento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[27] = $persona->NumeroDocumento;
                            $persona->NumeroIdTributaria = $persona->cuit; //-> ok
                            $datosParaGuardar[28] = $persona->NumeroIdTributaria;
                            $persona->Url = isset($key['url']) ? $key['url'] : ''; //-> ok
                            $datosParaGuardar[29] = $persona->Url;
                            $persona->Relacion = $persona->relacion; //->ok
                            $datosParaGuardar[30] = $persona->Relacion;
                            $persona->orden = ''; //-> ver esto para que se esta usando.
                            $persona->TipoFuente = $persona->tipoFuente; //-> ok
                            $datosParaGuardar[13] = $persona->TipoFuente;
                            //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
                            $persona->DescripcionFuente = isset($key['fuente']['description']) ? $key['fuente']['description'] : '';
                            //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                            $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
                            $persona->visible = '1'; //-> se e coloca 1 por default.

                            $principalLista = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : ''; //-> ok
                            $datosParaGuardar[31] = $principalLista;
                            //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
                            //----- $principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
                            //---- $datosParaGuardar[32] = $principalListaDescripcion;
                            $datosParaGuardar[32] = $persona->DescripcionFuente;
                            $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[33] = $paisSwift;
                            $tipoNovedad = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $datosParaGuardar[34] = $tipoNovedad;
                            $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[35] = $idOrigRel;
                            $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[36] = $principalFuente;
                            $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[37] = $observaciones;
                            $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
                            $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[39] = $urlNew;
                            $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[40] = $normaUif;
                            $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[41] = $normaUifDescripcion;
                            $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[42] = $fuenteLista;
                            $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[43] = $fuenteActiva;
                            //--> $fuenteDescripcion = $persona->PrincipalLista;
                            $fuenteDescripcion = $principalLista;
                            $datosParaGuardar[44] = $fuenteDescripcion;
                            $fuenteDescripcionLarga = $persona->DescripcionFuente;
                            $datosParaGuardar[45] = $fuenteDescripcionLarga;
                            $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[46] = $fuenteTipo;
                            $fuenteImagen = isset($key['fuente']['logoUrl']) ? $key['fuente']['logoUrl'] : '';
                            $datosParaGuardar[47] = $fuenteImagen;
                            $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[48] = $fuenteActualizaxml;
                            $lista[] = $persona;
                            //echo("aca tarda"); die();
                            $rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);
                        }
                    }
                    $codigo = '200';
                    if (count($lista) < 1) {
                        $lista = self::auxiliarParaFidechek($idTributaria, $nombre);
                    }
                    $lista = self::manejadoRespuesta($lista, $nroProducto);
                    self::Guardar_resultado_api(
                        $user_id,
                        $nroProducto,
                        $dni,
                        '',
                        $id_consumo ?? null,
                        json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]),
                        $codigo,
                        Misc::medirTiempoRespuesta()
                    );
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);

                } else {
                    //-- Busqueda libre por nombre
                    foreach ($response as $key) {
                        if (Misc::esElMismoNombreWs($nombre, $key['nombre'])) {
                            $datosParaGuardar = array();
                            $persona = new stdClass;

                            //-- Esta variables son tipo swap, no tocar  --//
                            $persona->tipoFuente = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $persona->relacion = isset($key['relacion']) ? $key['relacion'] : '';
                            $persona->FechaNovedad = isset($key['fechaNovedad']) ? $key['fechaNovedad'] : '';
                            //---------------------------------------------//

                            //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 
                            $persona->cuit = isset($key['idTributaria']) ? $key['idTributaria'] : ''; //-> ok
                            $datosParaGuardar[0] = $persona->cuit;
                            $persona->nombre_persona = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[1] = $persona->nombre_persona;
                            $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
                            $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
                            $persona->StatusCode = '200'; //-> ok
                            $datosParaGuardar[4] = $persona->StatusCode;
                            $persona->Status = 'OK'; //-> ok
                            $datosParaGuardar[5] = $persona->Status;
                            $persona->Reason = isset($key['fuente']['kind']['legend']) ? $key['fuente']['kind']['legend'] : ''; //-> ok
                            $datosParaGuardar[6] = $persona->Reason;
                            $persona->Id = isset($key['sdnId']) ? $key['sdnId'] : ''; //-> ok
                            $datosParaGuardar[7] = $persona->Id;
                            $persona->Fuente = isset($key['fuente']['name']) ? $key['fuente']['name'] : ''; //-> ok
                            $datosParaGuardar[8] = $persona->Fuente;
                            $persona->NombreModificado = isset($key['nombre']) ? $key['nombre'] : ''; //-> ok
                            $datosParaGuardar[9] = $persona->NombreModificado;
                            $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
                            $datosParaGuardar[10] = $persona->DocumentoBuscado;
                            $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
                            $datosParaGuardar[11] = $persona->NombreBuscado;
                            $persona->Documento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[12] = $persona->Documento;
                            $persona->Residencia = isset($key['residencia']) ? $key['residencia'] : ''; //-> ok
                            $datosParaGuardar[14] = $persona->Residencia;
                            $persona->DescripcionPais = isset($key['pais']) ? $key['pais'] : ''; //-> ok
                            $datosParaGuardar[15] = $persona->DescripcionPais;
                            $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
                            $datosParaGuardar[17] = '1'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
                            $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
                            $persona->PorcentajeSimilitud = isset($key['score']) ? $key['score'] : ''; //-> ok
                            $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
                            $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
                            $datosParaGuardar[20] = $persona->fidecheck;
                            $persona->Codigo = isset($key['id']) ? $key['id'] : ''; //-> ok
                            $datosParaGuardar[21] = $persona->Codigo;
                            $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
                            $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
                            $datosParaGuardar[23] = $persona->FechaNovedad;
                            $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
                            $persona->Cargo = isset($key['cargo']) ? $key['cargo'] : ''; //-> ok
                            $datosParaGuardar[24] = $persona->Cargo;
                            $persona->Institucion = isset($key['institucion']) ? $key['institucion'] : ''; //-> ok
                            $datosParaGuardar[25] = $persona->Institucion;
                            $persona->Domicilio = isset($key['domicilio']) ? $key['domicilio'] : ''; //-> ok
                            $datosParaGuardar[26] = $persona->Domicilio;
                            $persona->NumeroDocumento = isset($key['documento']) ? $key['documento'] : ''; //-> ok
                            $datosParaGuardar[27] = $persona->NumeroDocumento;
                            $persona->NumeroIdTributaria = $persona->cuit; //-> ok
                            $datosParaGuardar[28] = $persona->NumeroIdTributaria;
                            $persona->Url = isset($key['url']) ? $key['url'] : ''; //-> ok
                            $datosParaGuardar[29] = $persona->Url;
                            $persona->Relacion = $persona->relacion; //->ok
                            $datosParaGuardar[30] = $persona->Relacion;
                            $persona->orden = ''; //-> ver esto para que se esta usando.
                            $persona->TipoFuente = $persona->tipoFuente; //-> ok
                            $datosParaGuardar[13] = $persona->TipoFuente;
                            //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
                            $persona->DescripcionFuente = isset($key['fuente']['description']) ? $key['fuente']['description'] : '';
                            //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                            $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
                            $persona->visible = '1'; //-> se e coloca 1 por default.

                            $principalLista = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : ''; //-> ok
                            $datosParaGuardar[31] = $principalLista;
                            //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
                            //----- $principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
                            //---- $datosParaGuardar[32] = $principalListaDescripcion;
                            $datosParaGuardar[32] = $persona->DescripcionFuente;
                            $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[33] = $paisSwift;
                            $tipoNovedad = isset($key['fuente']['kind']['code']) ? $key['fuente']['kind']['code'] : '';
                            $datosParaGuardar[34] = $tipoNovedad;
                            $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[35] = $idOrigRel;
                            $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[36] = $principalFuente;
                            $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[37] = $observaciones;
                            $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
                            $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[39] = $urlNew;
                            $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[40] = $normaUif;
                            $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[41] = $normaUifDescripcion;
                            $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[42] = $fuenteLista;
                            $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[43] = $fuenteActiva;
                            //--> $fuenteDescripcion = $persona->PrincipalLista;
                            $fuenteDescripcion = $principalLista;
                            $datosParaGuardar[44] = $fuenteDescripcion;
                            $fuenteDescripcionLarga = $persona->DescripcionFuente;
                            $datosParaGuardar[45] = $fuenteDescripcionLarga;
                            $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[46] = $fuenteTipo;
                            $fuenteImagen = isset($key['fuente']['logoUrl']) ? $key['fuente']['logoUrl'] : '';
                            $datosParaGuardar[47] = $fuenteImagen;
                            $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                            $datosParaGuardar[48] = $fuenteActualizaxml;
                            $lista[] = $persona;
                            //echo("aca tarda"); die();
                            $rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);
                        }
                    }
                    $codigo = '200';
                    if (count($lista) < 1) {
                        $lista = self::auxiliarParaFidechek($idTributaria, $nombre);
                    }
                    $lista = self::manejadoRespuesta($lista, $nroProducto);
                    self::Guardar_resultado_api(
                        $user_id,
                        $nroProducto,
                        $dni,
                        '',
                        $id_consumo ?? null,
                        json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]),
                        $codigo,
                        Misc::medirTiempoRespuesta()
                    );
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);

                }
                //-- EVALUAR SI ESTE if SIGUE SIENDO NECESARIO  --//
                if (count($lista) == 0) {
                    $datosParaGuardar = array();
                    $persona = new stdClass;

                    //-- Esta variables son tipo swap, no tocar  --//
                    $persona->tipoFuente = '';
                    $persona->relacion = '';
                    $persona->FechaNovedad = '';
                    //---------------------------------------------//

                    //$persona->id_resultado = isset($key['id']) ? $key['id'] : ''; //-> Este es el id que anteriormente se usaba, era devuelto por la mdalidad antigua y solo era previo al insert 
                    $persona->cuit = ''; //-> ok
                    $datosParaGuardar[0] = $persona->cuit;
                    $persona->nombre_persona = ''; //-> ok
                    $datosParaGuardar[1] = $persona->nombre_persona;
                    $datosParaGuardar[2] = '0'; //-> Este es el id_padron qu eespera el store.
                    $datosParaGuardar[3] = 'worldsys'; //-> este es el parametro ws que espera el store.
                    $persona->StatusCode = '200'; //-> ok
                    $datosParaGuardar[4] = $persona->StatusCode;
                    $persona->Status = 'OK'; //-> ok
                    $datosParaGuardar[5] = $persona->Status;
                    $persona->Reason = ''; //-> ok
                    $datosParaGuardar[6] = $persona->Reason;
                    $persona->Id = ''; //-> ok
                    $datosParaGuardar[7] = $persona->Id;
                    $persona->Fuente = ''; //-> ok
                    $datosParaGuardar[8] = $persona->Fuente;
                    $persona->NombreModificado = ''; //-> ok
                    $datosParaGuardar[9] = $persona->NombreModificado;
                    $persona->DocumentoBuscado = isset($idTributaria) ? $idTributaria : ''; //-> ok
                    $datosParaGuardar[10] = $persona->DocumentoBuscado;
                    $persona->NombreBuscado = isset($nombre) ? $nombre : ''; //-> ok
                    $datosParaGuardar[11] = $persona->NombreBuscado;
                    $persona->Documento = ''; //-> ok
                    $datosParaGuardar[12] = $persona->Documento;
                    $persona->Residencia = ''; //-> ok
                    $datosParaGuardar[14] = $persona->Residencia;
                    $persona->DescripcionPais = ''; //-> ok
                    $datosParaGuardar[15] = $persona->DescripcionPais;
                    $datosParaGuardar[16] = ''; //--> esto es para pais no colaborativo, se manda asi porque ya no viene en la respuesta ws.
                    $datosParaGuardar[17] = '1'; //--> esto es Hallazgos, se manda asi porque ws cambio la estructura.
                    $datosParaGuardar[18] = ''; //-> esto es ExisteDocumentacion, se manda asi por cambio de ws.
                    $persona->PorcentajeSimilitud = ''; //-> ok
                    $datosParaGuardar[19] = $persona->PorcentajeSimilitud;
                    $persona->fidecheck = self::colorFidecheck($persona->tipoFuente, $persona->relacion);
                    $datosParaGuardar[20] = $persona->fidecheck;
                    $persona->Codigo = ''; //-> ok
                    $datosParaGuardar[21] = $persona->Codigo;
                    $datosParaGuardar[22] = ''; //-> esto es TipoFuenteMasDatos, se envia vacio porque ws cambio estructura.
                    $persona->FechaNovedad = self::limpiarFechaWs($persona->FechaNovedad);
                    $datosParaGuardar[23] = $persona->FechaNovedad;
                    $persona->FechaNovedaddmy = self::formatoArgentina($persona->FechaNovedad);
                    $persona->Cargo = ''; //-> ok
                    $datosParaGuardar[24] = $persona->Cargo;
                    $persona->Institucion = ''; //-> ok
                    $datosParaGuardar[25] = $persona->Institucion;
                    $persona->Domicilio = ''; //-> ok
                    $datosParaGuardar[26] = $persona->Domicilio;
                    $persona->NumeroDocumento = ''; //-> ok
                    $datosParaGuardar[27] = $persona->NumeroDocumento;
                    $persona->NumeroIdTributaria = $persona->cuit; //-> ok
                    $datosParaGuardar[28] = $persona->NumeroIdTributaria;
                    $persona->Url = ''; //-> ok
                    $datosParaGuardar[29] = $persona->Url;
                    $persona->Relacion = $persona->relacion; //->ok
                    $datosParaGuardar[30] = $persona->Relacion;
                    $persona->orden = ''; //-> ver esto para que se esta usando.
                    $persona->TipoFuente = $persona->tipoFuente; //-> ok
                    $datosParaGuardar[13] = $persona->TipoFuente;
                    //--> $persona->DescripcionFuente = isset($key['fuente']['caption']) ? $key['fuente']['caption'] : '';
                    $persona->DescripcionFuente = '';
                    //$persona->con_datos = $key->con_datos;  //-> ver si esto se usa para algo
                    $persona->fecha = $persona->FechaNovedaddmy;  //-> Esta fecha debe ser formateada a formato argentina
                    $persona->visible = '1'; //-> se e coloca 1 por default.

                    $principalLista = ''; //-> ok
                    $datosParaGuardar[31] = $principalLista;
                    //--> $datosParaGuardar[31] = $persona->DescripcionFuente;
                    //----- $principalListaDescripcion = isset($key['fuente']['description']) ? $key['fuente']['description'] : ''; //-> ok
                    //---- $datosParaGuardar[32] = $principalListaDescripcion;
                    $datosParaGuardar[32] = $persona->DescripcionFuente;
                    $paisSwift = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[33] = $paisSwift;
                    $tipoNovedad = '';
                    $datosParaGuardar[34] = $tipoNovedad;
                    $idOrigRel = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[35] = $idOrigRel;
                    $principalFuente = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[36] = $principalFuente;
                    $observaciones = ''; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[37] = $observaciones;
                    $datosParaGuardar[38] = $persona->DescripcionPais; //-> esto es para el valor pais que espera el store.
                    $urlNew = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[39] = $urlNew;
                    $normaUif = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[40] = $normaUif;
                    $normaUifDescripcion = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[41] = $normaUifDescripcion;
                    $fuenteLista = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[42] = $fuenteLista;
                    $fuenteActiva = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[43] = $fuenteActiva;
                    //--> $fuenteDescripcion = $persona->PrincipalLista;
                    $fuenteDescripcion = $principalLista;
                    $datosParaGuardar[44] = $fuenteDescripcion;
                    $fuenteDescripcionLarga = $persona->DescripcionFuente;
                    $datosParaGuardar[45] = $fuenteDescripcionLarga;
                    $fuenteTipo = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[46] = $fuenteTipo;
                    $fuenteImagen = '';
                    $datosParaGuardar[47] = $fuenteImagen;
                    $fuenteActualizaxml = 'null'; //-> se envia asi porque ya no lo devuelve ws.
                    $datosParaGuardar[48] = $fuenteActualizaxml;
                    $lista[] = $persona;
                    //echo("aca tarda"); die();
                    //$rr = SQLConnection::backendStoreProcedure('LN_Fidecheck_API_Data', $datosParaGuardar);
                    $codigo = '200';
                    $lista = self::manejadoRespuesta($lista, $nroProducto);
                    self::Guardar_resultado_api(
                        $user_id,
                        $nroProducto,
                        $dni,
                        '',
                        $id_consumo ?? null,
                        json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]),
                        $codigo,
                        Misc::medirTiempoRespuesta()
                    );
                    return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
                }
                // $codigo = 200;
                // $lista = self::manejadoRespuesta($lista, $nroProducto);
                // return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'country_code' => $pais, 'count' => count($lista), 'status_code' => $codigo,'status' => self::erroresWsV2($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
            }
        } catch (\Throwable $th) {
            $mensaje = 'Error al consultar nueva api ws fidelitas-www. <br> Error: ' . $th->getMessage() . '<br>Linea: ' . $th->getLine();
            Misc::enviarMail_errores_api($mensaje);
            $codigo = '401';
            self::Guardar_resultado_api(
                $user_id,
                $nroProducto,
                $dni,
                '',
                $id_consumo ?? null,
                json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'PAIS' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]),
                $codigo,
                Misc::medirTiempoRespuesta()
            );

            return json_encode(['Params' => array('full_name' => $nombre, 'tax_id' => $idTributaria, 'PAIS' => $pais, 'count' => count($lista), 'status_code' => $codigo, 'status' => Misc::error_query($codigo), 'transaction_id' => $id_consumo), 'response' => $lista]);
        }
    }

    /**
     * Procesa la verificacin de domicilio gubernamental
     *
     * Esta funcion realiza los siguientes pasos:
     * 1. Verifica si el producto asociado al usuario tiene acceso a la API
     * 2. Valida que el tax_id sea correcto
     * 4. Consulta los domicilios asociados al tax_id
     *
     * @return \Illuminate\Http\JsonResponse|string
     */
    public static function apiDomiciliosGovCheck()
    {
        // Se valida que tenga el producto para este API
        $producto = Session::get('usuario')->producto ?? 0;

        if (114 != $producto) {
            //return Response::JSON(['error' => '311', 'mensaje' => Misc::error_query(311)]);
            return json_encode([
                'error' => '301',
                'mensaje' => Misc::error_query(311)
            ]);
        }

        // Parametro obligatorio
        $tax_id = Request::input('tax_id') ?? Request::input('taxId') ?? Request::input('taxid') ?? Request::input('TAX_ID');

        if (empty($tax_id) || 11 != strlen($tax_id)) {
            return json_encode([
                'Status' => '302',
                'Message' => Misc::error_query(302)
            ]);
        }

        $parametrosrecibido = [
            'tax_id' => $tax_id
        ];

        // Consumiendo el servicio
        $consumirServicio = self::consumir_servicio($tax_id, $producto);
        $domicilio = SQLConnection::backendStoreProcedure('obtener_domicilios', [$tax_id, 1]);

        // Consultando domicilios 
        // $datosDomicilios = SQLConnection::backendStoreProcedure('sp_obtener_domicilios', array($tax_id, 1, 0));						

        // Si no obtengo datos de domicilio, devuelvo un mensaje de datos no encontrados
        if (empty($domicilio)) {
            return json_encode([
                'Parameters' => $parametrosrecibido,
                'Status' => '401',
                'Message' => 'OK',
                'Response' => Misc::error_query(401),
                'Transaction_id' => $consumirServicio->transaction_id
            ]);
        }

        $domiciliosFiltrados = array_filter($domicilio, function ($dom) {
            return isset($dom->nombre_fuente) && $dom->nombre_fuente === 'AFIP';
        });


        /* $domicilio = [];
              if (!empty($datosDomicilios) && isset($datosDomicilios[0]->id_domicilio)) {
                  $domicilio = SQLConnection::backendStoreProcedure('obtener_domicilios', [NULL, 1, $datosDomicilios[0]->id_domicilio]);
              }else {
                  return json_encode([
                      'Parameters' => $parametrosrecibido, 
                      'Status' => '401', 
                      'Message' => 'OK', 
                      'Response' => Misc::error_query(401),
                      'Transaction_id' => $consumirServicio->transaction_id
                  ]);
              }	 */

        if (empty($domiciliosFiltrados)) {
            return json_encode([
                'Parameters' => $parametrosrecibido,
                'Status' => '401',
                'Message' => 'OK',
                'Response' => Misc::error_query(401),
                'Transaction_id' => $consumirServicio->transaction_id
            ]);
        }

        $respuesta = Misc::respuestaDomiciliosGovcheck($domiciliosFiltrados);

        // Devolviendo la respuesta en formato JSON
        return json_encode([
            'Parameters' => $parametrosrecibido,
            'Status' => '200',
            'Message' => 'OK',
            'Response' => $respuesta,
            'Transaction_id' => $consumirServicio->transaction_id
        ]);
    }

    #Version 3 del api govcheck, donde se le agrega los parametros tax_id y genero - TB
	#08-05-2024
	public static function govcheck_v3() {
		$usuario        = Session::get('usuario');
		$user_id       = $usuario->user_id;
		$producto       = $usuario->producto;

        $dni = trim((isset($_POST['national_id']) ? $_POST['national_id'] : (isset($_POST['NATIONAL_ID']) ? $_POST['NATIONAL_ID'] : '')));

		//-- Validamos que el usuario tenga el producto habilitado
		if($usuario->producto == env('NRO_PRODUCTO_GOVCHECK')) {
			
			if (isset($_POST['tax_id']) && empty($_POST['tax_id']) && isset($_POST['national_id']) && empty($_POST['national_id'])) {
				$enviados['Tax_id'] = $_POST['tax_id'];
				$enviados['national_id'] = $_POST['national_id'];

				self::Guardar_resultado_api($user_id, $producto, '', '', null, json_encode(['Parameters' => $enviados, 'Status' => '310', 'Message' => Misc::error_query('310'), 'Response' => []]), "310", Misc::medirTiempoRespuesta());
				return json_encode(['Parameters'=>$enviados,'Status'=>'310','Message'=>Misc::error_query('310'),'Response'=>[]]);
			}

			#Si existe el tax_id lo tomamos para obtener los datos			
			if ((isset($_POST['tax_id']) || isset($_POST['TAX_ID'])) && (!empty($_POST['TAX_ID']) || !empty($_POST['tax_id']))) {
				$tax_id = trim((isset($_POST['tax_id']) ? $_POST['tax_id'] : (isset($_POST['TAX_ID']) ? $_POST['TAX_ID'] : '')));
				//-- validamos que no este vacio y que sean todos numeros con longitud de 11
				if(empty($tax_id) || Misc::noEsPosibleCuit($tax_id)) {
					self::Guardar_resultado_api($user_id, $producto, $tax_id, '', null, json_encode(['Parameters' => $tax_id, 'Status' => '302', 'Message' => Misc::error_query('302'), 'Response' => []]), "302", Misc::medirTiempoRespuesta());
					return json_encode(['Parameters'=>$tax_id,'Status'=>'302','Message'=>Misc::error_query('302'),'Response'=>[]]);
				}

				try {								
					$enviados['Tax_id'] = $tax_id;
					$res2 = SQLConnection::backendStoreProcedure('api_get_govcheck_2024',array($tax_id),'select');
					$response = Misc::conversorApisGovcheck($res2);
					try {
						$tid = (!is_null($response[0]->Tax_id_number)) ? $response[0]->Tax_id_number : $dni;
						$id_consumo = self::consumir_servicio($tid,env('NRO_PRODUCTO_GOVCHECK'));
						//-- ESTA SECCION SE AGREGA PARA IDENTIFICAR ERROR QUE GENERA EL STORE 'consumir_servicio_api'
						if($id_consumo->transaction_id == 0 || $id_consumo->transaction_id == '0' || is_null($id_consumo)) {
							$data = (is_null($id_consumo)) ? 'NULL' : $id_consumo->error;
							$mensaje = 'API GOVCHECK fidelitasprod.int - ERROR - CUIT consultado: '.$tax_id.' <br>Producto: '.$usuario->producto.'<br>Cliente: '.$usuario->cliente['client_id'].'<br>User_Id: '.$usuario->user_id.'<br>Error: '.$th->getMessage().'<br>Linea: '.$th->getLine().'<br>Error store dentro de consumir_servicio: '.$data;
							//Misc::enviarMail_errores_api($mensaje);
						}
						self::Guardar_resultado_api($user_id, $producto, $tid, '', $id_consumo->transaction_id ?? null, json_encode(['Parameters' => $enviados, 'Results' => count($response), 'Notification' => Misc::gestorNotificacionGovcheck($response), 'Response' => $response, 'Transaction_id' => $id_consumo->transaction_id]), Misc::gestorNotificacionGovcheck($response)["code"] ?? "", Misc::medirTiempoRespuesta());
						return json_encode(['Parameters'=>$enviados, 'Results'=>count($response), 'Notification'=>Misc::gestorNotificacionGovcheck($response), 'Response'=>$response, 'Transaction_id'=>$id_consumo->transaction_id]);	
					
					} catch (\Throwable $th) {
						$id_consumo = self::consumir_servicio($tax_id,env('NRO_PRODUCTO_GOVCHECK'));
						if($id_consumo->transaction_id == 0 || $id_consumo->transaction_id == '0' || is_null($id_consumo)) {
							$data = (is_null($id_consumo)) ? 'NULL' : $id_consumo->error;
							$mensaje = 'API GOVCHECK fidelitasprod.int - ERROR - CUIT consultado: '.$tax_id.' <br>Producto: '.$usuario->producto.'<br>Cliente: '.$usuario->cliente['client_id'].'<br>User_Id: '.$usuario->user_id.'<br>Error: '.$th->getMessage().'<br>Linea: '.$th->getLine().'<br>Error store dentro de consumir_servicio: '.$data;
							//Misc::enviarMail_errores_api($mensaje);
						} else {
							$mensaje = 'API GOVCHECK fidelitasprod.int - MIRAR ESTE CASO - CUIT consultado: '.$tax_id.' <br>Producto: '.$usuario->producto.'<br>Cliente: '.$usuario->cliente['client_id'].'<br>User_Id: '.$usuario->user_id.'<br>Error: '.$th->getMessage().'<br>Linea: '.$th->getLine();
							//Misc::enviarMail_errores_api($mensaje);
						}
						
						self::Guardar_resultado_api($user_id, $producto, $tax_id, '', $id_consumo->transaction_id ?? null, json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo->transaction_id]), "301", Misc::medirTiempoRespuesta());
						return json_encode(['Status'=>'301','Message'=>Misc::error_query('301'), 'Transaction_id'=>$id_consumo->transaction_id]);
					}					
				} catch (\Throwable $th) {

					$mensaje = 'Error al consultar API GOVCHECK fidelitasprod.int - DNI consultado: '.$dni.' <br>Producto: '.$usuario->producto.'<br>Cliente: '.$usuario->cliente['client_id'].'<br>User_Id: '.$usuario->user_id.'<br>Error: '.$th->getMessage().'<br>Linea: '.$th->getLine();
					//Misc::enviarMail_errores_api($mensaje);
					
					self::Guardar_resultado_api($user_id, $producto, $dni, '', $id_consumo->transaction_id ?? null, json_encode(['Status' => INTERNAL_ERROR, 'Message' => Misc::error_query(INTERNAL_ERROR)]), "INTERNAL_ERROR", Misc::medirTiempoRespuesta());

					return json_encode(['Status'=>INTERNAL_ERROR,'Message'=>Misc::error_query(INTERNAL_ERROR)]);	
				}
			}else{
				#En el caso que no exista el tax_id, tomamos el dni
				$dni = trim((isset($_POST['national_id']) ? $_POST['national_id'] : (isset($_POST['NATIONAL_ID']) ? $_POST['NATIONAL_ID'] : '')));
				//-- validamos que no este vacio y que sean todos numeros con longitud de 7 a 8
				if(empty($dni) || Misc::noEsPosibleDni($dni)) {

					self::Guardar_resultado_api($user_id, $producto, $dni, '', $id_consumo->transaction_id ?? null, json_encode(['Parameters' => $dni, 'Status' => '300', 'Message' => Misc::error_query('300'), 'Response' => []]), "300", Misc::medirTiempoRespuesta());
					return json_encode(['Parameters'=>$dni,'Status'=>'300','Message'=>Misc::error_query('300'),'Response'=>[]]);
				}
				
				try {
			
					//-- si es longitud 7, le agregamos 0 delante.
					$dni = (strlen($dni) == 7) ? '0'.$dni : $dni;				
					$enviados['National_id'] = $dni;
					$res2 = SQLConnection::backendStoreProcedure('api_get_govcheck_2024',array($dni),'select');																						
																																																			
					$response = Misc::conversorApisGovcheck($res2);					
					
					if(count($res2) == 0 || is_null($res2[0]->fecha_nacimiento) || is_null($res2[0]->ultimo_afip) || Misc::cantidadMeses($res2[0]->ultimo_afip) >= 1) {
						//self::BuscarCuit($dni,'S');
						self::BuscarCuit_Forzado($dni, 'S');																	
						$response = Misc::conversorApisGovcheck(SQLConnection::backendStoreProcedure('api_get_govcheck_2024',array($dni),'select'));
					}
					
					try {
						$tid = (!is_null($response[0]->Tax_id_number)) ? $response[0]->Tax_id_number : $dni;
						$id_consumo = self::consumir_servicio($tid,env('NRO_PRODUCTO_GOVCHECK'));
						//-- ESTA SECCION SE AGREGA PARA IDENTIFICAR ERROR QUE GENERA EL STORE 'consumir_servicio_api'
						if($id_consumo->transaction_id == 0 || $id_consumo->transaction_id == '0' || is_null($id_consumo)) {
							$data = (is_null($id_consumo)) ? 'NULL' : $id_consumo->error;
							$mensaje = 'API GOVCHECK fidelitasprod.int - ERROR - DNI consultado: '.$dni.' <br>Producto: '.$usuario->producto.'<br>Cliente: '.$usuario->cliente['client_id'].'<br>User_Id: '.$usuario->user_id.'<br>Error: '.$th->getMessage().'<br>Linea: '.$th->getLine().'<br>Error store dentro de consumir_servicio: '.$data;
							//Misc::enviarMail_errores_api($mensaje);
						}

						self::Guardar_resultado_api($user_id, $producto, $tid, '', $id_consumo->transaction_id ?? null, json_encode(['Parameters' => $enviados, 'Results' => count($response), 'Notification' => Misc::gestorNotificacionGovcheck($response), 'Response' => $response, 'Transaction_id' => $id_consumo->transaction_id]), Misc::gestorNotificacionGovcheck($response)["code"] ?? "", Misc::medirTiempoRespuesta());
						return json_encode(['Parameters'=>$enviados, 'Results'=>count($response), 'Notification'=>Misc::gestorNotificacionGovcheck($response), 'Response'=>$response, 'Transaction_id'=>$id_consumo->transaction_id]);	
					
					} catch (\Throwable $th) {
						$id_consumo = self::consumir_servicio($dni,env('NRO_PRODUCTO_GOVCHECK'));
						if($id_consumo->transaction_id == 0 || $id_consumo->transaction_id == '0' || is_null($id_consumo)) {
							$data = (is_null($id_consumo)) ? 'NULL' : $id_consumo->error;
							$mensaje = 'API GOVCHECK fidelitasprod.int - ERROR - DNI consultado: '.$dni.' <br>Producto: '.$usuario->producto.'<br>Cliente: '.$usuario->cliente['client_id'].'<br>User_Id: '.$usuario->user_id.'<br>Error: '.$th->getMessage().'<br>Linea: '.$th->getLine().'<br>Error store dentro de consumir_servicio: '.$data;
							//Misc::enviarMail_errores_api($mensaje);
						} else {
							$mensaje = 'API GOVCHECK fidelitasprod.int - MIRAR ESTE CASO - DNI consultado: '.$dni.' <br>Producto: '.$usuario->producto.'<br>Cliente: '.$usuario->cliente['client_id'].'<br>User_Id: '.$usuario->user_id.'<br>Error: '.$th->getMessage().'<br>Linea: '.$th->getLine();
							//Misc::enviarMail_errores_api($mensaje);
						}
						
						self::Guardar_resultado_api($user_id, $producto, $dni, '', $id_consumo->transaction_id ?? null, json_encode(['Status' => '301', 'Message' => Misc::error_query('301'), 'Transaction_id' => $id_consumo->transaction_id]), "301", Misc::medirTiempoRespuesta());
						return json_encode(['Status'=>'301','Message'=>Misc::error_query('301'), 'Transaction_id'=>$id_consumo->transaction_id]);
					}
					
	
				} catch (\Throwable $th) {

					$mensaje = 'Error al consultar API GOVCHECK fidelitasprod.int - DNI consultado: '.$dni.' <br>Producto: '.$usuario->producto.'<br>Cliente: '.$usuario->cliente['client_id'].'<br>User_Id: '.$usuario->user_id.'<br>Error: '.$th->getMessage().'<br>Linea: '.$th->getLine();
					//Misc::enviarMail_errores_api($mensaje);
					self::Guardar_resultado_api($user_id, $producto, $dni, '', $id_consumo->transaction_id ?? null, json_encode(['Status' => 'INTERNAL ERROR', 'Message' => Misc::error_query('INTERNAL_ERROR')]), "INTERNAL_ERROR", Misc::medirTiempoRespuesta());
					return json_encode(['Status'=>'INTERNAL ERROR','Message'=>Misc::error_query('INTERNAL_ERROR')]);	
				}
			}							
		}

		self::Guardar_resultado_api($user_id, $producto ?? null, $tax_id ?? $dni, '', null, json_encode(['Status' => 'ERROR PRODUCTO', 'Message' => Misc::error_query('ERROR_PRODUCTO')]), "ERROR_PRODUCTO", Misc::medirTiempoRespuesta());
		return json_encode(['Status'=>'ERROR PRODUCTO','Message'=>Misc::error_query('ERROR_PRODUCTO')]);
	}

    //busca todos los datos formales de una persona física
    private static function buscarDatosFormales($identificacion){
        $respuesta        = SQLConnection::backendStoreProcedure('api_buscar_datos_formales',array($identificacion),'selectOne');
        return json_encode($respuesta);
    }

    //busca la actividad principal del cuil/cuit relacionado
    private static function buscarActividadPrincipal($identificacion){
        $respuesta        = SQLConnection::backendStoreProcedure('api_buscar_actividad_principal',array($identificacion));
        return json_encode($respuesta);
    }

    /* Informe Comercial Completo - inicio */
	public static function ObtenerInformeComercialCompletoV2($cuit='',$apikey='',$idioma='ESP'){
		//datos básicos y declaraciones de clases y arrays, para que no fallen
		if(!$cuit){
		    $cuit         = Request::input('cuit');
		}
		/* 22/07/2021 Agregamos que pase por afip */
		if(!empty($cuit) && strlen($cuit) == 11){
			AFIPController::obtenerPadron($cuit,true,'AR',false);
		}
		// $idioma = (Request::input('idioma') !== NULL ) ? Request::input('idioma') : 'ESP';

		$usuario        = Session::get('usuario');
		$user_id        = $usuario->user_id;

		// AGB por favor transaccionar el ID producto que corresponde a cada APIKEY . Está usando fijo el 55 y ese producto se llama
		// informe comercial Teipesa. Creditsafe y Mati usan esta ruta con diferentes apikey y con el producto 79
		// Luego hay que actualizar la base de datos para que los consumos del 55 se muevan al 79 para estos dos clientes
		// El apikey se controla en api.php pero el producto del apikey se ignora.

		$producto       = $usuario->producto ?? 55;
		//$p_ip   = $_SERVER['REMOTE_ADDR'];
		//$csa = SQLConnection::backendStoreProcedure('consumir_servicio_API',array($user_id,$cuit,$producto,$p_ip),'selectOne');
		$csa = self::consumir_servicio($cuit,$producto);

		//SQLConnection::consumirServicio($user_id,$cuit,55);

		if(!$apikey){
		  	$apikey = Request::input('apikey');
		}
		$user_id        = 0;
		$persona        = new stdClass();
		$configuracion  = [];
		$cuit_validado = Misc::validarCuit($cuit);
		if(!$cuit_validado){
		    return json_encode(['error'=>'Cuit Inválido']);
		}
		$respuesta        = json_decode(self::obtenerServicioScore($cuit,true,false));
		$idp            = SQLConnection::obtenerIdPadron($cuit);
		$id_padron      = $idp->id_padron;

		//obtengo la configuración para este cliente/usuario y veo que secciones le habilito
		if($apikey){
		  	$configuracion = SQLConnection::backendStoreProcedure('api_obtener_configuracion_secciones',array($apikey),true);
        }

		// Información Score
		if ( $configuracion->score_ic == 1 ){
			$score = $respuesta->score;
			if( $idioma == 'ESP' ){
				$persona->score = new stdClass();
				$persona->score->valor = $score;
			} elseif( $idioma == 'ENG' ){
				$persona->score = new stdClass();
				$persona->score->value = $score;
			}
		}
		
		//si tiene la configuración de formales, tomamos todos los datos posibles del formales. (defunción, domicilios, datos personales. etc.)
		if( $configuracion->formales == 1 ){
			//definicion de variables compartidas.
			$nombre             = '';
			$defuncion          = SQLConnection::backendStoreProcedure('obtener_defuncion',array($cuit),true);
			$fisica_juridica    = Misc::tipoPersona($cuit);
			$p_fisica           = ($fisica_juridica == 'F') ? 'FISICA' : 'JURIDICA';
			//
			$legalForm = "";
            if ("F" != $p_fisica) {
                $cardScore = SQLConnection::obtenerCardScore($cuit);
                if (!empty($cardScore) && property_exists($cardScore, 'forma_juridica')) {
                    $legalForm = $cardScore->forma_juridica ?? "";
                }
            } else {
                $cardScorePF = SQLConnection::obtenerCardScorePF($cuit);
                if (!empty($cardScorePF) && property_exists($cardScorePF, 'forma_juridica')) {
                    $legalForm = $cardScorePF->forma_juridica ?? "";
                }
            }                        
            
            if ($idioma == 'ESP') {
                $persona->formales = new stdClass();
                $persona->formales->tipo_persona = $p_fisica;
                $persona->formaldata->forma_legal = $legalForm;
            } elseif ($idioma == 'ENG') {
                $persona->formaldata = new stdClass();
                $persona->formaldata->legal_type = $p_fisica;
                $persona->formaldata->legal_form = $legalForm;
            }

			$telefonos          = SQLConnection::backendStoreProcedure('obtener_telefono', array($id_padron));
			
			if( $idioma == 'ESP' ){
				$persona->formales->identificacion = $cuit;
			} elseif( $idioma == 'ENG' ){
				$persona->formaldata->taxid = $cuit;
			}

			if($fisica_juridica == 'F'){
				$datos_persona                      = SQLConnection::backendStoreProcedure('obtener_persona', array($cuit),true);
				$nombre                             = $datos_persona->nombre_persona;
				$dni                                = (int)substr($cuit, 2,-1);
				$empleado_de                        = SQLConnection::backendStoreProcedure('obtener_empleado_de', array($cuit));
				if( $idioma == 'ESP' ){
					$persona->formales->dni             = (string)$dni;
					$persona->formales->telefonos       = $telefonos;
					$persona->formales->sexo            = $datos_persona->sexo;
					$persona->formales->anio_nacimiento = $datos_persona->anio_nacimiento;
					//$persona->formales->nacionalidad    = ''; // en www2 estaba sacada esta linea
					//$persona->formales->ejemplar        = '';
					$persona->formales->defuncion = new stdClass();
				} elseif( $idioma == 'ENG' ){
					$persona->formaldata->national_id             = (string)$dni;
					$persona->formaldata->phone       = $telefonos;
					$persona->formaldata->gender            = $datos_persona->sexo;
					$persona->formaldata->YOB = $datos_persona->anio_nacimiento;
					//$persona->formaldata->nacionalidad    = ''; // en www2 estaba sacada esta linea
					//$persona->formaldata->ejemplar        = '';
					$persona->formaldata->death_info = new stdClass();
				}

				if(!empty($datos_persona->fecha_nacimiento)){
					$edad = Misc::calcularEdad($datos_persona->fecha_nacimiento);
					if($edad){
						if( $idioma == 'ESP' ){
							$persona->formales->edad = $edad;
						} elseif( $idioma == 'ENG' ){
							$persona->formaldata->age = $edad;
						}
					}
				}
				//
				if( $idioma == 'ESP' ){
					$persona->formales->empleado_de       = $empleado_de;
					$persona->formales->profesion         = $datos_persona->profesion;
					$persona->formales->fecha_nacimiento  = $datos_persona->fecha_nacimiento;
					$persona->formales->estado_civil      = $datos_persona->estado_civil;
					//
					$persona->formales->defuncion->fuente       = !empty($defuncion->fuente)        ? $defuncion->fuente : '-' ;
					$persona->formales->defuncion->fecha_deceso = !empty($defuncion->fecha_deceso)  ? $defuncion->fecha_deceso : '-'  ;
					$persona->formales->defuncion->defuncion    = !empty($defuncion->defuncion)     ? $defuncion->defuncion : '-'  ;
				} elseif( $idioma == 'ENG' ){
					// FALTA TRADUCIR
					$persona->formaldata->employee_of       = $empleado_de;
					$persona->formaldata->profession         = $datos_persona->profesion;
					$persona->formaldata->DOB  = $datos_persona->fecha_nacimiento;
					$persona->formaldata->marital_status      = $datos_persona->estado_civil;
					//
					$persona->formaldata->death_info->source       = !empty($defuncion->fuente)        ? $defuncion->fuente : '-' ;
					$persona->formaldata->death_info->DOD = !empty($defuncion->fecha_deceso)  ? $defuncion->fecha_deceso : '-'  ;
					$persona->formaldata->death_info->isdead    = !empty($defuncion->defuncion)     ? $defuncion->defuncion : '-'  ;
				}
			}else{
				$nombre       	= SQLConnection::obtenerRazonSocial($cuit)->nombre_persona;
				$sociedades 	= SQLConnection::backendStoreProcedure('obtener_sociedades', array($cuit));
				$info_empresa_formales = [];
				$card_empleados = SQLConnection::backendStoreProcedure('obtener_empleados', array($cuit),'selectOne');
				//
				if(isset($card_empleados->total)){
					if( $idioma == 'ESP' ){
						$card_empleados->total = (int)$card_empleados->total;
					} elseif( $idioma == 'ENG' ){
						$card_empleados->perc_men = $card_empleados->cantidad_hombres;
						$card_empleados->perc_women = $card_empleados->cantidad_mujeres;
						$card_empleados->total_employees = (int)$card_empleados->total;
						$card_empleados->period = $card_empleados->fecha;
						//
						unset($card_empleados->cantidad_mujeres);
						unset($card_empleados->cantidad_hombres);
						unset($card_empleados->total);
						unset($card_empleados->fecha);
					}
				}
				//
				if( $idioma == 'ESP' ){
					$persona->formales->empleados = $card_empleados;
				} elseif( $idioma == 'ENG' ){
					$persona->formaldata->employees = $card_empleados;
				}
				//
				if( $idioma == 'ESP' ){
					foreach ($sociedades as $key => $value) {
						$info_empresa_formales[$key] 								= new stdClass();
						$info_empresa_formales[$key]->ramo 							= $value->ramo; 
						$info_empresa_formales[$key]->subramo 						= $value->subramo; 
						$info_empresa_formales[$key]->fecha_contrato_social 		= $value->fecha_cons; 
						$info_empresa_formales[$key]->capital 						= (int)$value->capital; 
					}
					$persona->formales->mas_info = $info_empresa_formales;
				} elseif( $idioma == 'ENG' ){
					foreach ($sociedades as $key => $value) {
						$info_empresa_formales[$key] 								= new stdClass();
						$info_empresa_formales[$key]->ramo 							= $value->ramo; 
						$info_empresa_formales[$key]->subramo 						= $value->subramo; 
						$info_empresa_formales[$key]->social_contract_date 		= $value->fecha_cons; 
						$info_empresa_formales[$key]->capital 						= (int)$value->capital; 
					}
					$persona->formaldata->more_info = $info_empresa_formales;
				}
				//
				$claes_info    	= SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
				$claes 			= [];
				//
				if( $idioma == 'ESP' ){
					foreach ($claes_info as $key => $value) {
						$claes[$key] 				= new stdClass();
						$claes[$key]->cod_clae 		= $value->cod_clae; 
						$claes[$key]->descripcion 	= $value->descripcion; 
					}
					$persona->formales->claes = $claes;
				} elseif( $idioma == 'ENG' ){
					foreach ($claes_info as $key => $value) {
						$claes[$key] 				= new stdClass();
						$claes[$key]->clae_code 		= $value->cod_clae; 
						$claes[$key]->description 	= $value->descripcion; 
					}
					$persona->formaldata->economic_activity = $claes;
				}
			}
			//
			if( $idioma == 'ESP' ){
				$persona->formales->nombre  = $nombre;
				$persona->formales->domicilios = new stdClass();
			} elseif( $idioma == 'ENG' ){
				$persona->formaldata->legal_name  = $nombre;
				$persona->formaldata->addresses = new stdClass();
			}
			//
			$domicilios = SQLConnection::backendStoreProcedure('sp_obtener_domicilios', array($cuit));
			//
		  	if(!empty($domicilios)){
				if( $idioma == 'ESP' ){
					foreach ($domicilios as $key => $value) {
						// $domicilios[$key]->domicilio  = $domicilios[$key]->domicilio;
						$domicilios[$key]->provincia  = $domicilios[$key]->prv_nombre;
						$domicilios[$key]->localidad  = $domicilios[$key]->loc_nombre;
						$domicilios[$key]->pais       = $domicilios[$key]->pai_nombre;
						$domicilios[$key]->cp         = $domicilios[$key]->codpos;
						// unset($domicilios[$key]->domicilio);
						unset($domicilios[$key]->prv_nombre);
						unset($domicilios[$key]->loc_nombre);
						unset($domicilios[$key]->pai_nombre);
						unset($domicilios[$key]->codpos);
						unset($domicilios[$key]->id);
						unset($domicilios[$key]->tipo_domicilio);
						unset($domicilios[$key]->created);
					}
					//
					$persona->formales->domicilios = $domicilios;
				} elseif( $idioma == 'ENG' ){
					// nahu
					foreach ($domicilios as $key => $value) {
						$domicilios[$key]->address = $domicilios[$key]->domicilio;
						$domicilios[$key]->state  = $domicilios[$key]->prv_nombre;
						$domicilios[$key]->city  = $domicilios[$key]->loc_nombre;
						$domicilios[$key]->country       = $domicilios[$key]->pai_nombre;
						$domicilios[$key]->zip_code         = $domicilios[$key]->codpos;
						//
						unset($domicilios[$key]->domicilio);
						unset($domicilios[$key]->prv_nombre);
						unset($domicilios[$key]->loc_nombre);
						unset($domicilios[$key]->pai_nombre);
						unset($domicilios[$key]->codpos);
						unset($domicilios[$key]->id);
						unset($domicilios[$key]->tipo_domicilio);
						unset($domicilios[$key]->created);
					}
					//
					$persona->formaldata->addresses = $domicilios;
				}
			}
		}

		// FALTA TARDUCIR NODO BALANCE
		/* if( $idioma == 'ESP' ){
			$persona->balances = [];
			$persona->balances  = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
		} elseif( $idioma == 'ENG' ){
			// FALTA TRADUCIR
			$persona->balance_sheets = [];
			$persona->balance_sheets  = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
		} */

		//$participaciones  = [];
		//$vinculaciones    = []; // estaba wn www2
		//$relaciones       = []; // estaba wn www2 
	 
		//Información socios/directores/sociedades.
		if( $configuracion->relaciones  == 1 ){
			//
			if( $idioma == 'ESP' ){
				$persona->relaciones = new stdClass();
				$persona->relaciones->socios          = [];
				$persona->relaciones->participaciones = [];
				$persona->relaciones->vinculaciones   = [];
				//
				if($fisica_juridica == 'F'){
					$relaciones             = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit,$fisica_juridica));
					$participaciones        = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
					$vinculaciones          = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
		
				}else{
					$relaciones             = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit,$fisica_juridica));
					$participaciones        = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
					$vinculaciones          = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
				}
				//
				$i = 0;
				foreach($participaciones as $key => $value){
					$persona->relaciones->participaciones[$i]                = new stdClass();
					$persona->relaciones->participaciones[$i]->razon_social_sociedad  = $value->nombre_sociedad;
					$persona->relaciones->participaciones[$i]->cuit_sociedad          = $value->cuit_sociedad;
					$persona->relaciones->participaciones[$i]->cuit_socio             = $value->cuit_socio;
					$persona->relaciones->participaciones[$i]->nombre_socio           = $value->nombre_socio;
					$persona->relaciones->participaciones[$i]->cargo                  = $value->cargo;
					$i++;
				}
				//
				$i = 0;
				foreach($relaciones as $key => $value){
					$persona->relaciones->socios[$i]                  = new stdClass();
					$persona->relaciones->socios[$i]->cuit            = $value->cuit;
					$persona->relaciones->socios[$i]->pais            = $value->country_name;
					$persona->relaciones->socios[$i]->nombre_persona  = $value->nombre_persona;
					$persona->relaciones->socios[$i]->cargo           = $value->car_nombre;
					$persona->relaciones->socios[$i]->desde           = $value->c04_periodo_desde;
					$persona->relaciones->socios[$i]->hasta           = $value->c04_periodo_hasta;
					$i++;
				} 
				//
				$i = 0;
				foreach($vinculaciones as $key => $value){
					$persona->relaciones->vinculaciones[$i]                  = new stdClass();
					$persona->relaciones->vinculaciones[$i]->cuit            = $value->cuit_vinculada;
					$persona->relaciones->vinculaciones[$i]->nombre_persona  = $value->nombre_persona;
					$persona->relaciones->vinculaciones[$i]->tipo            = $value->nombre;
					$persona->relaciones->vinculaciones[$i]->detalle         = $value->detalle;
					$i++;
				}

			} elseif ( $idioma == 'ENG' ) {
				$persona->corporate_realationships = new stdClass();
				$persona->corporate_realationships->partners = [];
				$persona->corporate_realationships->shareholding_activity = [];
				$persona->corporate_realationships->linkages = [];
				//
				if($fisica_juridica == 'F'){
					$relaciones             = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit,$fisica_juridica));
					$participaciones        = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
					$vinculaciones          = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
				} else {
					$relaciones             = SQLConnection::backendStoreProcedure('obtener_socios_directores', array($cuit,$fisica_juridica));
					$participaciones        = SQLConnection::backendStoreProcedure('obtener_participacion_socios_directores', array($cuit));
					$vinculaciones          = SQLConnection::backendStoreProcedure('obtener_vinculaciones', array($cuit));
				}
				//
				$i = 0;
				foreach($participaciones as $key => $value){
					$persona->corporate_realationships->shareholding_activity[$i] = new stdClass();
					$persona->corporate_realationships->shareholding_activity[$i]->legal_name = $value->nombre_sociedad;
					$persona->corporate_realationships->shareholding_activity[$i]->taxid = $value->cuit_sociedad;
					$persona->corporate_realationships->shareholding_activity[$i]->taxid_sharheolder = $value->cuit_socio;
					$persona->corporate_realationships->shareholding_activity[$i]->legal_name_shareholder = $value->nombre_socio;
					$persona->corporate_realationships->shareholding_activity[$i]->role = $value->cargo;
					$i++;
				}
				//
				$i = 0;
				foreach($relaciones as $key => $value){
					$persona->corporate_realationships->partners[$i]                  = new stdClass();
					$persona->corporate_realationships->partners[$i]->taxid            = $value->cuit;
					$persona->corporate_realationships->partners[$i]->country            = $value->country_name;
					$persona->corporate_realationships->partners[$i]->legal_name  = $value->nombre_persona;
					$persona->corporate_realationships->partners[$i]->position           = $value->car_nombre;
					$persona->corporate_realationships->partners[$i]->from_date           = $value->c04_periodo_desde;
					$persona->corporate_realationships->partners[$i]->to_date           = $value->c04_periodo_hasta;
					$i++;
				} 
				//
				$i = 0;
				foreach($vinculaciones as $key => $value){
					$persona->corporate_realationships->linkages[$i]              = new stdClass();
					$persona->corporate_realationships->linkages[$i]->tax_id      = $value->cuit_vinculada;
					$persona->corporate_realationships->linkages[$i]->legal_name  = $value->nombre_persona;
					$persona->corporate_realationships->linkages[$i]->tipo        = $value->nombre;
					$persona->corporate_realationships->linkages[$i]->description     = $value->detalle;
					$i++;
				}
			}
		}

		//Información Comercial.
		if( $configuracion->comerciales == 1 ){
			if( $idioma == 'ESP' ){
				$persona->comerciales = new stdClass(); 
			} elseif( $idioma == 'ENG' ){
				$persona->commercial_data = new stdClass(); 
			}
			//
			$consultas_ramos  = SQLConnection::backendStoreProcedure('obtener_consulta_por_ramos', array($cuit,12));
			$seguros          = SQLConnection::backendSeguros($cuit);
			$marcas           = SQLConnection::backendStoreProcedure('obtener_marcas', array($cuit));
			$consultas = [];
			//
			if( $consultas_ramos ){
				if( $idioma == 'ESP' ){
					foreach($consultas_ramos as $key_ramo => $consulta){
						$consultas[$key_ramo]['nombre']    			  = $consulta->descripcion;
						$consultas[$key_ramo][$consulta->antiguedad]  = $consulta->cantidad;
					}
					//
					foreach($consultas as $key => $consulta){
						if(!isset($consultas[$key]['entre_0_1'])){
							$consultas[$key]['entre_0_1'] = 0;
						}
						//
						if(!isset($consultas[$key]['entre_1_2'])){
							$consultas[$key]['entre_1_2'] = 0;
						}
						//
						if(!isset($consultas[$key]['entre_2_5'])){
							$consultas[$key]['entre_2_5'] = 0;
						}
						//
						ksort($consultas[$key]);
					}
				} elseif( $idioma == 'ENG' ){
					foreach($consultas_ramos as $key_ramo => $consulta){
						$consultas[$key_ramo]['name']    			 	= $consulta->descripcion;
						$consultas[$key_ramo][$consulta->antiguedad]  	= $consulta->cantidad;
					}
					//
					foreach($consultas as $key => $consulta){
						if(!isset($consultas[$key]['between_0_1'])){
							$consultas[$key]['between_0_1'] = 0;
						}
						//
						if(!isset($consultas[$key]['between_1_2'])){
							$consultas[$key]['between_1_2'] = 0;
						}
						//
						if(!isset($consultas[$key]['between_2_5'])){
							$consultas[$key]['between_2_5'] = 0;
						}
						//
						ksort($consultas[$key]);
					}
				}
			}
			//
			if(!empty($marcas)){
				if($idioma == 'ESP'){
					foreach ($marcas as $key => $value) {
						unset($value->num_boletin);
						unset($value->directorio);
						unset($value->web);
						unset($value->fecha_publicacion);
						unset($value->encontrada);
					}
				} elseif($idioma == 'ENG'){
					foreach ($marcas as $key => $value) {
						$marcas[$key]->num_acta = $marcas[$key]->num_acta;
						$marcas[$key]->type = $marcas[$key]->tipo;
						$marcas[$key]->brand = $marcas[$key]->marca;
						$marcas[$key]->class = $marcas[$key]->clase;
						//
						unset($marcas[$key]->tipo);
						unset($marcas[$key]->marca);
						unset($marcas[$key]->clase);
						//
						unset($value->num_boletin);
						unset($value->directorio);
						unset($value->web);
						unset($value->fecha_publicacion);
						unset($value->encontrada);
					}
				}
			}
			//
			if(!empty($seguros)){
				if($idioma == 'ESP'){
					foreach ($seguros as $key => $value) {
						unset($seguros[$key]->seg_codigo);
						unset($seguros[$key]->rie_codigo);
						unset($seguros[$key]->id_seguros);
						unset($seguros[$key]->id_padron);
						unset($seguros[$key]->visible);
						unset($seguros[$key]->estado);
					}
				} elseif($idioma == 'ENG'){
					foreach ($seguros as $key => $value) {
						$seguros[$key]->company_name 	= $seguros[$key]->seg_nombre; 
						$seguros[$key]->type 			= $seguros[$key]->rie_nombre; 
						//
						unset($seguros[$key]->seg_nombre);
						unset($seguros[$key]->rie_nombre);
						//
						unset($seguros[$key]->seg_codigo);
						unset($seguros[$key]->rie_codigo);
						unset($seguros[$key]->id_seguros);
						unset($seguros[$key]->id_padron);
						unset($seguros[$key]->visible);
						unset($seguros[$key]->estado);
					}		
				}
			}
			//
			if( $idioma == 'ESP' ){
				$persona->comerciales->consultas  = $consultas;
				$persona->comerciales->seguros    = $seguros;
				$persona->comerciales->marcas 	  = $marcas; 
			} elseif( $idioma == 'ENG' ){
				$persona->commercial_data->qtyqueries 	= $consultas;
				$persona->commercial_data->insurances 	= $seguros;
				$persona->commercial_data->brands 		= $marcas;
			}
		}

		//Información Contables.
		if( $configuracion->contables == 1 ){
			// $MainController = new MainController();
			// $contables      = json_decode($MainController->obtenerContables(true,'','','','','','','','','','',$cuit)->getContent())->info;
			//
			if( $idioma == 'ESP' ){
				$persona->balances = [];
				$persona->balances  = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
				//
				foreach( $persona->balance_sheets as $key => $value ){
					unset($persona->balance_sheets[$key]->id_balance);
					unset($persona->balance_sheets[$key]->cuit);
					unset($persona->balance_sheets[$key]->fecha_balance);
					unset($persona->balance_sheets[$key]->ejercicio);
					unset($persona->balance_sheets[$key]->periodo);
					unset($persona->balance_sheets[$key]->bal_manifestacion);
					unset($persona->balance_sheets[$key]->comentarios);
				}
			} elseif( $idioma == 'ENG' ){
				//
				$persona->balance_sheets = [];
				$persona->balance_sheets  = SQLConnection::backendStoreProcedure('api_obtener_balances', array($cuit));
				//
				foreach( $persona->balance_sheets as $key => $value ){
					$persona->balance_sheets[$key]->currency = $persona->balance_sheets[$key]->moneda;
					$persona->balance_sheets[$key]->date = $persona->balance_sheets[$key]->fecha_balance_dmy;
					//
					unset($persona->balance_sheets[$key]->moneda);
					unset($persona->balance_sheets[$key]->fecha_balance_dmy);
					//
					unset($persona->balance_sheets[$key]->id_balance);
					unset($persona->balance_sheets[$key]->cuit);
					unset($persona->balance_sheets[$key]->fecha_balance);
					unset($persona->balance_sheets[$key]->ejercicio);
					unset($persona->balance_sheets[$key]->periodo);
					unset($persona->balance_sheets[$key]->bal_manifestacion);
					unset($persona->balance_sheets[$key]->comentarios);
				}
			}
		}

		//Información Fiscal.
		if( $configuracion->fiscales == 1 ){
			if( $idioma == 'ESP' ){
				$persona->fiscales = new stdClass();
			} elseif( $idioma == 'ENG' ){
				$persona->fiscal_data = new stdClass();
			}
			//
			$claes             = SQLConnection::backendStoreProcedure('obtener_clae', array($cuit));
			$inscripciones     = SQLConnection::backendStoreProcedure('obtener_inscripciones', array($cuit));
			$impuestos         = SQLConnection::backendStoreProcedure('obtener_padron_impuestos', array($id_padron));
			$apocrifas         = SQLConnection::backendStoreProcedure('obtener_apocrifas', array($cuit));
			$sircreb           = SQLConnection::backendStoreProcedure('obtener_sircreb', array($cuit));
			$arba              = SQLConnection::backendStoreProcedure('obtener_arba', array($cuit));
			$aportes           = SQLConnection::backendStoreProcedure('backend_mis_aportes', array($cuit, NULL, 12, 1), false);
			//
			if( $idioma == 'ESP' ){
				$persona->fiscales->aportes             = $aportes;
				$persona->fiscales->clae                = $claes;
				$persona->fiscales->inscripciones       = $inscripciones;
				$persona->fiscales->impuestos           = $impuestos;
				$persona->fiscales->facturas_apocrifas  = $apocrifas;
				$persona->fiscales->sircreb             = $sircreb;
				$persona->fiscales->arba                = $arba;
				//
			} elseif( $idioma == 'ENG' ){
				$persona->fiscal_data->social_security_contributions = $aportes;//AGB VER CON DATOS
				$persona->fiscal_data->economic_activity_code = $claes;
				//
				foreach ($persona->fiscal_data->economic_activity_code as $key => $clae) { 
					$persona->fiscal_data->economic_activity_code[$key]->code = $clae->cod_clae;
					$persona->fiscal_data->economic_activity_code[$key]->description = $clae->descripcion;
					$persona->fiscal_data->economic_activity_code[$key]->start_date = $clae->fecha_inicio_actividad;
					unset($persona->fiscal_data->economic_activity_code[$key]->cod_clae);
					unset($persona->fiscal_data->economic_activity_code[$key]->descripcion);
					unset($persona->fiscal_data->economic_activity_code[$key]->fecha_inicio_actividad);
				}
				//
				foreach ($inscripciones as $key => $value) {
					$inscripciones[$key]->social_contract_date = $inscripciones[$key]->fecha_contrato_social;
					$inscripciones[$key]->registration_number = $inscripciones[$key]->numero_inscripcion;
					$inscripciones[$key]->registration_date = $inscripciones[$key]->fecha_inscripcion;
					$inscripciones[$key]->monotributo = $inscripciones[$key]->monotributo;
					$inscripciones[$key]->activity_start_date = $inscripciones[$key]->inicio_actividad;
					$inscripciones[$key]->employer = $inscripciones[$key]->empleador;
					//
					unset($inscripciones[$key]->fecha_contrato_social);
					unset($inscripciones[$key]->numero_inscripcion);
					unset($inscripciones[$key]->fecha_inscripcion);
					unset($inscripciones[$key]->inicio_actividad);
					unset($inscripciones[$key]->empleador);
				}
				$persona->fiscal_data->registered_taxes = $inscripciones;
				//
				foreach ($impuestos as $key => $value) {
					$impuestos[$key]->tax_code = $impuestos[$key]->codigo_impuesto;
					$impuestos[$key]->tax_name = $impuestos[$key]->nombre_impuesto;
					$impuestos[$key]->registration_date = $impuestos[$key]->fecha_inscripcion;
					$impuestos[$key]->state = $impuestos[$key]->estado;
					//
					unset($impuestos[$key]->codigo_impuesto);
					unset($impuestos[$key]->nombre_impuesto);
					unset($impuestos[$key]->fecha_inscripcion);
					unset($impuestos[$key]->estado);
				}
				//
				$persona->fiscal_data->taxes = $impuestos;
				$persona->fiscal_data->apocryphal_invoices = $apocrifas;
				$persona->fiscal_data->sircreb = $sircreb;
				$persona->fiscal_data->arba = $arba;
			}
		}
		
		//informacion de bancos
		if( $configuracion->bancos_y_cheques == 1 ){
			//
			$bancos = SQLConnection::backendStoreProcedure('backend_central_deudores', array($cuit,24,1));
			$periodo =  SQLConnection::backendStoreProcedure('obtener_periodo_maximo', array($cuit),'selectOne');
			if( $idioma == 'ESP' ){
				$persona->periodos = new stdClass(); 
				$persona->periodos->bancos = Misc::convertirFormatoFecha($periodo->periodo_maximo,'Y-m-d','Ym');
				$persona->bancos  = [];
				//
				foreach ($bancos as $key => $value) {
					$persona->bancos[$key]  = new stdClass();
					$persona->bancos[$key]->codigo_entidad  = $value->codigo_ent;
					$persona->bancos[$key]->nombre_entidad  = $value->nombre;
					$persona->bancos[$key]->periodo         = $value->fec_inf;
					$persona->bancos[$key]->situacion       = $value->situacion;
					$persona->bancos[$key]->monto           = $value->total;
					$persona->bancos[$key]->dias_atraso     = $value->dia_atraso;
				}
			} elseif( $idioma == 'ENG' ){
				$persona->max_bank_information = new stdClass(); 
				$persona->max_bank_information->period = Misc::convertirFormatoFecha($periodo->periodo_maximo,'Y-m-d','Ym');
				$persona->banks  = [];
				//
				foreach ($bancos as $key => $value) {
					$persona->banks[$key]  = new stdClass();
					$persona->banks[$key]->bank_code = $value->codigo_ent;
					$persona->banks[$key]->bank_name = $value->nombre;
					$persona->banks[$key]->period = $value->fec_inf;
					$persona->banks[$key]->status = $value->situacion;
					$persona->banks[$key]->amount = $value->total;
					$persona->banks[$key]->days_late = $value->dia_atraso;
				}
			}
			//
			if( $idioma == 'ESP' ){
				$persona->vinculados_segun_bcra = [];
			} elseif( $idioma == 'ENG' ){
				$persona->representatives_with_banking_system = [];
			}
			//informacion de cheques
			$cheques = SQLConnection::backendStoreProcedure('obtener_cheques', array($cuit));
			$i = 0;
			foreach ($cheques as $key => $value) {
				if($value->tipo == 'vinculaciones'){
					if( $idioma == 'ESP' ){
						$persona->vinculados_segun_bcra[$i] = new stdClass();
						$persona->vinculados_segun_bcra[$i]->nombre_persona_firmante     = $value->nombre_persona_firmante;
						$persona->vinculados_segun_bcra[$i]->cuit_firmante               = $value->cuit_firmante;
						$persona->vinculados_segun_bcra[$i]->nombre_persona_relacionado  = $value->nombre_persona_relacionado;
						$persona->vinculados_segun_bcra[$i]->cuit_relacionado            = $value->Cuit_relacionado;
						$persona->vinculados_segun_bcra[$i]->cantidad_cheques_firmados   = $value->cantidad;
						$persona->vinculados_segun_bcra[$i]->cantidad_cheques_totales    = $value->total_cheques;
						unset($cheques[$i]);
						$i+=1;
					} elseif( $idioma == 'ENG' ){
						//
						$persona->representatives_with_banking_system[$i] = new stdClass();
						$persona->representatives_with_banking_system[$i]->signer 					   = $value->nombre_persona_firmante;
						$persona->representatives_with_banking_system[$i]->signer_tax_id               = $value->cuit_firmante;
						$persona->representatives_with_banking_system[$i]->related  				   = $value->nombre_persona_relacionado;
						$persona->representatives_with_banking_system[$i]->related_tax_id              = $value->Cuit_relacionado;
						$persona->representatives_with_banking_system[$i]->signed_checks   			   = $value->cantidad;
						$persona->representatives_with_banking_system[$i]->total_checks    			   = $value->total_cheques;
						unset($cheques[$i]);
						$i+=1;
					}
				}else{
					unset($cheques[$key]->idp);
					unset($cheques[$key]->idppr);
					unset($cheques[$key]->cantidad);
					unset($cheques[$key]->total_cheques);
				}
			}
			//
			if( $idioma == 'ESP' ){
				$persona->cheques = array_values($cheques);
			} elseif( $idioma == 'ENG' ){
				$persona->bounced_checks = array_values($cheques);
				//
				foreach( $persona->bounced_checks as $key => $value ){
					$persona->bounced_checks[$key]->signer	  					= $persona->bounced_checks[$key]->nombre_persona_firmante;
					$persona->bounced_checks[$key]->signer_tax_id	           	= $persona->bounced_checks[$key]->cuit_firmante;
					$persona->bounced_checks[$key]->related						= $persona->bounced_checks[$key]->nombre_persona_relacionado;
					$persona->bounced_checks[$key]->related_tax_id	        	= $persona->bounced_checks[$key]->Cuit_relacionado;
					$persona->bounced_checks[$key]->check_number	           	= $persona->bounced_checks[$key]->nro_cheque;
					$persona->bounced_checks[$key]->rejection_date	           	= $persona->bounced_checks[$key]->fecha_rechazo;
					$persona->bounced_checks[$key]->cover_payment_date	        = $persona->bounced_checks[$key]->fecha_levantamiento;
					$persona->bounced_checks[$key]->import	           			= $persona->bounced_checks[$key]->importe;
					$persona->bounced_checks[$key]->cause	           			= $persona->bounced_checks[$key]->causa;
					$persona->bounced_checks[$key]->type	           			= $persona->bounced_checks[$key]->tipo;
					$persona->bounced_checks[$key]->payment_date	  			= $persona->bounced_checks[$key]->fecha_pago;
					//
					unset($persona->bounced_checks[$key]->fecha_pago);
					unset($persona->bounced_checks[$key]->nombre_persona_firmante);
					unset($persona->bounced_checks[$key]->cuit_firmante);
					unset($persona->bounced_checks[$key]->nombre_persona_relacionado);
					unset($persona->bounced_checks[$key]->Cuit_relacionado);
					unset($persona->bounced_checks[$key]->nro_cheque);
					unset($persona->bounced_checks[$key]->fecha_rechazo);
					unset($persona->bounced_checks[$key]->fecha_levantamiento);
					unset($persona->bounced_checks[$key]->importe);
					unset($persona->bounced_checks[$key]->causa);
					unset($persona->bounced_checks[$key]->tipo);
				}
			}
		}
		
		//Información Comex.
		if ( $configuracion->comex == 1 ){
			if( $idioma == 'ESP' ){
				$persona->comex = new stdClass();
			} elseif( $idioma == 'ENG' ){
				$persona->comex = new stdClass();
			}
			//
			$impo     =  SQLConnection::backendStoreProcedure('obtener_comex', array($cuit),'select');
			$pais     =  SQLConnection::backendStoreProcedure('obtener_comex_pais', array($cuit),'select');
			$rubros   =  SQLConnection::backendStoreProcedure('obtener_comex_rubros', array($cuit),'select');
			$totales  =  SQLConnection::backendStoreProcedure('obtener_comex_totales', array($cuit),'selectOne');
			//
			if( $idioma == 'ESP' ){
				$persona->comex->importaciones = [];
				if(!empty($impo)){
					foreach ($impo as $key => $value) {
						$persona->comex->importaciones[$key] = new StdClass();
						$persona->comex->importaciones[$key]->fecha 		= $value->date;
						$persona->comex->importaciones[$key]->consumo 		= $value->consumo;
						$persona->comex->importaciones[$key]->deposito 		= $value->deposito;
						$persona->comex->importaciones[$key]->zonafranca 	= $value->zonafranca;
						$persona->comex->importaciones[$key]->temporal 		= $value->temporal;
						$persona->comex->importaciones[$key]->total 		= $value->total;
					}
				}
			} elseif( $idioma == 'ENG' ){
				//
				$persona->comex->imports = [];
				if(!empty($impo)){
					foreach ($impo as $key => $value) {
						$persona->comex->imports[$key] = new StdClass();
						$persona->comex->imports[$key]->date 			= $value->date;
						$persona->comex->imports[$key]->consumption 	= $value->consumo;
						$persona->comex->imports[$key]->deposit  		= $value->deposito;
						$persona->comex->imports[$key]->free_trade_zone = $value->zonafranca;
						$persona->comex->imports[$key]->temporary  		= $value->temporal;
						$persona->comex->imports[$key]->total 			= $value->total;
					}
				}
			}
			//
			if(!empty($pais)){
				//
				if( $idioma == 'ESP' ){
					foreach ($pais as $key => $value) {
						$persona->comex->pais[$key] = new StdClass();
						$persona->comex->pais[$key]->tipo_operacion  = $value->tipo_operacion;
						$persona->comex->pais[$key]->fob             = $value->fob;
					}
				} elseif( $idioma == 'ENG' ){
					foreach ($pais as $key => $value) {
						$persona->comex->country[$key] = new StdClass();
						$persona->comex->country[$key]->operation  	 	= $value->tipo_operacion;
						$persona->comex->country[$key]->fob             = $value->fob;
					}
				}
			}
			//
			if(!empty($rubros)){
				// FALTA TRADUCIR
				if( $idioma == 'ESP' ){
					foreach ($rubros as $key => $value) {
						$persona->comex->rubros[$key] = new StdClass();
						$persona->comex->rubros[$key]->tipo_operacion  = $value->tipo_operacion;
						$persona->comex->rubros[$key]->descripcion     = $value->descripcion;
						$persona->comex->rubros[$key]->fob             = $value->fob;
						$persona->comex->rubros[$key]->posicion        = $value->posicion;
					}
				} elseif( $idioma == 'ENG' ){
					foreach ($rubros as $key => $value) {
						$persona->comex->category[$key] = new StdClass();
						$persona->comex->category[$key]->operation  	   = $value->tipo_operacion;
						$persona->comex->category[$key]->description     = $value->descripcion;
						$persona->comex->category[$key]->fob             = $value->fob;
						$persona->comex->category[$key]->position        = $value->posicion;
					}
				}
			}
			// 
			if(!empty($totales)){
				if( $idioma == 'ESP' ){
					$persona->comex->totales = new StdClass();
					$persona->comex->totales->total_impo  = $totales->total_impo;
					$persona->comex->totales->total_expo  = $totales->total_expo;
				}elseif( $idioma == 'ENG' ){
					$persona->comex->total = new StdClass();
					$persona->comex->total->total_imports  = $totales->total_impo;
					$persona->comex->total->total_exports  = $totales->total_expo;
				}
			}
		}
		
		//Información Legales.
		if ( $configuracion->legales == 1 ){
			$actor      =  SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null,'A',$cuit,60,1),'select');
			$demandado  =  SQLConnection::backendStoreProcedure('obtener_juicios_demandado_actor', array(null,'D',$cuit,60,1),'select');
			if( $idioma == 'ESP' ){
				$persona->legales = new StdClass();
				$persona->legales->actor      = [];
				$persona->legales->demandado  = [];
				//
				foreach ($actor as $key => $value) {
					$persona->legales->actor[$key] = new StdClass();
					$persona->legales->actor[$key]->fecha_causa   = $value->fecha_causa;
					$persona->legales->actor[$key]->nombre_causa  = $value->nombre_causa;
					$persona->legales->actor[$key]->cuit          = $value->cuit_otra_parte;
					$persona->legales->actor[$key]->nombre        = $value->nombre_padron_otra_parte;
					$persona->legales->actor[$key]->juzgado       = $value->juzgado;
					$persona->legales->actor[$key]->secretaria    = $value->secretaria;
				}
				//
				foreach ($demandado as $key => $value) {
					$persona->legales->demandado[$key] = new StdClass();
					$persona->legales->demandado[$key]->fecha_causa   = $value->fecha_causa;
					$persona->legales->demandado[$key]->nombre_causa  = $value->nombre_causa;
					$persona->legales->demandado[$key]->cuit          = $value->cuit_otra_parte;
					$persona->legales->demandado[$key]->nombre        = $value->nombre_padron_otra_parte;
					$persona->legales->demandado[$key]->expediente    = $value->expediente;
					$persona->legales->demandado[$key]->juzgado       = $value->juzgado;
					$persona->legales->demandado[$key]->secretaria    = $value->secretaria;
				}
			} elseif( $idioma == 'ENG' ){
				$persona->legal = new StdClass();
				$persona->legal->plaintiff = [];
				$persona->legal->defendant = [];
				//
				foreach ($actor as $key => $value) {
					$persona->legal->plaintiff[$key] = new StdClass();
					$persona->legal->plaintiff[$key]->case_date   	= $value->fecha_causa;
					$persona->legal->plaintiff[$key]->process_type  = $value->nombre_causa;
					$persona->legal->plaintiff[$key]->tax_id        = $value->cuit_otra_parte;
					$persona->legal->plaintiff[$key]->name        	= $value->nombre_padron_otra_parte;
					$persona->legal->plaintiff[$key]->court       	= $value->juzgado;
					$persona->legal->plaintiff[$key]->court_clerk   = $value->secretaria;
				}
				//
				foreach ($demandado as $key => $value) {
					$persona->legal->defendant[$key] = new StdClass();
					$persona->legal->defendant[$key]->case_date   		= $value->fecha_causa;
					$persona->legal->defendant[$key]->process_type  	= $value->nombre_causa;
					$persona->legal->defendant[$key]->tax_id        	= $value->cuit_otra_parte;
					$persona->legal->defendant[$key]->name        		= $value->nombre_padron_otra_parte;
					$persona->legal->defendant[$key]->process_number	= $value->expediente;
					$persona->legal->defendant[$key]->court       		= $value->juzgado;
					$persona->legal->defendant[$key]->court_clerk   	= $value->secretaria;
				}
			}
		}
		//
		return Response::JSON($persona);
  	}

      public static function apiBcra(){
		$usuario  = Session::get('usuario');
		$user_id  = $usuario->user_id;
		$cliente  = $usuario->cliente['client_id'];
		$tax_id   = trim(Request::input('tax_id'));

		if(empty($tax_id))
		{
			return json_encode([
				'Status'=>'ERROR','Message'=>'TAX_ID CANNOT BE NULL','Response'=>[]
			]);
		}		

		$producto = $usuario->producto ?? 87; 
		self::consumir_servicio($tax_id,$producto); 
	
		if(strlen($tax_id) == 11){
			AFIPController::obtenerPadron($tax_id,true,'AR',false);
		}
		else 
		{
			return json_encode([
				'Status'=>'ERROR','Message'=>'TAX_ID ERROR','Response'=>[]
			]);
		}
	
		$datos = SQLConnection::backendStoreProcedure('API_BCRA',array($cliente,$tax_id),'select');	
		//var_dump($datos); die(); 
		$result = [];
		foreach($datos as $key => $persona){
		
			$result[0][$persona->nodo] = new StdClass();
			$result[0][$persona->nodo]->valor = $persona->valor;
			$result[0][$persona->nodo]->detalle = $persona->detalle;
			
		}
		return json_encode([
			 'Status'=>'OK','Message'=>'OK','Response'=>$result
		]);

	}

}
