<?php namespace App\Http\Controllers;

use Illuminate\Support\Facades\Request;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Session;
use App\Custom\SQLConnection;
use App\Custom\Misc;
use Illuminate\Support\Facades\Storage;
use Response;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;


class gestorFuentesController extends Controller {
   
    public static function panelfuentes20082024() {             
        $cliente = SQLConnection::backendStoreProcedure("backend_datos_clientes",array("2254875"),'selectOne');        
        $cuit= $cliente->cuit;
        $numcliente = $cliente->cliente;
        $identificador = $cliente->tipo_identificador;

        $id_padron = SQLConnection::backendStoreProcedure('LN_busqueda_padron',array($identificador,$cuit))[0]->id_padron;
        $identificacion = SQLConnection::backendStoreProcedure('LN_busqueda_padron',array($identificador,$cuit))[0]->identificacion;
        $familias = SQLConnection::backendStoreProcedure('LN_familias_sc', array('search',NULL,NULL,2254875,NULL,1,NULL,NULL,NULL,NULL,NULL,47), 'select');
        
        $servicio = 47;
        $id_padron = SQLConnection::backendStoreProcedure('LN_busqueda_padron',array($identificador,$cuit))[0]->id_padron;
        $identificacion = SQLConnection::backendStoreProcedure('LN_busqueda_padron',array($identificador,$cuit))[0]->identificacion;
        $datosFuentes =  SQLConnection::backendStoreProcedure('fuentes_panel',array());        
        // $indices_excluir = array(0, 1, 3, 6, 7, 8, 9);
        $indices_excluir = [];
        // Itera sobre los índices a excluir
        foreach ($indices_excluir as $indice) {
            // Verifica si el índice existe en el array
            if (array_key_exists($indice,  $datosFuentes)) {
                // Si existe, elimina el elemento
                unset($datosFuentes[$indice]);
            }
        }
        
        return view('/panel_fuentes/panel_fuentes')->with(compact('cliente','familias','cuit','id_padron','identificacion','datosFuentes'));
    }

    public static function panelfuentes() {
        // Obtener datos del cliente
        $cliente = SQLConnection::backendStoreProcedure('backend_datos_clientes', ['2254875'], 'selectOne');
        $cuit = $cliente->cuit;
        $numcliente = $cliente->cliente;
        $identificador = $cliente->tipo_identificador;

        // Obtener datos de identificacion
        $id_padron = SQLConnection::backendStoreProcedure('LN_busqueda_padron', [$identificador, $cuit])[0]->id_padron;
        $identificacion = SQLConnection::backendStoreProcedure('LN_busqueda_padron', [$identificador, $cuit])[0]->identificacion;

        // Obtener datos de la familia
        $familias = SQLConnection::backendStoreProcedure(
            'LN_familias_sc', 
            ['search', null, null, 2254875, null, 1, null, null, null, null, null, 47], 
            'select'
        );

        $servicio = 47;        

        // Obtener datos fuentes
        $datosFuentes = SQLConnection::backendStoreProcedure('fuentes_panel', []);                        

        // Retorno de la vista con los datos
        return view('/panel_fuentes/panel_fuentes')->with(compact(
            'cliente',
            'familias',
            'cuit',
            'id_padron',
            'identificacion',
            'datosFuentes'
        ));
    }
    
    public static function panelFuentesInformes() {
        $panel_fuentes = 1;
        return view('/panel_fuentes/panel_fuentes_informes')->with(compact('panel_fuentes'));
    }

    public static function tipoInformes() {
        $familia = $_POST['id_familia'];
        $tipo_informes_activos=array();
		$tipos_informe = SQLConnection::backendStoreProcedure('LN_familia_tipo_informe', array('LISTAR_FAMILIA', $familia ,NULL,Session::get('usuario')->user_id),'select');
		foreach ($tipos_informe as $key => $value) {			
			if(intval($value->activo) == 1 && intval($value->activo_fam_inf) == 1) {
				array_push($tipo_informes_activos, $value);
			}
		}
        echo json_encode(array("cantidad"=>count($tipo_informes_activos),"tipos_informe"=>$tipo_informes_activos));
    }

    public static function obtenerTeam() {
        if ( isset($_POST['equipo']) and !empty($_POST['equipo']) ) {
            
            $team_default = Misc::obtenerTeamDefaultFamilia($_POST['equipo']);
            echo json_encode(array("team"=>$team_default->id_team));
        }
    }

    public function solicitantesInformeFuente() {
		$contrap = Request::input('contraparte');
		$cliente = Request::input('cliente');
		
        if ( $contrap == "" ) {
            $contrap = null;
        }
		
        $solicitantes = SQLConnection::backendStoreProcedure('LN_demo_', array('usuarios_solicitantes', $contrap, $cliente), 'select');
		
        return json_encode($solicitantes);
	}

    public static function guardarFuente() {
        if( isset($_POST['accion']) && !empty($_POST['accion']) ) {
            $ip =  $_SERVER['REMOTE_ADDR'];
            $usuario_id = Session::get("usuario")->user_id;
            $duracion = (int) $_POST['duracion_fuente'];
            $cliente = (int) $_POST['cliente'];
            $cuit = $_POST['cuit'];
            $padron = $_POST['id_padron'];
            $identificacion = $_POST['identificacion'];
            $nombre_fuente = $_POST['nombre_fuente'];
            $descripcion_fuente = $_POST['descripcion_fuente'];
            $team = $_POST['team_default'];
            $familia = $_POST['familia'];
            $proveedor = $_POST['proveedor'];
            //$periodicidad = $_POST['periodicidad'];
            $id_tipo_informe = $_POST['tipo_informe'];
            $FILIAL_DEFAULT = env('FILIAL_DEFAULT');
            $IDIOMA_DEFAULT= env('IDIOMA_DEFAULT');
            $DATAMANAGER_DEFAULT = env('DATAMANAGER_DEFAULT');
            $ASIGNADO_DEFAULT = env('ASIGNADO_DEFAULT');
            $ESTADO_INFORME_INICIAL = env('ESTADO_INFORME_INICIAL');
            $producto = 2002;
            $servicio = 47;
            $automatico = intval($_POST['automatico']);

            if ($_POST['accion'] == 'B') {
                $id_fuente = $_POST['id_fuente'];
                # la duracion se obtiene de este store pero por el momento es mejor que elijan la duraciòn desde el formulario
                #$duracion = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR',null,null,null,null,null,null,null,null,null,$id_tipo_informe,null),'selectOne')->duracion;
                $parametros = array( 
                    $id_fuente,
                    $nombre_fuente,
                    $descripcion_fuente,
                    $duracion,$proveedor,
                    null,
                    null,
                    'M',
                    $cliente,
                    $team,
                    $identificacion,
                    $padron,
                    $familia,
                    $id_tipo_informe,
                    null,
                    null,
                    null,
                    $FILIAL_DEFAULT,
                    $IDIOMA_DEFAULT,
                    $DATAMANAGER_DEFAULT,
                    $ASIGNADO_DEFAULT,
                    $producto,
                    $servicio,
                    $automatico,
                    $usuario_id,
                    $ip
                );

                SQLConnection::backendStoreProcedure('backend_modificar_fuentes_descripciones', $parametros);
                echo json_encode(array("error"=>0,"msj"=>"fuente exitosamente editada"));
            } else {
                # la duracion se obtiene de este store pero por el momento es mejor que elijan la duraciòn desde el formulario
                #$duracion = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR',null,null,null,null,null,null,null,null,null,$id_tipo_informe,null),'selectOne')->duracion;
                $parametros = array(
                    null,
                    $nombre_fuente,
                    $descripcion_fuente,
                    $duracion,
                    $proveedor,
                    null,
                    null,
                    null,
                    $cliente,
                    $team,
                    $identificacion,
                    $padron,
                    $familia,
                    $id_tipo_informe,
                    null,
                    null,
                    null,
                    $FILIAL_DEFAULT,
                    $IDIOMA_DEFAULT,
                    $DATAMANAGER_DEFAULT,
                    $ASIGNADO_DEFAULT,
                    $producto,
                    $servicio,
                    $automatico,
                    $usuario_id,
                    $ip
                );

                SQLConnection::backendStoreProcedure('backend_modificar_fuentes_descripciones', $parametros);
                echo json_encode(array("error"=>0,"msj"=>"fuente exitosamente creada"));
            }
        }
    }

    public static function estadoAutomatico() {
        $estado = $_POST['estado'];
        $id_fuente=$_POST['id_fuente'];
        
        $parametros = array(
            $id_fuente,
            null,
            null,
            null,
            null,
            null,
            null,
            'A',
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            $estado
        );

        SQLConnection::backendStoreProcedure('backend_modificar_fuentes_descripciones', $parametros);

        $parametrosListar = array(
            $id_fuente,
            null,
            null,
            null,
            null,
            null,
            null,
            'I',
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null
        );
        
        $nuevosDatosFila =  SQLConnection::backendStoreProcedure('backend_modificar_fuentes_descripciones', $parametrosListar);
        echo json_encode(array("error"=>0,"msj"=>"actualizaciòn realizada","fila"=>$nuevosDatosFila));
    }

    public static function index() {
        return view('/gestor-fuentes/gestorFuentes');
    }

    public static function indexCuentasApocrifas() {
        $idFuente = Request::input('idFuente');

        return view("/fuentes-deudas-apocrifas/carga_archivo")->with(compact('idFuente'));
    }
   
    public static function recibir_archivo_fuentes03092024() 
    {
        $fechaProceso = Request::input('fecha_del_proceso');
        $idFuente = Request::input('idFuente');

        // Verifica si el archivo ya fue procesado anteriormente
        $validarProceso = Misc::validacion_proceso_fuente_semanal($idFuente, 'FA', $fechaProceso);        
        if (!empty($validarProceso)) {
            return json_encode(array("error" => 0, "msj" => "El archivo ya fue procesado anteriormente"));    
        }

        $fecha_actual = date("Y-m-d_H-i-s");
        $archivo = $fecha_actual.'_apocrifa.txt';
        $archivo_temporal = $_FILES['archivo']['tmp_name'];
        $path_fuente = env("PATH_FUENTES_ARCHIVOS_PROCESAR");
        $directorio_archivo = $path_fuente."facturas_apocrifas/";
        $directorio_reserva = env('PATH_FUENTES_RESERVA').'facturas_apocrifas/';
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
               
        if (!file_exists($directorio_archivo)) {
            mkdir($directorio_archivo, 0777, true);
        }

        // Mover el archivo al directorio destino
        if ( move_uploaded_file($archivo_temporal,$directorio_archivo.$archivo) ) {
            //
            if ( copy($directorio_archivo.$archivo,$directorio_reserva.$archivo) ) {
                //
                $url = env('URL_WEB_FUENTES');
                $ip = $_SERVER['REMOTE_ADDR'];
                $usuario_id = Session::get("usuario")->user_id;
                $fecha_proceso = date('Y-m-d');
                $datos = http_build_query(array("tipo_fuente"=>"FA","ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $fecha_proceso));
                $request = Misc::CURLCall($url,$datos,'POST',600);
                $respuesta = json_decode($request);
                //
                if( (intval($respuesta->error) == 0) ){
                    return Response::json(array("error" => 0, "msj" => "Fuente procesada con exito."));
                } else {
                    return Response::json(array("error" => 3, "msj" => "Ocurrió un error en el procesamiento del archivo."));
                }
            } else {
                return Response::json(array("error" => 2, "msj" => "No se pudo generar la copia de seguridad."));
            }
        } else {
            return Response::json(array("error" => 1, "msj" => "No se ha enviado ningún archivo o ha ocurrido un error."));
        }
    }

    /**
     * Se carga el archivo de fuentes apocrifas y tambien crea su copía
     * 
     * @return \Illuminate\Http\JsonResponse
     */
    public static function recibir_archivo_fuentes() 
    {        
        $fechaProceso = Request::input('fecha_del_proceso');
        $idFuente = Request::input('idFuente');
    
        // Verifica si el archivo ya fue procesado anteriormente
        $validarProceso = Misc::validacion_proceso_fuente_semanal($idFuente, 'FA', $fechaProceso);        
        if (!empty($validarProceso)) {
            return response()->json(["error" => 0, "msj" => "El archivo ya fue procesado anteriormente"]);
        }
    
        $file = Request::file('archivo');
        if (!$file || !$file->isValid()) {
            return response()->json(["error" => 1, "msj" => "No se ha enviado ningún archivo o ha ocurrido un error."]);
        }
    
        $archivoNombre = $fechaProceso . '_apocrifa.txt'; 
        $archivoNombreFijo = 'archivo_apocrifa.txt'; 
        $path_fuente = env("PATH_FUENTES_ARCHIVOS_PROCESAR");
        $directorio_archivo = $path_fuente . "facturas_apocrifas/";
        $directorio_reserva = env('PATH_FUENTES_RESERVA') . 'facturas_apocrifas/';
    
        // Verifica si el directorio existe y lo crea si es necesario
        if (!file_exists($directorio_archivo)) {
            mkdir($directorio_archivo, 0777, true);
        }
    
        // Mover el archivo al directorio destino con un nombre dinámico
        if (move_uploaded_file($file->getPathname(), $directorio_archivo . $archivoNombre)) {
            // Copiar el archivo al directorio de reserva con un nombre fijo
            if (copy($directorio_archivo . $archivoNombre, $directorio_reserva . $archivoNombreFijo)) {
                $url = env('URL_WEB_FUENTES');
                $ip = $_SERVER['REMOTE_ADDR'];
                $usuario_id = Session::get("usuario")->user_id;
                $fecha_proceso = date('Y-m-d');
                $datos = http_build_query(["tipo_fuente" => "FA", "ip" => $ip, "usuario_id" => $usuario_id, 'fecha_proceso' => $fecha_proceso]);
                $request = Misc::CURLCall($url, $datos, 'POST', 600);
                $respuesta = json_decode($request);
    
                if (intval($respuesta->error) === 0) {
                    return response()->json(["error" => 0, "msj" => "Fuente procesada con éxito."]);
                } else {
                    return response()->json(["error" => 3, "msj" => "Ocurrió un error en el procesamiento del archivo."]);
                }
            } else {
                return response()->json(["error" => 2, "msj" => "No se pudo generar la copia de seguridad."]);
            }
        } else {
            return response()->json(["error" => 1, "msj" => "Error al mover el archivo al directorio destino."]);
        }
    }    

    private static function fechaparseada($fecha) {
        $fecha = $fecha;
        $timestamp = strtotime($fecha);
        $fecha_formateada = date("Y-m-d", $timestamp);
        return $fecha_formateada;
    }

    // FUNCION QUE DECIDE SI EL ARCHIVO ES VALIDO O NO
    private static function validar_archivo_nuevo($p) {
        $expReg = "/^.+\.txt$/";
        return (preg_match($expReg,$p) == 1);
    }

    //sección entidades bancarias nuevo
    public static function indexEntidadesBancarias() {
        $contenido = json_encode(SQLConnection::backendStoreProcedure('EntidadesBancariasMensual',array('LISTAR')));
        return view('/fuentes-entidades-bancarias/cargar_archivo_txt_nuevo',compact('contenido'));
    }

    public static function cargar_archivoentidadesBancarias() {
        $ip = $_SERVER['REMOTE_ADDR'];
        $path_fuentes = env('PATH_EJECUCION_FUENTES');
        $usuario_id = Session::get("usuario")->user_id;
        $expReg = "/^.+\.txt$/";
        $fecha_informacion = null;
        //-------- Si el nombre del archivo es valido
        if ( Misc::validar_data($expReg, $_FILES["archivo_txt"]["name"] )) {
            $fecha_informacion = explode(".",explode("_",$_FILES['archivo_txt_fecha']['name'])[2])[0];
            $ruta = $_FILES["archivo_txt"]["tmp_name"];
            $lista = file($ruta);
            
            SQLConnection::backendStoreProcedure(
                "backend_abm_fuentes_procesadas",
                array(
                    "A",
                    NULL,
                    $fecha_informacion,
                    'Entidades Bancarias',
                    1,
                    'se ha facilitado la fuente:'.$_FILES["archivo_txt"]["name"],
                    $usuario_id,$ip
                )
            );

            $ruta_script = null;
            if (file_exists($path_fuentes.'cambiarestado/cambiar_estado.php')) {
                $ruta_script = $path_fuentes.'cambiarestado/./cambiar_estado.php';
            } else {
                dd("no llega al archivo");
            }
            $tipo_estado = 'procesando';
            $tipo_fuente_a_cambiar = 'fuentes_entidades_bancarias';
            $resultado = shell_exec("php ".$ruta_script." ".$tipo_estado." ".$tipo_fuente_a_cambiar);
            //---------------- Si el contenido del archivo es valido lo agrega a la lista sino no
            $patron_total = "/^\d{5}.{1,150}$/";
            $codigo_entidad = [];
            $nombre_entidad = [];
            //-------- Lo codifica con utf8 para purgar los caracteres extraños
            foreach ($lista as $e ) {
                //--------
                if (Misc::validar_data($patron_total,$e)) {
                    $action = "";
                    $codigo = mb_convert_encoding(substr($e,0,5), 'UTF-8', 'ISO-8859-1');
                    $nombre = mb_convert_encoding(substr($e,5,150), 'UTF-8', 'ISO-8859-1');
                    array_push($nombre_entidad,$nombre);
                    array_push($codigo_entidad,$codigo);
                    SQLConnection::backendStoreProcedure('EntidadesBancariasMensual',array("PROCESOTXT",$codigo,$nombre));
                }
                //-----
            }
            $ruta_script;
            if (file_exists($path_fuentes.'cambiarestado/cambiarestado.php')) {
                $ruta_script = $path_fuentes.'cambiarestado/./cambiarestado.php';
            } else {
                dd("no llega al archivo");
            }
            $tipo_estado = 'aprobado';
            $tipo_fuente_a_cambiar = 'fuentes_entidades_bancarias';
            $resultado = shell_exec("php ".$ruta_script." ".$tipo_estado." ".$tipo_fuente_a_cambiar);
            SQLConnection::backendStoreProcedure("backend_abm_fuentes_procesadas",array("A",NULL,$fecha_informacion,'Entidades Bancarias',1,'se proceso la fuente: '.$_FILES["archivo_txt"]["name"],$usuario_id,$ip));
            echo json_encode(array("error"=>0,"msj"=>"Fuente exitosamente procesada"));
        } else {
            //------------- Si el nombre del archivo es invalido
            echo json_encode(array("error"=>1,"msj"=>"No se ha enviado ningún archivo o ha ocurrido un error."));
        }
    }

    public static function indexContInscriptos() {        
        $idFuente = Request::input('idFuente');

        return view('/fuentes-contribuyentes-inscriptos/index_contribuyentes_inscriptos')->with(compact('idFuente'));
    }
    
    /**
     * Carga y procesa un archivo ZIP de inscriptos
     *
     * @return string Devuelve un JSON con un mensaje de error o exito
     *                    
     */
    public static function cargarFuenteInscriptos() {                   
        // Verifica si no se subio ningun archivo
        if (empty($_FILES)) {
            return json_encode(array("error" => 0, "mensaje" => "No se detecto un archivo para cargar"));
        }
    
        // Valida si el archivo subido es un archivo ZIP
        if (!self::validarArchivoZip($_FILES["archivo"]["name"])) {
            return json_encode(array("error" => 0, "mensaje" => "Hemos tenido un error a la hora de carga del archivo"));
        }
    
        // Obtiene la fecha de proceso y el ID de la fuente
        $fechaProceso = Request::input('fecha_proceso');
        $idFuente = Request::input('idFuente');
        
        // Verifica si el archivo ya fue procesado anteriormente
        $validarProceso = Misc::validacion_proceso_fuente_semanal($idFuente, 'IN', $fechaProceso);
        if (!empty($validarProceso)) {
            return json_encode(array("error" => 0, "mensaje" => "El archivo ya fue procesado anteriormente"));    
        }        

        // Variables para el procesamiento del archivo
        $usuario_id = Session::get("usuario")->user_id;                
        $ruta = $_FILES["archivo"]["tmp_name"];
        $url = env('URL_WEB_FUENTES');
        $ip = $_SERVER['REMOTE_ADDR'];                                                                
        $destino = env('PATH_FUENTES_PROCESAR_INSCRIPTOS');
        //$destino_reserva = env('PATH_FUENTES_RESERVA_INSCRIPTOS');
        $archivo = str_replace('-', '_', $fechaProceso) . '.zip';
        
        // Verifica la existencia de un proceso 
        $verificarEstadoProceso = Misc::CURLCall($url, http_build_query(array("tipo_fuente" => "IN", "es_pendiente" => 1)),'POST', 600);                
        $estadoProceso = json_decode($verificarEstadoProceso);
        
        // Si hay un proceso en cola devuelve error 1 y no realizamos el procesado actual 
        if (0 == $estadoProceso->error) {
            $datosProceso = json_decode($estadoProceso->datos);
            $mensajeEstadoProceso = "Ya existe un proceso en cola para este tipo de fuente, fecha de proceso: {$datosProceso[0]->fecha_proceso}";
            
            return json_encode(array("error" => 1, "mensaje" => $mensajeEstadoProceso));
        }
        
        // Crea los directorios de destino si no existen
        self::crearDirectorioSiNoExiste($destino);
        //self::crearDirectorioSiNoExiste($destino_reserva);                 
    
        // Define la ruta final del archivo procesado
        $ruta_final_inscriptos = $destino . $archivo;
    
        // Mueve el archivo subido al destino final
        if (!move_uploaded_file($ruta, $ruta_final_inscriptos)) {
            return json_encode(array("error" => 1, "mensaje" => "Error al mover el archivo subido"));
        }
    
        // Copia el archivo a un destino de reserva
       /*  if (!copy($ruta_final_inscriptos, $destino_reserva . $archivo)) {  
            return json_encode(array("error" => 1, "mensaje" => "El archivo no se puede copiar!"));  
        }  */
    
        // Arma los datos para la solicitud HTTP
        $datos = http_build_query(array("tipo_fuente" => "IN", "ip" => $ip, "usuario_id" => $usuario_id, "fecha_proceso" => $fechaProceso));
        
        // Realiza una llamada cURL a la URL proporcionada
        $request = Misc::CURLCall($url, $datos, 'POST', 600);
        $respuesta = json_decode($request);
    
        // Devuelve un mensaje de exito si no hubo errores en la respuesta
        if (0 == intval($respuesta->error)) {
            return json_encode(array("error" => 0, "msj" => "Fuente exitosamente procesada"));
        }
    }
    
    /**
     * Crea un directorio si no existe.
     *
     * @param string $ruta La ruta del directorio a crear.
     * @return void
     */
    private static function crearDirectorioSiNoExiste($ruta) {
        if (!file_exists($ruta)) {
            mkdir($ruta, 0777, true); 
        }
    }

    public static function cargarFuenteInscriptos23082024(){           
        if ( !empty($_FILES)) {
            if (self::validarArchivoZip($_FILES["archivo"]["name"]) ) {
                $fechaProceso = Request::input('fecha_proceso');
                $idFuente = Request::input('idFuente');

                $validarProceso = Misc::validacion_proceso_fuente_semanal($idFuente,'IN',$fechaProceso);
                if (empty($validarProceso)) {
                    $usuario_id = Session::get("usuario")->user_id;                
                    $ruta = $_FILES["archivo"]["tmp_name"];
                    $url = env('URL_WEB_FUENTES');
                    $ip = $_SERVER['REMOTE_ADDR'];                                                                
                    $destino = env('PATH_FUENTES_PROCESAR_INSCRIPTOS');
                    $destino_reserva = env('PATH_FUENTES_RESERVA_INSCRIPTOS');
                    $archivo = str_replace('-','_',$fechaProceso).'.zip';                                
                    
                    $filename = $_FILES["archivo"]["name"];
                                                         
                    if (!file_exists($destino)) {
                        mkdir($destino, 0777, true); 
                    }
                
                    if (!file_exists($destino_reserva)) {
                        mkdir($destino_reserva, 0777, true); 
                    }                 
                                    
                    $ruta_final_inscriptos = $destino.$archivo;
                    $ip = $_SERVER['REMOTE_ADDR'];
                    $usuario_id = Session::get("usuario")->user_id;
    
                    $indicador = 0;
                    if (move_uploaded_file($ruta,$ruta_final_inscriptos)) {
                    // Imprimir la salida en la consola del servidor (opcional)
                        $indicador = 1;
                        if ( !copy($destino.$archivo, $destino_reserva.$archivo) ) {  
                            echo "File can't be copied! \n";  
                        } else {                                                                                                 
                            $datos = http_build_query(array("tipo_fuente"=>"IN","ip"=>$ip,"usuario_id"=>$usuario_id,"fecha_proceso"=>$fechaProceso));
                            $request = Misc::CURLCall($url,$datos,'POST',600);
                            
                            $respuesta = json_decode($request);
                            
                            if (0 == intval($respuesta->error)) {
                                echo json_encode(array("error"=>0,"msj"=>"Fuente exitosamente procesada"));
                            }
                        }  
                    }                               
                }else {
                    return json_encode(array("error"=>0,"mensaje"=>"El archivo ya fue procesado anteriormente"));    
                }               
            } else {
                return json_encode(array("error"=>0,"mensaje"=>"Hemos tenido un error a la hora de carga del archivo"));
            }            
        } else {
            return 0;
        }        
    }   

    // FUNCION QUE DECIDE SI EL ARCHIVO ES VALIDO O NO
    private static function validarArchivoZip($p) {
        $expReg = "/^.+\.zip$/";
        return (preg_match($expReg,$p) == 1);
    }
    
    //sección correspondiente a mis aportes
    public static function indexMisAportes() {
        return view("fuentes-mis-aportes/fuentes_mis_aportes");
    }

    //sección correspondiente deudores
    public static function indexDeudores() {  
        $gestor = 'mensual';    
        $idFuente = Request::input('idFuente');
        return view("/fuentes-deudores/indexdeudores")->with(compact('gestor', 'idFuente'));
    }

    public static function indexDeudoresActualizacion()
    {
        $gestor = 'actualizacion';    
        $idFuente = Request::input('idFuente');  
        return view("/fuentes-deudores/indexdeudores")->with(compact('gestor', 'idFuente'));
    }

    //eliminar directorio
    public static function eliminarDirectorio($directorio)  
    {
        //Abre el directorio
        $gestorDirectorio = opendir($directorio);
        
        // Itera sobre los archivos y directorios dentro del directorio
        while (($archivo = readdir($gestorDirectorio)) !== false) {
            if ($archivo != '.' && $archivo != '..') {
                $rutaArchivo = $directorio . DIRECTORY_SEPARATOR . $archivo;
                // Si es un directorio, llama recursivamente la función para eliminarlo
                if (is_dir($rutaArchivo)) {
                    self::eliminarDirectorio($rutaArchivo);
                } else {
                    // Si es un archivo, elimínalo
                    unlink($rutaArchivo);
                }
            }
        }
        // Cierra el gestor de directorio
        closedir($gestorDirectorio);
        
        // Finalmente, elimina el directorio
        rmdir($directorio);
    }

    
    /**
     * Funcion que se encarga de hacer un pedido para el proceso de la fuente de central de deudores mensual
     * 
     * Se consulta una funcion validacion_proceso_fuente_mensual la cual si devuelve vacio quiere decir que no hay un pedido de carga
     * Si devuelve datos significa que un pedido esta en proceso
     * 
     * return JsonResponse,  con el mensaje de accion procesada y error 
    */
    public static function cargar_archivoCentralDeudores() {
        $fechaCarga = Request::input('fechaCarga').'-01';
        $idFuente = Request::input('idFuente');
        $fuente = Request::input('fuente'); 
        $visible = 1;
        $observaciones = 'Se inserto el registro con exito';
        $usuario_id = Session::get("usuario")->user_id;
        $ip = $_SERVER['REMOTE_ADDR']; 
        
        $procesoFuente = Misc::validacion_proceso_fuente_mensual($idFuente,'CD',$fechaCarga);
        
        $mensaje = '';
        $error = '';
        if (empty($procesoFuente)) {
            SQLConnection::backendStoreProcedure('backend_abm_fuentes_procesadas', ['A', NULL, $fechaCarga, 'CD', $visible, $observaciones, $usuario_id, $ip, $idFuente]);
            $mensaje = 'El pedido se realizo con exito.';
            $error = 0;
        } else {
            $mensaje = 'Ya existe un pedido de carga, intentelo mas tarde';
            $error = 1;
        }
        
        return json_encode(array("error"=>$error,"mensaje"=>$mensaje));
    }
    

    public static function cargar_archivoCentralDeudoresbkp() {
        if ( self::validar_archivo_generico($_FILES["archivo"]["name"],'7Z') ) {
            $ruta = $_FILES["archivo"]["tmp_name"];
            $destino = "/var/www/html/compartido/central_deudores/para_procesar/";
            $destino_reserva = "/var/www/html/compartido/fuentes_reserva/central_deudores/";
            if (!file_exists($destino)) {
                mkdir($destino, 0777, true); // El tercer parámetro `true` indica que se deben crear directorios padres si no existen
            } 
            if (!file_exists($destino_reserva)) {
                mkdir($destino_reserva, 0777, true); // El tercer parámetro `true` indica que se deben crear directorios padres si no existen
            } 
            $archivo = $_FILES["archivo"]["name"];
            $indicador = 0;
            if (move_uploaded_file($ruta,$destino.$archivo)) {
                chmod($destino . $archivo, 0777); // Cambiar los permisos según tus necesidades
                if (file_exists('/var/www/html/backend.fidelitas/public/central_deudores_prueba/central_deudores_extraer.py')) {
                    $ruta_script = '/var/www/html/backend.fidelitas/public/central_deudores_prueba/./central_deudores_extraer.py';
                } else {
                    echo("no llega al archivo");
                }
                
                $resultado = shell_exec("python3 ".$ruta_script);
                if( !copy($destino.$archivo, $destino_reserva.$archivo) ) {  
                    echo "File can't be copied! \n";  
                } else {  
                    return json_encode(array("error"=>0,"mensaje"=>"Actividad realizada, posteriormente se realizará el procesamiento de la fuente..."));
                }  
            } else {
                $indicador = 2;
            }
        }
    }

    //hace la descompresion del archivo de deudores para actualizar
    public static function cargar_archivoCentralDeudoresActualizacion() {
        if ( self::validar_archivo_generico($_FILES["archivo"]["name"],'7Z') ) {
            $ruta = $_FILES["archivo"]["tmp_name"];
            $destino = "/var/www/html/compartido/central_deudores_actualizacion/para_procesar/";
            $destino_reserva = "/var/www/html/compartido/fuentes_reserva/central_deudores/";
            
            if (!file_exists($destino)) {
                mkdir($destino, 0777, true); // El tercer parámetro `true` indica que se deben crear directorios padres si no existen
            }

            if (!file_exists($destino_reserva)) {
                mkdir($destino_reserva, 0777, true); // El tercer parámetro `true` indica que se deben crear directorios padres si no existen
            }

            $archivo = $_FILES["archivo"]["name"];
            $indicador = 0;

            if (move_uploaded_file($ruta,$destino.$archivo)) {
                chmod($destino . $archivo, 0777); // Cambiar los permisos según tus necesidades
                if ( file_exists('/var/www/html/backend.fidelitas/public/central_deudores_prueba/central_deudores_diferencial_extraer.py' ) ) {
                    $ruta_script = '/var/www/html/backend.fidelitas/public/central_deudores_prueba/./central_deudores_diferencial_extraer.py';
                } else {
                    echo("no llega al archivo");
                }
                
                $resultado = shell_exec("python3 ".$ruta_script);
                
                if( !copy($destino.$archivo, $destino_reserva.$archivo) ) {  
                    echo "File can't be copied! \n";  
                } else {  
                    return json_encode(array("error"=>0,"mensaje"=>"Actividad realizada, posteriormente se realizará el procesamiento de la fuente..."));
                } 
            } else {
                $indicador = 2;
            }
        }
    }

    public static  function indexDeudoresHistorico() 
    {
        return view("/fuentes-deudores/indexdeudoresHistorico");
    }

    public static function cargar_archivoCentralDeudoresHistorico() {
        $tempDir = '/var/www/html/compartido/central_deudores_historico/';
        $fileName = $_POST['name'];
        $fileIndex = $_POST['index'];

        if (!is_dir($tempDir)) {
            mkdir($tempDir, 0777, true);
        }

        move_uploaded_file($_FILES['file']['tmp_name'], "$tempDir/$fileName.part.$fileIndex");
        $finalDir = '/var/www/html/compartido/central_deudores_historico/';
        $filePath = "$tempDir/$fileName.part.*";
        $fileParts = glob($filePath);
        sort($fileParts, SORT_NATURAL);

        $finalFile = fopen($finalDir.$fileName, 'a');

        foreach ($fileParts as $filePart) {
            $chunk = file_get_contents($filePart);
            fwrite($finalFile, $chunk);
            unlink($filePart);  // Optionally delete the chunk
        }
        fclose($finalFile);
    }

    public static function indexsituacionUnoDeudores() {
        $id_fuente = Request::input('idFuente');
        return view("/fuentes-deudores/carga_deudores_situacion_uno")->with(compact('id_fuente'));
    }

    public static function cargar_archivoCDSituacionUno() {
        $periodo = Request::input('fecha_fuente').'-01';
        $id_fuente = Request::input('id_fuente');
        $archivo = $_FILES['archivo']['name'];
        
        if ( !empty($id_fuente) && !empty($periodo) && (!is_null($archivo) || !empty($archivo)) ) {
            $path = env('PATH_ARCHIVOS_SITUACION_UNO');
            $ext = '.7Z';
            $name = "SU";
            $proceso_fuente = Misc::validacion_proceso_fuente_mensual($id_fuente,$name,$periodo);

            $url = env('URL_WEB_FUENTES');
            $ip = $_SERVER['REMOTE_ADDR'];
            $usuario_id = Session::get("usuario")->user_id;
            $datos = http_build_query(array("tipo_fuente"=>$name,"ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $periodo,'es_pendiente' => 1));
            $request = Misc::CURLCall($url,$datos,'POST',600);
            $respuesta = json_decode($request);
            
            if ( !empty($proceso_fuente) ) {
                return 3;
            }
            if ( !empty($respuesta) && $respuesta->error == 0 ) {
                return 4;
            }
            if ( !file_exists($path.$name.$ext) && !empty($respuesta) && $respuesta->error == 1) {
                move_uploaded_file($_FILES['archivo']['tmp_name'],$path.$name.$ext);
                $datos = http_build_query(array("tipo_fuente"=>$name,"ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $periodo));
                $request = Misc::CURLCall($url,$datos,'POST',600);
                $respuesta = json_decode($request);
                return 1;
            } else {
                return 2;
            }
        }
        return 0;
    }

    public static function copia_reserva_situacion_uno() {
        $ruta = '/var/www/html/compartido/situacion_uno/'.$_POST['archivo'];
        $destino_reserva = "/var/www/html/compartido/fuentes_reserva/situacion_uno/";
        if (!file_exists($destino_reserva)) {
            mkdir($destino_reserva, 0777, true);
        } 
        if( !copy($ruta, $destino_reserva.$_POST['archivo']) ) {  
            echo "File can't be copied! \n";  
        }  
    }

    public static function copiaReservaSituacionUno() {
        $archivo = basename($_POST['archivo']);  
        $ruta = '/var/www/html/compartido/situacion_uno/' . $archivo;
        $destino_reserva = '/var/www/html/compartido/fuentes_reserva/situacion_uno/';
        
        // Nombre fijo para el archivo copiado
        $nombreArchivoDestino = 'archivo_reserva.txt';
    
        // Verificar si el archivo de origen existe
        if (!file_exists($ruta)) {
            echo "El archivo no existe en la ruta especificada: $ruta";
            return;
        }
    
        // Crear el directorio de destino si no existe
        if (!file_exists($destino_reserva) && !mkdir($destino_reserva, 0777, true) && !is_dir($destino_reserva)) {
            echo "No se pudo crear el directorio de destino: $destino_reserva";
            return;
        }
    
        // Intentar copiar el archivo con el nombre fijo
        if (!copy($ruta, $destino_reserva . $nombreArchivoDestino)) {  
            echo "No se pudo copiar el archivo de $ruta a $destino_reserva";
        } else {
            echo "Archivo copiado exitosamente como $nombreArchivoDestino en $destino_reserva";
        }
    }    

    public static function indexIgj() {
        $id_fuente = Request::input('idFuente');
        return view("/fuentes-IGJ/carga_fuente_IGJ")->with(compact('id_fuente'));
        //return view("/fuentes-IGJ/indexIgj");
    }

    public static function copia_reserva_igj() 
    {
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        $fecha_informacion = self::parseFechaSemestre_igj($_POST['archivo']); 
        SQLConnection::backendStoreProcedure("backend_abm_fuentes_procesadas",array("A",NULL,$fecha_informacion,'Fuente IGJ',1,'se ha facilitado la fuente (semestral): '.$_POST['archivo'],$usuario_id,$ip));
        $ruta = '/var/www/html/compartido/igj/'.$_POST['archivo'];
        $destino_reserva = "/var/www/html/compartido/fuentes_reserva/igj/";
        
        if (!file_exists($destino_reserva)) {
            mkdir($destino_reserva, 0777, true); // El tercer parámetro `true` indica que se deben crear directorios padres si no existen
        } 

        if( !copy($ruta, $destino_reserva.$_POST['archivo']) ) {  
            echo "File can't be copied! \n";  
        }  
    }

    public static function parseFechaSemestre_igj($cadena) 
    {
        // Expresión regular para extraer el año y el número de semestre
        $patron = '/(\d{4})-semestre-(\d)\.zip/';
        
        // Intenta hacer coincidir el patrón con la cadena proporcionada
        if (preg_match($patron, $cadena, $matches)) {
            $anio = $matches[1];
            $semestre = $matches[2];
            
            // Determina la fecha según el semestre
            if ($semestre == 1) {
                // Si es el primer semestre, establece la fecha al 1 de enero
                $fecha = "$anio-01-01";
            } else {
                // Si es el segundo semestre, establece la fecha al 1 de julio
                $fecha = "$anio-07-01";
            }
            
            return $fecha;
        } else {
            // Si no se encuentra el patrón en la cadena, devuelve null
            return null;
        }
    }

    public function guardarArchivoIGJ(){
        $periodo = Request::input('fecha_fuente').'-01';
        $tipo_fuente = Request::input('tipo_fuente');
        $id_fuente = Request::input('id_fuente');
        $archivo = $_FILES['archivo']['name'];
        if ( !empty($id_fuente) && !empty($periodo) && !empty($tipo_fuente) && (!is_null($archivo) || !empty($archivo)) ) {
            $path = env('PATH_ARCHIVOS_IGJ');
            $ext = '.'.explode('/',$_FILES['archivo']['type'])[1];
            if ( $tipo_fuente == '1' ) {
                $name = "GE";
            } elseif ( $tipo_fuente == '2' ) {
                $name = "GA";    
            } elseif ( $tipo_fuente == '3' ) {                
                $name = "GU";
            }  elseif ( $tipo_fuente == '4' ) {                
                $name = "GB";
            } elseif ( $tipo_fuente == '5' ) {                
                $name = "GD";
            }
            $proceso_fuente = Misc::validacion_proceso_fuente_mensual($id_fuente,$name,$periodo);

            $url = env('URL_WEB_FUENTES');
            $ip = $_SERVER['REMOTE_ADDR'];
            $usuario_id = Session::get("usuario")->user_id;
            $datos = http_build_query(array("tipo_fuente"=>$name,"ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $periodo,'es_pendiente' => 1));
            $request = Misc::CURLCall($url,$datos,'POST',600);
            $respuesta = json_decode($request);
            
            if ( !empty($proceso_fuente) ) {
                return 3;
            }
            if ( !empty($respuesta) && $respuesta->error == 0 ) {
                return 4;
            }
            if ( !file_exists($path.$name.$ext) && !empty($respuesta) && $respuesta->error == 1) {
                move_uploaded_file($_FILES['archivo']['tmp_name'],$path.$name.$ext);
                $datos = http_build_query(array("tipo_fuente"=>$name,"ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $periodo));
                $request = Misc::CURLCall($url,$datos,'POST',600);
                $respuesta = json_decode($request);
                return 1;
            } else {
                return 2;
            }
        }
        return 0;
    }

    public static function carga_archivoIgj() 
    {
        // //inicio de la carga del archivo al destino
        $tempDir = '/var/www/html/compartido/fuente_procesar/igj';
        $fileName = $_POST['name'];
        $fileIndex = $_POST['index'];

        if (!is_dir($tempDir)) {
            mkdir($tempDir, 0777, true);
        }

        move_uploaded_file($_FILES['file']['tmp_name'], "$tempDir/$fileName.part.$fileIndex");
        $finalDir = '/var/www/html/compartido/igj/';
        $filePath = "$tempDir/$fileName.part.*";
        $fileParts = glob($filePath);
        sort($fileParts, SORT_NATURAL);

        $finalFile = fopen($finalDir."/".$fileName, 'a');

        foreach ($fileParts as $filePart) {
            $chunk = file_get_contents($filePart);
            fwrite($finalFile, $chunk);
            unlink($filePart);  // Optionally delete the chunk
        }

        fclose($finalFile);
        //fin de la carga del archivo a su destina
    }

    //archivo que posteriormente servirá como ruta mediadora para ejecutar archivos de extracción de .zip,.7z,etc 
    public static function descomprimir() 
    {
        //$user_id 
        $usuario_id = Session::get("usuario")->user_id;
        $ip = $_SERVER['REMOTE_ADDR'];
        if ( isset($_POST['fuente']) and !empty($_POST['fuente']) ) {
            //inicio de la descompresión del archivo en su destino
            $ruta_script;
            if ( file_exists($_POST['fuente']) ) {
                $ruta_script = $_POST['fuente_ejecucion'];
            } else {
                dd("no llega al archivo");
            }   
            //
            $resultado = shell_exec("python3 ".$ruta_script." ".$usuario_id." ".$ip);
            var_dump($resultado);exit;
        }
    }

    public static function indexKht() 
    {
        return view("/fuentes-kht/indexkht");
    }

    public static function cargaArchivoKht() {
        // //inicio de la carga del archivo al destino
        $tempDir = '/var/www/html/compartido/kht/';
        $fileName = $_POST['name'];
        $fileIndex = $_POST['index'];

        if (!is_dir($tempDir)) {
            mkdir($tempDir, 0777, true);
        }

        move_uploaded_file($_FILES['file']['tmp_name'], "$tempDir/$fileName.part.$fileIndex");
        $finalDir = '/var/www/html/compartido/kht/';
        $filePath = "$tempDir/$fileName.part.*";
        $fileParts = glob($filePath);
        sort($fileParts, SORT_NATURAL);

        $finalFile = fopen($finalDir."/".$fileName, 'a');
        
        foreach ($fileParts as $filePart) {
            $chunk = file_get_contents($filePart);
            fwrite($finalFile, $chunk);
            unlink($filePart);  // Optionally delete the chunk
        }

        fclose($finalFile);
        //fin de la carga del archivo a su destina
    }

    public static function copia_reserva_kht() {
        $fecha_informacion = self::convertirFecha_kht($_POST['archivo']);
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        SQLConnection::backendStoreProcedure("backend_abm_fuentes_procesadas",array("A",NULL,$fecha_informacion,'COMEX',1,'se ha facilitado la fuente: '.$_POST['archivo'],$usuario_id,$ip));
        $ruta = '/var/www/html/compartido/kht/'.$_POST['archivo'];
        $destino_reserva = "/var/www/html/compartido/fuentes_reserva/kht/";

        if (!file_exists($destino_reserva)) {
            mkdir($destino_reserva, 0777, true); // El tercer parámetro `true` indica que se deben crear directorios padres si no existen
        } 
        if( !copy($ruta, $destino_reserva.$_POST['archivo']) ) {  
            echo "File can't be copied! \n";  
        }
    }

    public static function convertirFecha_kht($nombre_archivo) {
         // Extrae la parte de la fecha del nombre del archivo
        $partes_nombre = explode('.', $nombre_archivo);
        $partes_fecha = explode('_', $partes_nombre[0]);

        // Obtiene el día, mes y año
        $dia = $partes_fecha[0];
        $mes = $partes_fecha[1];
        $anio = '20' . $partes_fecha[2];

        // Reemplaza los nombres de los meses abreviados con sus equivalentes en inglés
        $mes = str_replace(
            array('Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'),
            array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'),
            $mes
        );

        // Convierte el nombre del mes a su número correspondiente
        $mes_numero = date('m', strtotime($mes));

        // Formatea la fecha según el formato deseado
        $fecha_formateada = sprintf('%s-%02d-%02d', $anio, $mes_numero, $dia);

        return $fecha_formateada;
    }

    // FUNCION QUE DECIDE SI EL ARCHIVO ES VALIDO O NO
    private static function validar_archivo_generico($p,$typeFile) {
        $expReg = "/^.+\.$typeFile$/";
        return (preg_match($expReg,$p) == 1);
    }

    //funcion de prueba
    public static function FuentesInformesTareas() {        
        $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_tareas_fuentes',Session::get('usuario')->user_id,null,null,null,null,env('PLATAFORMA')), 'select');
        // $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_tareas',Session::get('usuario')->user_id,null,null,null,null,env('PLATAFORMA')), 'select');
        //
        $tareas = array_values($tareas);
        return Response::JSON($tareas);
    }

    public static function indexJuicios() {
        $id_fuente = Request::input('idFuente');
        $fuente = $_POST['nombre_informe'];
        $indicaciones = '';
        $aux = explode(' ', $fuente);

        if ( end($aux) == 'Corrientes' || end($aux) == 'Mendoza' || end($aux) == 'Misiones' || end($aux) == 'Estero' || end($aux) == 'Luis' ) {
            $indicaciones = '
            <ul id="pasos_carga_facturas_apocrifas">
                <li>Paso 1: El formato de las columnas del archivo deberán ser las siguientes en el orden:
                    <li style="list-style: none;">
                        <b>Provincia, fecha, juzgado, actor,demandado, expediente, objeto, texto</b>
                    </li>
                </li>
                <li>Paso 2: Cargar el archivo en el sistema.</li>
            </ul>';
            $tipo_archivo = '.csv';
        } else if (end($aux) == 'Tucumán') {
            $indicaciones = '
            <ul id="pasos_carga_facturas_apocrifas">
                <li>Paso 1: El formato de las columnas del archivo deberán ser las siguientes en el orden:
                    <li style="list-style: none;">
                        <b>Expediente, Carátula, Causa, Fecha Inicio, Secretaría, Actores, Tipo Dni (actores), Dni (actores), Demandados, Tipo Dni (demandados), Dni (demandados), Novedad</b>
                    </li>
                </li>
                <li>Paso 2: Cargar el archivo en el sistema.</li>
            </ul>';
            $tipo_archivo = '.xlsx';
        } else {
            $indicaciones = '
            <ul id="pasos_carga_facturas_apocrifas">
                <li>Paso 1: El formato de las columnas del archivo deberán ser las siguientes en el orden:
                    <li style="list-style: none;">
                        <b>id,fecha inicio, actor, expediente, caratula, juzgado, secretaria, año, demandado, objeto</b>
                    </li>
                </li>
                <li>Paso 2: Cargar el archivo en el sistema.</li>
            </ul>';
            $tipo_archivo = '.xlsx';
        }

        return view("/fuentes_juicios/indexJuicios")->with(compact('id_fuente','fuente','indicaciones','tipo_archivo'));
    }

    public static function cargaArchivoJuicios() {
        $periodo = Request::input('fecha_fuente').'-01';
        $id_fuente = Request::input('id_fuente');
        $archivo = $_FILES['archivo']['name'];
        if ( !empty($id_fuente) && !empty($periodo) && (!is_null($archivo) || !empty($archivo)) ) {
            $ext = '.'.explode('/',$_FILES['archivo']['type'])[1];
            switch ($id_fuente) {
                case '28':
                    $name = 'JU';
                    $path = env('PATH_ARCHIVOS_JUICIOS_CABA');
                    $ext = '.xlsx';
                    break;
                case '33':
                    $name = 'JC';
                    $path = env('PATH_ARCHIVOS_JUICIOS_CORRIENTES');
                    break;
                case '35':
                    $name = 'JM';
                    $path = env('PATH_ARCHIVOS_JUICIOS_MENDOZA');
                    break;
                case '36':
                    $name = 'JI';
                    $path = env('PATH_ARCHIVOS_JUICIOS_MISIONES');
                    break;
                case '34':
                    $name = 'JS';
                    $path = env('PATH_ARCHIVOS_JUICIOS_SANTIAGO_DEL_ESTERO');
                    break;
                case '37':
                    $name = 'JL';
                    $path = env('PATH_ARCHIVOS_JUICIOS_SAN_LUIS');
                    break;
                case '38':
                    $name = 'JT';
                    $path = env('PATH_ARCHIVOS_JUICIOS_TUCUMAN');
                    break;
                case '40':
                    $name = 'JB';
                    $path = env('PATH_ARCHIVOS_JUICIOS_BA');
                    $ext = '.xlsx';
                    break;
                default:
                    $name = '';
                    $path = '';
                    break;
            }
            //
            if ( $name == '' ) {
                return 0;
            }
            $proceso_fuente = Misc::validacion_proceso_fuente_mensual($id_fuente,$name,$periodo);
            //
            $url = env('URL_WEB_FUENTES');
            $ip = $_SERVER['REMOTE_ADDR'];
            $usuario_id = Session::get("usuario")->user_id;
            //
            if ( !empty($proceso_fuente) ) {
                return 3;
            }
            //
            if ( !file_exists($path.$name.$ext) ) {
                move_uploaded_file($_FILES['archivo']['tmp_name'],$path.$name.$ext);
                $datos = http_build_query(array("tipo_fuente"=>$name,"ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $periodo));
                $request = Misc::CURLCall($url,$datos,'POST',600);
                $respuesta = json_decode($request);
                return 1;
            } else {
                return 2;
            }
        }
        return 0;
    }

    public static function cargaArchivoJuiciosBKP() {
        // //inicio de la carga del archivo al destino
        $fecha_proceso = $_POST['fecha_proceso'];
        $path_fuente = env("PATH_FUENTES_ARCHIVOS_PROCESAR");
        $compartidos = env("PATH_COMPARTIDO");
        $tempDir = $path_fuente.'juicios/';
        $fileName = $fecha_proceso.str_replace("de","",str_replace(" ","",$_POST['name']));
        $fileIndex = $_POST['index'];
        if (!is_dir($tempDir)) {
            mkdir($tempDir, 0777, true);
        }

        move_uploaded_file($_FILES['file']['tmp_name'], "$tempDir/$fileName.part.$fileIndex");
        $finalDir = $path_fuente.'juicios/';
        $filePath = "$tempDir/$fileName.part.*";
        $fileParts = glob($filePath);
        sort($fileParts, SORT_NATURAL);

        $finalFile = fopen($finalDir.$fileName, 'a');
        foreach ($fileParts as $filePart) {
            $chunk = file_get_contents($filePart);
            fwrite($finalFile, $chunk);
            unlink($filePart);  // Optionally delete the chunk
        }

        fclose($finalFile);
        //fin de la carga del archivo a su destina
    }

    public static function copia_reserva_juicios03092024() {
        $path_proyecto = env("PATH_EJECUCION_FUENTES");
        $compartido = env("PATH_FUENTES_ARCHIVOS_PROCESAR");
        $compartidos = env("PATH_COMPARTIDO")."/";
        $fecha_informacion = $_POST['fecha_proceso'];
        $fileName = $fecha_informacion.str_replace("de","",str_replace(" ","",$_POST['archivo']));
        //$fecha_informacion = self::obtenerFechaDesdeNombreArchivo($fileName);
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        $fechaHora = date('Y-m-d H:i:s');
        // SQLConnection::backendStoreProcedure("backend_abm_fuentes_procesadas",array("A",NULL,$fecha_informacion,'Juicios',1,'se ha facilitado la fuente: '.$fileName,$usuario_id,$ip));
        // self::crearLogs( $path_proyecto .'juicios/control/juicioshistorial.log','['.$fechaHora.']'.' Se ha facilitado el archivo:'.$fileName);
        // self::sobrescribirArchivoTXT('Archivo de juicios preparado',$path_proyecto .'juicios/procesar/control_ejecucion_juicios.log');
        $ruta = $compartido.'juicios/'.$fileName;
        $destino_reserva = $compartidos."fuentes_reserva/juicios/";
        if (!file_exists($destino_reserva)) {
            mkdir($destino_reserva, 0777, true); // El tercer parámetro `true` indica que se deben crear directorios padres si no existen
        } 
        if( !copy($ruta, $destino_reserva.$fecha_informacion.$fileName) ) {  
            echo "File can't be copied! \n";  
        }  
    }

    /**
     * Creacion de copia del archivo de fuente de juicios
     * 
     * Esta funcion crea la copia del archivo de fuente de juicios
     * 
     * @return void ejecuta echo
     */
    public static function copia_reserva_juicios() {
        $path_proyecto = env("PATH_EJECUCION_FUENTES");
        $compartido = env("PATH_FUENTES_ARCHIVOS_PROCESAR");
        $compartidos = env("PATH_COMPARTIDO") . "/";
        $fecha_informacion = $_POST['fecha_proceso'];
        $nombreArchivo = basename(str_replace("de", "", str_replace(" ", "", $_POST['archivo'])));
        $fileName = $fecha_informacion . $nombreArchivo;
    
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        $fechaHora = date('Y-m-d H:i:s');
    
        // Definir la ruta del archivo fuente y el destino
        $ruta = $compartido . 'juicios/' . $fileName;
        $destino_reserva = $compartidos . "fuentes_reserva/juicios/";
    
        // Nombre fijo para el archivo copiado
        $nombreArchivoDestino = 'archivo_reserva_juicios.zip';
    
        // Verificar si el archivo de origen existe
        if (!file_exists($ruta)) {
            echo "El archivo de origen no existe en la ruta especificada: $ruta";
            return;
        }
    
        // Crear el directorio de destino si no existe
        if (!file_exists($destino_reserva) && !mkdir($destino_reserva, 0777, true) && !is_dir($destino_reserva)) {
            echo "No se pudo crear el directorio de destino: $destino_reserva";
            return;
        }
    
        // Intentar copiar el archivo con el nombre fijo
        if (!copy($ruta, $destino_reserva . $nombreArchivoDestino)) {
            echo "No se pudo copiar el archivo de $ruta a $destino_reserva";
        } else {
            echo "Archivo copiado exitosamente como $nombreArchivoDestino en $destino_reserva";
        }
    }    

    public static function juiciosProcesar() {
        $url = env('URL_WEB_FUENTES');
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        $fecha_informacion = $_POST['fecha_proceso'];
        
        $datos = http_build_query(array("tipo_fuente" => "JU","fecha_proceso" => $fecha_informacion,'ip' => $ip,'usuario_id' => $usuario_id));
        $request = Misc::CURLCall($url,$datos,'POST',600);
        $respuesta = json_decode($request);

        $fecha_archivo_fuente = null;
        $nombre_archivo_fuente = null;
        if ( is_array($respuesta) ) {
            $fecha_archivo_fuente = $respuesta[0];
            $nombre_archivo_fuente = $respuesta[1];
        }else{
            echo json_encode(array("error"=>1,"mensaje"=>"ha ocurrido un incidente con la respuesta de procesamiento de la fuente"));exit;
        }

        $ruta_fuentes = env("PATH_EJECUCION_FUENTES");
        $fecha_informacion = $_POST['fecha_proceso'];
       
        echo json_encode(array("fecha_archivo"=> $fecha_archivo_fuente,"nombre_archivo"=>$nombre_archivo_fuente,"cantidad_errores"=>intval($datos_fuentes)));
    }

    public static function obtenerCausasErrores() {
        $fecha = $_POST["fecha_archivo"];
        $causas_errores = SQLConnection::backendStoreProcedure("backend_juicios_errores",array("novedades_error",$fecha));
        return json_encode($causas_errores);
    }

    public static function obtenerCausas() {
        $causas = SQLConnection::backendStoreProcedure("backend_juicios_errores",array("tipos_causas"));
        return json_encode($causas);
    }

    public static function obtenerCausasErroresAsignar() {
        $tipo_novedad = $_POST["tipo_novedad"];
        $tipo_de_causa_vieja = $_POST["tipo_de_causa_vieja"];
        $causas = SQLConnection::backendStoreProcedure("backend_juicios_errores",array("asigna_tipos_causas",null, $tipo_novedad,  $tipo_de_causa_vieja));
        return json_encode(array("error"=>0,"mensaje"=>"Asignado"));
    }

    public static function obtenerCausasErroresProcesar() {
        $url = env("URL_WEB_FUENTES");
        $fecha_archivo = $_POST['fecha_archivo'];
        $procesar_causas = SQLConnection::backendStoreProcedure("backend_juicios_errores",array("procesar",$fecha_archivo,null,null));
        $datos_fuentes = SQLConnection::backendStoreProcedure("backend_juicios_errores",array("cantidad_errores",$fecha_archivo,null,null))[0]->computed;
        //el siguiente if me sirve para saber si ya está terminado procesado sin errores los juicios, si es así cerramos la fuente y eliminamos el archivo de la fuente 
        if(intval($datos_fuentes) == 0) {
            $datos = http_build_query(array("tipo_fuente"=>"JU","fecha_proceso"=>$fecha_archivo,"accion"=>"cambiarestado"));
            $request = Misc::CURLCall($url,$datos,'POST',600);
            $respuesta = json_decode($request);
        }
        return json_encode(array("error"=>0,"mensaje"=>"Procesados"));
    }

    public static function obtenerCausasErroresCerrar() {
        $url = env("URL_WEB_FUENTES");
        $fecha_archivo = $_POST['fecha_archivo'];
        $datos = http_build_query(array("tipo_fuente"=>"JU","fecha_proceso"=>$fecha_archivo,"accion"=>"cambiarestado"));
        $request = Misc::CURLCall($url,$datos,'POST',600);
        $respuesta = json_decode($request);
        return json_encode(array("error"=>0,"mensaje"=>"Cerrados"));
    }

    public static function obtenerFechaDesdeNombreArchivo($nombreArchivo) {
        // Buscar el patrón de "MesAño" en el nombre del archivo
        preg_match('/([A-Za-z]+)(\d{4})/', $nombreArchivo, $matches);
        
        // Obtener el mes y el año
        $mes = $matches[1];
        $anio = $matches[2];
        
        // Mapear el nombre del mes a su número correspondiente
        $meses = [
            'enero' => '01',
            'febrero' => '02',
            'marzo' => '03',
            'abril' => '04',
            'mayo' => '05',
            'junio' => '06',
            'julio' => '07',
            'agosto' => '08',
            'septiembre' => '09',
            'octubre' => '10',
            'noviembre' => '11',
            'diciembre' => '12'
        ];
        
        // Obtener el número del mes
        $numeroMes = $meses[strtolower($mes)];
        
        // Formar la fecha completa
        $fechaCompleta = $anio . '-' . $numeroMes . '-01';
        
        return $fechaCompleta;
    }

    public static function crearLogs($ruta, $texto) {
        $archivoLog = $ruta;
    
        // Obtener el directorio donde se supone que debería estar el archivo log
        $directorio = dirname($archivoLog);
    
        // Verificar si el directorio existe
        if (!file_exists($directorio)) {
            // Si no existe, crearlo con permisos de escritura
            mkdir($directorio, 0777, true);
        }
    
        // Verificar si el archivo log existe
        if (!file_exists($archivoLog)) {
            // Si no existe, crearlo con permisos de escritura
            $crearArchivo = fopen($archivoLog, 'w');
            fclose($crearArchivo);
        }
    
        // Agregar datos al archivo log
        $datos = "$texto\n";
        file_put_contents($archivoLog, $datos, FILE_APPEND);
    }

    public static function indexMarcas() {
        $path_fuente = env('PATH_EJECUCION_FUENTES');
        $idFuente = Request::input('idFuente');

        return view('/fuente_marcas/index_marcas')->with(compact('path_fuente','idFuente'));
    }

    public static function cargaArchivomarcas() {
        $fecha_proceso = $_POST['fecha_proceso'];
        $path_fuente = env('PATH_FUENTES_ARCHIVOS_PROCESAR');
        // //inicio de la carga del archivo al destino
        $tempDir = $path_fuente."marcas";
        //
        $fileName = $fecha_proceso.'_marcas.zip';
        $fileIndex = $_POST['index'];
        if (!is_dir($tempDir)) {
            mkdir($tempDir, 0777, true);
        }
        //
        move_uploaded_file($_FILES['file']['tmp_name'], "$tempDir/$fileName.part.$fileIndex");
        //
        $finalDir = $path_fuente.'marcas/';
        $filePath = "$tempDir/$fileName.part.*";
        $fileParts = glob($filePath);
        sort($fileParts, SORT_NATURAL);
        //
        $finalFile = fopen($finalDir."/".$fileName, 'a');
        //
        foreach ($fileParts as $filePart) {
            $chunk = file_get_contents($filePart);
            fwrite($finalFile, $chunk);
            unlink($filePart);  // Optionally delete the chunk
        }
        //
        fclose($finalFile);
        //fin de la carga del archivo a su destina
    }

    public static function copia_reserva_marcas03092024() {
        $fecha_proceso = $_POST['fecha_proceso'];
        //
        $path_fuente = env('PATH_FUENTES_ARCHIVOS_PROCESAR');
        $ruta = $path_fuente.'marcas/reserva_marcas.zip';
        $destino_reserva = env('PATH_FUENTES_RESERVA')."marcas/";
        //
        if (!file_exists($destino_reserva))
        {
            mkdir($destino_reserva, 0777, true); 
        }  

        if( !copy($ruta, $destino_reserva.'reserva_marcas.zip') ) {
            echo "Archivo no pudo ser copiado! \n";  
        }
    }

    /**
     * Creacion de la copia del archivo de fuentes marcas
     * 
     * Esta funcion crea la copia del archivo de fuentes marcas
     *      
     * @return void ejecuta echo  
     * 
    */
    public static function copia_reserva_marcas() 
    {
        // Obtén la fecha de proceso desde la entrada del usuario
        $fecha_proceso = $_POST['fecha_proceso'];
    
        // Rutas para los archivos de fuente y destino
        $path_fuente = env('PATH_FUENTES_ARCHIVOS_PROCESAR');
        $ruta = $path_fuente.'marcas/'.$fecha_proceso.'_marcas.zip';
        $destino_reserva = env('PATH_FUENTES_RESERVA') . 'marcas/';
        
        // Nombre fijo para el archivo copiado
        $nombreArchivoDestino = 'reserva_marcas.zip';
    
        // Verificar si el archivo de origen existe
        if (!file_exists($ruta)) {
            echo "El archivo de origen no existe en la ruta especificada: $ruta";
            return;
        }
    
        // Crear el directorio de destino si no existe
        if (!file_exists($destino_reserva) && !mkdir($destino_reserva, 0777, true) && !is_dir($destino_reserva)) {
            echo "No se pudo crear el directorio de destino: $destino_reserva";
            return;
        }
    
        // Intentar copiar el archivo con el nombre fijo
        if (!copy($ruta, $destino_reserva . $nombreArchivoDestino)) {
            echo "No se pudo copiar el archivo de $ruta a $destino_reserva";
        } else {
            echo "Archivo copiado exitosamente como $nombreArchivoDestino en $destino_reserva";
        }
    }
    
   
    public static function extraerProcesar() {
        $fecha_proceso = $_POST['fecha_proceso'];
        $url = env('URL_WEB_FUENTES');
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        //
        $datos = http_build_query(array("tipo_fuente"=>"MA","ip"=>$ip,"usuario_id" => $usuario_id,"fecha_proceso" => $fecha_proceso));
        $request = Misc::CURLCall($url,$datos,'POST',600);
        $respuesta = json_decode($request);
        //
        if ( !is_null($respuesta) && intval($respuesta->error) == 0 ) {
            return Response::JSON(['error' => 0,'msj' => 'Fuente exitosamente procesada']);
        } else {
            return Response::JSON(['error' => 1,'msj' => 'Fallo el procesamiento de fuentes']);
        }
    }

    public static function indexCheques() {
        $path_fuente = env("PATH_EJECUCION_FUENTES");
        $idFuente = Request::input('idFuente');

        return view("/fuentes-cheques/fuentes_cheques_index")->with(compact('path_fuente', 'idFuente'));
    }

    public static function cargar_archivoCheques() {
        $idFuente = Request::input('idFuente');        
        $fecha_proceso = $_POST['fecha_proceso'];                

        $compartidos = env("PATH_FUENTES_ARCHIVOS_PROCESAR");

        $tempDir = $compartidos.'/'.'cheques/';
        $fileName = $fecha_proceso .$_POST['name'];
        $fileIndex = $_POST['index'];
 
        if (!is_dir($tempDir)) {
            mkdir($tempDir, 0777, true);
        }
 
        move_uploaded_file($_FILES['file']['tmp_name'], "$tempDir/$fileName.part.$fileIndex");
        $finalDir =  $compartidos.'/'.'cheques/';
        $filePath = "$tempDir/$fileName.part.*";
        $fileParts = glob($filePath);
        sort($fileParts, SORT_NATURAL);
 
        $finalFile = fopen($finalDir."/".$fileName, 'a');
 
        foreach ($fileParts as $filePart) {
            $chunk = file_get_contents($filePart);
            fwrite($finalFile, $chunk);
            unlink($filePart);  // Optionally delete the chunk
        }
 
        fclose($finalFile);
         //fin de la carga del archivo a su destina
    }

    public static function copia_reserva_cheques03092024()
    {
        $path_fuentes = env('PATH_FUENTES_ARCHIVOS_PROCESAR');
        $compartidos = env("PATH_COMPARTIDO");
        $fecha_proceso = $_POST['fecha_proceso'];
        $ruta = $path_fuentes.'/'.'cheques/'.$fecha_proceso.$_POST['archivo'];
        $destino_reserva = $compartidos."/fuentes_reserva/cheques/";
        if (!file_exists($destino_reserva)) 
        {
            mkdir($destino_reserva, 0777, true); // El tercer parámetro `true` indica que se deben crear directorios padres si no existen
        } 
        if( !copy($ruta, $destino_reserva.$fecha_proceso.$_POST['archivo']) ) 
        {  
            echo "File can't be copied! \n";  
        }  
    }

    /**
     * Creacion de una copia del archivo de fuentes de cheques
     * 
     * Esta funcion se encarga de crear la copia del archivo fuente
     * 
     * @return void ejecuta echo
     */
    public static function copia_reserva_cheques()
    {
        // Obtener los paths de los entornos
        $path_fuentes = env('PATH_FUENTES_ARCHIVOS_PROCESAR');
        $compartidos = env('PATH_COMPARTIDO');
        $fecha_proceso = $_POST['fecha_proceso'];
        $nombre_archivo = basename($_POST['archivo']);

        // Definir la ruta del archivo fuente y el destino
        $ruta = $path_fuentes . '/cheques/' . $fecha_proceso . $nombre_archivo;
        //$ruta = $path_fuentes.'/'.'cheques/'.$fecha_proceso.$_POST['archivo'];
        $destino_reserva = $compartidos . '/fuentes_reserva/cheques/';

        // Nombre fijo para el archivo copiado
        $nombreArchivoDestino = 'archivo_reserva_cheques.zip';

        // Verificar si el archivo de origen existe
        if (!file_exists($ruta)) {
            echo "El archivo de origen no existe en la ruta especificada: $ruta";
            return;
        }

        // Crear el directorio de destino si no existe
        if (!file_exists($destino_reserva) && !mkdir($destino_reserva, 0777, true) && !is_dir($destino_reserva)) {
            echo "No se pudo crear el directorio de destino: $destino_reserva";
            return;
        }

        // Intentar copiar el archivo con el nombre fijo
        if (!copy($ruta, $destino_reserva . $nombreArchivoDestino)) {
            echo "No se pudo copiar el archivo de $ruta a $destino_reserva";
        } else {
            echo "Archivo copiado exitosamente como $nombreArchivoDestino en $destino_reserva";
        }
    }
    

    public static function extraerProcesarCheques() {
        $url = env('URL_WEB_FUENTES');
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        $fecha_proceso = $_POST['fecha_proceso'];
        $datos = http_build_query(array("tipo_fuente"=>"CH","ip"=>$ip,"usuario_id"=>$usuario_id,"fecha_proceso"=>$fecha_proceso));
        $request = Misc::CURLCall($url,$datos,'POST',600);
        //
        $respuesta = json_decode($request);
        
        if ( intval($respuesta->error) == 0 ) {
            echo json_encode(array("error"=>0,"msj"=>"Fuente exitosamente procesada"));
        }
    }

    ////////////////////////////////////////
    ///////////////// ARBA /////////////////
    ////////////////////////////////////////

    public static function indexArba() {
        $path_fuente = env("PATH_EJECUCION_FUENTES");
        $id_fuente = Request::input('idFuente');
        return view("/fuente_arba/index_arba")->with(compact("path_fuente",'id_fuente'));
    }

    public static function cargar_archivoArba() {
        // //inicio de la carga del archivo al destino
        $compartidos = env("PATH_FUENTES_ARCHIVOS_PROCESAR");
        $tempDir = $compartidos.'arba/';
        $fileName = $_POST['name'];
        $fileIndex = $_POST['index'];
 
        if ( !is_dir($tempDir) ) {
            mkdir($tempDir, 0777, true);
        }
 
        move_uploaded_file($_FILES['file']['tmp_name'], "$tempDir/$fileName.part.$fileIndex");
        $finalDir = $compartidos.'arba/';
        $filePath = "$tempDir/$fileName.part.*";
        $fileParts = glob($filePath);
        sort($fileParts, SORT_NATURAL);

        $finalFile = fopen($finalDir."/".$fileName, 'a');

        foreach ($fileParts as $filePart) {
            $chunk = file_get_contents($filePart);
            fwrite($finalFile, $chunk);
            unlink($filePart);  // Optionally delete the chunk
        }
 
        fclose($finalFile);
        //fin de la carga del archivo a su destina
    }

    public static function listarArchivos($directorio, $misarchivos = array(), $filtro = '') {
        // Obtener todos los archivos del directorio
        $archivos = scandir($directorio);
        
        // Recorrer todos los archivos
        foreach ($archivos as $archivo) {
            // Ignorar los directorios '.' y '..'
            if ($archivo != '.' && $archivo != '..') {
                // Obtener la ruta completa del archivo
                $rutaArchivo = $directorio . DIRECTORY_SEPARATOR . $archivo;
    
                // Comprobar si es un archivo o un directorio
                if (is_file($rutaArchivo)) {
                    // Aplicar filtro si se proporciona
                    if (!empty($filtro)) {
                        if (strpos($archivo, $filtro) !== false) {
                            array_push($misarchivos, $archivo);
                        }
                    } else {
                        array_push($misarchivos, $archivo);
                    }
                } elseif (is_dir($rutaArchivo)) {
                    // Llamada recursiva si es un directorio
                    self::listarArchivos($rutaArchivo, $misarchivos, $filtro);
                }
            }
        }
        return json_encode($misarchivos);
    }
        
    public static function copia_reserva_arba04092024() {
        //$compartido = env("PATH_EJECUCION_FUENTES");PATH_FUENTES_ARCHIVOS_PROCESAR
        $compartido = env("PATH_FUENTES_ARCHIVOS_PROCESAR");
        $compartidos = env("PATH_COMPARTIDO");
       //$fecha_informacion = self::get_fecha_arba($_POST['archivo']);
        $fecha_informacion = $_POST['fecha_proceso'];
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        SQLConnection::backendStoreProcedure("backend_abm_fuentes_procesadas",array("A",NULL,$fecha_informacion,'Fuente arba',1,'se ha facilitado la fuente: '.$_POST['archivo'],$usuario_id,$ip));
        $ruta = $compartido.'arba/'.$_POST['archivo'];
        $destino_reserva = $compartidos."/fuentes_reserva/arba/";
        if (!file_exists($destino_reserva)) {
            mkdir($destino_reserva, 0777, true); // El tercer parámetro `true` indica que se deben crear directorios padres si no existen
        } 
        if( !copy($ruta, $destino_reserva.$_POST['archivo']) ) {  
            echo "File can't be copied! \n";  
        }  
    }

    /**
     * Copia un archivo de la fuente ARBA a un directorio de reserva
     *
     * Esta funcion obtiene la informacion del archivo de la fuente ARBA y lo copia a un directorio de reserva 
     * 
     * @return void
     */
    public static function copia_reserva_arba() {
        $compartido = env("PATH_FUENTES_ARCHIVOS_PROCESAR");
        $compartidos = env("PATH_COMPARTIDO");

        $fecha_informacion = $_POST['fecha_proceso'];
        $ip = $_SERVER['REMOTE_ADDR'];

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

        // Define la ruta del archivo fuente y la ruta de destino de la reserva
        $ruta = $compartido . 'arba/' . $_POST['archivo'];
        $destino_reserva = $compartidos . "/fuentes_reserva/arba/";
        $nombreArchivoFijo = 'archiv_reserva_arba.zip';

        // Crea el directorio de destino si no existe
        if (!file_exists($destino_reserva)) {
            mkdir($destino_reserva, 0777, true); 
        } 
        
        // Copia el archivo al destino de reserva
        if (!copy($ruta, $destino_reserva . $nombreArchivoFijo)) {  
            echo "¡El archivo no se pudo copiar! \n";  
        } else {
            echo "El archivo ha sido copiado con el nombre : $nombreArchivoFijo \n";
        }
    }

    

    public static function extraerProcesarArba() {
        $url = env('URL_WEB_FUENTES');
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        $fecha_proceso = $_POST['fecha_proceso'];
        $datos = http_build_query(array("tipo_fuente"=>"AR","ip"=>$ip,"usuario_id"=>$usuario_id,"fecha_proceso"=>$fecha_proceso,"accion"=>"procesar"));
        $request = Misc::CURLCall($url,$datos,'POST',600);
        $respuesta = json_decode($request);
    
        /* $ruta_respuesta_arba = '/var/www/html/compartido/fuentes_procesar/arba/respuesta_arba/';
        $archivos_respuesta = array();
        if(file_exists($ruta_respuesta_arba)){
            $arba_descargar = self::listarArchivos($ruta_respuesta_arba,$archivos_respuesta,$fecha_proceso);
        } */
     
        /* echo json_encode(
            array(
                    "error"=>0,
                    "message"=>"Fuentes de arba procesadas"
                )
        ); */
        return Response::JSON(["error"=>0,"message"=>"Fuentes de arba procesadas"]);
    }

    public static function descargarArba($archivos) {
        self::descargaFile('/var/www/html/compartido/fuentes_procesar/arba/respuesta_arba/',$archivos);
    }

    public static function cerrarArba() {
        $url = env('URL_WEB_FUENTES');
        $datos = http_build_query(array("tipo_fuente"=>"AR","accion"=>"cambiarestado"));
        $request = Misc::CURLCall($url,$datos,'POST',600);
        $respuesta = json_decode($request);
        if(intval($respuesta->error) == 0){
            echo json_encode(array("error"=>0,"message"=>"Se ha cerrado la fuente"));
        }
    }

    public static function get_fecha_arba($archivo) {
        $archivo = explode("_", $archivo)[1];
        return $archivo;
    }
    
    public static function fechaProcesadaArba(){
        return self::fechaProcesada('AR', 'validacion_proceso_fuente_diario');              
    }

    public static function fechaProcesadaCheques(){
        return self::fechaProcesada('CH', 'validacion_proceso_fuente_diario');       
    }

    public static function fechaProcesadajuicios(){
        return self::fechaProcesada('JU', 'validacion_proceso_fuente_mensual');              
    }

    public static function fechaProcesadaBbva(){
        return self::fechaProcesada('BB', 'validacion_proceso_fuente_mensual');               
    }

    public static function fechaProcesadaMarcas(){
        return self::fechaProcesada('MA', 'validacion_proceso_fuente_mensual');
    }

    public static function fechaProcesada($proceso, $validacionFuncion){
        $fecha_proceso = isset($_POST['fecha_del_proceso']) ? $_POST['fecha_del_proceso'] : NULL;
        $id_fuente = isset($_POST['id_fuente']) ? $_POST['id_fuente'] : NULL;
        
        if (!is_null($fecha_proceso) && !is_null($id_fuente)) {
            $fecha = date_create_from_format('Y-m-d', $fecha_proceso);
            $datos = Misc::$validacionFuncion($id_fuente,$proceso,$fecha->format('Y-m-d H:i:s'));                        

            if (empty($datos)) {
                return Response::json(['error' => 0, 'mensaje' => 'OK']);
            }
            return Response::json(['error' => 2, 'mensaje' => 'Hay datos procesados para esa fecha']);
        }
    
        return Response::json(['error' => 1, 'mensaje' => 'La fecha no fue recibida']);
    }
    
    ///////////////////////////
    /////////// ARBA //////////
    //////////////////////////

    public static function indexBbva() {
        $idFuente = Request::input('idFuente');

        return view("/fuentes-bbva/indexBbva")->with(compact('idFuente'));
    }

    public static function cargar_archivobbva() {
        $fecha_proceso = $_POST['fecha_proceso'];
        $compartido = env("PATH_FUENTES_ARCHIVOS_PROCESAR");
        $tempDir = $compartido.'/'.'bbva/';
        $fileName =  $fecha_proceso.str_replace(" ","",$_POST['name']);
        $fileIndex = $_POST['index'];
        if (!is_dir($tempDir)) {
            mkdir($tempDir, 0777, true);
        }

        move_uploaded_file($_FILES['file']['tmp_name'], "$tempDir/$fileName.part.$fileIndex");
        $finalDir = $compartido.'/'.'bbva/';
        $filePath = "$tempDir/$fileName.part.*";
        $fileParts = glob($filePath);
        sort($fileParts, SORT_NATURAL);

        $finalFile = fopen($finalDir."/".$fileName, 'a');
        foreach ($fileParts as $filePart) {
            $chunk = file_get_contents($filePart);
            fwrite($finalFile, $chunk);
            unlink($filePart);  // Optionally delete the chunk
        }

        fclose($finalFile);
        //fin de la carga del archivo a su destina
    }

    public static function sobrescribirArchivoTXT($contenido, $rutaArchivo) {
        // Obtén el directorio del archivo
        $directorio = dirname($rutaArchivo);
    
        // Si el directorio no existe, créalo
        if (!is_dir($directorio)) {
            mkdir($directorio, 0777, true);
        }
    
        // Abre el archivo en modo escritura (crea el archivo si no existe)
        $archivo = fopen($rutaArchivo, "w");
        
        if ($archivo === false) {
            // Manejar el error si no se pudo abrir el archivo
            return false;
        }
        
        // Escribe el contenido en el archivo
        fwrite($archivo, $contenido);
        
        // Cierra el archivo
        fclose($archivo);
        
        return true; // Operación exitosa
    }

    public static function copia_reserva_bbva() {
        $fecha_proceso = $_POST['fecha_proceso'];
        $compartidos = env("PATH_COMPARTIDO");
        $path_fuentes = env('PATH_EJECUCION_FUENTES');
        $fileName = $fecha_proceso.str_replace(" ","",$_POST['archivo']);
        //$fecha_informacion = self::obtener_fecha_bbva($fileName);
        $fecha_informacion = $fecha_proceso;
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        $fechaHora = date('Y-m-d H:i:s');
        //SQLConnection::backendStoreProcedure("backend_abm_fuentes_procesadas",array("A",NULL,$fecha_informacion,'BBVA',1,'se ha facilitado la fuente: '.$fileName,$usuario_id,$ip));
        //self::crearLogs($path_fuentes.'/bbva/control/bbvahistorial.log','['.$fechaHora.'[ Se ha pasado el archivo: '.$fileName);
        self::sobrescribirArchivoTXT('Archivo de BBVA preparado',$path_fuentes.'bbva/procesar/control_ejecucion_bbva.log');
        $ruta = env('PATH_FUENTES_ARCHIVOS_PROCESAR').'bbva/'.$fileName;
        $destino_reserva = $compartidos."/fuentes_reserva/bbva/";

        if (!file_exists($destino_reserva)) {
            mkdir($destino_reserva, 0777, true); // El tercer parámetro `true` indica que se deben crear directorios padres si no existen
        } 

        if( !copy($ruta, $destino_reserva.$fecha_proceso.$fileName) )  {
            echo "no se ha pido copiar";
        }  
        
        //COMO ES MANUAL LO HACEMOS RECORRIDO
        $url = env('URL_WEB_FUENTES');
        $ip = $_SERVER['REMOTE_ADDR'];
        $usuario_id = Session::get("usuario")->user_id;
        $datos = http_build_query(array("tipo_fuente"=>"BB","ip"=>$ip,"usuario_id"=>$usuario_id,"fecha_proceso"=>$fecha_proceso));
        $request = Misc::CURLCall($url,$datos,'POST',600);
        $respuesta = json_decode($request);
        if (intval($respuesta->error) == 0) {
            return json_encode(array("error"=>0));  
        }
    }

    public static function obtener_fecha_bbva($nombre_archivo) {
        // Expresión regular para extraer la fecha del nombre del archivo
        if (preg_match("/([A-Z]+)(\d{4})/", $nombre_archivo, $matches)) {
            $month_str = $matches[1];
            $year_str = $matches[2];
    
            // Mapear el nombre del mes a su número correspondiente
            $meses = array('JAN' => '01', 'FEB' => '02', 'MAR' => '03', 'APR' => '04', 'MAY' => '05', 'JUN' => '06', 
                           'JUL' => '07', 'AUG' => '08', 'SEP' => '09', 'OCT' => '10', 'NOV' => '11', 'DEC' => '12');
    
            // Obtener el número del mes
            $month_number = $meses[$month_str];
    
            // Construir la fecha en el formato deseado
            $fecha_formateada = "$year_str-$month_number-01";
    
            return $fecha_formateada;
        } else {
            return "No se encontró una fecha en el nombre del archivo.";
        }
    }

    public static function descargaFile($ruta, $archivo) {
        $archivo_completo = $ruta . $archivo;
    
        if (file_exists($archivo_completo)) {
            $tipo_mime = mime_content_type($archivo_completo); // Obtener el tipo MIME del archivo
    
            header('Content-Description: File Transfer'); 
            header('Content-Type: application/octet-stream'); 
            header('Content-Disposition: attachment; filename="'
                                        .basename($archivo).'"'); 
            header('Expires: 0'); 
            header('Cache-Control: must-revalidate'); 
            header('Pragma: public'); 
            header('Content-Length: ' . filesize($archivo_completo)); 
  
            // Flush system output buffer 
            flush();  
            readfile($archivo_completo); 
        } else {
            // Si la ruta del archivo no existe, devolver un mensaje de error
            echo json_encode(array("error" => 1, "mensaje" => "No existe dicho archivo"));
        }
    }
    
    //SECCION GENERAL DE TAREAS EN COMÚN , POR EJEMPLO, DESCARGA DE FUENTES
    public static function obtenerFuente() {
        $nombre_fuente = '';
        $actividad = '';
        
        if(strpos($_POST['nombre_informe'], "apócrifas") !== false || strpos($_POST['nombre_informe'], "apocrifas") !== false || strpos($_POST['nombre_informe'], "Apócrifas") !== false || strpos($_POST['nombre_informe'], "Apocrifas") !== false) {
            $nombre_fuente = 'Facturas Apócrifas';
            $actividad = ' 
            <ul id="pasos_carga_facturas_apocrifas">
                <li>
                    Paso 1: Diríjase a al sitio que se encuentra en el enlace <a href="https://servicioscf.afip.gob.ar/Facturacion/facturasApocrifas/default.aspx" target="_blank">https://servicioscf.afip.gob.ar</a>
                </li>
                <li>
                    Paso 2: Presione el botón el botón <b>Descargar listado completo</b> para finalmente descargar el recurso de datos.
                </li>
            </ul>';
        } else if(strpos($_POST['nombre_informe'], "Entidades Bancarias") !== false || strpos($_POST['nombre_informe'], "Entidades bancarias") !== false) {
            $nombre_fuente = 'Entidades Bancarias';
            $actividad = '
            <ul id="pasos_carga_entidades_bancarias">
                <li>
                    Paso 1: Diríjase a al sitio que se encuentra en el enlace <a href="https://www.afip.gob.ar" target="_blank">www.afip.gob.ar</a>
                </li>
                <li>
                    Paso 2: Buscar el servivio del Banco Central de la República Argentina <b>Cheques y Deudores</b>
                </li>
                <li>
                    Paso 3: Ingresar en la opción Deudores
                </li>
                <li>
                    Paso 4: Realizar la Descarga del archivo
                </li>
            </ul>
            ';
        } else if(strpos($_POST['nombre_informe'], "Comex") !== false || 
            strpos($_POST['nombre_informe'], "Comercio Exterior") !== false ||
            strpos($_POST['nombre_informe'], "Comercio exterior") !== false ||
            strpos($_POST['nombre_informe'], "comercio exterior") !== false ||
            strpos($_POST['nombre_informe'], "KHT") !== false ||
            strpos($_POST['nombre_informe'], "kht") !== false )
        {
            $nombre_fuente = 'Comercio Exterior';
            $actividad = '
            <ul id="pasos_carga_comecio_exterior">
                <li>
                    Paso 1: Diríjase a su casilla de correo empresarial y revise si ha recibido un email por parte de <b>carlosmaresca53@gmail.com</b> 
                </li>
                <li>
                    Paso 2: Descargue la fuente desde su casilla de correo electrónico
                </li>
            </ul>
            ';
        } else if(strpos($_POST['nombre_informe'], "Cheques") !== false || strpos($_POST['nombre_informe'], "cheques") !== false) {
            $nombre_fuente = 'Cheques';
            $actividad = '
            <ul id="pasos_carga_cheques">
                <li>Paso 1: Diríjase a al sitio que se encuentra en el enlace 
                    <a href="https://www.bcra.gob.ar/actualiza/" target="_blank">https://www.bcra.gob.ar/actualiza/</a>
                </li>
                <li>Paso 2: Elija el enlace de la fecha correspondiente a la cual usted quiere procesar posteriormente y descargue le archivo <b>.zip</b></li>
            </ul>
            ';
        } else if(strpos($_POST['nombre_informe'], "Juicios") !== false || strpos($_POST['nombre_informe'], "juicios") !== false || strpos($_POST['nombre_informe'], "JUICIOS") !== false ) {
            $nombre_fuente = $_POST['nombre_informe'];
            $actividad = ' 
            <ul id="pasos_carga_juicios">
                <li>
                    Paso 1: Diríjase a su casilla de correo empresarial y revise si ha recibido un email por parte de <b>jpbthames@gmail.com</b>
                </li>
                <li>
                    Paso 2: Descargue la fuente desde su casilla de correo electrónico
                </li>
            </ul>';
        } else if(strpos($_POST['nombre_informe'], "Marcas") !== false || strpos($_POST['nombre_informe'], "marcas") !== false) {
            $nombre_fuente = 'Marcas';
            $actividad = ' 
            <ul id="pasos_carga_marcas">
                <li>
                    Paso 1: Diríjase a su casilla de correo empresarial y revise si ha recibido un email por parte de <b>damlongsrl@gmail.com</b>
                </li>
                <li>
                    Paso 2: Descargue la fuente desde su casilla de correo electrónico
                </li>
            </ul>';
        } else if(strpos($_POST['nombre_informe'], "BBVA") !== false) {
            $nombre_fuente = 'BBVA';
            $actividad = '
                <ul id="pasos_carga_bbva">
                    <li>
                        Paso 1: Diríjase a su casilla de correo empresarial y revise si ha recibido un email por parte de <b>juan.elidd@fidelitas.com.ar</b> 
                        o <b>juan.elidd@fidelitas.com.ar</b> correspondiente a al archivo adjunto para Banco Frances
                    </li>
                    <li>
                        Paso 2: Descargue la fuente desde su casilla de correo electrónico
                    </li>
                </ul>';
        } else if( strpos($_POST['nombre_informe'], "ARBA") !== false || strpos($_POST['nombre_informe'], "Arba") !== false || strpos($_POST['nombre_informe'], "arba") !== false) {
            $nombre_fuente = 'ARBA';
            $actividad = '
                <ul id="pasos_carga_arba">
                    <li>
                         Paso 1: Diríjase a al sitio que se encuentra en el enlace <a href="https://web.arba.gov.ar/" target="_blank">https://web.arba.gov.ar/</a>
                    </li>
                    <li>
                        Paso 2: Un vez en el sitio vaya a la última sección del sitio y busque la opción <b>Convenio con Organismos</b> e ingrese
                    </li>
                    <li>
                        Paso 3: Busque la opción <b>acceder al sistema</b> y seleccionelo
                    </li>
                    <li>
                        Paso 4: Complete con sus credenciales y aceptar
                    </li>
                    <li>
                        Paso 5: En la solapa de Tranferencias y despliegue las opciones
                    </li>
                    <li>
                        Paso 6: Elije la primera opción
                    </li>
                    <li>
                        Paso 7: Presione aceptar
                    </li>
                    <li>
                        Paso 8: Elija la razón social
                    </li>
                    <li>
                        Paso 9: Descargue el archivo a procesar
                    </li>
                </ul>
            ';
        } else if(strpos($_POST['nombre_informe'], "Contribuyentes Inscriptos") !== false){
            $nombre_fuente = 'Contribuyentes Inscriptos';
            $actividad = '
            <ul id="pasos_carga_contribuyentes">
                <li>
                    Paso 1: Diríjase a al sitio que se encuentra en el enlace 
                    <a href="https://www.afip.gob.ar/genericos/cInscripcion/archivoCompleto.asp" target="_blank">https://www.afip.gob.ar/genericos/cInscripcion/archivoCompleto.asp</a>
                </li>
            </ul>';
        } else if(strpos($_POST['nombre_informe'], "Repsal") !== false){
            $nombre_fuente = 'REPSAL';
            $actividad = '
            <ul id="pasos_carga_repsal">
                <li>
                    Haga click en el siguiente enlace para descargar el excel. 
                    <a href="http://repsal.trabajo.gob.ar/Sancion/GenerarExcel?OrganismoSancionadorId=0" target="_blank">Descarga de excel</a>
                </li>
            </ul>
            <small class="text-muted">La fuente proviene de http://repsal.trabajo.gob.ar</small>';
        }
        
        return view("/tareas_fuente/descarga_fuente")->with(compact("nombre_fuente","actividad"));
    }

    public static function cargarFuente() {
        if(
            strpos($_POST['nombre_informe'], "apócrifas") !== false ||
            strpos($_POST['nombre_informe'], "apocrifas") !== false ||
            strpos($_POST['nombre_informe'], "Apócrifas") !== false ||
            strpos($_POST['nombre_informe'], "Apocrifas") !== false
        ){
            return view("/fuentes-deudas-apocrifas/carga_archivo");
        } else if(
            strpos($_POST['nombre_informe'], "Entidades Bancarias") !== false ||
            strpos($_POST['nombre_informe'], "Entidades bancarias") !== false
        ){
            $contenido = json_encode(SQLConnection::backendStoreProcedure('EntidadesBancariasMensual',array('LISTAR')));
            return view('/fuentes-entidades-bancarias/cargar_archivo_txt_nuevo',compact('contenido'));
        } else if(
            strpos($_POST['nombre_informe'], "Comex") !== false || 
            strpos($_POST['nombre_informe'], "Comercio Exterior") !== false ||
            strpos($_POST['nombre_informe'], "Comercio exterior") !== false ||
            strpos($_POST['nombre_informe'], "comercio exterior") !== false ||
            strpos($_POST['nombre_informe'], "KHT") !== false ||
            strpos($_POST['nombre_informe'], "kht") !== false
        ){
            return view("/fuentes-kht/indexkht");
        } else if(
            strpos($_POST['nombre_informe'], "Cheques") !== false ||
            strpos($_POST['nombre_informe'], "cheques") !== false
        ){
            $path_fuente = env("PATH_EJECUCION_FUENTES");
            return view("/fuentes-cheques/fuentes_cheques_index")->with(compact("path_fuente"));
        } else if(
            strpos($_POST['nombre_informe'], "Juicios") !== false ||
            strpos($_POST['nombre_informe'], "juicios") !== false
        ){
            $fuente = end(explode(' ', $_POST['nombre_informe']));
            $indicaciones = '';

            if ( $fuente == 'Corrientes' || $fuente == 'Mendoza' ) {
                $indicaciones = '
                <ul id="pasos_carga_facturas_apocrifas">
                    <li>Paso 1: El formato de las columnas del archivo deberán ser las siguientes en el orden:
                        <li style="list-style: none;">
                            <b>Provincia, fecha, juzgado, actor,demandado, expediente, objeto, texto</b>
                        </li>
                    </li>
                    <li>Paso 2: Cargar el archivo en el sistema.</li>
                </ul>';
            } else {
                $indicaciones = '
                <ul id="pasos_carga_facturas_apocrifas">
                    <li>Paso 1: El formato de las columnas del archivo deberán ser las siguientes en el orden:
                        <li style="list-style: none;">
                            <b>id,fecha inicio demanda,actor, expediente,caratula, juzgado, secretaria, año, demandado, objeto</b>
                        </li>
                        <li style="list-style: none;">
                            <b>fecha inicio demanda</b> debe tener el formato, ejemplo: 2024-02-01
                        </li>
                    </li>
                    <li>Paso 2: Cargar el archivo en el sistema.</li>
                </ul>';
            }

            return view("/fuentes_juicios/indexJuicios")->with(compact('indicaciones','fuente'));
        } else if(
            strpos($_POST['nombre_informe'], "Marcas") !== false ||
            strpos($_POST['nombre_informe'], "marcas") !== false
        ){
            $path_fuente = env("PATH_EJECUCION_FUENTES");
            return view('/fuente_marcas/index_marcas')->with(compact("path_fuente"));
        } else if(
            strpos($_POST['nombre_informe'], "BBVA") !== false
        ){
            return view("/fuentes-bbva/indexBbva");
        } else if(
            strpos($_POST['nombre_informe'], "ARBA") !== false || 
            strpos($_POST['nombre_informe'], "Arba") !== false ||
            strpos($_POST['nombre_informe'], "arba") !== false
        ){
            $path_fuente = env("PATH_EJECUCION_FUENTES");
            return view("/fuente_arba/index_arba")->with(compact("path_fuente"));
        } else if(
            strpos($_POST['nombre_informe'], "contribuyentes") !== false
        ){
            return view('/fuentes-contribuyentes-inscriptos/index_contribuyentes_inscriptos');
        }
    }

    //posible funcionalidad para limpiar la ruta
    public static function fuentePendiente() {
        $fuentes_procesar = env('PATH_FUENTES_ARCHIVOS_PROCESAR');
        $fuentes_ejecucion = env('PATH_EJECUCION_FUENTES');
        $accion = isset($_POST['accion'])?$_POST['accion']:null;
        if (isset($_POST['accion']) and $_POST['accion'] == "buscar") {
            $fuente = isset($_POST['fuente'])?$_POST['fuente']:null;
            $fuente_buscar = null;
            $informacion = null;
            if (isset($_POST['fuente'])) {
                if($_POST['fuente'] == "FA") {
                    $fuente_buscar = $fuentes_procesar."facturas_apocrifas";
                    $informacion = self::listarArchivosPendientes($fuente_buscar);
                    echo json_encode(array("error"=>0,"cantidad"=>$informacion['cantidad']));
                } else if($_POST['fuente'] == "MA") {
                    $fuente_buscar = $fuentes_procesar."marcas";
                    $informacion = self::listarArchivosPendientes($fuente_buscar);
                    $buscar_en_fuentes = $fuentes_ejecucion."marcas/archivos/para_procesar/Usr/MARCAARG/";
                    $informacion_fuentes = self::listarArchivosPendientes($buscar_en_fuentes);
                    $total_archivos = intval($informacion['cantidad'])+intval($informacion_fuentes["cantidad"]);
                    echo json_encode(array("error"=>0,"cantidad"=>$total_archivos));
                } else if($_POST['fuente'] == "JU") {
                    $fuente_buscar = $fuentes_procesar."juicios";
                    $informacion = self::listarArchivosPendientes($fuente_buscar);
                    $buscar_en_fuentes = $fuentes_ejecucion."juicios/procesar/";
                    $informacion_fuentes = self::listarArchivosPendientes($buscar_en_fuentes);
                    $total_archivos = intval($informacion['cantidad'])+intval($informacion_fuentes["cantidad"]);
                    echo json_encode(array("error"=>0,"cantidad"=>$total_archivos));
                } else if($_POST['fuente'] == "CH") {
                    $fuente_buscar = $fuentes_procesar."cheques";
                    $informacion = self::listarArchivosPendientes($fuente_buscar);
                    $buscar_en_fuentes = $fuentes_ejecucion."cheques/para_procesar/cheques/";
                    $informacion_fuentes = self::listarArchivosPendientes($buscar_en_fuentes);
                    $total_archivos = intval($informacion['cantidad'])+intval($informacion_fuentes["cantidad"]);
                    echo json_encode(array("error"=>0,"cantidad"=>$total_archivos));
                } else if($_POST['fuente'] == "BB") {
                    $fuente_buscar = $fuentes_procesar."bbva";
                    $informacion = self::listarArchivosPendientes($fuente_buscar);
                    $buscar_en_fuentes = $fuentes_ejecucion."bbva/procesar/";
                    $informacion_fuentes = self::listarArchivosPendientes($buscar_en_fuentes);
                    $total_archivos = intval($informacion['cantidad'])+intval($informacion_fuentes["cantidad"]);
                    echo json_encode(array("error"=>0,"cantidad"=>$total_archivos));
                } else if($_POST['fuente'] == "AR") {
                    $fuente_buscar = $fuentes_procesar."arba";
                    $informacion = self::listarArchivosPendientes($fuente_buscar);
                    $buscar_en_fuentes = $fuentes_ejecucion."arba/para_procesar/";
                    $informacion_fuentes = self::listarArchivosPendientes($buscar_en_fuentes);
                    $total_archivos = intval($informacion['cantidad'])+intval($informacion_fuentes["cantidad"]);
                    echo json_encode(array("error"=>0,"cantidad"=>$total_archivos));
                }
            }            
        } else if(isset($_POST['accion']) and $_POST['accion'] == "limpiar") {
            $fuente = isset($_POST['fuente'])?$_POST['fuente']:null;
            $fuente_buscar = null;
            $informacion = null;
            if(isset($_POST['fuente'])) {
                if($_POST['fuente'] == "FA") {
                    self::eliminarArchivos($fuentes_procesar.'facturas_apocrifas/');
                    echo json_encode(array("error"=>0));
                } else  if($_POST['fuente'] == "MA") {
                    self::eliminarArchivos($fuentes_procesar.'marcas/');
                    self::eliminarArchivos($fuentes_ejecucion.'marcas/archivos/para_procesar/Usr/MARCAARG/');
                    echo json_encode(array("error"=>0));
                } else  if($_POST['fuente'] == "JU") {
                    self::eliminarArchivos($fuentes_procesar.'juicios/');
                    self::eliminarArchivos($fuentes_ejecucion.'juicios/procesar/');
                    echo json_encode(array("error"=>0));
                } else  if($_POST['fuente'] == "CH") {
                    self::eliminarArchivos($fuentes_procesar.'cheques/');
                    self::eliminarArchivos($fuentes_ejecucion.'cheques/para_procesar/cheques/');
                    echo json_encode(array("error"=>0));
                } else  if($_POST['fuente'] == "BB") {
                    self::eliminarArchivos($fuentes_procesar.'bbva/');
                    self::eliminarArchivos($fuentes_ejecucion.'bbva/procesar/');
                    echo json_encode(array("error"=>0));
                } else  if($_POST['fuente'] == "AR") {
                    self::eliminarArchivos($fuentes_procesar.'arba/');
                    self::eliminarArchivos($fuentes_ejecucion.'arba/para_procesar/');
                    echo json_encode(array("error"=>0));
                }
            }
        }
    }

    // //mostrar archivos de ruta y su nombre 
    public static function listarArchivosPendientes($ruta) {
        // Array para almacenar los nombres de los archivos
        $archivos = [];
    
        // Abrimos el directorio
        if (is_dir($ruta)) {
            // Escaneamos el directorio
            $files = scandir($ruta);
    
            // Iteramos sobre los elementos del directorio
            foreach ($files as $file) {
                $ruta_completa = $ruta . '/' . $file;
    
                // Verificamos si es un archivo regular y no un directorio ni "." ni ".."
                if (is_file($ruta_completa) && $file != '.' && $file != '..') {
                    $archivos[] = $file;
                }
            }
        }
    
        // Devolvemos la cantidad de archivos y sus nombres
        return [
            'cantidad' => count($archivos),
            'archivos' => $archivos
        ];
    }
    
    public static function eliminarArchivos($ruta) {
        $directory = $ruta;
        if (is_dir($directory)) {
            $files = scandir($directory);

            foreach ($files as $file) {
                $filePath = $directory . '/' . $file;
                
                if (is_file($filePath)) {
                    unlink($filePath);
                }
            }
        }
    }   

    public function controlArba() {
        $id_fuente = Request::input('idFuente');
        $contraparte = Request::input('contraparte');
        $informe = Request::input('informe');
        //
        return view('/fuente_arba/control_fuente')->with(compact('id_fuente','contraparte','informe'));
    }

    public function datosControlArba(){
        $id_fuente = Request::input('idFuente');
        $contraparte = Request::input('contraparte');
        $informe = Request::input('informe');
        $fecha_proceso = Request::input('fecha-proceso');
        //
        $fecha = date_create_from_format('Y-m-d',$fecha_proceso);
        $formato_archivo = $fecha->format('Ymd');
        //
        $datos_arba = SQLConnection::backendStoreProcedure('control_fuente',array('ARB',NULL,$fecha->format('Y-m-d H:i:s')));
        //
        $this->marcarDatosNoInformados($datos_arba);
        //
        $path_incosistencia_arba = env('PATH_RESPUESTA_ARBA').DIRECTORY_SEPARATOR.'InconsistenciasFidelitas_'.$formato_archivo.'.txt';
        $ruta_incosistencia_arba = NULL;
        if ( file_exists($path_incosistencia_arba) ){
            $ruta_incosistencia_arba = env('RUTA_RESPUESTA_ARBA').DIRECTORY_SEPARATOR.'InconsistenciasFidelitas_'.$formato_archivo.'.txt';
        }
        //
        $path_telefono_arba = env('PATH_RESPUESTA_ARBA').DIRECTORY_SEPARATOR.'TelefonosFidelitas_'.$formato_archivo.'.txt';
        $ruta_telefono_arba = NULL;
        if ( file_exists($path_telefono_arba) ){
            $ruta_telefono_arba = env('RUTA_RESPUESTA_ARBA').DIRECTORY_SEPARATOR.'TelefonosFidelitas_'.$formato_archivo.'.txt';
        }
        //
        $path_domicilios_arba = env('PATH_RESPUESTA_ARBA').DIRECTORY_SEPARATOR.'DomiciliosFidelitas_'.$formato_archivo.'.txt';
        $ruta_domicilios_arba = NULL;
        if ( file_exists($path_domicilios_arba) ){
            $ruta_domicilios_arba = env('RUTA_RESPUESTA_ARBA').DIRECTORY_SEPARATOR.'DomiciliosFidelitas_'.$formato_archivo.'.txt';
        }
        //
        $view = \View::make('/fuente_arba/tabla_control')->with(compact('datos_arba','ruta_incosistencia_arba','ruta_telefono_arba','ruta_domicilios_arba'))->render();
        return Response::JSON([
            'vista' => $view
        ]);
    }

    /**
     * Marca los registros Informados de los
     * datos de Arba
     */
    private function marcarDatosNoInformados(&$datos_arba){
        $diff = NULL;
        $dia = date_create();
        $fecha_juicio = NULL;
        //
        foreach( $datos_arba as $reg ){
            $fecha_juicio = date_create_from_format('Y-m-d',$reg->fecha_de_inicio_de_juicio);
            $diff = $dia->diff($fecha_juicio);
            $reg->informado = true;
            //
            if ( $diff->y >= 5 ){
                $reg->informado = false;
            }
        }
    }

    public function controlMarcas(){
        var_dump($_POST);exit;
    }

    public function cargaArchivosComex(){
        $id_fuente = Request::input('idFuente');
        return view('/fuentes-comex/carga_archivos_comex')->with(compact('id_fuente'));
        // return view('/fuentes-comex/control_fuentes_comex')->with(compact('id_fuente'));
    }

    public function guardarArchivoComex(){
        $periodo = Request::input('fecha_fuente').'-01';
        $tipo_fuente = Request::input('tipo_fuente');
        $id_fuente = Request::input('id_fuente');
        $archivo = $_FILES['archivo']['name'];
        if ( !empty($id_fuente) && !empty($periodo) && !empty($tipo_fuente) && (!is_null($archivo) || !empty($archivo)) ) {
            $path = env('PATH_ARCHIVOS_COMEX');
            $ext = '.'.explode('/',$_FILES['archivo']['type'])[1];
            if ( $tipo_fuente == '1' ) {
                $name = "CI";
            } elseif ( $tipo_fuente == '2' ) {
                $name = "CE";    
            } elseif ( $tipo_fuente == '3' ) {                
                $name = "CA";
            }
            $proceso_fuente = Misc::validacion_proceso_fuente_mensual($id_fuente,$name,$periodo);

            $url = env('URL_WEB_FUENTES');
            $ip = $_SERVER['REMOTE_ADDR'];
            $usuario_id = Session::get("usuario")->user_id;
            $datos = http_build_query(array("tipo_fuente"=>$name,"ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $periodo,'es_pendiente' => 1));
            $request = Misc::CURLCall($url,$datos,'POST',600);
            $respuesta = json_decode($request);
            
            if ( !empty($proceso_fuente) ) {
                return 3;
            }
            if ( !empty($respuesta) && $respuesta->error == 0 ) {
                return 4;
            }
            if ( !file_exists($path.$name.$ext) && !empty($respuesta) && $respuesta->error == 1) {
                move_uploaded_file($_FILES['archivo']['tmp_name'],$path.$name.$ext);
                $datos = http_build_query(array("tipo_fuente"=>$name,"ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $periodo));
                $request = Misc::CURLCall($url,$datos,'POST',600);
                $respuesta = json_decode($request);
                return 1;
            } else {
                return 2;
            }
        }
        return 0;
    }

    public function vistaControlComex(){
        $id_fuente = Request::input('idFuente');
        return view('/fuentes-comex/control_fuentes_comex')->with(compact('id_fuente'));
    }

    public function controlFuentesComex() {
        $periodo = Request::input('fecha_fuente').'-01';
        $tipo_fuente = Request::input('tipo_fuente');
        $data = SQLConnection::backendStoreProcedure('control_fuente',array($tipo_fuente,NULL,$periodo));
        $vista = \View::make('/fuentes-comex/tabla_errores_'.strtolower($tipo_fuente))->with(compact(['data']))->render();
        return json_encode( array('view' => $vista, 'tipo_fuente' => $tipo_fuente) );
    }

    public function obtenerJuiciosCorrientes() {
        return view('/fuentes-juicios-corrientes/obtener_juicios_corrientes');
    }

    public function cargaJuiciosCorrientes() {
        $id_fuente = Request::input('idFuente');
        return view('/fuentes-juicios-corrientes/cargar_juicios_corrientes')->with(compact('id_fuente'));
    }

    public function guardarArchivoJuiciosCorrientes(){
        $periodo = Request::input('fecha_fuente').'-01';
        $id_fuente = Request::input('id_fuente');
        $archivo = $_FILES['archivo']['name'];
        dd($periodo,$id_fuente,$archivo);
        if ( !empty($id_fuente) && !empty($periodo) && (!is_null($archivo) || !empty($archivo)) ) {
            $path = env('PATH_ARCHIVOS_JUICIOS_CORRIENTES');
            $ext = '.'.explode('/',$_FILES['archivo']['type'])[1];
            $name = 'JC';
            $proceso_fuente = Misc::validacion_proceso_fuente_mensual($id_fuente,$name,$periodo);

            $url = env('URL_WEB_FUENTES');
            $ip = $_SERVER['REMOTE_ADDR'];
            $usuario_id = Session::get("usuario")->user_id;
            $datos = http_build_query(array("tipo_fuente"=>$name,"ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $periodo,'es_pendiente' => 1));
            $request = Misc::CURLCall($url,$datos,'POST',600);
            $respuesta = json_decode($request);
            
            if ( !empty($proceso_fuente) ) {
                return 3;
            }
            if ( !empty($respuesta) && $respuesta->error == 0 ) {
                return 4;
            }
            if ( !file_exists($path.$name.$ext) && !empty($respuesta) && $respuesta->error == 1) {
                move_uploaded_file($_FILES['archivo']['tmp_name'],$path.$name.$ext);
                $datos = http_build_query(array("tipo_fuente"=>$name,"ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $periodo));
                $request = Misc::CURLCall($url,$datos,'POST',600);
                $respuesta = json_decode($request);
                return 1;
            } else {
                return 2;
            }
        }
        return 0;
    }

    public function cargaRepsal(){
        $idFuente = Request::input('idFuente');
        return view('/fuentes-repsal/carga_repsal')->with(compact('idFuente'));
    }

    public function guardarArchivoRepsal(){
        $periodo = Request::input('fecha_fuente');
        $id_fuente = Request::input('id_fuente');
        $archivo = $_FILES['archivo']['name'];
        if ( !is_null($archivo) || !empty($archivo) ) {
            $path = env('PATH_ARCHIVOS_REPSAL');
            $ext = '.xls';
            $name = "RE";
            $proceso_fuente = Misc::validacion_proceso_fuente_diario($id_fuente,$name,$periodo);
            //
            $url = env('URL_WEB_FUENTES');
            $ip = $_SERVER['REMOTE_ADDR'];
            $usuario_id = Session::get("usuario")->user_id;
            //
            if ( !empty($proceso_fuente) ) {
                return 3;
            }
            //
            if ( !file_exists($path.$name.$ext) ) {
                move_uploaded_file($_FILES['archivo']['tmp_name'],$path.$name.$ext);
                $datos = http_build_query(array("tipo_fuente"=>$name,"ip"=>$ip,"usuario_id"=>$usuario_id,'fecha_proceso' => $periodo));
                $request = Misc::CURLCall($url,$datos,'POST',600);
                $respuesta = json_decode($request);
                return 1;
            } else {
                return 2;
            }
        }
        return 0;
    }

    public function solicitarFuenteStaff(){                                
        return view('fuente_staff.indexStaff'); 
    }

    public function procesarSolicitudStaff(Request $request)
    {                
        // $fecha = Request::input('fecha');
        // 2) Guardar archivo
        //$path = $request->file('archivo')->store('staff');

        // 3) Ejecutar SP que trae la ejecución anterior
        $idFuente = env('FUENTE_STAFF');
        $ejecucion_anterior = SQLConnection::backendStoreProcedure('backend_fuentes_por_id',[$idFuente],true);
    
        
        // 4) Definir fechas
        $fecha_inicio = now(); // o Carbon::now()
        
        // -> 'YYYY-MM-DD 23:59:59' del día siguiente
        $periodo_dias = (int) (
        $ejecucion_anterior->periodicidad
        
        );

        $fecha_comprometida = $fecha_inicio->copy()->addDays($periodo_dias)->endOfDay();
        // 5) Usuario (si querés mantener fijo como usabas antes)
        $userId = Session::get('usuario')->user_id; // o: auth()->id() ?? 725499615;


        // 6) Armar parámetros EXACTOS para LN_panel_control 'CREAR_INFORME_Y_TAREAS'
        $params = [
            'alta_contraparte_v3',                        // acción (va como primer parámetro)
            (int)($ejecucion_anterior->cliente  ?? 0),       // @p_cliente
            (int)$userId,                                    // @p_user_id
            (int)($ejecucion_anterior->idProducto ?? 0),       // @p_id_producto
            (int)($ejecucion_anterior->idTipo_informe ?? 0),// @p_id_tipo_informe
            (int)($ejecucion_anterior->idPadron ?? 0),      // @p_id_padron
            $ejecucion_anterior->familia      ?? null,       // @p_familia
            null,                                            // @p_referencia
            null,                                            // @p_ref
            null,                                            // @p_ref_nombre
            null,                                            // @p_ref_seccion
            null,                                            // @p_ref_cargo
            null,                                            // @p_email_candidato
            null,                                            // @p_telefono_candidato
            null,                                            // @p_notas_candidato
            $ejecucion_anterior->FILIAL_DEFAULT      ?? null,       // @p_filial
            $ejecucion_anterior->IDIOMA_DEFAULT      ?? null,       // @p_idioma
            $ejecucion_anterior->DATAMANAGER_DEFAULT  ?? null,       // @p_datamanager
            $ejecucion_anterior->ASIGNADO_DEFAULT     ?? null,       // @p_asignado
            'A',                                             // @p_estado_inicial
            null,                                            // @p_fecha_limite_doc  (si querés: $fecha_comprometida->format('Y-m-d H:i:s'))
            $fecha_comprometida->format('Y-m-d H:i:s'),      // @p_fecha_comprometida
            null,                                            // @p_doc_id
            null,                                            // @p_asignado_gestion
            ($ejecucion_anterior->contraparte ?? null),      // @p_contraparte
            null,                                            // @p_clave_indicador
            null,                                            // @p_valor_texto
            // Soporta ambos nombres por si cambia en el SP de origen:
            (int)($ejecucion_anterior->idTeam ?? $ejecucion_anterior->idTeam ?? 0), // @p_team_id
            $fecha_inicio ->now()->format('Y-m-d H:i:s'),                   // <-- @p_fecha_inicio SIEMPRE HOY
            null,                                            // @p_id_referencia
            (int)env('LED_PRODUCTO'),                        // @servicioContratado
            0,                                               // @p_nueva_gestion
            null,                                            // @p_old_informe
            null,                                            // @p_objeto_informe
            null,                                            // @p_idsector
            null,                                            // @p_solicitado_por (podés poner $userId si lo querés registrar)
        ];
        
        
        $resultado = SQLConnection::backendStoreProcedure('LN_panel_control', $params, 'select');
        //aca va lo nuevo es informe por tarea

        

        $informe = $resultado[0]->informe;        
        $contraparte = $resultado[0]->contraparte;  
        // Obtener la ÚNICA tarea del informe
        // Traer la ÚNICA tarea de ese informe
        $tarea = SQLConnection::backendStoreProcedure(
            'LN_Blue_Tareas_Informe',               // singular
            ['tareas_informe', null, $informe],     // acción, NULL, @informe
            'selectOne'
        );
        // El id correcto de la tarea es el campo "tarea"
        $tarea_id = (int)($tarea->tarea ?? 0);     // ej: 100953516
        if ($tarea_id <= 0) {
            \Log::warning('No pude obtener tarea_id', ['row' => (array)$tarea]);
            return back()->with('error', "No se pudo determinar la tarea del informe {$informe}.");
        }

        
            
        

        $archivo_informe = $_FILES['archivo']['tmp_name'];
        //$nombre_archivo_informe = $_FILES['archivo']['name'];
   	$nombre_archivo_informe = strtolower($_FILES['archivo']['name']);
   
        //
        $this->GuardarArchivoTarea($contraparte,$userId,$informe,$tarea_id,$archivo_informe,$nombre_archivo_informe);
        
        // Mensaje de salida (si tu SP devuelve un id, léelo desde $resultado[0])
        return back()->with('ok', "Informe dado de alta");
    }



    /**
     * Summary of GuardarArchivoTarea
     * @param int $contraparte es el id de la contarparte
     * @param int $userId es el id del usuario logueado
     * @param int $informe es el id del informe
     * @param int $tarea es el id de la tarea
     * @param string $archivo_informe es la ruta del archivo dado
     * @param string $nombre_archivo_informe es el nombre del archivo dado
     * @return void
     */
    private function GuardarArchivoTarea($contraparte,$userId,$informe,$tarea,$archivo_informe,$nombre_archivo_informe): void{
        $extension = pathinfo($nombre_archivo_informe, PATHINFO_EXTENSION);
        //
        $nombre_archivo = $informe . '.' . $extension;
        $path_guardar = env('PATH_ARCHIVOS_INFORMES') . '/' . $informe . '/' . $nombre_archivo;
        
        if (!is_dir(env('PATH_ARCHIVOS_INFORMES') . '/' . $informe )) {
            mkdir(env('PATH_ARCHIVOS_INFORMES') . '/' . $informe );
        }

        if (!file_exists($path_guardar)) {
            if (move_uploaded_file($archivo_informe, $path_guardar)) {
                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('archivo_informe', $contraparte,$informe, $userId, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $nombre_archivo, $extension));
            }
        }
    }

}
