<?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 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))->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;
        }
    }

    /**
     * @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) && $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_api($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));
    }

    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' => $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
		]);

	}

}
