<?php namespace App\Http\Controllers;

use App\Custom\SQLConnection;
use App\Custom\Misc;
use Request;
use Session;
use DB;
use DateTime;
use StdClass;
use SoapClient;

//Esta clase se útiliza como conector intermedio con AFIP.
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 DatosLogin($metodo){
		$datos = '';
		//$datos = session::get($metodo);
		if($datos){return $datos;}
		$datos =  SQLConnection::backendStoreProcedure('afip_obtener_datos_login', array($metodo),'selectOne');
		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;
		}
	}

	//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');
		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;
		}
	}

	/*
	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);
		}
	
		//--  $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 requestInternos($cuit='',$alta=false,$pais='AR'){
		//validar consultas.
		if(!$cuit){
			$cuit = Request::input('cuit');
		}
		if(!$cuit){
		return 'error';
		}

		SQLConnection::busquedaPadron($cuit,1);
		return self::obtenerPadron($cuit,$alta,$pais);
	}
	
	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 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');
	}

	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 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';
	}

	/*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){
		//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'
				$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);
		
		$func = 'obtenerWSPadronA5';  //--> empresa
		$final_response[1] = self::$func($cuit,$alta);
		$func = 'obtenerWSPadronA13'; //--> personas
		$final_response[0] = self::$func($cuit,$alta);
		
		
		return $final_response;
	}
	
	/*Obtiene la constancia de inscripción y la guarda en el NAS*/
	public static function obtenerConstanciaPDF($cuit){
		$curl = curl_init();
		curl_setopt_array($curl, array(
			CURLOPT_URL => ENV('AFIP_URL_CONSTANCIA').'/'.$cuit,
			CURLOPT_RETURNTRANSFER => true,
			CURLOPT_ENCODING => "UTF-8",
			CURLOPT_MAXREDIRS => 10,
			//CURLOPT_TIMEOUT => 30,
			CURLOPT_TIMEOUT => 1,
			CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
			CURLOPT_CUSTOMREQUEST => "GET",
			CURLOPT_HTTPHEADER => array(
				"cache-control: no-cache",
				"content-type: application/xml; charset=UTF-8",
			),
		));

		$response = curl_exec($curl);
		$err = curl_error($curl);
		/*var_dump("obtenerConstanciaPDF"); 
		var_dump("response: "); 
		var_dump($response); 
		var_dump("err: "); 
		var_dump($err); 
		die(); */

		curl_close($curl);

		if ($err) {
			//return json_encode("cURL Error #:" . $err);
			$rseponse = 'cURL Error #:' . $err; 
			$constancia_error = 'cURL Error #:' . $err; 
		} else {
			$constancia_error = false;
			if($response){
				if(isset(json_decode($response)->error)){
					$constancia_error = true;
				}else{
					$dir = env('AFIP_URL_COMPARTIDO_PEGAR').'/'.substr($cuit, 0, 2).'/'.substr($cuit, 2, 3).'/'.substr($cuit, 5, 3);
					if (!is_dir($dir)) {
						// dir doesn't exist, make it
						mkdir($dir,0777,true);
					}
					file_put_contents($dir.'/'.$cuit.'.pdf', $response);
					$response = 'Grabó la constancia!';
				}
			}
		}
		$array_resp = ['response' => $response, 'constancia_error' => $constancia_error];
		return $array_resp;
	}

	//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) {
		
		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') ;
		$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]); }
	
	}

	private static function obtenerWSPadronA13($cuit='',$alta= false){

		$datos = self::obtenerDatosLogin(env('AFIP_SERVICIO_PADRON_A13'));
		
		$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 obtenerWSPadronA4($cuit='',$alta=false){
		$datos = self::obtenerDatosLogin(env('AFIP_SERVICIO_PADRON_A4'));
		$element =    "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"
		xmlns:a4=\"http://a4.soap.ws.server.puc.sr/\">
		 <soapenv:Header/>
		 <soapenv:Body>
		 <a4:getPersona>
		 <token>$datos->token</token>
		 <sign>$datos->sign</sign>
		 <cuitRepresentada>30641368977</cuitRepresentada>
		 <idPersona>$cuit</idPersona>
		 </a4:getPersona>
		 </soapenv:Body>
		</soapenv:Envelope>";
		$url = env('AFIP_URL_PADRON_A4');
		$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->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');
		$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);
		}
	}



	//parseo de persona física con el servicio de AFIP A5
	private static function parseoPersonaFisicaA5($datos_persona,$alta){
		$respuesta = [];
		if(isset($datos_persona['datosGenerales'])){
			$persona = $datos_persona['datosGenerales'];
			if(!empty($persona)){
				$respuesta = $datos_persona['datosGenerales'];
				$respuesta['cuit'] = $datos_persona['datosGenerales']['idPersona'];
			}
		}else{
			$persona = isset($datos_persona['errorConstancia'])  ? $datos_persona['errorConstancia'] : '';
			$respuesta['cuit'] = isset($datos_persona['errorConstancia']['idPersona']) ? $datos_persona['errorConstancia']['idPersona'] : '';
		}
		$persona['domicilios'] = !empty($datos_persona['datosGenerales']['domicilioFiscal']) ? $datos_persona['datosGenerales']['domicilioFiscal']  : '';
		$persona['actividad'] = '';
		$persona['categoria'] = '';
		$persona['impuesto'] = ''; 
		if(!empty($datos_persona['datosMonotributo'])){
			$persona['actividad'] = !empty($datos_persona['datosMonotributo']['actividadMonotributista']) ? $datos_persona['datosMonotributo']['actividadMonotributista']  : '';
			$persona['categoria'] = !empty($datos_persona['datosMonotributo']['categoriaMonotributo']) ? $datos_persona['datosMonotributo']['categoriaMonotributo']  : '';
			$persona['impuesto'] = !empty($datos_persona['datosMonotributo']['impuesto']) ? $datos_persona['datosMonotributo']['impuesto']  : '';
		//$respuesta= self::parsearDatosPersonales($persona,$alta);
		}
		if(!empty($datos_persona['datosRegimenGeneral'])){
			$persona['actividad'] = !empty($datos_persona['datosRegimenGeneral']['actividad']) ? $datos_persona['datosRegimenGeneral']['actividad']  : '';
			$persona['categoria'] = !empty($datos_persona['datosRegimenGeneral']['categoriaAutonomo']) ? $datos_persona['datosRegimenGeneral']['categoriaAutonomo']  : '';
			$persona['impuesto'] = !empty($datos_persona['datosRegimenGeneral']['impuesto']) ? $datos_persona['datosRegimenGeneral']['impuesto']  : '';
		//$respuesta= self::parsearDatosPersonales($persona,$alta);
		}
		$respuesta= self::parsearDatosPersonales($persona,$alta);

		self::parsear_domicilios_impuestos($persona,$respuesta);
		
		/*
		if (isset($persona['razonSocial'])) {
			$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', 
			array($persona['idPersona'], $persona['razonSocial'], json_encode($datos_persona), 'AFIP'));
			SQLConnection::backendStoreProcedure('insertar_servicios_externos_fecha_consultado', 
			array($persona['idPersona'],'AFIP'));
		}
		*/

		if (isset($respuesta['razon_social'])) {
			$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', 
			array($persona['idPersona'], $respuesta['razon_social'], json_encode($datos_persona), 'AFIP'));
			SQLConnection::backendStoreProcedure('insertar_servicios_externos_fecha_consultado', 
			array($persona['idPersona'],'AFIP'));
		}
		if(isset($datos_persona['errorConstancia']['error']) && isset($respuesta['cuit']) ){
			$error_constancia = $datos_persona['errorConstancia']['error'];
			if(is_array($error_constancia)){$error_constancia = $error_constancia[0] . '. ' . $error_constancia[1] ?? '' ; }
			SQLConnection::backendStoreProcedure('servicios_externos_procesar_cuit_sin_pdf', array($respuesta['cuit'],$error_constancia),true);
		}
		if(isset($datos_persona['errorRegimenGeneral']['error'])  && isset($respuesta['cuit'])){
			$error_constancia = $datos_persona['errorRegimenGeneral']['error'];
			if(is_array($error_constancia)){$error_constancia = $error_constancia[0] . '. ' . $error_constancia[1] ?? '' ; }
			SQLConnection::backendStoreProcedure('servicios_externos_procesar_cuit_sin_pdf', array($respuesta['cuit'],$error_constancia),true);
		}
		if(!isset($datos_persona['errorConstancia']['error']) && !isset($datos_persona['errorRegimenGeneral']['error']) && 
			 isset($persona['idPersona']))
		{
			SQLConnection::backendStoreProcedure('servicios_externos_procesar_cuit_sin_pdf_borrar', array($persona['idPersona']),true);
		}
	}

	//parseo de persona Jurídica con el servicio de AFIP A5
	private static function parseoPersonaJuridicaA5($datos_persona,$alta){
	 if(isset($datos_persona['datosGenerales'])){
			$persona = $datos_persona['datosGenerales'];
			if(!empty($persona)){
				$respuesta = $datos_persona['datosGenerales'];
				$respuesta['cuit'] = $datos_persona['datosGenerales']['idPersona'];
			}
		}else{
			$persona = !empty($datos_persona['errorConstancia'])  ? $datos_persona['errorConstancia'] : '';
			$respuesta['cuit'] = isset($datos_persona['datosGenerales']['idPersona']) ? $datos_persona['datosGenerales']['idPersona'] : '';
		}
		$persona['domicilios'] = !empty($datos_persona['datosGenerales']['domicilioFiscal']) ? $datos_persona['datosGenerales']['domicilioFiscal']  : '';
		$persona['actividad'] = !empty($datos_persona['datosRegimenGeneral']['actividad']) ? $datos_persona['datosRegimenGeneral']['actividad']  : '';
		$persona['impuesto'] = !empty($datos_persona['datosRegimenGeneral']['impuesto']) ? $datos_persona['datosRegimenGeneral']['impuesto']  : '';

		$respuesta = self::parsearDatosPersonales($persona,$alta);
		self::parsear_domicilios_impuestos($persona,$respuesta);
	 /* $persona['categoria'] = isset($datos_persona['datosRegimenGeneral']['categoriaMonotributo']) ? $datos_persona['datosRegimenGeneral']['categoriaMonotributo']  : '';*/
			
		if (isset($persona['razonSocial'])) {
			$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', 
			array($persona['idPersona'], $persona['razonSocial'], json_encode($datos_persona), 'AFIP'));
			SQLConnection::backendStoreProcedure('insertar_servicios_externos_fecha_consultado', 
			array($persona['idPersona'],'AFIP'));
		}
		
		if(isset($datos_persona['errorConstancia']['error']) && isset($respuesta['cuit']) ){
			$error_constancia = $datos_persona['errorConstancia']['error'];
			if(is_array($error_constancia)){$error_constancia = $error_constancia[0] . '. ' . $error_constancia[1] ?? '' ; }
			SQLConnection::backendStoreProcedure('servicios_externos_procesar_cuit_sin_pdf', array($respuesta['cuit'],$error_constancia),true);
		}

		if(isset($datos_persona['errorRegimenGeneral']['error'])){
			$error_constancia = $datos_persona['errorRegimenGeneral']['error'];
			SQLConnection::backendStoreProcedure('servicios_externos_procesar_cuit_sin_pdf', array($respuesta['cuit'],$error_constancia),true);
		}

		if(!isset($datos_persona['errorConstancia']['error']) && !isset($datos_persona['errorRegimenGeneral']['error']) && 
			 isset($persona['idPersona']))
		{
			SQLConnection::backendStoreProcedure('servicios_externos_procesar_cuit_sin_pdf_borrar', array($persona['idPersona']),true);
		}

	}

	private static function parseoPersonaFisicaA4($datos_persona,$alta){
		//CUIT
		$persona = self::parsearDatosPersonales($datos_persona,$alta);
		//--------- 21/08/2018
		// CUIT INACTIVA
		if (isset($datos_persona['relacion'])) {
			foreach ($datos_persona['relacion'] as $pos => $relacion) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$relacion = $datos_persona['relacion'];
				}
				$tipo = isset($relacion['tipoRelacion']) ? $relacion['tipoRelacion'] : '';
				if ($tipo == 'CLAVE INACTIVA') 
				{
					$params = [
						'cuit'              => isset($relacion['idPersonaAsociada']) ? $relacion['idPersonaAsociada'] : null,
						'cuit_inactivo'     => isset($relacion['idPersona']) ? $relacion['idPersona'] : null,
						'fecha_relacion'    => isset($relacion['ffRelacion']) ? Misc::parseFechaDatosAfip($relacion['ffRelacion']) : null,
					];
					$exec =   SQLConnection::backendStoreProcedure('insertar_cuit_inactivo_afip', array_values($params), true);
					if (isset($exec->error)) {
						// LOG DE ERRORES
						$params = [
							'cuit' => $persona['cuit'],
							'nombre_persona' => $persona['razon_social'],
							'datos' => '{error: "'.$exec->error.'"}',
							'servicio_origen' => 'AFIP',
						];
						$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
					}
				}
				if ($salir) { break; }
			}
		}

		if (isset($datos_persona['claveInactivaAsociada'])) {
				$params = [
					'cuit'              => $persona['cuit'],
					'cuit_inactivo'     => isset($datos_persona['claveInactivaAsociada']) ? $datos_persona['claveInactivaAsociada'] : null,
					'fecha_relacion'    => isset($datos_persona['fechaInscripcion']) ? Misc::parseFechaDatosAfip($datos_persona['fechaInscripcion']) : null,
				];
				if(is_array($params['cuit_inactivo'])){
					foreach ($params['cuit_inactivo'] as $key => $value) {
						$exec =   SQLConnection::backendStoreProcedure('insertar_cuit_inactivo_afip', array($params['cuit'],$value,$params['fecha_relacion']), true);
					}
				}else{
					$exec =   SQLConnection::backendStoreProcedure('insertar_cuit_inactivo_afip', array_values($params), true);
				}
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
		}
		//---------

		//EMAIL
		if (isset($datos_persona['email']) && isset($persona['idp'])) {
			foreach ($datos_persona['email'] as $pos => $email) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$email = $datos_persona['email'];
				}
				$params = [
					'id_padron'  => $persona['idp'],
					'email'      => isset($email['direccion']) ? $email['direccion'] : null,
					'tipo_email' => isset($email['tipoEmail']) ? $email['tipoEmail'] : null
				];
				
				$exec = SQLConnection::backendStoreProcedure('carga_email_afip', array_values($params), true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));

				}
				if ($salir) { break; }
			}
		}
		
		//ACTIVIDADES    
		if(isset($datos_persona['actividad'])){
			foreach ($datos_persona['actividad'] as $pos => $actividad) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$actividad = $datos_persona['actividad'];
				}
				$params = [
					'codigo_actividad'      => isset($actividad['idActividad']) ? $actividad['idActividad'] : null,
					'cuit'                  => $persona['cuit'],
					'descripcion_actividad' => isset($actividad['descripcionActividad']) ? $actividad['descripcionActividad'] : null,
					'formulario'            => isset($actividad['nomenclador']) ? $actividad['nomenclador'] : null,
					'orden'                 => ($actividad['orden'] == 1) ? 1 : 0,
				];
				$exec = SQLConnection::backendStoreProcedure('carga_actividades_afip', array_values($params), true);
				
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}
		}
		
		//ACTIVIDAD PRINCIPAL
		
		if(isset($datos_persona['idActividadPrincipal'])){
		 
				$params = [
					'codigo_actividad'      => isset($datos_persona['idActividadPrincipal']) ? $datos_persona['idActividadPrincipal'] : null,
					'cuit'                  => $persona['cuit'],
					'descripcion_actividad' => isset($datos_persona['descripcionActividadPrincipal']) ? $datos_persona['descripcionActividadPrincipal'] : null,
					'formulario'            => '883',
					'orden'                 => '1', 
				];
				$exec = SQLConnection::backendStoreProcedure('carga_actividades_afip', array_values($params), true);
				
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
		}

		if(isset($datos_persona['idActividadPrincipal']) || isset($datos_persona['actividad']))
		{
			$params = ['cuit' => $persona['cuit']];   
			$exec = SQLConnection::backendStoreProcedure('carga_actividades_afip_visible', array_values($params), true); 
		}

		//FECHA NACIMIENTO
		if (isset($datos_persona['fechaNacimiento'])) {
			$fecha = $datos_persona['fechaNacimiento'];
			$fecha_nacimiento = Misc::parseFechaDatosAfip($fecha);
			$persona['fecha_nacimiento'] = $fecha_nacimiento;
		}
		//FECHA INSCRIPCION
		if (isset($datos_persona['fechaInscripcion'])) {
			$fecha = $datos_persona['fechaInscripcion'];
			$fecha_inscripcion = Misc::parseFechaDatosAfip($fecha);
			$persona['fecha_inscripcion'] = $fecha_inscripcion;
		}
		//FECHA FALLECIMIENTO
		if (isset($datos_persona['fechaFallecimiento'])) {
			$fecha = $datos_persona['fechaFallecimiento'];
			$fecha_fallecimiento = Misc::parseFechaDatosAfip($fecha);
			$persona['fecha_fallecimiento'] = $fecha_fallecimiento;
		}
		//DOCUMENTO
		if (isset($datos_persona['numeroDocumento'])) {
			$persona['num_documento'] = $datos_persona['numeroDocumento'];
		}  
		//SEXO
		if (isset($datos_persona['sexo'])) {
			$persona['sexo'] = $datos_persona['sexo'];
			if ($persona['sexo'] == 'MASCULINO') {
				$persona['sexo'] = 'M';
			}else{
				$persona['sexo'] = 'F';
			}
		}
		//TIPO CLAVE
		if (isset($datos_persona['tipoClave'])) {
			$persona['tipo_clave'] = $datos_persona['tipoClave'];
		}
		//TIPO DOCUMENTO
		if (isset($datos_persona['tipoDocumento'])) {
			$persona['tipo_documento'] = $datos_persona['tipoDocumento'];
		}
		//TIPO PERSONA
		$persona['tipo_persona'] = '';
		if (isset($datos_persona['tipoPersona'])) {
			$persona['tipo_persona'] = $datos_persona['tipoPersona'];
			if ($persona['tipo_persona'] == 'FISICA') {
				$persona['tipo_persona'] = 'F';
			}else{
				$persona['tipo_persona'] = 'J';
			}
		}

		//TELEFONOS
		if (isset($datos_persona['telefono']) && isset($persona['idp'])) {
			foreach ($datos_persona['telefono'] as $pos => $telefono) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$telefono = $datos_persona['telefono'];
				}
				$params = [
					'id_padron'       => $persona['idp'],
					'numero_telefono' =>isset($telefono['numero']) ? $telefono['numero'] : null,
					'tipo_linea'      => isset($telefono['tipo_linea']) ? $telefono['tipo_linea'] : null
				];
				$exec = SQLConnection::backendStoreProcedure('carga_telefonos_afip', array_values($params), true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}

		}
		//DOMICILIOS
		if (isset($datos_persona['domicilio'])) {
			foreach ($datos_persona['domicilio'] as $pos => $domicilio) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$domicilio = $datos_persona['domicilio'];
				}

				$tipo_domicilio = 'O';
				if (isset($domicilio['tipoDomicilio'])) {
					if (strpos(strtoupper($domicilio['tipoDomicilio']), 'FISCAL') !== false){
						$tipo_domicilio = 'F';
					}elseif (strpos(strtoupper($domicilio['tipoDomicilio']), 'LEGAL') !== false){
						$tipo_domicilio = 'L';
					}
				}
				$codigo_postal = isset($domicilio['codPostal'])   ? $domicilio['codPostal'] : null;
				if($codigo_postal == null){
					$codigo_postal = isset($domicilio['codigoPostal'])   ? $domicilio['codigoPostal'] : null;
				}
				$params = [
					'cuit'           => $persona['cuit'],
					'codpos'         => $codigo_postal,
					'domicilio'      => isset($domicilio['direccion'])   ? str_replace('?', '', $domicilio['direccion']) : null,
					'loc_nombre'     => isset($domicilio['localidad'])   ? str_replace('?', '', $domicilio['localidad']) : null,
					'prv_codigo'     => isset($domicilio['idProvincia']) ? $domicilio['idProvincia'] : null,
					'prv_nombre'     => isset($domicilio['descripcionProvincia']) ? str_replace('?', '', $domicilio['descripcionProvincia']) : null,
					'tipo_domicilio' => $tipo_domicilio,
				];

				$exec = SQLConnection::backendStoreProcedure('insertar_domicilio_persona_fisica_afip', array_values($params), true);
				// El domicilio legal se guarda como L y como D
				if ($tipo_domicilio == 'L') {
					$params = [
					'cuit'           => $persona['cuit'],
					'codpos'         => $codigo_postal,
					'domicilio'      => isset($domicilio['direccion'])   ? str_replace('?', '', $domicilio['direccion']) : null,
					'loc_nombre'     => isset($domicilio['localidad'])   ? str_replace('?', '', $domicilio['localidad']) : null,
					'prv_codigo'     => isset($domicilio['idProvincia']) ? $domicilio['idProvincia'] : null,
					'prv_nombre'     => isset($domicilio['descripcionProvincia']) ? str_replace('?', '', $domicilio['descripcionProvincia']) : null,
					'tipo_domicilio' => 'D',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_domicilio_persona_fisica_afip', array_values($params), true);
				}

				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				} 
				/*
				else { 
					// OBTENER DOMICILIOS TIPO L
					$domicilios_l = SQLConnection::backendStoreProcedure('obtener_domicilios_legales_persona_fisica_afip', array($persona['cuit']));
					foreach ($domicilios_l as $domicilio_l) {
						$params = [
							'id_domicilio'   => $domicilio_l->id_domicilio,
							'cuit'           => $persona['cuit'],
							'codpos'         => $domicilio_l->codpos,
							'domicilio'      => $domicilio_l->domicilio,
							'loc_nombre'     => $domicilio_l->loc_nombre,
							'prv_codigo'     => $domicilio_l->prv_codigo,
							'prv_nombre'     => $domicilio_l->prv_nombre,
						];

						$exec = SQLConnection::backendStoreProcedure('reasignar_domicilios_legales_persona_fisica_afip', array_values($params), true);
						if (isset($exec->error)) {
							// LOG DE ERRORES
							$params = [
								'cuit' => $persona['cuit'],
								'nombre_persona' => $persona['razon_social'],
								'datos' => '{
															error: "'.$exec->error.'",
															tipo_error: "reasignacion de domicilio legal",
														}',
								'servicio_origen' => 'AFIP',
							];
							$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
						}
					}
				}
				*/


				if ($salir) { break; }
			}
		}
		//IMPUESTOS
		if (!empty($datos_persona['impuesto']) && isset($persona['idp'])) {
			foreach ($datos_persona['impuesto'] as $pos => $impuesto) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$impuesto = $datos_persona['impuesto'];
				}
				
				$params = [
					'id_padron'         => $persona['idp'],
					'codigo_impuesto'   => isset($impuesto['idImpuesto']) ? $impuesto['idImpuesto'] : null,
					'descripcion'       => isset($impuesto['descripcionImpuesto']) ? $impuesto['descripcionImpuesto'] : null,
					'estado'            => isset($impuesto['estado']) ? $impuesto['estado'] : null,
					'fecha_inscripcion' => isset($impuesto['ffInscripcion']) ? Misc::parseFechaDatosAfip($impuesto['ffInscripcion']) : null
				];
				$exec = SQLConnection::backendStoreProcedure('carga_impuesto_afip', array_values($params), true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}
		}
		//CATEGORIAS
		if (isset($datos_persona['categoria']) && isset($persona['idp'])) {
			foreach ($datos_persona['categoria'] as $pos => $categoria) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$categoria = $datos_persona['categoria'];
				}
				$params = [
					'id_padron'    => $persona['idp'],
					'id_categoria' => isset($categoria['idCategoria']) ? $categoria['idCategoria'] : null,
					'id_impuesto'  => isset($categoria['idImpuesto']) ? $categoria['idImpuesto'] : null,
					'descripcion'  => isset($categoria['descripcionCategoria']) ? $categoria['descripcionCategoria'] : null,
					'estado'       => isset($categoria['estado']) ? $categoria['estado'] : null,
					'periodo'      => isset($categoria['periodo']) ? $categoria['periodo'] : null,
				];
				$exec = SQLConnection::backendStoreProcedure('insertar_categoria_persona_afip', array_values($params), true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}
		}
		//DATOS PERSONA GENERAL
		if (isset($persona['idp'])) {
			$params = [
				'cuit'               => $persona['cuit'],
				'idp'                => $persona['idp'],
				'fecha_nacimiento'   => isset($persona['fecha_nacimiento']) ? $persona['fecha_nacimiento'] : null,
				'razon_social'       => isset($persona['razon_social']) ? $persona['razon_social'] : null,
				'fecha_fallecimiento'=> isset($persona['fecha_fallecimiento']) ? $persona['fecha_fallecimiento'] : null,
				'sexo'               => isset($persona['sexo']) ? $persona['sexo'] : null,
				'identificador'      => isset($persona['tipo_clave']) ? $persona['tipo_clave'] : null,
				'fecha_inscripcion'  => isset($persona['fecha_inscripcion']) ? $persona['fecha_inscripcion'] : null,
				'tipo_persona'       => isset($persona['tipo_persona']) ? $persona['tipo_persona'] : null
			];
			$exec = SQLConnection::backendStoreProcedure('carga_datos_persona_afip', array_values($params), true);
			if (isset($exec->error)) {
				// LOG DE ERRORES
				$params = [
					'cuit' => $persona['cuit'],
					'nombre_persona' => $persona['razon_social'],
					'datos' => '{error: "'.$exec->error.'"}',
					'servicio_origen' => 'AFIP',
				];
				$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
			}
		}
		if (self::$modificar_consulta && isset($persona['razon_social'])) {
			$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', 
				array($persona['cuit'], $persona['razon_social'], json_encode($datos_persona), 'AFIP'));
			SQLConnection::backendStoreProcedure('insertar_servicios_externos_fecha_consultado', 
				array($persona['cuit'],'AFIP'));
		}
		return $persona;
	}

	private static function parseoPersonaJuridicaA4($datos_persona,$alta=false){
		//CUIT
		$persona = [];
		if (isset($datos_persona['idPersona'])) {
			$persona['cuit'] = $datos_persona['idPersona'];
		}

		//RAZON SOCIAL
		$persona['razon_social'] = ''; 
		if (isset($datos_persona['razonSocial'])) {
			$persona['razon_social'] = str_replace('"','',$datos_persona['razonSocial']);
		}

		$persona['tipo_persona'] = ''; 
		if (isset($datos_persona['tipoPersona'])) {
			$persona['tipo_persona'] = $datos_persona['tipoPersona'];
			if ($persona['tipo_persona'] == 'FISICA') {
				$persona['tipo_persona'] = 'F';
			}else{
				$persona['tipo_persona'] = 'J';
			}
		}

		$persona['tipo_clave'] = '';
		if (isset($datos_persona['tipoClave'])) {
			$persona['tipo_clave'] = $datos_persona['tipoClave'];
		}


		if($alta == true){
			/* 3/8/2023: Eliminamos comillas */
			$persona['razon_social'] = str_replace("'"," ",$persona['razon_social']);
			$persona['razon_social'] = str_replace('"',' ',$persona['razon_social']);
			$params = [
			'numero' => $persona['cuit'],
			'nombre_persona' => $persona['razon_social'],
			'tipoclave' => $persona['tipo_clave'],
			'tipo_persona' => $persona['tipo_persona']
			];
			$exec = SQLConnection::backendStoreProcedure('Alta_Padron_Automatico', array_values($params));
		}

		//ID PADRON
		if (isset($persona['cuit'])) {
			$id_padron       = SQLConnection::obtenerIdPadron($persona['cuit']);
			$idp             = $id_padron->id_padron;
			$persona['idp']  = $idp;
		}


		//EMAIL
		if (isset($datos_persona['email']) && isset($persona['idp'])) {
			foreach ($datos_persona['email'] as $pos => $email) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$email = $datos_persona['email'];
				}
				$params = [
					'id_padron'  => $persona['idp'],
					'email'      => isset($email['direccion']) ? $email['direccion'] : null,
					'tipo_email' => isset($email['tipoEmail']) ? $email['tipoEmail'] : null
				];
				$exec = SQLConnection::backendStoreProcedure('carga_email_afip', array_values($params), true);
				
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}
		}
		
		//ACTIVIDADES    
		if(isset($datos_persona['actividad'])){
			foreach ($datos_persona['actividad'] as $pos => $actividad) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$actividad = $datos_persona['actividad'];
				}
				$params = [
					'codigo_actividad'      => isset($actividad['idActividad']) ? $actividad['idActividad'] : null,
					'cuit'                  => $persona['cuit'],
					'descripcion_actividad' => isset($actividad['descripcionActividad']) ? $actividad['descripcionActividad'] : null,
					'formulario'            => isset($actividad['nomenclador']) ? $actividad['nomenclador'] : null,
					'orden'                 => ($actividad['orden'] == 1) ? 1 : 0,
				];
				$exec = SQLConnection::backendStoreProcedure('carga_actividades_afip', array_values($params), true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}
		}

		//ACTIVIDAD PRINCIPAL
		if(isset($datos_persona['idActividadPrincipal'])){
		 
				$params = [
					'codigo_actividad'      => isset($datos_persona['idActividadPrincipal']) ? $datos_persona['idActividadPrincipal'] : null,
					'cuit'                  => $persona['cuit'],
					'descripcion_actividad' => isset($datos_persona['descripcionActividadPrincipal']) ? $datos_persona['descripcionActividadPrincipal'] : null,
					'formulario'            => '883',
					'orden'                 => '1', 
				];
				$exec = SQLConnection::backendStoreProcedure('carga_actividades_afip', array_values($params), true);
				
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
		}

		if(isset($datos_persona['idActividadPrincipal']) || isset($datos_persona['actividad']))
		{
			$params = ['cuit' => $persona['cuit']];   
			$exec = SQLConnection::backendStoreProcedure('carga_actividades_afip_visible', array_values($params), true); 
		}

		
		//FECHA INSCRIPCION
		if (isset($datos_persona['fechaInscripcion'])) {
			$fecha = $datos_persona['fechaInscripcion'];
			$fecha_inscripcion = Misc::parseFechaDatosAfip($fecha);
			$persona['fecha_inscripcion'] = $fecha_inscripcion;
		}

		//TIPO CLAVE
		$persona['tipo_clave']  = '';
		if (isset($datos_persona['tipoClave'])) {
			$persona['tipo_clave'] = $datos_persona['tipoClave'];
		}
 
		//TIPO PERSONA    
		$persona['tipo_persona'] = ''; 
		if (isset($datos_persona['tipoPersona'])) {
			$persona['tipo_persona'] = $datos_persona['tipoPersona'];
			if ($persona['tipo_persona'] == 'FISICA') {
				$persona['tipo_persona'] = 'F';
			}else{
				$persona['tipo_persona'] = 'J';
			}
		}

		//TELEFONOS
		if (isset($datos_persona['telefono']) && isset($persona['idp'])) {
			foreach ($datos_persona['telefono'] as $pos => $telefono) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$telefono = $datos_persona['telefono'];
				}
				$params = [
					'id_padron'       => $persona['idp'],
					'numero_telefono' => isset($telefono['numero']) ? $telefono['numero'] : null,
					'tipo_linea'      => isset($telefono['tipoLinea']) ? $telefono['tipoLinea'] : null
				];
				$exec = SQLConnection::backendStoreProcedure('carga_telefonos_afip', array_values($params), true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}

		}
		//DOMICILIOS
		if (isset($datos_persona['domicilio'])) {
			foreach ($datos_persona['domicilio'] as $pos => $domicilio) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$domicilio = $datos_persona['domicilio'];
				}

				$tipo_domicilio = 'O';
				if (isset($domicilio['tipoDomicilio'])) {
					if (strpos(strtoupper($domicilio['tipoDomicilio']), 'FISCAL') !== false){
						$tipo_domicilio = 'F';
					}elseif (strpos(strtoupper($domicilio['tipoDomicilio']), 'LEGAL') !== false){
						$tipo_domicilio = 'L';
					}
				}

				$codigo_postal = isset($domicilio['codPostal'])   ? $domicilio['codPostal'] : null;
				if($codigo_postal == null){
					$codigo_postal = isset($domicilio['codigoPostal'])   ? $domicilio['codigoPostal'] : null;
				}


				$params = [
					'cuit'           => $persona['cuit'],
					'codpos'         => $codigo_postal,
					'domicilio'      => isset($domicilio['direccion']) ? str_replace('?', '', $domicilio['direccion']) : null,
					/* AGREGAR */
					'calle'      => isset($domicilio['calle']) ? str_replace('?', '', $domicilio['calle']) : null,
					'numero'      => isset($domicilio['numero']) ? str_replace('?', '', $domicilio['numero']) : null,
					'piso'      => isset($domicilio['piso']) ? str_replace('?', '', $domicilio['piso']) : null,
					'oficinaDptoLocal'      => isset($domicilio['oficinaDptoLocal']) ? str_replace('?', '', $domicilio['oficinaDptoLocal']) : null,
					/* AGREGAR */
/*  ORDEN DE PARAMETROS DEL SP insertar_domicilio_persona_fisica_afip*/
/*PONER ESTE AFIP CONTROLLER EN FIDELITAS-WWW Y FIDELITAS2 EN PRODUCCION*/

/*

@p_cuit varchar(13),
@p_codpos varchar(10),
@p_domicilio varchar(70),
@p_loc_nombre varchar(50),
@p_prv_codigo varchar(2),
@p_prv_nombre varchar(50),
@p_tipo_domicilio varchar(1),
@calle varchar(150) = null,
@alturacalle varchar(50) = null,
@piso varchar(10) = null,
@depto varchar(10) = null


*/




					'loc_nombre'     => isset($domicilio['localidad']) ? str_replace('?', '', $domicilio['localidad']) : null,
					'prv_codigo'     => isset($domicilio['idProvincia']) ? $domicilio['idProvincia'] : null,
					'prv_nombre'     => isset($domicilio['descripcionProvincia']) ? str_replace('?', '', $domicilio['descripcionProvincia']) : null,
					'tipo_domicilio' => $tipo_domicilio,
				];


				$exec = SQLConnection::backendStoreProcedure('insertar_domicilio_persona_fisica_afip', array_values($params), true);

				// EL domicilio legal se guarda como L y como D
				if ($tipo_domicilio == 'L') {
					$params = [
					'cuit'           => $persona['cuit'],
					'codpos'         => $codigo_postal,
					'domicilio'      => isset($domicilio['direccion']) ? str_replace('?', '', $domicilio['direccion']) : null,
					'loc_nombre'     => isset($domicilio['localidad']) ? str_replace('?', '', $domicilio['localidad']) : null,
					'prv_codigo'     => isset($domicilio['idProvincia']) ? $domicilio['idProvincia'] : null,
					'prv_nombre'     => isset($domicilio['descripcionProvincia']) ? str_replace('?', '', $domicilio['descripcionProvincia']) : null,
					'tipo_domicilio' => 'D',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_domicilio_persona_fisica_afip', array_values($params), true);
				}


				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}
		}
		//IMPUESTOS
		if (isset($datos_persona['impuesto']) && isset($persona['idp'])) {

			
			foreach ($datos_persona['impuesto'] as $pos => $impuesto) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$impuesto = $datos_persona['impuesto'];
				}

				$params = [
					'id_padron'         => $persona['idp'],
					'codigo_impuesto'   => isset($impuesto['idImpuesto']) ? $impuesto['idImpuesto'] : null,
					'descripcion'       => isset($impuesto['descripcionImpuesto']) ? $impuesto['descripcionImpuesto'] : null,
					'estado'            => isset($impuesto['estado']) ? $impuesto['estado'] : null,
					'fecha_inscripcion' => isset($impuesto['ffInscripcion']) ? Misc::parseFechaDatosAfip($impuesto['ffInscripcion']) : null
				];
				$exec = SQLConnection::backendStoreProcedure('carga_impuesto_afip', array_values($params), true);

				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}
		}

		//RELACIONES
		if (isset($datos_persona['relacion'])) {
			foreach ($datos_persona['relacion'] as $pos => $relacion) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$relacion = $datos_persona['relacion'];
				}
				//Misc::parseFechaDatosAfip($fecha);
				$params = [
					'cuit'              => $persona['cuit'],
					'cuit_asociado'     => isset($relacion['idPersonaAsociada']) ? $relacion['idPersonaAsociada'] : null,
					'fecha_relacion'    => isset($relacion['ffRelacion']) ? Misc::parseFechaDatosAfip($relacion['ffRelacion']) : null,
					'fecha_vencimiento' => isset($relacion['ffVencimiento']) ? Misc::parseFechaDatosAfip($relacion['ffVencimiento']) : null,
					'tipo_relacion'     => isset($relacion['tipoRelacion']) ? $relacion['tipoRelacion'] : null,
					'sub_tipo_relacion' => isset($relacion['subtipoRelacion']) ? $relacion['subtipoRelacion'] : null,
				];
				$exec =   SQLConnection::backendStoreProcedure('insertar_relaciones_afip', array_values($params), true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
				
			}
		}

		//FECHA CONTRATO SOCIAL (agrega el campo en 'datos_sociedades')
		if (isset($datos_persona['fechaContratoSocial'])) {
			$persona['fecha_contrato_social'] = isset($datos_persona['fechaContratoSocial']) ? Misc::parseFechaDatosAfip($datos_persona['fechaContratoSocial']) : null;
		}

		//FORMA JURIDICA
		if (isset($datos_persona['formaJuridica'])) {
			$persona['forma_juridica'] = isset($datos_persona['formaJuridica']) ? $datos_persona['formaJuridica'] : null;
		}

		//NUMERO INSCRIPCION
		if (isset($datos_persona['numeroInscripcion'])) {
			$persona['numero_inscripcion'] = $datos_persona['numeroInscripcion'];
		}

		//DATOS PERSONA GENERAL

		if (isset($persona['idp'])) {
			$params = [
				'cuit'               => $persona['cuit'],
				'idp'                => $persona['idp'],
				'razon_social'       => isset($persona['razon_social']) ? $persona['razon_social'] : null,
				'identificador'      => isset($persona['tipo_clave']) ? $persona['tipo_clave'] : null,
				'tipo_persona'       => isset($persona['tipo_persona']) ? $persona['tipo_persona'] : null
			];
			$exec = SQLConnection::backendStoreProcedure('carga_datos_padron_pj_afip', array_values($params), true);
			if (isset($exec->error)) {
				// LOG DE ERRORES
				$params = [
					'cuit' => $persona['cuit'],
					'nombre_persona' => $persona['razon_social'],
					'datos' => '{error: "'.$exec->error.'"}',
					'servicio_origen' => 'AFIP',
				];
				$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
			}
		}
		
		if (isset($persona['cuit']) && isset($persona['idp'])) {
			$params = [
				'id_padron'             => (int)$persona['idp'],
				'cuit'                  => $persona['cuit'],
				'fecha_inscripcion'     => isset($persona['fecha_inscripcion']) ? $persona['fecha_inscripcion'] : null,
				'fecha_contrato_social' => isset($persona['fecha_contrato_social']) ? $persona['fecha_contrato_social'] : null,
				'numero_inscripcion'    => isset($persona['numero_inscripcion']) ? $persona['numero_inscripcion'] : null,
				'forma_juridica'    	=> isset($persona['forma_juridica']) ? $persona['forma_juridica'] : null
			];
			$exec = SQLConnection::backendStoreProcedure('insertar_datos_sociedades_afip',array_values($params),true);
			if (isset($exec->error)) {
				// LOG DE ERRORES
				$params = [
					'cuit' => $persona['cuit'],
					'nombre_persona' => $persona['razon_social'],
					'datos' => '{error: "'.$exec->error.'"}',
					'servicio_origen' => 'AFIP',
				];
				$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
			}
		}

		if (isset($datos_persona['regimen'])) {
			foreach ($datos_persona['regimen'] as $pos => $regimen) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$regimen = $datos_persona['regimen'];
				}

				$params = [
					'id_padron'    => $persona['idp'], 
					'descripcion'  => isset($regimen['descripcionRegimen']) ? $regimen['descripcionRegimen'] : null,
					'estado'       => isset($regimen['estado']) ? $regimen['estado'] : null,
					'id_impuesto'  => isset($regimen['idImpuesto']) ? $regimen['idImpuesto'] : null,
					'id_regimen'   => isset($regimen['idRegimen']) ? $regimen['idRegimen'] : null,
					'periodo'      => isset($regimen['periodo']) ? $regimen['periodo'] : null,
					'tipo_regimen' => isset($regimen['tipoRegimen']) ? $regimen['tipoRegimen'] : null  
				];
				$exec = SQLConnection::backendStoreProcedure('insertar_regimenes_afip',array_values($params),true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}
			/*
			 "descripcionRegimen":
				"estado": "ACTIVO",
				"idImpuesto": "217",
				"idRegimen": "94",
				"periodo": "200310",
				"tipoRegimen": "RETENCION"
			*/
		}

		if (self::$modificar_consulta && isset($persona['razon_social'])) {
			$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', 
				array($persona['cuit'], $persona['razon_social'], json_encode($datos_persona), 'AFIP'));
			SQLConnection::backendStoreProcedure('insertar_servicios_externos_fecha_consultado', 
				array($persona['cuit'],'AFIP'));
		}
		return $persona;
	}
	
	//parseo e inserción de datos personales provenientes de AFIP 
	private static function parsearDatosPersonales($datos_persona,$alta=false){
		$persona = [];
		if (isset($datos_persona['idPersona'])) {
			$persona['cuit'] = $datos_persona['idPersona'];
		}
		 //RAZON SOCIAL
		$persona['razon_social'] = ''; 
		if (isset($datos_persona['razonSocial'])) {
			$persona['razon_social'] = str_replace('"','',$datos_persona['razonSocial']);
		}
		//RAZON SOCIAL
		$persona['nombre'] = ''; 
		$persona['apellido'] = ''; 
		if (isset($datos_persona['nombre']) || isset($datos_persona['apellido'])) {
			 $datos_persona['nombre']   = isset($datos_persona['nombre'])   ? str_replace('"','',$datos_persona['nombre']) : '';
			 $datos_persona['apellido'] = isset($datos_persona['apellido']) ? str_replace('"','',$datos_persona['apellido']) : '';

			 $persona['razon_social'] = $datos_persona['apellido'].' '. $datos_persona['nombre'];
			 $persona['apellido'] = $datos_persona['apellido'];
			 $persona['nombre']   =  $datos_persona['nombre'];
		}
		$persona['tipo_persona'] = ''; 
		if (isset($datos_persona['tipoPersona']) && isset($persona['cuit'][0])) {
			$persona['tipo_persona'] = $datos_persona['tipoPersona'];
			if ($persona['tipo_persona'] == 'FISICA' || $persona['cuit'][0] == '2') {
				$persona['tipo_persona'] = 'F';
			}else{
				$persona['tipo_persona'] = 'J';
			}
		}else{
			$persona['tipo_persona']     = (substr($persona['cuit'],0,1) != '3') ? 'F' : 'J' ;
		}

		$persona['sexo'] = '';
		if (isset($datos_persona['sexo'])) {
			$persona['sexo'] = $datos_persona['sexo'];
			if ($persona['sexo'] == 'MASCULINO') {
				$persona['sexo'] = 'M';
			}else{
				$persona['sexo'] = 'F';
			}
		}

		$persona['tipo_clave'] = '';
		if (isset($datos_persona['tipoClave'])) {
			$persona['tipo_clave'] = $datos_persona['tipoClave'];
		}else{
			$persona['tipo_clave'] = 'CUIL';

		}
		/* 3/8/2023: Eliminamos comillitas simples y dobles*/
		$persona['razon_social'] = str_replace("'"," ",$persona['razon_social']);
		$persona['apellido'] = str_replace("'"," ",$persona['apellido']);
		$persona['nombre'] = str_replace("'"," ",$persona['nombre']);
		$persona['razon_social'] = str_replace('"',' ',$persona['razon_social']);
		$persona['apellido'] = str_replace('"',' ',$persona['apellido']);
		$persona['nombre'] = str_replace('"',' ',$persona['nombre']);
		$params = []; 
		
	 // if($alta == true){
			$params = [
			'numero' => $persona['cuit'],
			'nombre_persona' => $persona['razon_social'],
			'tipoclave' => $persona['tipo_clave'],
			'tipo_persona' => $persona['tipo_persona'],
			'apellido' => $persona['apellido'],
			'nombre' => $persona['nombre'],
		 // 'sexo' => $persona['sexo'],
			];
			$exec = SQLConnection::backendStoreProcedure('Alta_Padron_Automatico', array_values($params));
		//}
		//ID PADRON
		if (isset($persona['cuit']) ) {
			$id_padron       = SQLConnection::obtenerIdPadron($persona['cuit']);
			$idp             = $id_padron->id_padron;
			$persona['idp']  = $idp;
		}

		if($alta == false) {
			if (isset($persona['cuit'])) {
				if (isset($datos_persona['nombre']) || isset($datos_persona['apellido'])) {
					$alta_params['cuit'] = $persona['cuit'];
					$alta_params['apellido'] = isset( $datos_persona['apellido']) ?  str_replace('"', '', $datos_persona['apellido']) : '';
					$alta_params['nombre']   = isset( $datos_persona['nombre']) ?    str_replace('"', '', $datos_persona['nombre']) : '';
					$exec = SQLConnection::backendStoreProcedure('Alta_cuit_apellido_nombre', array_values($alta_params));
				}
			}
		}
		return $persona;
	}
	//parseo e inserción de domicilios e impuestos provenientes de AFIP 
	private static function parsear_domicilios_impuestos($datos_persona,$persona){
		//DOMICILIOS
		//print_r('Domicilios:'); print_r($datos_persona['domicilios']); 
		if (!empty($datos_persona['domicilios'])) {
			foreach ($datos_persona['domicilios'] as $pos => $domicilio) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$domicilio = $datos_persona['domicilios'];
				}

				$tipo_domicilio = 'O';
				if (isset($domicilio['tipoDomicilio'])) {
					if (strpos(strtoupper($domicilio['tipoDomicilio']), 'FISCAL') !== false){
						$tipo_domicilio = 'F';
					}elseif (strpos(strtoupper($domicilio['tipoDomicilio']), 'LEGAL') !== false){
						$tipo_domicilio = 'L';
					}
				}
				$codigo_postal = isset($domicilio['codPostal'])   ? $domicilio['codPostal'] : null;
				if($codigo_postal == null){
					$codigo_postal = isset($domicilio['codigoPostal'])   ? $domicilio['codigoPostal'] : null;
				}
				$params = [
					'cuit'           => $persona['cuit'],
					'codpos'         => $codigo_postal,
					'domicilio'      => isset($domicilio['direccion'])   ? str_replace('?', '', $domicilio['direccion']) : null,
					'loc_nombre'     => isset($domicilio['localidad'])   ? str_replace('?', '', $domicilio['localidad']) : null,
					'prv_codigo'     => isset($domicilio['idProvincia']) ? $domicilio['idProvincia'] : null,
					'prv_nombre'     => isset($domicilio['descripcionProvincia']) ? str_replace('?', '', $domicilio['descripcionProvincia']) : null,
					'tipo_domicilio' => $tipo_domicilio,
				];

				$exec = SQLConnection::backendStoreProcedure('insertar_domicilio_persona_fisica_afip', array_values($params), true);
				
				// el domicilio legal se guarda como L y como D
				if ($tipo_domicilio == 'L') {
					$params = [
					'cuit'           => $persona['cuit'],
					'codpos'         => $codigo_postal,
					'domicilio'      => isset($domicilio['direccion'])   ? str_replace('?', '', $domicilio['direccion']) : null,
					'loc_nombre'     => isset($domicilio['localidad'])   ? str_replace('?', '', $domicilio['localidad']) : null,
					'prv_codigo'     => isset($domicilio['idProvincia']) ? $domicilio['idProvincia'] : null,
					'prv_nombre'     => isset($domicilio['descripcionProvincia']) ? str_replace('?', '', $domicilio['descripcionProvincia']) : null,
					'tipo_domicilio' => 'D',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_domicilio_persona_fisica_afip', array_values($params), true);
				}

				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				} 
				/*
				else { 
					// OBTENER DOMICILIOS TIPO L
					$domicilios_l = SQLConnection::backendStoreProcedure('obtener_domicilios_legales_persona_fisica_afip', array($persona['cuit']));
					foreach ($domicilios_l as $domicilio_l) {
						$params = [
							'id_domicilio'   => $domicilio_l->id_domicilio,
							'cuit'           => $persona['cuit'],
							'codpos'         => $domicilio_l->codpos,
							'domicilio'      => $domicilio_l->domicilio,
							'loc_nombre'     => $domicilio_l->loc_nombre,
							'prv_codigo'     => $domicilio_l->prv_codigo,
							'prv_nombre'     => $domicilio_l->prv_nombre,
						];

						$exec = SQLConnection::backendStoreProcedure('reasignar_domicilios_legales_persona_fisica_afip', array_values($params), true);
						if (isset($exec->error)) {
							// LOG DE ERRORES
							$params = [
								'cuit' => $persona['cuit'],
								'nombre_persona' => $persona['razon_social'],
								'datos' => '{
															error: "'.$exec->error.'",
															tipo_error: "reasignacion de domicilio legal",
														}',
								'servicio_origen' => 'AFIP',
							];
							$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
						}
					}
				}
				*/


				if ($salir) { break; }
			}
		}
		//IMPUESTOS

		if (!empty($datos_persona['impuesto']) && isset($persona['idp'])) {
			foreach ($datos_persona['impuesto'] as $pos => $impuesto) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$impuesto = $datos_persona['impuesto'];
				}
				$params = [
					'id_padron'         => $persona['idp'],
					'codigo_impuesto'   => isset($impuesto['idImpuesto']) ? $impuesto['idImpuesto'] : null,
					'descripcion'       => isset($impuesto['descripcionImpuesto']) ? $impuesto['descripcionImpuesto'] : null,
					'estado'            => 'ACTIVO',//isset($impuesto['estado']) ? $impuesto['estado'] : null,
					'fecha_inscripcion' => isset($impuesto['periodo']) ? Misc::convertirFormatoFecha($impuesto['periodo'].'01','Ymd','Y-m-d') : null
				];
				//print_r($params['fecha_inscripcion']); die();   
				$exec = SQLConnection::backendStoreProcedure('carga_impuesto_afip', array_values($params), true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}
		}

		//ACTIVIDADES    
		if(!empty($datos_persona['actividad'])){
			foreach ($datos_persona['actividad'] as $pos => $actividad) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$actividad = $datos_persona['actividad'];
				}
				$params = [
					'codigo_actividad'      => isset($actividad['idActividad']) ? $actividad['idActividad'] : null,
					'cuit'                  => $persona['cuit'],
					'descripcion_actividad' => isset($actividad['descripcionActividad']) ? $actividad['descripcionActividad'] : null,
					'formulario'            => isset($actividad['nomenclador']) ? $actividad['nomenclador'] : null,
					'orden'                 => ($actividad['orden'] == 1) ? 1 : 0,
					'periodo'               => isset($actividad['periodo']) ? $actividad['periodo'] : null,

				];
				$exec = SQLConnection::backendStoreProcedure('carga_actividades_afip', array_values($params), true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}   
		}


		//ACTIVIDAD PRINCIPAL
		if(isset($datos_persona['idActividadPrincipal'])){
		 
				$params = [
					'codigo_actividad'      => isset($datos_persona['idActividadPrincipal']) ? $datos_persona['idActividadPrincipal'] : null,
					'cuit'                  => $persona['cuit'],
					'descripcion_actividad' => isset($datos_persona['descripcionActividadPrincipal']) ? $datos_persona['descripcionActividadPrincipal'] : null,
					'formulario'            => '883',
					'orden'                 => '1', 
				];
				$exec = SQLConnection::backendStoreProcedure('carga_actividades_afip', array_values($params), true);
				
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
		}
		if(isset($datos_persona['idActividadPrincipal']) || isset($datos_persona['actividad']))
		{
			$params = ['cuit' => $persona['cuit']];   
			$exec = SQLConnection::backendStoreProcedure('carga_actividades_afip_visible', array_values($params), true); 
		}


		//CATEGORIAS
		if (!empty($datos_persona['categoria']) && isset($persona['idp'])) {
			foreach ($datos_persona['categoria'] as $pos => $categoria) {
				$salir = false;
				if (!is_numeric($pos)) {
					$salir = true;
					$categoria = $datos_persona['categoria'];
				}
				$params = [
					'id_padron'    => $persona['idp'],
					'id_categoria' => isset($categoria['idCategoria']) ? $categoria['idCategoria'] : null,
					'id_impuesto'  => isset($categoria['idImpuesto']) ? $categoria['idImpuesto'] : null,
					'descripcion'  => isset($categoria['descripcionCategoria']) ? $categoria['descripcionCategoria'] : null,
					'estado'       => isset($categoria['estado']) ? $categoria['estado'] : null,
					'periodo'      => isset($categoria['periodo']) ? $categoria['periodo'] : null,
				];
				$exec = SQLConnection::backendStoreProcedure('insertar_categoria_persona_afip', array_values($params), true);
				if (isset($exec->error)) {
					// LOG DE ERRORES
					$params = [
						'cuit' => $persona['cuit'],
						'nombre_persona' => $persona['razon_social'],
						'datos' => '{error: "'.$exec->error.'"}',
						'servicio_origen' => 'AFIP',
					];
					$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', array_values($params));
				}
				if ($salir) { break; }
			}
		}
	}

	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);
		
		//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]);
			}
		}
	
	}
}
