<?php

namespace App\Http\Controllers;

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

use App\Custom\SQLConnection;
use App\Custom\Misc;
use App\Http\Controllers\MainController;

use DateTime;

class AFIPController extends Controller
{
	/*
				public static $tiempo_p_juridica    = env('AFIP_TIEMPO_JURIDICA');
				public static $tiempo_p_fisica      = env('AFIP_TIEMPO_FISICA');
				*/
	public static $fecha_afip = '';
	private static $modificar_consulta = false;

	//obtiene los datos de token generados para AFIP
	private static function obtenerDatosLogin($metodo)
	{

		$datos = '';
		//$datos = session::get($metodo);
		if ($datos) {
			return $datos;
		}
		$datos = SQLConnection::backendStoreProcedure('afip_obtener_datos_login', array($metodo), 'selectOne');
		// TODO: Aqui esta consulta no me devuelva nada
		//dd($metodo);
		if (!empty($datos)) {
			session::put($metodo, $datos);
			return $datos;
		} else {
			//time.afip.gov.ar
			$login = self::obtenerLoginCms($metodo);
			$datos = SQLConnection::backendStoreProcedure('afip_obtener_datos_login', array($metodo), 'selectOne');
			session::put($metodo, $datos);
			return $datos;
		}
	}

	private static function obtenerLoginCms($metodo)
	{
		if (!file_exists(env('AFIP_CERT'))) {
			return false;
		}
		if (!file_exists(env('AFIP_PRIVATEKEY'))) {
			return false;
		}
		if (!file_exists(env('AFIP_WSDL'))) {
			return false;
		}
		self::CreateTRA($metodo);
		$CMS = self::SignTRA();
		$resp = self::CallWSAA($CMS);
		$resp = simplexml_load_string($resp);
		if (isset($resp->credentials->token) && isset($resp->credentials->sign) && isset($resp->header->expirationTime)) {
			$token = $resp->credentials->token;
			$sign = $resp->credentials->sign;
			$expiracion = $resp->header->expirationTime;
			$expiracion = new DateTime($expiracion);
			$expiracion = $expiracion->format('Y-m-d H:i:s');
			SQLConnection::backendStoreProcedure('afip_guardar_autenticacion', array($token, $sign, $expiracion, $metodo));
			return true;
		}
		return false;
	}

	private static function CallWSAA($CMS)
	{
		if (ENV('SERVICIOS_AFIP') == true) {
			$client = new \SoapClient(env('AFIP_WSDL'), array(
				//    'proxy_host'     => PROXY_HOST,
				//   'proxy_port'     => PROXY_PORT,
				'soap_version' => SOAP_1_2,
				'location' => env('AFIP_URL_LOGIN'),
				'trace' => 1,
				'exceptions' => 1
			));
			$results = $client->loginCms(array('in0' => $CMS));
			file_put_contents("request-loginCms.xml", $client->__getLastRequest());
			file_put_contents("response-loginCms.xml", $client->__getLastResponse());

			if (is_soap_fault($results)) {
				exit("SOAP Fault: " . $results->faultcode . "\n" . $results->faultstring . "\n");
			}
			return $results->loginCmsReturn;
		}
		return 'SERVICIO NO DISPONIBLE';
	}

	private static function SignTRA()
	{
		$STATUS = openssl_pkcs7_sign(
			"TRA.xml",
			"TRA.tmp",
			"file://" . env('AFIP_CERT'),
			array("file://" . env('AFIP_PRIVATEKEY'), env('AFIP_PASSPHRASE')),
			array(),
			!PKCS7_DETACHED
		);
		if (!$STATUS) {
			exit("ERROR generating PKCS#7 signature\n");
		}
		$inf = fopen("TRA.tmp", "r");

		$i = 0;
		$CMS = "";
		while (!feof($inf)) {
			$buffer = fgets($inf);
			if ($i++ >= 4) {
				$CMS .= $buffer;
			}
		}
		fclose($inf);
		unlink("TRA.tmp");
		return $CMS;
	}

	private static function CreateTRA($metodo)
	{
		$TRA = new \SimpleXMLElement(
			'<?xml version="1.0" encoding="UTF-8"?>' .
			'<loginTicketRequest version="1.0">' .
			'</loginTicketRequest>'
		);
		$TRA->addChild('header');
		$TRA->header->addChild('uniqueId', date('U'));
		$TRA->header->addChild('generationTime', date('c', date('U') - 60));
		$TRA->header->addChild('expirationTime', date('c', date('U') + 60));
		$TRA->addChild('service', $metodo);
		$TRA->asXML('TRA.xml');
	}

	/*Servicio intermedio creado en el AFIPController, reconoce que servicios tiene activos y a cual debe apuntar
				, además si se le pasa un pais en el parámetro pais, se irá a buscar en otro padrón (implementación futura).*/
	/* 29-06-2021 el parametro $alta estaba = false, se cambio a = true */
	//public static function obtenerPadron($cuit = '', $alta = true, $pais = 'AR', $constancia = false)
	public static function obtenerPadron02072025($cuit = '', $alta = true, $pais = 'AR', $constancia = false, $dias_afip=null)
	{
		//validar consultas.
		if (!$cuit) {
			$cuit = Request::input('cuit');
		}
		if (ENV('SERVICIO_MONGO') == true) {
			MainController::verificarMongo($cuit);
		}

		/* if ($pais != 'AR') {
			return json_encode(['error' => "El servicio no se encuentra habilitado."]);
		}
		$cuit_length = strlen((string) $cuit);
		if ($cuit_length != 11) {
			return json_encode(['error' => "El cuit enviado no tiene un formato correcto, debe poseer exactamente 11 carácteres númericos"]);
		} */

		// connuslta CURL a la web de clientes .cloud
		$data = Misc::CURLCall(
			env('API_BUSCAR_PADRON'), 
			http_build_query([
				'apikey' => env('APIKEY_BUSCAR_PADRON'), 
				'pais_busqueda' => $pais, 
				'identificacion' => $cuit
			])
		);
		
		$decodedData = json_decode($data); 
		// Verifica si la decodificación fue exitosa y si Response existe
		if (isset($decodedData->Response) && is_array($decodedData->Response) && !empty($decodedData->Response)) {
			$encode = $decodedData->Response[0];
			return response()->json($encode);
		} else {
			return response()->json(['error' => 'Respuesta no encontrada o formato incorrecto'], 400);
		}

		#$consultar = self::validarConsulta($cuit, $pais);
		$consultar = self::validarConsulta($cuit, $pais, $dias_afip);
		$consulta_decode = json_decode($consultar);
		if (isset($consulta_decode->error)) {
			return $consultar;
		}
		// aqui no tendria q entrar
		if ($constancia) {
			return self::obtenerConstanciaPDF($cuit);
		}
		//verificar servicio activo
		$final_response = '';
		$servicios_afip = SQLConnection::backendStoreProcedure('obtener_estado_servicios_afip', [], false);

		foreach ($servicios_afip as $key => $servicio) {
			if ($servicio->activo == 1) {
				//var_dump($servicio->servicio); 
				$func = $servicio->servicio;
				//$func = 'obtenerWS'
				//TODO: ejecuta la funcion obtenerWSPadronA13();

				$final_response = self::$func($cuit, $alta);
				//var_dump($final_response); 
				//return self::$func($cuit,$alta);
			}
		}
		return $final_response;
		//echo($func." cuit: ".$cuit." - Alta: ".$alta);
	}

	public static function obtenerPadron($cuit = '', $alta = true, $pais = 'AR', $constancia = false)
	{
		//validar consultas.
		if (!$cuit) {
			$cuit = Request::input('cuit');
		}
		if (ENV('SERVICIO_MONGO') == true) {
			MainController::verificarMongo($cuit);
		}

		/* if ($pais != 'AR') {
			return json_encode(['error' => "El servicio no se encuentra habilitado."]);
		}
		$cuit_length = strlen((string) $cuit);
		if ($cuit_length != 11) {
			return json_encode(['error' => "El cuit enviado no tiene un formato correcto, debe poseer exactamente 11 carácteres númericos"]);
		} */

		// connuslta CURL a la web de clientes .cloud
		$data = Misc::CURLCall(
			env('API_BUSCAR_PADRON'), 
			http_build_query([
				'apikey' => env('APIKEY_BUSCAR_PADRON'), 
				'pais_busqueda' => $pais, 
				'identificacion' => $cuit
			])
		);
//		var_dump($data); die(); 
		$decodedData = json_decode($data); 		
		// Verifica si la decodificación fue exitosa y si Response existe
		if (isset($decodedData->Response) && is_array($decodedData->Response) && !empty($decodedData->Response)) {
			$encode = $decodedData->Response[0];
			$encode->tiempo_curl = $decodedData->tiempo_curl_afip;
			$encode->proveedor_curl = $decodedData->proveedor_curl_afip;
			$encode->tiempos_funciones_afip = $decodedData->tiempos_funciones_afip ?? [];
			return json_encode ($encode); 
			//return response()->json($encode);
			//return response()->json(['afip' => $encode, 'tiempo_curl' => $decodedData->tiempo_curl_afip, 'proveedor_curl' => $decodedData->proveedor_curl_afip ],400) ;
		} else {
			return response()->json(['error' => 'Respuesta no encontrada o formato incorrecto'], 400);
		}

		$consultar = self::validarConsulta($cuit, $pais);
		$consulta_decode = json_decode($consultar);
		if (isset($consulta_decode->error)) {
			return $consultar;
		}
		// aqui no tendria q entrar
		if ($constancia) {
			return self::obtenerConstanciaPDF($cuit);
		}
		//verificar servicio activo
		$final_response = '';
		$servicios_afip = SQLConnection::backendStoreProcedure('obtener_estado_servicios_afip', [], false);

		foreach ($servicios_afip as $key => $servicio) {
			if ($servicio->activo == 1) {
				//var_dump($servicio->servicio); 
				$func = $servicio->servicio;
				//$func = 'obtenerWS'
				//TODO: ejecuta la funcion obtenerWSPadronA13();

				$final_response = self::$func($cuit, $alta);
				//var_dump($final_response); 
				//return self::$func($cuit,$alta);
			}
		}

		return $final_response;
		//echo($func." cuit: ".$cuit." - Alta: ".$alta);
	}


	/*Servicio intermedio creado en el AFIPController, reconoce que servicios tiene activos y a cual debe apuntar
				, además si se le pasa un pais en el parámetro pais, se irá a buscar en otro padrón (implementación futura).*/
	/* 29-06-2021 el parametro $alta estaba = false, se cambio a = true */
	public static function obtenerPadronOrg($cuit = '', $alta = true, $pais = 'AR', $constancia = false)
    {
        //validar consultas.
        if (!$cuit) {
            $cuit = Request::input('cuit');
        }
        if (ENV('SERVICIO_MONGO') == true) {
            MainController::verificarMongo($cuit);
        }

        /* if ($pais != 'AR') {
            return json_encode(['error' => "El servicio no se encuentra habilitado."]);
        }
        $cuit_length = strlen((string) $cuit);
        if ($cuit_length != 11) {
            return json_encode(['error' => "El cuit enviado no tiene un formato correcto, debe poseer exactamente 11 carácteres númericos"]);
        } */

        // connuslta CURL a la web de clientes .cloud
        $data = Misc::CURLCall(
            env('API_BUSCAR_PADRON'), 
            http_build_query([
                'apikey' => env('APIKEY_BUSCAR_PADRON'), 
                'pais_busqueda' => $pais, 
                'identificacion' => $cuit
            ])
        );
        
        $decodedData = json_decode($data); 
        // Verifica si la decodificación fue exitosa y si Response existe
        if (isset($decodedData->Response) && is_array($decodedData->Response)) {
            $encode = $decodedData->Response[0];
            return response()->json($encode);
        } else {
            return response()->json(['error' => 'Respuesta no encontrada o formato incorrecto'], 400);
        }

        $consultar = self::validarConsulta($cuit, $pais);
        $consulta_decode = json_decode($consultar);
        if (isset($consulta_decode->error)) {
            return $consultar;
        }
        // aqui no tendria q entrar
        if ($constancia) {
            return self::obtenerConstanciaPDF($cuit);
        }
        //verificar servicio activo
        $final_response = '';
        $servicios_afip = SQLConnection::backendStoreProcedure('obtener_estado_servicios_afip', [], false);

        foreach ($servicios_afip as $key => $servicio) {
            if ($servicio->activo == 1) {
                //var_dump($servicio->servicio); 
                $func = $servicio->servicio;
                //$func = 'obtenerWS'
                //TODO: ejecuta la funcion obtenerWSPadronA13();

                $final_response = self::$func($cuit, $alta);
                //var_dump($final_response); 
                //return self::$func($cuit,$alta);
            }
        }
        return $final_response;
        //echo($func." cuit: ".$cuit." - Alta: ".$alta);
    }

    
	public static function obtenerPadron02122024($cuit = '', $alta = true, $pais = 'AR', $constancia = false)
	{
		//validar consultas.
		if (!$cuit) {
			$cuit = Request::input('cuit');
		}
		if (ENV('SERVICIO_MONGO') == true) {
			MainController::verificarMongo($cuit);
		}
		$consultar = self::validarConsulta($cuit, $pais);
		$consulta_decode = json_decode($consultar);
		if (isset($consulta_decode->error)) {
			return $consultar;
		}
		if ($constancia) {
			return self::obtenerConstanciaPDF($cuit);
		}
		//verificar servicio activo
		$final_response = '';
		$servicios_afip = SQLConnection::backendStoreProcedure('obtener_estado_servicios_afip', [], false);

		foreach ($servicios_afip as $key => $servicio) {
			if ($servicio->activo == 1) {
				//var_dump($servicio->servicio); 
				$func = $servicio->servicio;
				//$func = 'obtenerWS'
				//TODO: ejecuta la funcion obtenerWSPadronA13();

				$final_response = self::$func($cuit, $alta);
				//var_dump($final_response); 
				//return self::$func($cuit,$alta);
			}
		}
		return $final_response;
		//echo($func." cuit: ".$cuit." - Alta: ".$alta);
	}

	//--  VA A AFIP SI O SI  --//

	public static function obtenerPadronSi($cuit)
    {
        if (ENV('SERVICIO_MONGO') == true) {
            MainController::verificarMongo($cuit);
        }

        $alta = true;
        //verificar servicio activo
        $final_response = '';

        $servicios_afip = SQLConnection::backendStoreProcedure('obtener_estado_servicios_afip', [], false);

        $pais = 'AR';

        $data = Misc::CURLCall(
            env('API_BUSCAR_PADRON'), 
            http_build_query([
                'apikey' => env('APIKEY_BUSCAR_PADRON'), 
                'pais_busqueda' => $pais, 
                'identificacion' => $cuit
            ])
        );

        $decodedData = json_decode($data); 
        // Verifica si la decodificación fue exitosa y si Response existe
        if (isset($decodedData->Response) && is_array($decodedData->Response)) {
            $encode = $decodedData->Response[0];
            return response()->json($encode);
        } else {
            return response()->json(['error' => 'Respuesta no encontrada o formato incorrecto'], 400);
        }

        $func = 'obtenerWSPadronA5';  //--> empresa
        $final_response[1] = self::$func($cuit, $alta);
        $func = 'obtenerWSPadronA13'; //--> personas
        $final_response[0] = self::$func($cuit, $alta);


        return $final_response;
    }


	public static function obtenerPadronSi02122024($cuit)
	{
		if (ENV('SERVICIO_MONGO') == true) {
			MainController::verificarMongo($cuit);
		}

		$alta = true;
		//verificar servicio activo
		$final_response = '';

		$servicios_afip = SQLConnection::backendStoreProcedure('obtener_estado_servicios_afip', [], false);

		$func = 'obtenerWSPadronA5';  //--> empresa
		$final_response[1] = self::$func($cuit, $alta);
		$func = 'obtenerWSPadronA13'; //--> personas
		$final_response[0] = self::$func($cuit, $alta);


		return $final_response;
	}

	/*
				   ESTA FUNCION VA FORZADO SI O SI AFIP, SE ARMA ASI PARA ESTANDARIZAR DATOS. 
				   SE IMPLEMENTE EN validacionGBG_v2
				   */

	public static function obtenerPadronForzado($cuit = '', $alta = true, $pais = 'AR', $constancia = false)
    {
        //validar consultas.
        if (!$cuit) {
            $cuit = Request::input('cuit');
        }
        if (ENV('SERVICIO_MONGO') == true) {
            MainController::verificarMongo($cuit);
        }

        $data = Misc::CURLCall(
            env('API_BUSCAR_PADRON'), 
            http_build_query([
                'apikey' => env('APIKEY_BUSCAR_PADRON'), 
                'pais_busqueda' => $pais, 
                'identificacion' => $cuit
            ])
        );
       

        $decodedData = json_decode($data); 
        // Verifica si la decodificación fue exitosa y si Response existe
        if (isset($decodedData->Response) && is_array($decodedData->Response) && !empty($decodedData->Response) ) {
            $encode = $decodedData->Response[0];
			$encode->tiempo_curl = $decodedData->tiempo_curl_afip;
			$encode->proveedor_curl = $decodedData->proveedor_curl_afip;
			return json_encode ($encode); 
        } else {
            return response()->json(['error' => 'Respuesta no encontrada o formato incorrecto'], 400);
        }

        //--  $consultar da true  --//
        //--> comentado Claudio
        if ($constancia) {
            return self::obtenerConstanciaPDF($cuit);
        }

        //verificar servicio activo
        $final_response = '';
        $servicios_afip = SQLConnection::backendStoreProcedure('obtener_estado_servicios_afip', [], false);
        $func = 'obtenerWSPadronA5';  //--> empresa
        $final_response[1] = self::$func($cuit, $alta);
        $func = 'obtenerWSPadronA13'; //--> personas
        $final_response[0] = self::$func($cuit, $alta);
        return $final_response;
    }

	public static function obtenerPadronForzado02122024($cuit = '', $alta = true, $pais = 'AR', $constancia = false)
	{
		//validar consultas.
		if (!$cuit) {
			$cuit = Request::input('cuit');
		}
		if (ENV('SERVICIO_MONGO') == true) {
			MainController::verificarMongo($cuit);
		}

		//--  $consultar da true  --//
		//--> comentado Claudio
		if ($constancia) {
			return self::obtenerConstanciaPDF($cuit);
		}

		//verificar servicio activo
		$final_response = '';
		$servicios_afip = SQLConnection::backendStoreProcedure('obtener_estado_servicios_afip', [], false);
		$func = 'obtenerWSPadronA5';  //--> empresa
		$final_response[1] = self::$func($cuit, $alta);
		$func = 'obtenerWSPadronA13'; //--> personas
		$final_response[0] = self::$func($cuit, $alta);
		return $final_response;
	}

	//valida los parámetros de entrada y cuando fue la última vez que se consultó a AFIP( para saber si se debe consultar o no un CUIT)
	#private static function validarConsulta($cuit, $pais)
    private static function validarConsulta($cuit,$pais,$dias_afip) 

	{

		if ($pais != 'AR') {
			return json_encode(['error' => "El servicio no se encuentra habilitado."]);
		}
		$cuit_length = strlen((string) $cuit);
		if ($cuit_length != 11) {
			return json_encode(['error' => "El cuit enviado no tiene un formato correcto, debe poseer exactamente 11 carácteres númericos"]);
		}
		#$tiempo = (substr($cuit, 0, 1) != '3') ? env('AFIP_TIEMPO_FISICA') : env('AFIP_TIEMPO_JURIDICA');
        if ($dias_afip == null)
        {
            $tiempo = (substr($cuit,0,1) != '3') ? env('AFIP_TIEMPO_FISICA') : env('AFIP_TIEMPO_JURIDICA') ;
        }
        else 
        {
            $tiempo = $dias_afip; 
        }

		$diferencia = $tiempo;
		$servicio = 'AFIP';

		$procesar = false;
		$params = [
			'cuit' => $cuit,
			'servicio' => 'AFIP',
		];
		$consultado = SQLConnection::backendStoreProcedure('servicios_externos_obtener_fecha_consultado', array_values($params), true);
		$persona = SQLConnection::backendStoreProcedure('info_padron', array($cuit), true);
		if (!$persona) {
			return true;
		}
		if ((isset($consultado->fecha) && !empty($consultado->fecha))) {
			$modificado = new DateTime($consultado->fecha);
		} else {
			if (!empty($persona)) {
				$modificado = ($persona->ismodified == null) ? null : new DateTime($persona->ismodified);
			}
		}
		$ejecutar_log = false;


		if ((isset($persona)) && (count(array($persona)) > 0)) {
			$hoy = new DateTime();
			if ($modificado !== null) {
				$diferencia = $modificado->diff($hoy);
				$diferencia = $diferencia->format('%a');
			}
			if (($modificado == null) || ($diferencia > $tiempo)) {
				// Se actualiza si no se ha modificado nunca, o si la fecha de modificación es mayor a 30 dias
				return true;
			}
		}
		if (isset($modificado)) {
			self::$fecha_afip = $modificado->format('d/m/Y');
		}
		if (!self::$modificar_consulta) {
			return json_encode(['error' => "Esta consulta no fue a AFIP por validación de tiempo. Fecha de la última consulta: " . self::$fecha_afip]);
		}

	}

	public static function obtenerConstanciaPDF($cuit)
	{
		$constancia_path = env('AFIP_URL_COMPARTIDO_PEGAR') . '/' . substr($cuit, 0, 2) . '/' . substr($cuit, 2, 3) . '/' . substr($cuit, 5, 3) . '/' . $cuit . '.pdf';
		$constancia_error = true;
		$response = "No se encuentra la constancia";
		//
		if (file_exists($constancia_path)) {
			$constancia_error = false;
			$response = "Devuelve la constancia";
		}
		//
		$array_resp = ['response' => $response, 'constancia_error' => $constancia_error];
		return $array_resp;
	}

	//TODO: NO FUNCIONA -> ARREGLAR EN EL FUTURO
	private static function obtenerWSPadronA13($cuit = '', $alta = false)
	{
		$prueba = env("AFIP_SERVICIO_PADRON_A13");

		$datos = self::obtenerDatosLogin(env("AFIP_SERVICIO_PADRON_A13"));
		//dd($datos);
if(env('SERVICIOS_AFIP') == false) {
            return true;
        }
		$element = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"
			xmlns:a13=\"http://a13.soap.ws.server.puc.sr/\">
			 <soapenv:Header/>
			 <soapenv:Body>
			 <a13:getPersona>
			 <token>$datos->token</token>
			 <sign>$datos->sign</sign>
			 <cuitRepresentada>30641368977</cuitRepresentada>
			 <idPersona>$cuit</idPersona>
			 </a13:getPersona>
			 </soapenv:Body>
			</soapenv:Envelope>";
		$url = env('AFIP_URL_PADRON_A13');
		$resp = self::CurlAFIP($datos, $element, $url, $cuit, $alta, 'A4');
		$resp = json_decode($resp);
		if (!empty($resp)) {
			if ((isset($resp->apellido) && $resp->apellido != '') || (isset($resp->nombre) && $resp->nombre != '') || (isset($resp->razonSocial) && $resp->razonSocial != '')) {
				return json_encode($resp);
			} else {
				$resp = new \stdClass();
				$resp->error = 'Afip informa el nombre/razón social.';
				return json_encode($resp);
			}
		}
		return json_encode(['error' => "No se pudo consultar en AFIP."]);
	}

	private static function obtenerWSPadronA5($cuit = '', $alta = false)
	{
		$datos = self::obtenerDatosLogin('ws_sr_padron_a5');
if(env('SERVICIOS_AFIP') == false) {
            return true;
        }
		$element = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"
		xmlns:a5=\"http://a5.soap.ws.server.puc.sr/\">
		 <soapenv:Header/>
		 <soapenv:Body>
		 <a5:getPersona>
		 <token>$datos->token</token>
		 <sign>$datos->sign</sign>
		 <cuitRepresentada>30641368977</cuitRepresentada>
		 <idPersona>$cuit</idPersona>
		 </a5:getPersona>
		 </soapenv:Body>
		</soapenv:Envelope>";

		$url = "https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA5?WSDL";
		$resp = self::CurlAFIP($datos, $element, $url, $cuit, $alta, 'A5');
		$resp = json_decode($resp);
		if (!empty($resp)) {
			if ((isset($resp->apellido) && $resp->apellido != '') || (isset($resp->nombre) && $resp->nombre != '') || (isset($resp->razonSocial) && $resp->razonSocial != '')) {
				return json_encode($resp);
			} else {

				return json_encode($resp);
			}
		}
		return json_encode(['error' => "No se pudo consultar en AFIP."]);
	}

	public static function CurlAFIP($datos, $element, $url, $cuit, $alta = false, $servicio = 'A4')
	{
		$curl = curl_init();
		curl_setopt_array($curl, array(
			CURLOPT_URL => $url,
			CURLOPT_RETURNTRANSFER => true,
			CURLOPT_ENCODING => "UTF-8",
			CURLOPT_MAXREDIRS => 10,
			CURLOPT_TIMEOUT => 40,
			CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
			CURLOPT_CUSTOMREQUEST => "POST",
			CURLOPT_POSTFIELDS => $element,
			CURLOPT_HTTPHEADER => array(
				"cache-control: no-cache",
				"content-type: application/xml; charset=UTF-8",
			),
		));

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

		curl_close($curl);
		$datos_afip = [];
		if ($err) {
			return json_encode("cURL Error #:" . $err);
		} else {
			$response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response);
			$response = str_replace('', '\'', $response);
			try {
				//code...

				$xml = new \SimpleXMLElement($response);
				//file_put_contents("documentos/afipws/".$cuit.'_'.$datos->servicio.'.txt',(json_encode((array)$xml)));
				$array = json_decode(json_encode((array) $xml), TRUE);
				if (isset($array['soapBody']['soapFault'])) {
					return json_encode(['error' => "El CUIT/CUIL ingresado es inválido / no existe en AFIP"]);
				}

				if ($servicio == 'A5') {

					$datos_afip = isset($array['soapBody']['ns2getPersonaResponse']['personaReturn']) ? $array['soapBody']['ns2getPersonaResponse']['personaReturn'] : '';
				} else {
					$datos_afip = isset($array['soapBody']['ns2getPersonaResponse']['personaReturn']['persona']) ? $array['soapBody']['ns2getPersonaResponse']['personaReturn']['persona'] : '';
				}
				$persona = (substr($cuit, 0, 1) != '3') ? true : false;
				if ($persona) {
					$func = "parseoPersonaFisica" . "$servicio";
					AFIPController::$func($datos_afip, $alta);
				} else {
					$func = "parseoPersonaJuridica" . "$servicio";
					AFIPController::$func($datos_afip, $alta);
					//return;
				}
			} catch (\Throwable $th) {
				//throw $th;
			}
			return json_encode($datos_afip);
		}
	}

	public static function obtenerPadron_test($cuit = '', $alta = true, $pais = 'AR', $constancia = false)
	{
		//validar consultas.
		if (!$cuit) {
			$cuit = Request::input('cuit');
		}
		if (ENV('SERVICIO_MONGO') == true) {
			MainController::verificarMongo($cuit);
		}

		$consultar = self::validarConsulta_test($cuit, $pais);

		$consulta_decode = json_decode($consultar);

		if (isset($consulta_decode->error)) {
			return $consultar;
		}
		//--  $consultar da true  --//
		//--> comentado Claudio
		if ($constancia) {
			return self::obtenerConstanciaPDF($cuit);
		}

		//verificar servicio activo
		$final_response = '';
		//$final_response = array();
		//$servicios_afip   =  SQLConnection::backendStoreProcedure('obtener_estado_servicios_afip', [] , false);
		//echo(var_dump($servicios_afip)); die();
		/*foreach($servicios_afip as $key => $servicio){
						if($servicio->activo == 1){
							$func = $servicio->servicio;
							//echo($func); die();
							$final_response[] = self::$func($cuit,$alta);
							//var_dump($final_response); 
							//return self::$func($cuit,$alta);
						}
					}*/
		//$func = 'obtenerWSPadronA5';
		/*if($cuit[0] == '2') {
						$func = 'obtenerWSPadronA13'; //--> personas
						$final_response[] = self::$func($cuit,$alta);
					} else {
						$func = 'obtenerWSPadronA5';  //--> empresa
						$final_response[] = self::$func($cuit,$alta);
					}*/
		/*
					$func = 'obtenerWSPadronA5';  //--> empresa
					$final_response[1] = self::$func($cuit,$alta);
					$func = 'obtenerWSPadronA13'; //--> personas
					$final_response[0] = self::$func($cuit,$alta);
					*/
		$servicios_afip = SQLConnection::backendStoreProcedure('obtener_estado_servicios_afip', [], false);
		foreach ($servicios_afip as $key => $servicio) {
			if ($servicio->activo == 1) {
				$func = $servicio->servicio;
				$final_response = self::$func($cuit, $alta);
			}
		}

		//echo(var_dump($final_response)); die();
		return $final_response;
		//echo($func." cuit: ".$cuit." - Alta: ".$alta);
	}

	private static function validarConsulta_test($cuit, $pais)
	{

		if ($pais != 'AR') {
			return json_encode(['error' => "El servicio no se encuentra habilitado."]);
		}
		$cuit_length = strlen((string) $cuit);
		if ($cuit_length != 11) {
			return json_encode(['error' => "El cuit enviado no tiene un formato correcto, debe poseer exactamente 11 carácteres númericos"]);
		}
		$tiempo = (substr($cuit, 0, 1) != '3') ? env('AFIP_TIEMPO_FISICA_TEST') : env('AFIP_TIEMPO_JURIDICA_TEST');
		$diferencia = $tiempo;
		$servicio = 'AFIP';

		$procesar = false;
		$params = [
			'cuit' => $cuit,
			'servicio' => 'AFIP',
		];
		$consultado = SQLConnection::backendStoreProcedure('servicios_externos_obtener_fecha_consultado', array_values($params), true);
		$persona = SQLConnection::backendStoreProcedure('info_padron', array($cuit), true);

		if (!$persona) {
			return true;
		}

		if (!empty($persona)) {
			$modificado = ($persona->ismodified == null) ? null : new DateTime($persona->ismodified);
		}

		$ejecutar_log = false;

		if ((isset($persona)) && (count(array($persona)) > 0)) {
			$hoy = new DateTime();

			if ($modificado !== null) {
				$diferencia = $modificado->diff($hoy);
				$diferencia = $diferencia->format('%a');
			}
			if (($modificado == null) || ($diferencia > $tiempo)) {
				// Se actualiza si no se ha modificado nunca, o si la fecha de modificación es mayor a 30 dias
				return true;
			} else {
				self::$fecha_afip = $modificado->format('d/m/Y');
				return json_encode(['error' => "Esta consulta no fue a AFIP por validación de tiempo. Fecha de la última consulta: " . self::$fecha_afip]);
			}
		}

	}
}
