<?php

namespace App\Http\Controllers;

use App\Http\Controllers\EmailController;
use App\Http\Controllers\LegalesController;

use App\Custom\SQLConnection;
use App\Custom\Misc;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Route;
use Shuchkin\SimpleXLSXGen;

use DB;
use stdClass;
use DateTime;
use DateInterval;

class BlueInformesController extends Controller {

    // FUNCION QUE DEVUELVE EL PANEL DE INFORMES-TAREAS
    public static function panelInformesBlue() {
        // $informes_tareas = SQLConnection::backendStoreProcedure('LN_Blue',array('informes_panel',null,null));
        // $informes_tareas = SQLConnection::backendStoreProcedure('LN_panel_reports', array('search_panel_tareas',Session::get('usuario')->user_id,null,null,null), 'select');
        // $informes_tareas = SQLConnection::backendStoreProcedure('LN_panel_reports', array('search_panel_tareas',Session::get('usuario')->user_id,null,null,null,null,env('PLATAFORMA')), 'select');
        // $tareas = SQLConnection::backendStoreProcedure('LN_panel_reports', array('search_panel_tareas',Session::get('usuario')->user_id,null,null,null,null,env('PLATAFORMA')), 'select');
        $filtro = (isset($_GET['filtro'])) ? $_GET['filtro'] : 0;
        $fecha = (isset($_GET['fecha'])) ? $_GET['fecha'] : 0;
        // $cantidad_inf_tar = count($tareas);
        //('LN_panel_reports','search_panel_tareas',user_id,null,null,null,null,10);
        Traducciones::$blade = 'panel_informes_blue';
        $titulo_navbar = 'Tasks';
        // $informes_tareas = json_encode($informes_tareas);
        //        
        return view('/informes-blue/panel_informes_blue')->with(compact('filtro', 'fecha', 'titulo_navbar'));
    }

    // FUNCION QUE DEVUELVE LOS INFORMES TRABAJADOS EN EL BLUE
    public function informesBlueDataOld() {
        //$informes;
        // sección de informes terminados
        if (isset($_GET['filtro']) and $_GET['filtro'] == 'OK') {
            $informes = SQLConnection::backendStoreProcedure('IV_panel_reports', array('panel_informes_solo_docsOk', Session::get('usuario')->user_id, null, null, null, null, env('PLATAFORMA')), 'select');
        } else {
            // $informes = SQLConnection::backendStoreProcedure('IV_panel_reports', array('panel_solo_informes',Session::get('usuario')->user_id,null,null,null,null,env('PLATAFORMA')), 'select');
            $informes = SQLConnection::backendStoreProcedure('IV_panel_reports', array('PANEL_SOLO_INFORMES_1', Session::get('usuario')->user_id, null, null, null, null, env('PLATAFORMA')), 'select');
            //                                    
            Traducciones::$blade = 'panel_informes_blue';
            //
            if (isset($_GET['filtro'])) {
                $estado = NULL;
                if ($_GET['filtro'] == 'IP') {
                    $estado = 'P';
                } elseif ($_GET['filtro'] == 'IW') {
                    $estado = 'W';
                } elseif ($_GET['filtro'] == 'IA') {
                    $estado = 'A';
                } elseif ($_GET['filtro'] == 'IE') {
                    $estado = 'E';
                } elseif ($_GET['filtro'] == 'IR') {
                    //$estado = 'R';
                    foreach ($informes as $key => $inf) {
                        if ($inf->cod_estado_informe != 'R' && $inf->cod_estado_informe != 'T') {
                            unset($informes[$key]);
                        }
                    }
                }
                //
                if ($estado) {
                    foreach ($informes as $key => $inf) {
                        if ($inf->cod_estado_informe != $estado) {
                            unset($informes[$key]);
                        }
                    }
                }
            }
        }
        // $tareaSinIdtarea = SQLConnection::backendStoreProcedure('informes_',array('actualizar_idtarea',$informe,$id_tipo_informe));
        //
        /* foreach( $informes as $inf_d ){
            $inf_d->estado_informe = (!is_null($inf_d->cod_estado_informe)) ? Traducciones::get(Misc::NombreEstadosInforme($inf_d->cod_estado_informe)) : NULL;
            $inf_d->nombre_informe = Traducciones::get($inf_d->nombre_informe);
        } */
        //
        $acceso_informes_test = Session::get('informes_test_access');
        // $tipos = [409736,9594018,4564458,4622988,2824908,118888,9876061,8312546];
        // $clientes = [1226057645,7500717,6086009,632095719,2400056,1310336827,9878630,5281581,9017721,1702664090,5546348,528397,431136419,861672084,2046807993,1530289645];
        //
        foreach ($informes as $clave_inf => $inf_d) {
            //
            if (!$acceso_informes_test) {
                if ($inf_d->cliente == env('CLIENTES_TEST')) {
                    unset($informes[$clave_inf]);
                }
            } else {
                if ($inf_d->cliente != env('CLIENTES_TEST')) {
                    unset($informes[$clave_inf]);
                }
            }
        }
        //
        $informes = array_values($informes);
        return Response::JSON($informes);
    }

    // FUNCION QUE DEVUELVE LOS INFORMES TRABAJADOS EN EL BLUE
    public function informesBlueData() {
        /* $informes;
        no tiene sentido */
        // sección de informes terminados
        if (isset($_GET['filtro'])) {
            if ($_GET['filtro'] == 'OK') {
                $informes = SQLConnection::backendStoreProcedure('IV_panel_reports', array('panel_informes_solo_docsOk', Session::get('usuario')->user_id, null, null, null, null, env('PLATAFORMA')), 'select');
            } else {
                //
                $fecha = isset($_GET['fecha']) ? $_GET['fecha'] : NULL;
                $estado = NULL;
                if ($_GET['filtro'] == 'IP') {
                    $estado = 'P';
                } elseif ($_GET['filtro'] == 'IW') {
                    $estado = 'W';
                } elseif ($_GET['filtro'] == 'IA') {
                    $estado = 'A';
                } elseif ($_GET['filtro'] == 'IE') {
                    $estado = 'E';
                } elseif ($_GET['filtro'] == 'IR') {
                    $estado = 'R,T';
                }
                //
                if (!is_null($fecha)) {
                    if ($fecha == 'N') {
                        // Informes Vencidos desde la semana de hoy 
                        $hoy = new DateTime();
                        //$informes = SQLConnection::backendStoreProcedure('LN_informes_filtro', array('INFORMES_VENCIDOS_ESTADO_SEMANA',env('PLATAFORMA'),NULL,$estado,$hoy->format('Y-m-d')), 'select');
                        $informes = SQLConnection::backendStoreProcedure('LN_informes_filtro', array('INFORMES_VENCIDOS_ESTADO_DIA', env('PLATAFORMA'), NULL, $estado, $hoy->format('Y-m-d')), 'select');
                    } else {
                        // Informes activos con fecha comprometida de la semana de hoy 
                        $fecha = date_create($fecha);
                        //
                        if ($estado == 'P') {
                            $fecha->sub((new DateInterval('P1D')));
                            $informes = SQLConnection::backendStoreProcedure('LN_informes_filtro', array('INFORMES_ACTIVOS_ESTADO_SEMANA', env('PLATAFORMA'), NULL, $estado, $fecha->format('Y-m-d')), 'select');
                        } else {
                            $informes = SQLConnection::backendStoreProcedure('LN_informes_filtro', array('INFORMES_ACTIVOS_ESTADO_DIA', env('PLATAFORMA'), NULL, $estado, $fecha->format('Y-m-d')), 'select');
                        }
                    }
                } elseif (!is_null($estado)) {
                    // Informes filtrado por estado
                    $informes = SQLConnection::backendStoreProcedure('LN_informes_filtro', array('INFORMES_ACTIVOS_ESTADO', env('PLATAFORMA'), NULL, $estado), 'select');
                }
            }
        } else {
            $informes = SQLConnection::backendStoreProcedure('IV_panel_reports', array('PANEL_SOLO_INFORMES_1', Session::get('usuario')->user_id, null, null, null, null, env('PLATAFORMA')), 'select');
        }
        Traducciones::$blade = 'panel_informes_blue';
        //
        $acceso_informes_test = Session::get('informes_test_access');
        //
        foreach ($informes as $clave_inf => $inf_d) {
            //
            if (!$acceso_informes_test) {
                if ($inf_d->cliente == env('CLIENTES_TEST')) {
                    unset($informes[$clave_inf]);
                }
            } else {
                if ($inf_d->cliente != env('CLIENTES_TEST')) {
                    unset($informes[$clave_inf]);
                }
            }
        }
        //
        $informes = array_values($informes);
        return Response::JSON($informes);
    }

    // FUNCION QUE DEVUELVE LAS TAREAS DE LOS INFORMES TRABAJADOS EN EL BLUE
    public static function tareasBlueDataOld() {
        if (isset($_GET['filtro']) && $_GET['filtro'] == 'CA') {
            $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_categoria_tareas', Session::get('usuario')->user_id, null, null, NULL, null, env('PLATAFORMA'), NULL, NULL, NULL, null, null, null, null, null, null, null, '2'), 'select');
        } elseif (isset($_GET['filtro']) && $_GET['filtro'] == 'CO') {
            $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_categoria_tareas', Session::get('usuario')->user_id, null, null, NULL, null, env('PLATAFORMA'), NULL, NULL, NULL, null, null, null, null, null, null, null, '1'), 'select');
        } elseif (isset($_GET['filtro']) && $_GET['filtro'] == 'R') {
            $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_categoria_tareas', Session::get('usuario')->user_id, null, null, NULL, null, env('PLATAFORMA'), NULL, NULL, NULL, null, null, null, null, null, null, null, '3,7,9'), 'select');
        } elseif (isset($_GET['filtro']) && $_GET['filtro'] == 'DC') {
            $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_categoria_tareas', Session::get('usuario')->user_id, null, null, NULL, null, env('PLATAFORMA'), NULL, NULL, NULL, null, null, null, null, null, null, null, '7'), 'select');
        } elseif (isset($_GET['filtro']) && $_GET['filtro'] == 'B') {
            $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_categoria_tareas', Session::get('usuario')->user_id, null, null, NULL, null, env('PLATAFORMA'), NULL, NULL, NULL, null, null, null, null, null, null, null, '9'), 'select');
        } elseif (isset($_GET['filtro']) && $_GET['filtro'] == 'TOP') {
            $tareas = SQLConnection::backendStoreProcedure('LN_informes_filtro', array('INFORMES_ACTIVOS_TOP_N', env('PLATAFORMA'), 500), 'select');
        } else {
            // $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_tareas',Session::get('usuario')->user_id,null,null,null,null,env('PLATAFORMA')), 'select');
            $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_tareas_new', Session::get('usuario')->user_id, null, null, null, null, env('PLATAFORMA')), 'select');
            // return Response::JSON(SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_tareas_new',Session::get('usuario')->user_id,null,null,null,null,env('PLATAFORMA')), 'select'));
        }
        // Traducciones::$blade = 'panel_informes_blue';
        //
        if (isset($_GET['filtro'])) {
            if ($_GET['filtro'] == 'TE') {
                // PANEL DE TAREAS EN ESPERA
                foreach ($tareas as $key => $tarea) {
                    if ($tarea->cod_estado_tarea != 'W') {
                        unset($tareas[$key]);
                    }
                }
            } elseif ($_GET['filtro'] == 'TP') {
                // PANEL DE TAREAS EN PROCESO
                foreach ($tareas as $key => $tarea) {
                    if ($tarea->cod_estado_tarea != 'E') {
                        unset($tareas[$key]);
                    }
                }
            } elseif ($_GET['filtro'] == 'TR2') {
                // PANEL DE TAREAS LISTAS PARA INICIAR
                foreach ($tareas as $key => $tarea) {
                    if (!$tarea->ready_to_start || $tarea->cod_estado_tarea != 'A') {
                        unset($tareas[$key]);
                    }
                }
            }/*  else {
               // PANEL DE TAREAS
               foreach ($tareas as $key => $tarea){
                   if ( $tarea->cod_estado_tarea == 'K' || $tarea->cod_estado_tarea == 'N' ){
                       unset($tareas[$key]);
                   }
               }
           } */
            //$tareas = array_values($tareas);
        }
        // 
        $acceso_informes_test = Session::get('informes_test_access');
        // $tipos = [409736,9594018,4564458,4622988,2824908,118888,9876061,8312546];
        // $clientes = [1226057645,7500717,6086009,632095719,2400056,1310336827,9878630,5281581,9017721,1702664090,5546348,528397,431136419,861672084,2046807993,1530289645];
        //
        foreach ($tareas as $key => $tarea) {
            //
            if (!$acceso_informes_test) {
                if ($tarea->cliente == env('CLIENTES_TEST')) {
                    unset($tareas[$key]);
                }
            } else {
                if ($tarea->cliente != env('CLIENTES_TEST')) {
                    unset($tareas[$key]);
                }
            }
        }
        //
        $tareas = array_values($tareas);
        return Response::JSON($tareas);

        /* foreach ($tareas as $key => $tarea){
            $tarea->estado_informe = (!is_null($tarea->cod_estado_informe)) ? Traducciones::get(Misc::NombreEstadosInforme($tarea->cod_estado_informe)) : NULL;
            $tarea->estado_tarea  = (!is_null($tarea->cod_estado_tarea)) ? Traducciones::get(Misc::NombreEstadosInforme($tarea->cod_estado_tarea)) : NULL;
            $tarea->nombre_tarea = Traducciones::get($tarea->nombre_tarea);
        } */
        //
        // return json_encode($tareas);

        // @accion                                        varchar(40),
        // @p_user_id                                    int,
        // @p_cliente                                    int = null,
        // @p_contraparte                                int = null,
        // @p_servicio_contratado                        int = NULL,
        // @p_informe                                    int = NULL,
        // @plataforma                                    varchar(max) = null,
        // @p_estado_informe                            varchar(1) = NULL,
        // @p_fecha_desde                                date = null,
        // @p_fecha_hasta                                date = null,
        // @docsOK                                        bit = null,
        // @publicado                                    bit = null,
        // @idPadron                                    bigint = null,
        // @p_tipo_informe                                int = null,
        // @country_code_tax_id                        char(2)= null,
        // @p_fecha_desde_publicacion                    date=null,
        // @p_fecha_hasta_publicacion                    date=null,
        // @tipo_tareas                                varchar(100)=null
    }

    // FUNCION QUE DEVUELVE LAS TAREAS DE LOS INFORMES TRABAJADOS EN EL BLUE
    public static function tareasBlueData() {
        if (isset($_GET['filtro'])) {
            $filtro = $_GET['filtro'];
            if ($filtro == 'CA') {
                $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_categoria_tareas', Session::get('usuario')->user_id, null, null, NULL, null, env('PLATAFORMA'), NULL, NULL, NULL, null, null, null, null, null, null, null, '2'), 'select');
            } elseif ($filtro == 'R') {
                $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_categoria_tareas', Session::get('usuario')->user_id, null, null, NULL, null, env('PLATAFORMA'), NULL, NULL, NULL, null, null, null, null, null, null, null, '3,7,9,8,11'), 'select');
            } elseif ($filtro == 'CO') {
                $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_categoria_tareas', Session::get('usuario')->user_id, null, null, NULL, null, env('PLATAFORMA'), NULL, NULL, NULL, null, null, null, null, null, null, null, '1'), 'select');
            } elseif ($filtro == 'DC') {
                $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_categoria_tareas', Session::get('usuario')->user_id, null, null, NULL, null, env('PLATAFORMA'), NULL, NULL, NULL, null, null, null, null, null, null, null, '7'), 'select');
            } elseif ($filtro == 'B') {
                $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_categoria_tareas', Session::get('usuario')->user_id, null, null, NULL, null, env('PLATAFORMA'), NULL, NULL, NULL, null, null, null, null, null, null, null, '9'), 'select');
            } elseif ($filtro == 'TOP') {
                $tareas = SQLConnection::backendStoreProcedure('LN_informes_filtro', array('INFORMES_ACTIVOS_TOP_N', env('PLATAFORMA'), 500), 'select');
            } else {
                $fecha = (isset($_GET['fecha'])) ? $_GET['fecha'] : NULL;
                $estado = NULL;
                if ($_GET['filtro'] == 'TE') {
                    $estado = 'W';
                } elseif ($_GET['filtro'] == 'TP') {
                    $estado = 'E';
                } elseif ($_GET['filtro'] == 'TR2') {
                    $estado = 'Z';
                }
                //
                if (!is_null($fecha)) {
                    if ($fecha == 'N') {
                        // Informes Vencidos desde la semana de hoy
                        $hoy = new DateTime();
                        $tareas = SQLConnection::backendStoreProcedure('LN_informes_filtro', array('TAREAS_VENCIDOS_ESTADO_DIA', env('PLATAFORMA'), NULL, $estado, $hoy->format('Y-m-d')), 'select');
                    } else {
                        // Informes activos con fecha comprometida de la semana de hoy
                        $fecha = date_create($fecha);
                        $tareas = SQLConnection::backendStoreProcedure('LN_informes_filtro', array('TAREAS_ACTIVOS_ESTADO_DIA', env('PLATAFORMA'), NULL, $estado, $fecha->format('Y-m-d')), 'select');
                    }
                } elseif (!is_null($estado)) {
                    // Informes filtrado por estado
                    $tareas = SQLConnection::backendStoreProcedure('LN_informes_filtro', array('TAREAS_ACTIVOS_ESTADO', env('PLATAFORMA'), NULL, $estado), 'select');
                }
            }
        } else {
            $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports', array('search_panel_tareas_new', Session::get('usuario')->user_id, null, null, null, null, env('PLATAFORMA')), 'select');
        }
        // Traducciones::$blade = 'panel_informes_blue';
        // 
        $acceso_informes_test = Session::get('informes_test_access');
        //
        foreach ($tareas as $key => $tarea) {
            //
            if (!$acceso_informes_test) {
                if ($tarea->cliente == env('CLIENTES_TEST')) {
                    unset($tareas[$key]);
                }
            } else {
                if ($tarea->cliente != env('CLIENTES_TEST')) {
                    unset($tareas[$key]);
                }
            }
        }
        //
        $tareas = array_values($tareas);
        return Response::JSON($tareas);
    }

    /**
     * Funcion que devuelve las
     * tareas para armar el panel 
     * de los informes sin contrapartes
     * @access public
     */
    public static function tareasSinContrapartes() {
        //
        $tareas = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL', array('REPORTE_DCL', NULL), 'select');
        //
        Traducciones::$blade = 'panel_informes_blue';
        foreach ($tareas as $key => $tarea) {
            $tarea->estado_informe = (!is_null($tarea->cod_estado_informe)) ? Traducciones::get(Misc::NombreEstadosInforme($tarea->cod_estado_informe)) : NULL;
            $tarea->estado_tarea = (!is_null($tarea->cod_estado_tarea)) ? Traducciones::get(Misc::NombreEstadosInforme($tarea->cod_estado_tarea)) : NULL;
            $tarea->nombre_tarea = Traducciones::get($tarea->nombre_tarea);
        }
        //
        return Response::JSON(['error' => 0, 'data' => $tareas]);
    }

    /////////////////////////////////////////////////
    ////////////// PANEL DE INFORMES ////////////////
    /////////////////////////////////////////////////

    // FUNCION QUE DEVUELVE LA VISTA DEL PANEL DE INFORMES.
    public static function panelInformes() {
        $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT', NULL, NULL, NULL, NULL, 0, env('PLATAFORMA')), 'select');
        //----------
        $paises = SQLConnection::backendStoreProcedure('backend_obtener_paises', array(), 'select');
        //----------
        $tipos_informes = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('LISTAR', null, null, null, null, null, null, null, null, null, null, null, env('PLATAFORMA')), 'select');
        //
        $titulo_navbar = 'Panel de Informes';
        //
        return view('/panel-informes/panel_informes')->with(compact('clientes', 'paises', 'tipos_informes', 'titulo_navbar'));
    }

    // FUNCION QUE DEVUELVE LOS DATOS QUE LLENA LA TABLA DEL PANEL DE INFORMES.

public static function dataPanelInformes() {
        $cliente = (!empty(Request::input('cliente'))) ? Request::input('cliente') : NULL;
        $pais = (!empty(Request::input('pais'))) ? Request::input('pais') : NULL;
        $tipo_informe = (!empty(Request::input('tipo_informe'))) ? Request::input('tipo_informe') : NULL;
        $estado = (!empty(Request::input('estado'))) ? Request::input('estado') : NULL;
        $id_padron = (!empty(Request::input('id_padron'))) ? Request::input('id_padron') : NULL;
        $fecha_desde = Request::input('fecha_desde');
        $fecha_hasta = Request::input('fecha_hasta');
        //--FECHAS PUBLICADO O CREADO
        $fech_check_publicado = (!is_null(Request::input('fech_publicado'))) ? Request::input('fech_publicado') : NULL;
        $fech_check_creado = (!is_null(Request::input('fech_creado'))) ? Request::input('fech_creado') : NULL;
        //--
        $publicado = (!is_null(Request::input('publicado'))) ? Request::input('publicado') : NULL;
        //--
        $fecha_desde = date_create_from_format('Y-m-d', $fecha_desde) ?? NULL;
        $fecha_hasta = date_create_from_format('Y-m-d', $fecha_hasta) ?? NULL;
        //--
        $fecha_desde->setTime(0, 0, 0);
        $fecha_hasta->setTime(23, 59, 59);
        //--
        $fecha_desde = ($fecha_desde != FALSE && $fecha_desde != NULL) ? $fecha_desde->format('Y-m-d H:i:s') : NULL;
        $fecha_hasta = ($fecha_hasta != FALSE && $fecha_hasta != NULL) ? $fecha_hasta->format('Y-m-d H:i:s') : NULL;
        //--VERIFICACION DE LAS FECHAS PUBLICADO O CREADO
        if ($fech_check_publicado == '1') {
            $datos = SQLConnection::backendStoreProcedure('LN_panel_reports', array('filt_panel_informes', Session::get('usuario')->user_id, $cliente, null, null, null, env('PLATAFORMA'), $estado, null, null, NULL, $publicado, $id_padron, $tipo_informe, $pais, $fecha_desde, $fecha_hasta));
        } elseif ($fech_check_creado == '1') {
            $datos = SQLConnection::backendStoreProcedure('LN_panel_reports', array('filt_panel_informes', Session::get('usuario')->user_id, $cliente, null, null, null, env('PLATAFORMA'), $estado, $fecha_desde, $fecha_hasta, NULL, $publicado, $id_padron, $tipo_informe, $pais, null, null));
        }

        //--
        return view('/panel-informes/tabla-panel-informes')->with(compact('cliente', 'pais', 'tipo_informe', 'estado', 'fecha_desde', 'fecha_hasta', 'publicado', 'datos'));
    }


    public static function dataPanelInformesTBB() {
        $cliente = (!empty(Request::input('cliente'))) ? Request::input('cliente') : NULL;
        $pais = (!empty(Request::input('pais'))) ? Request::input('pais') : NULL;
        $tipo_informe = (!empty(Request::input('tipo_informe'))) ? Request::input('tipo_informe') : NULL;
        $estado = (!empty(Request::input('estado'))) ? Request::input('estado') : NULL;
        $id_padron = (!empty(Request::input('id_padron'))) ? Request::input('id_padron') : NULL;
        $fecha_desde = Request::input('fecha_desde');
        $fecha_hasta = Request::input('fecha_hasta');
        //--FECHAS PUBLICADO O CREADO
        $fech_check_publicado = (!is_null(Request::input('fech_publicado'))) ? Request::input('fech_publicado') : NULL;
        $fech_check_creado = (!is_null(Request::input('fech_creado'))) ? Request::input('fech_creado') : NULL;
        //--
        $publicado = (!is_null(Request::input('publicado'))) ? Request::input('publicado') : NULL;
        //--
        $fecha_desde = date_create_from_format('Y-m-d', $fecha_desde) ?? NULL;
        $fecha_hasta = date_create_from_format('Y-m-d', $fecha_hasta) ?? NULL;
        //--
        $fecha_desde->setTime(0, 0, 0);
        $fecha_hasta->setTime(23, 59, 59);
        //--
        $fecha_desde = ($fecha_desde != FALSE && $fecha_desde != NULL) ? $fecha_desde->format('Y-m-d H:i:s') : NULL;
        $fecha_hasta = ($fecha_hasta != FALSE && $fecha_hasta != NULL) ? $fecha_hasta->format('Y-m-d H:i:s') : NULL;
        //--VERIFICACION DE LAS FECHAS PUBLICADO O CREADO
        if ($fech_check_publicado == '1') {
            $datos = SQLConnection::backendStoreProcedure('LN_panel_reports', array('filt_panel_informes', Session::get('usuario')->user_id, $cliente, null, null, null, env('PLATAFORMA'), $estado, null, null, NULL, $publicado, $id_padron, $tipo_informe, $pais, $fecha_desde, $fecha_hasta));
        } elseif ($fech_check_creado == '1') {
            $datos = SQLConnection::backendStoreProcedure('LN_panel_reports', array('filt_panel_informes', Session::get('usuario')->user_id, $cliente, null, null, null, env('PLATAFORMA'), $estado, $fecha_desde, $fecha_hasta, NULL, $publicado, $id_padron, $tipo_informe, $pais, null, null));
        }

        //--
        return view('/panel-informes/tabla-panel-informes')->with(compact('cliente', 'pais', 'tipo_informe', 'estado', 'fecha_desde', 'fecha_hasta', 'publicado', 'datos'));
    }

    //FUNCION VIEJA PARA EXPORTAR EXCEL
    /* public function exportarTablaExcel(){
        $datos_tabla = Request::input('data_table');
        //------------- SE DEVUELVEN LOS DATOS DEL ARCHIVO EN FORMA DE JSON
        $archivo = utf8_decode($datos_tabla);
        $nombre_archivo = 'Excel_panel_informe_'.date('d/m/Y').'.xls';
        //----
        header('Content-disposition: attachment; filename='.$nombre_archivo);
        header('Content-type: application/vnd.ms-excel; charset=utf-8');
        //-------------
        $response = array(
            'op' => 'ok',
            'archivo' => $nombre_archivo,
            'file' => "data:application/vnd.ms-excel;base64,".base64_encode($archivo)
        );
        die(json_encode($response));
    } */

    public function exportarExcelXLSX() {
        $data = Request::input('data');
        $dataExcel = json_decode($data);
        $fecha = date("Y-m-d");
        $nombreExcel = 'Reporte_Informes_' . $fecha . '.xlsx';
        
        
        $path = env('PATH_EXCEL_GEN');
        if (!is_dir($path)) {
            mkdir($path, 0777, true);
        }

        $xlsx = SimpleXLSXGen::fromArray($dataExcel);
        $xlsx->saveAs($path . '/' . $nombreExcel);

        return json_encode([
            'filename' => $nombreExcel,
            'path' => (env('RUTA_EXCEL_GEN') . '/' . $nombreExcel)
        ]);
    }

    public function exportarExcelXLSXbkp() {
        $data = Request::input('data');
        $dataExcel = json_decode($data);
        $fecha = date("Y-m-d");
        $nombreExcel = 'Reporte_Informes_' . $fecha . '.xlsx';
        
        
        $path = env('PATH_EXCEL_GEN');
        if (!is_dir($path)) {
            mkdir($path, 0777, true);
        }

        $xlsx = SimpleXLSXGen::fromArray($dataExcel);
        $xlsx->saveAs($path . '/' . $nombreExcel);

        return json_encode([
            'filename' => $nombreExcel,
            'path' => (env('RUTA_EXCEL_GEN') . '/' . $nombreExcel)
        ]);
    }



    public function exportarExcelXLSXTBB() {
        $data = Request::input('data');
        $dataExcel = json_decode($data);
        $fecha = date("Y-m-d");
        $nombreExcel = 'Reporte_Informes_' . $fecha . '.xlsx';
        
        
        $path = env('PATH_EXCEL_GEN');
        if (!is_dir($path)) {
            mkdir($path, 0777, true);
        }

        $xlsx = SimpleXLSXGen::fromArray($dataExcel);
        $xlsx->saveAs($path . '/' . $nombreExcel);

        return json_encode([
            'filename' => $nombreExcel,
            'path' => (env('RUTA_EXCEL_GEN') . '/' . $nombreExcel)
        ]);
    }
    //FUNCION NUEVA PARA EXPORTAR EXCEL
    public function exportarExcelXLSXTBB2() {
        $data = Request::input('data');
        $dataExcel = json_decode($data);
        $fecha = date("Y-m-d");
        $nombreExcel = 'Reporte_Informes_' . $fecha . '.xlsx';
        //Genero el excel con la libreria nueva
        $xlsx = SimpleXLSXGen::fromArray($dataExcel);
        $xlsx->saveAs(env('PATH_EXCEL_GEN') . '/' . $nombreExcel);


        return json_encode(['filename' => $nombreExcel, 'path' => (ENV('RUTA_EXCEL_GEN') . '/' . $nombreExcel)]);
    }

    //ELIMINA RESIDUOS
    public function eliminaResiduosExcel() {
        // Folder path to be flushed
        $folder_path = env('PATH_EXCEL_GEN');
        // Lista los nombres de los archivos dentro del directorio
        $files = glob($folder_path . '/*');
        // Borra todos los archivos del directorio
        foreach ($files as $file) {
            if (is_file($file) && file_exists($file)) {
                unlink($file);
            }
        }
    }

    public static function buscarPadronPersona() {
        if (isset($_POST['cliente']) && !Misc::tieneCaracterRaroBase($_POST['cliente'])) {
            return SQLConnection::busquedaPadronAutocomplete($_POST['cliente'], 1);
        }
        return '0';
    }

    /////////////////////////////////////////////////
    ////////////// EDICION DEL INFORME //////////////
    /////////////////////////////////////////////////

    // FUNCION QUE DEVUELVE EL MODAL DE EDICION DEL INFORME
    public static function editarInforme() {
        if (isset($_POST['informe'])) {
            $informe = Request::input('informe');
            $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', Session::get('usuario')->user_id, null, null, null, $informe), 'selectOne');
            //
            $tareaSinIdtarea = SQLConnection::backendStoreProcedure('informes_', array('tareas_sin_idtarea', $informe, $datos_informe->id_tipo_informe));
            $teams_familia = SQLConnection::backendStoreProcedure('LN_Teams_', array('LSTFAMILYTEAMS', Session::get('usuario')->user_id, null, null, null, null, null, null, null, null, null, null, $datos_informe->familia), 'select');
            //
            //$referencia_externa = $data_busqueda->referencia_externa;
            // $visible = (( $data_busqueda->visible == '1' ) ? true : false);
            if ($datos_informe->publicado == 0) {
                $visible = false;
            } else {
                $visible = true;
            }
            $trazabilidad = SQLConnection::backendStoreProcedure('LN_trazabilidad_v2', array($datos_informe->contraparte, $datos_informe->gestion, 10), 'select');
            //$wsp = SQLConnection::backendStoreProcedure('LN_tickets_', array('LISTBYCONTRA', $data_busqueda->contraparte,$data_busqueda->gestion,Session::get('servicio_actual'),$data_busqueda->cliente,Session::get('usuario')->user_id,'','F'));
            //$tareas = SQLConnection::backendStoreProcedure('LN_Blue',array('tareas_informe',NULL,$informe));
            $users = SQLConnection::backendStoreProcedure('LN_Blue', array('USERS_BACK', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, env('PLATAFORMA')));
            $seccion_archivos = self::archivosInforme($datos_informe->contraparte, $informe);
            //
            $permiso_fecha_comp = true;
            /* $miembros = SQLConnection::backendStoreProcedure('LN_Teams_', array('LSTTEAMMEMBER',Session::get('usuario')->user_id,$datos_informe->idTeam),'select');
            $permiso_fecha_comp = false;
            foreach ($miembros as $usuario) {
                if ($usuario->user_id == Session::get('usuario')->user_id && $usuario->id_rol == '1') {
                    $permiso_fecha_comp = true;
                    break;
                }
            }  */
            // TAREAS DEL INFORME
            $seccion_tareas = self::tareasInforme($informe, 0, $users, $datos_informe);
            $datos_informe->fecha_tiempo_comprometida = date_create_from_format('Y-m-d H:i:s', $datos_informe->fecha_comprometida_informe) ?? NULL;
            $datos_informe->fecha_tiempo_inicio = date_create_from_format('Y-m-d H:i:s', $datos_informe->inicio_informe);
            $username = Session::get('usuario')->username;
            $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $datos_informe->contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
            $solicitantes = SQLConnection::backendStoreProcedure('LN_demo_', array('usuarios_solicitantes', null, $datos_informe->cliente), 'select');
            $docs_carga = [];
            foreach ($docs as $doc) {
                if ($doc->quien_carga == 'C') {
                    array_push($docs_carga, $doc);
                }
            }
            $ultima_tarea = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $datos_informe->informe));
            $ultima_tarea = end($ultima_tarea);
            // $temp = SQLConnection::backendStoreProcedure('LN_informes', array('check_docs_ok', $datos_informe->contraparte, NULL, Session::get('usuario')->user_id), 'selectOne');
            // dd($datos_informe);
            //
            return view('/informes-blue/edicion-informe')->with(compact('datos_informe', 'users', 'trazabilidad', 'seccion_tareas', 'seccion_archivos', 'username', 'docs_carga', 'teams_familia', 'permiso_fecha_comp', 'visible', 'tareaSinIdtarea', 'solicitantes', 'ultima_tarea'));
        } else {
            return 0;
        }
    }

    // FUNCION QUE ACTUALIZA LOS DATOS DEL INFORME
    public function guardarInforme() {
        if (isset($_POST['informe']) && isset($_POST['contraparte'])) {
            $user_id = Session::get('usuario')->user_id;
            $informe = Request::input('informe');
            $contraparte = Request::input('contraparte');
            $cliente = Request::input('cliente');
            $gestion = Request::input('gestion');
            $estado = Request::input('estado');
            $dedicacion = Request::input('dedicacion');
            $nombre_usuario = Request::input('nombre_usuario_asignado');
            $nombre_estado = Request::input('nombre_estado');
            $nota_contraparte = Request::input('notas_contraparte');
            $solicitado_por = Request::input('solicitado_por');
            $referencia = trim(Request::input('referencia'));
            $docs_rechazados = Request::input('docs_rechazados');
            $duracion_inf = Request::input('duracion_informe');
            //
            $usuario = (empty(Request::input('usuario_asignado'))) ? NULL : Request::input('usuario_asignado');
            //
            $idioma = Request::input('idioma');
            $fecha_inicio = Request::input('fecha_completa_inicio');
            $fecha_comprometida = Request::input('fecha_completa_comprometida');
            //
            $busqueda = SQLConnection::backendStoreProcedure('IV_busquedas_', array('search', NULL, $contraparte), 'selectOne');
            $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', $user_id, null, null, null, $informe), 'selectOne');
            $ingresado_por = !is_null(Request::input('ingresado_por')) && !empty(Request::input('ingresado_por')) ? Request::input('ingresado_por') : $datos_informe->created_by;
            $cliente = $datos_informe->cliente;
            $id_tipo_informe = $datos_informe->id_tipo_informe;
            $servicio_contratado = $datos_informe->servicio_contratado;
            // SE OBTIENEN LOS DATOS ACTUALES DEL INFORME PARA COMPRAR SI SE REALIZO ALGUN CAMBIO
            $estado_informe_actual = $datos_informe->codigo_estado_informe;
            $dedicacion_actual = $datos_informe->informe_prioridad;
            $usuario_actual = $datos_informe->userIDAsigandoInforme;
            $nombre_usuario_actual = $datos_informe->usuario_informe;
            $idioma_actual = $datos_informe->idioma;
            $equipo_actual = $datos_informe->idTeam;
            // 
            $todas_tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe));
            $ultima_tarea = end($todas_tareas);
            //
            $fecha_inicio_actual = (!is_null($datos_informe->inicio_informe)) ? date_create_from_format('Y-m-d H:i:s', $datos_informe->inicio_informe) : NULL;
            if (!is_null($fecha_inicio_actual)) {
                // $fecha_inicio_actual = $fecha_inicio_actual->setTime($fecha_inicio_actual->format('H'),$fecha_inicio_actual->format('i'),0);
                $fecha_inicio_actual = $fecha_inicio_actual->setTime(9, 0, 0);
            }
            $fecha_comprometida_actual = (!is_null($datos_informe->fecha_comprometida_informe)) ? date_create_from_format('Y-m-d H:i:s', $datos_informe->fecha_comprometida_informe) : NULL;
            if (!is_null($fecha_comprometida_actual)) {
                $fecha_comprometida_actual->setTime($fecha_comprometida_actual->format('H'), $fecha_comprometida_actual->format('i'), 0);
            }
            // SE FORMATEAN LAS FECHAS RECIBIDAS
            $fecha_completa_inicio = NULL;
            $fecha_completa_comprometida = NULL;
            $fecha_completa_inicio_object = NULL;
            $fecha_completa_comprometida_object = NULL;
            if (!is_null($fecha_inicio) && !empty($fecha_inicio)) {
                $fecha_completa_inicio_object = date_create_from_format('d/m/Y H:i', $fecha_inicio);
                // $fecha_completa_inicio_object->setTime($fecha_completa_inicio_object->format('H'),$fecha_completa_inicio_object->format('i'),0);
                $fecha_completa_inicio_object->setTime(9, 0, 0);
                $fecha_completa_inicio = $fecha_completa_inicio_object->format('Y-m-d H:i:s');
            }
            //
            if (!is_null($fecha_comprometida) && !empty($fecha_comprometida)) {
                $fecha_completa_comprometida_object = date_create_from_format('d/m/Y H:i', $fecha_comprometida);
                // $fecha_completa_comprometida_object->setTime($fecha_completa_comprometida_object->format('H'),$fecha_completa_comprometida_object->format('i'),0);
                $fecha_completa_comprometida_object->setTime(18, 0, 0);
                $fecha_completa_comprometida = $fecha_completa_comprometida_object->format('Y-m-d H:i:s');
            }
            //
            $cambio_estado = ($estado_informe_actual != $estado);
            // si pasa de estados que deshabilitan accion a otros que habilitan accion o al reves
            $recarga_tareas = (($estado_informe_actual == 'K' || $estado_informe_actual == 'N' || $estado_informe_actual == 'C') xor ($estado == 'K' || $estado == 'N' || $estado == 'C'));
            $seccion_tareas = NULL;
            //
            // se verifica que el informe esta generado
            if ($estado == 'K' && $cambio_estado) {
                //
                self::verificarDocumentosInforme($contraparte);
            }
            // SE ACTUALIZAN LOS DATOS DEL INFORME
            if (($estado == 'C' || $estado == 'N') && $cambio_estado) {
                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('CANCELA_INFORME', $contraparte, $informe, $user_id, NULL, NULL, $id_tipo_informe, $dedicacion, $estado, $ingresado_por, NULL, $usuario, $cliente, NULL, NULL, $fecha_completa_comprometida, NULL, NULL, $idioma, $fecha_completa_inicio), 'selectOne');
                SQLConnection::logTrazabilidad('Las tareas del informe fueron cerradas.', 'CERRAR_TAREAS_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, null);
                //self::verificarDocumentosInforme($contraparte);
            } else {
                if ($estado == 'E' && is_null($fecha_completa_inicio)) {
                    $fecha_completa_inicio = new DateTime(); // fecha de ahora
                    $fecha_completa_inicio = $fecha_completa_inicio->format('Y-m-d H:i:s');
                }
                if (!is_null($fecha_completa_inicio)) {
                    $hoy = new DateTime();
                    $inicio = new DateTime($fecha_completa_inicio);
                    if ($inicio > $hoy) {
                        $todas_tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe));
                        foreach ($todas_tareas as $tr) {
                            if (isset($tr->ready_to_start) && $tr->ready_to_start == '1' && $tr->estado_tarea == 'A') {
                                // VUELVE EL READY TO START A 0
                                SQLConnection::backendStoreProcedure('IV_ready2start', array('UNDO_READY2START', $contraparte, $tr->tarea, Session::get('usuario')->user_id, $servicio_contratado, $cliente));
                            }
                        }
                    }
                }
                // $fecha_comp_inf = Misc::establecerFechasInforme($duracion_inf,$fecha_completa_inicio);
                // $fecha_comp_inf = new DateTime($fecha_comp_inf['fecha_comprometida']);
                $fecha_comp_ultima_tar = new DateTime($ultima_tarea->fecha_comprometidaTAR);
                $fecha_comprometida = new DateTime($fecha_completa_comprometida);
                if ($fecha_comprometida < $fecha_comp_ultima_tar) {
                    $fecha_completa_comprometida = $fecha_comp_ultima_tar->format('Y-m-d H:i:s');
                }
                // dd('UPD_informe',$contraparte,$informe,$user_id,NULL,NULL,$id_tipo_informe,$dedicacion,$estado,$ingresado_por,NULL,$usuario,$cliente,NULL,NULL,$fecha_completa_comprometida,NULL,NULL,$idioma,$fecha_completa_inicio,null,null,null,null,null,0,null,null,1,$referencia);
                //
                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_informe', $contraparte, $informe, $user_id, NULL, NULL, $id_tipo_informe, $dedicacion, $estado, $ingresado_por, NULL, $usuario, $cliente, NULL, NULL, $fecha_completa_comprometida, NULL, NULL, $idioma, $fecha_completa_inicio, null, null, null, null, null, 0, null, null, 1, $referencia), 'selectOne');
            }
            //
            if ($estado == 'K' && $cambio_estado) {
                //if ( $cliente == 738156811 || $cliente == 2254875 ){
                $this->procesarHitContraparte($contraparte);
                Misc::calcularTAT($contraparte, $gestion);
                //$tatFront = SQLConnection::backendStoreProcedure('LN_TATime_', array('UPDBYCONTRA', $contraparte, $gestion, $calculoTAT['minutos_totales'], $calculoTAT['bloque_jornada']));
                //}
            }
            //
            $cambio_equipo = false;
            $nuevos_usuarios_asignados = [];
            $miembros_equipo = [];
            $equipo = Request::input('equipo_asignado');
            if ($equipo != $equipo_actual && ($estado_informe_actual != 'K' && $estado_informe_actual != 'N' && $estado_informe_actual != 'C' && $estado_informe_actual != 'F')) {
                $nombre_equipo = Request::input('nombre_equipo_asignado');
                //
                $nuevos_usuarios_asignados = $this->cambiarTeamInforme($equipo, $nombre_equipo, $informe, $cliente, $contraparte, $servicio_contratado, $miembros_equipo, true);
                $cambio_equipo = true;
            }
            // SE ARMAN COMPARACION PARA GUARDAR TRAZABILIDAD
            if ($cambio_estado) {
                // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio el estado del informe a '.$nombre_estado, $cliente, 'CAMBIAR_ESTADO_INFORME','BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
                // 
                if ($estado == 'R') {
                    // Observado
                    SQLConnection::logTrazabilidad('El Informe fue Observado', 'OBS_IV', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL);
                } elseif ($estado == 'C') {
                    // Rechazado
                    SQLConnection::logTrazabilidad('El Informe fue Rechazado', 'REJECT_IV', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL);
                } elseif ($estado == 'E') {
                    // En proceso
                    SQLConnection::logTrazabilidad('El Informe fue Iniciado', 'START_IV', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL);
                } elseif ($estado == 'N') {
                    // Anulado
                    SQLConnection::logTrazabilidad('El Informe fue Anulado', 'CANCEL_IV', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL);
                } elseif ($estado == 'P') {
                    // En gestión
                    SQLConnection::logTrazabilidad('El Informe esta en gestión de terceros', 'GESTION_IV', Session::get('webdata')['id_menu_plataforma'], $user_id, $datos_informe->servicio_contratado, $datos_informe->cliente, $datos_informe->contraparte, null, null, null, null, null, NULL, NULL, $informe);
                } else {
                    SQLConnection::logTrazabilidad('Se cambió el estado del informe a ' . $nombre_estado, 'CAMBIAR_ESTADO_INFORME', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $informe, null);
                }
            }
            //            
            if ($dedicacion_actual != $dedicacion) {
                // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio la prioridad del informe a '.$dedicacion, $cliente, 'CAMBIAR_PRIORIDAD_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
                // CAMBIA DEDDICACION DE TODAS LAS TAREAS
                // STORE
                // 
                SQLConnection::logTrazabilidad('Se cambió la prioridad del informe a ' . $dedicacion, 'CAMBIAR_PRIORIDAD_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $informe, null);
            }
            //
            /* if ( $usuario_actual != $usuario ){
                if ( !empty($usuario) ){
                    // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se asigno el informe al usuario '.$nombre_usuario, $cliente, 'ASIGNAR_INFORME_USUARIO','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
                    SQLConnection::logTrazabilidad('Se asignó el informe al usuario '.$nombre_usuario,'ASIGNAR_INFORME_USUARIO',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,$informe,null);
                } else {
                    // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se desasigno el informe al usuario '.$nombre_usuario_actual, $cliente, 'DESASIGNAR_INFORME_USUARIO','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
                    SQLConnection::logTrazabilidad('Se desasignó el informe al usuario '.$nombre_usuario,'DESASIGNAR_INFORME_USUARIO',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,$informe,null);
                }
            } */
            //
            if ($idioma_actual != $idioma) {
                // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio el idioma del informe a '.strtoupper($idioma), $cliente, 'CAMBIAR_IDIOMA_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
                SQLConnection::logTrazabilidad('Se cambió el idioma del informe a ' . strtoupper($idioma), 'CAMBIAR_IDIOMA_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $informe, null);
            }
            //
            if ($fecha_inicio_actual != $fecha_completa_inicio_object) {
                if (!is_null($fecha_inicio_actual) && $fecha_inicio_actual != FALSE) {
                    // SE CAMBIO LA FECHA DE INICIO
                    // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio la fecha de inicio del informe : '.$fecha_completa_inicio, $cliente, 'CAMBIAR_INICIO_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
                    SQLConnection::logTrazabilidad('Se cambió la fecha de inicio del informe: ' . $fecha_inicio, 'CAMBIAR_INICIO_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $informe, null);
                } else {
                    // SE ESTABLECIÓ UNA FECHA DE INICIO
                    // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se estableció un fecha de inicio para el informe : '.$fecha_completa_inicio, $cliente, 'ESTABLECER_INICIO_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
                    SQLConnection::logTrazabilidad('Se estableció la fecha de inicio para el informe: ' . $fecha_inicio, 'ESTABLECER_INICIO_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $informe, null);
                }
            }
            //
            if ($fecha_comprometida_actual != $fecha_completa_comprometida_object) {
                if (!is_null($fecha_comprometida_actual) && $fecha_comprometida_actual != FALSE) {
                    // SE CAMBIO LA FECHA COMPROMETIDA
                    // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio la fecha comprometida del informe : '.$fecha_completa_comprometida, $cliente, 'CAMBIAR_FECHA_COMPROMETIDA_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
                    $fecha_comprometida = is_object($fecha_comprometida) ? $fecha_comprometida->format('d/m/Y H:i:s') : $fecha_comprometida;
                    SQLConnection::logTrazabilidad('Se cambió la fecha comprometida del informe: ' . $fecha_comprometida, 'CAMBIAR_FECHA_COMPROMETIDA_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $informe, null);
                } else {
                    // SE ESTABLECIÓ UNA FECHA COMPROMETIDA
                    // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se estableció un fecha comprometida para el informe : '.$fecha_completa_comprometida, $cliente, 'ESTABLECER_FECHA_COMPROMETIDA_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
                    SQLConnection::logTrazabilidad('Se estableció la fecha comprometida del informe: ' . $fecha_comprometida, 'ESTABLECER_FECHA_COMPROMETIDA_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $informe, null);
                }
            }
            //
            if ($recarga_tareas) {
                $seccion_tareas = self::tareasInforme($informe, 0)->render();
            }
            //
            return json_encode(['error' => 1, 'mensaje' => 'OK', 'cambio_equipo' => $cambio_equipo, 'nuevos_usuarios_asignados' => $nuevos_usuarios_asignados, 'nuevo_team_usuarios' => $miembros_equipo, 'seccion_tareas' => $seccion_tareas]);
        } else {
            return json_encode(['error' => 0, 'mensaje' => 'Error']);
        }
    }

    /**
     * Funcion que cambia un team
     * a un informe
     * @access private
     * @param int|string el id del team
     * @param string el nombre del team
     * @param int|string el id del informe
     * @param int|string el id del cliente
     * @param int|string el id de la contraparte
     * @param int|string el id del servicio contratado
     * @param bool si esta en true devuelve lo nuevos usuarios asignados a cada tarea
     * @return array|void
     */
    private function cambiarTeamInforme($team, $team_name, $informe, $cliente, $contraparte, $servicio_contratado, &$miembros_equipo, $devolver_nuevos_miembros = false) {
        $team_members = SQLConnection::backendStoreProcedure('LN_Teams_', array('LSTTEAMMEMBER', Session::get('usuario')->user_id, $team), 'select');
        $tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe));
        $defaults = [];
        $usuarios_activos = [];
        $usuarios_repetidos = [];
        // se obtiene los defaults del team
        foreach ($team_members as $member) {
            if ($member->activo == '1' && !in_array($member->user_id, $usuarios_repetidos)) {
                //$usuarios_activos[] = (object) ['id' => $member->user_id,'nombre' => ($member->first_name.' '.$member->last_name),'id_rol' => $member->id_rol,'nombre_rol' => $member->NOMBRE_ROL];
                $usuarios_activos[] = (object) ['id' => $member->user_id, 'nombre' => ($member->first_name . ' ' . $member->last_name)];
                $usuarios_repetidos[] = $member->user_id;
            }
            //
            if ($member->isdefault == '1' && !isset($defaults[$member->id_rol])) {
                $defaults[$member->id_rol] = (object) ['id' => $member->user_id, 'nombre' => ($member->first_name . ' ' . $member->last_name)];
            }
        }
        //
        SQLConnection::backendStoreProcedure('LN_Teams_UPD', array('UPD_TEAM_INF', $contraparte, $informe, $team, Session::get('usuario')->user_id));
        SQLConnection::logTrazabilidad('Se cambió el team asignado para trabajar el informe a ' . strtoupper($team_name), 'CAMBIAR_TEAM_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $informe, null);
        // asignar los usuarios del nuevo equipo a las tareas
        $usuarios_nuevos = [];
        $usuario = NULL;
        foreach ($tareas as $tarea) {
            if ($tarea->estado_tarea != 'K' && $tarea->estado_tarea != 'N' && $tarea->estado_tarea != 'C' && $tarea->estado_tarea != 'F') {
                $usuario = isset($defaults[$tarea->rol_tarea]->id) ? $defaults[$tarea->rol_tarea]->id : null;
                if (isset($defaults[$tarea->rol_tarea]) && $usuario != $tarea->tarea_usuario_asignado) {
                    self::actualizarDatosTarea($cliente, $tarea->contraparte, $tarea->tarea, $tarea->estado_tarea, $tarea->idTarea, $tarea->dedicacion, $tarea->ingresado_por, $usuario, $tarea->fecha_comprometidaTAR, $tarea->fecha_inicio, $informe);
                    $usuarios_nuevos[] = (object) ['tarea' => $tarea->tarea, 'nuevo_usuario' => $defaults[$tarea->rol_tarea]->id];
                    SQLConnection::logTrazabilidad('Se asignó la tarea ' . $tarea->nombre_tipo_tarea . ' al usuario ' . $defaults[$tarea->rol_tarea]->nombre, 'ASIGNAR_INFORME_TAREA', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $tarea->servicio_contratado, $cliente, $tarea->contraparte, null, null, null, null, null, $informe, null);
                }
            }
        }
        //
        if ($devolver_nuevos_miembros) {
            $miembros_equipo = $usuarios_activos;
            return $usuarios_nuevos;
        }
    }

    // FUNCIÓN QUE AGREGA NOTA DE CONTRAPARTE Y RECHAZA DOCS
    public static function addNotaYRechazoDocs() {
        if (isset($_POST['informe']) && isset($_POST['contraparte'])) {
            $user_id = Session::get('usuario')->user_id;
            $informe = Request::input('informe');
            $contraparte = Request::input('contraparte');
            $cliente = Request::input('cliente');
            $gestion = Request::input('gestion');
            $nota_contraparte = Request::input('notas_contraparte');
            $docs_rechazados = Request::input('docs_rechazados');
            $servicio_contratado = Request::input('servicio_contratado');
            // CAMBIA ESTADOS DE LOS DOCS DE CARGA A RECHAZADO
            if (!empty($docs_rechazados)) {
                $docs_rechazados = explode(',', $docs_rechazados);
                foreach ($docs_rechazados as $doc_id) {
                    $temp = SQLConnection::backendStoreProcedure('LN_docs_', array('RECHAZADO', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, null, $user_id), 'selectOne');
                }
            }
            //
            // $tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe',array('TAREAS_TIPODOC',NULL,$informe));
            // foreach ($tareas as $tarea){
            //     self::actualizarEstadoTarea($tarea->tarea,'W',$tarea->nombre_tarea,'En espera',$cliente,$contraparte,$servicio_contratado,$tarea->idTarea);
            // }
            //
            $fecha = new DateTime('now', new \DateTimeZone('UTC'));
            //
            $nombre = ((isset(Session::get('usuario')->aliasname)) ? (Session::get('usuario')->aliasname) : (Session::get('usuario')->first_name . ' ' . Session::get('usuario')->last_name));
            //
            $nota_contraparte = '[' . $nombre . '-' . $fecha->format('Y-m-d H:i') . ']: ' . $nota_contraparte;
            //
            SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_INFORME_OBS', $contraparte, $informe, $user_id, NULL, NULL, null, null, null, null, NULL, null, null, NULL, NULL, null, NULL, NULL, null, null, $nota_contraparte), 'selectOne');
            // SQLConnection::logTrazabilidad('El Informe fue Observado','OBS_IV',Session::get('webdata')['id_menu_plataforma'],$user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,NULL,NULL);
            //
            return Response::JSON(['error' => 0, 'mensaje' => 'OK', 'nota' => $nota_contraparte]);
        }
        //
        return Response::JSON(['error' => 1, 'mensaje' => 'No se grabo el comentario']);
    }

    // FUNCIÓN QUE AGREGA RESPUESTA A LOS TICKETS EMITIDOS POR EL CLIENTE
    public static function addTicket() {
        if (!empty($_POST['msg']) && !empty($_POST['informe'])) {
            $contraparte = Request::input('contraparte');
            $gestion = Request::input('gestion');
            $informe = Request::input('informe');
            $cliente = Request::input('cliente');
            $msg = Request::input('msg');

            $wsp = SQLConnection::backendStoreProcedure('LN_tickets_', array('ADDTICKET', $contraparte, $gestion, Session::get('webdata')['servicio_contratado'], $cliente, Session::get('usuario')->user_id, $msg, 'B'));

            return $informe;

        } else {
            return 0;
        }
    }

    /**
     * Funcion que publica o
     * despublica un informe
     * @access public
     * @static
     * @return string
     */
    public static function informeVisible() {
        if (isset($_POST['contraparte'])) {
            $contraparte = Request::input('contraparte');
            $visible = (!is_null(Request::input('publicarInforme'))) ? true : false;
            $busqueda = SQLConnection::backendStoreProcedure('IV_busquedas_', array('search', NULL, $contraparte), 'selectOne');
            //
            if (!is_null($busqueda)) {
                if ($visible && $busqueda->estado_informe == 'K') {
                    $temp = SQLConnection::backendStoreProcedure('IV_busquedas_', array('publicar_inquiro', NULL, $contraparte, NULL, Session::get('usuario')->user_id), 'selectOne');
                    SQLConnection::backendStoreProcedure('LN_contrapartes_queue_', array('insert', NULL, $contraparte), 'selectOne');
                    // 
                    SQLConnection::logTrazabilidad('Se publicó informe de la contraparte ' . $busqueda->nombre_persona . '(' . $contraparte . ') del cliente ' . $busqueda->nombre_cliente, 'PUBLISH_IV_REPORT', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, Session::get('webdata')['servicio_contratado'], $busqueda->cliente, $contraparte);
                    return Response::JSON(['error' => 0, 'mensaje' => 'OK.', 'visible' => 1]);
                } elseif (!$visible) {
                    $temp = SQLConnection::backendStoreProcedure('IV_busquedas_', array('despublicar_inquiro', NULL, $contraparte, NULL, Session::get('usuario')->user_id), 'selectOne');
                    SQLConnection::backendStoreProcedure('LN_contrapartes_queue_', array('insert', NULL, $contraparte), 'selectOne');
                    // 
                    SQLConnection::logTrazabilidad('Se despublicó informe de la contraparte ' . $busqueda->nombre_persona . '(' . $contraparte . ') del cliente ' . $busqueda->nombre_cliente, 'UNPUBLISH_IV_REPORT', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, Session::get('webdata')['servicio_contratado'], $busqueda->cliente, $contraparte);
                    return Response::JSON(['error' => 0, 'mensaje' => 'OK.', 'visible' => 0]);
                } else {
                    return Response::JSON(['error' => 1, 'mensaje' => 'Error.']);
                }
            }
            return Response::JSON(['error' => 1, 'mensaje' => 'Error.']);
        } else {
            return Response::JSON(['error' => 1, 'mensaje' => 'Error.']);
        }
    }

    ///////////////////////////////
    ///// TAREAS DEL INFORME //////
    ///////////////////////////////

    // FUNCION QUE DEVUELVE LOS DATOS DE LA TAREA DEL INFORME
    public static function editarTarea() {
        // $time_start = microtime(true);
        if (isset($_POST['informe']) && isset($_POST['tarea'])) {
            $informe = Request::input('informe');
            $tarea = Request::input('tarea');
            $user_id = Session::get('usuario')->user_id;
            //--
            //$datos_tarea = SQLConnection::backendStoreProcedure('IV_panel_reports',array('tarea_by_id',$user_id,null,null,null,$tarea),'selectOne');
            $datos_tarea = self::datosTarea($tarea);
            //
/* VV 
            $docs_cliente = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $datos_tarea->contraparte, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 'C'));
            //
            $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', Session::get('usuario')->user_id, null, null, null, $informe), 'selectOne');
            $seccion_archivos = null;
            if (!is_null($datos_informe) || !empty($datos_informe)) {
                $seccion_archivos_tareas = self::archivosInformeTarea($datos_informe->contraparte, $informe);
            }
            $solicitantes = SQLConnection::backendStoreProcedure('LN_demo_', array('usuarios_solicitantes', null, $datos_informe->cliente), 'select');
*/
	    $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', Session::get('usuario')->user_id, null, null, null, $informe), 'selectOne');
	    // Lazy load: docs_cliente, archivos y solicitantes se cargan bajo demanda via AJAX
	    $docs_cliente = [];
	    $seccion_archivos_tareas = '';
	    $solicitantes = [];   


            // $time_end = microtime(true);
            // $time = $time_end - $time_start;
            // $datos_tarea = $datos_tarea[0];
            // EN CASO DE PEDIRLO DESDE TAREAS A APROBAR
            if (isset($_POST['aprobar']) && $_POST['aprobar'] == '1') {
                return view('/informes-blue/edicion-tarea-aprobar')->with(compact('datos_tarea', 'tarea', 'docs_cliente'));
            }
            $id_tipo_informe = $datos_informe->id_tipo_informe;
            //

            return view('/informes-blue/edicion-tarea')->with(compact('datos_tarea', 'tarea', 'docs_cliente', 'seccion_archivos_tareas', 'id_tipo_informe', 'solicitantes', 'datos_informe'));
        } else {
            return 0;
        }
    }


	 /**
	     * Lazy load: Documentos del cliente (solo cuando se necesite observar/rechazar)
	     */
	    public static function editarTareaLazyDocs() {
	        $contraparte = Request::input('contraparte');
	        if (empty($contraparte)) return Response::JSON(['error' => 1]);
	        $docs_cliente = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 'C'));
	        return Response::JSON(['error' => 0, 'docs' => $docs_cliente]);
	    }

	    /**
	     * Lazy load: Archivos del informe (solo cuando se abre el collapse)
	     */
	    public static function editarTareaLazyArchivos() {
	        $contraparte = Request::input('contraparte');
	        $informe = Request::input('informe');
	        if (empty($contraparte) || empty($informe)) return 0;
	        return self::archivosInformeTarea($contraparte, $informe);
	    }

	    /**
	     * Lazy load: Solicitantes (solo para tareas tipo E)
	     */
	    public static function editarTareaLazySolicitantes() {
	        $cliente = Request::input('cliente');
	        if (empty($cliente)) return Response::JSON(['error' => 1]);
	        $solicitantes = SQLConnection::backendStoreProcedure('LN_demo_', array('usuarios_solicitantes', null, $cliente), 'select');
	        return Response::JSON(['error' => 0, 'solicitantes' => $solicitantes]);
	    }
    /**
     * FUNCION QUE DEVUELE LA VISTA DE CARGA DE ARCHIVOS RELACIONADOS AL INFORME
     */
    public static function archivosInformeTarea($contraparte, $informe) {
        $archivos = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('list_archivos', $contraparte, $informe, NULL));
        //
        foreach ($archivos as $archivo) {
            $archivo->ruta = env('RUTA_ARCHIVOS_INFORMES') . '/' . $informe . '/' . $archivo->path_archivo;
        }
        //
        return view('/informes-blue/archivos-informe-tarea')->with(compact('archivos'));
    }

    // FUNCION QUE DEVUELVE LAS TAREAS DEL INFORME PARA SER ASIGNADAS
    public static function tareasInforme($informe, $desde_modal_actividad = 0, $users = null, $datos_informe = null, $sin_contraparte = false) {
        // if ($sin_contraparte){
        if (is_null($datos_informe)) {
            $datos_informe = (!is_null($datos_informe)) ? $datos_informe : SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', Session::get('usuario')->user_id, null, null, null, $informe), 'selectOne');
        }
        // } else {
        //     $datos_informe = (!is_null($datos_informe)) ? $datos_informe : SQLConnection::backendStoreProcedure('IV_panel_reports',array('informe_by_id',Session::get('usuario')->user_id,null,null,null,$informe),'selectOne');
        // }
        $team = $datos_informe->idTeam;
        //
        $deshabilito_acciones = FALSE;
        if ($datos_informe->codigo_estado_informe == 'N' || $datos_informe->codigo_estado_informe == 'C' || $datos_informe->codigo_estado_informe == 'K') {
            $deshabilito_acciones = TRUE;
        }
        // dd($informe,$datos_informe,Session::get('usuario')->user_id);
        $tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe));
        // dd($tareas);
        /* if ($sin_contraparte) {
            $tareas = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('TAREAS_INFORME',$informe));
            // dd($tareas,$informe);
        } else {
            $tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe',array('tareas_informe',NULL,$informe));            
        } */
        //$users = !is_null($users) ? $users : SQLConnection::backendStoreProcedure('LN_Blue',array('USERS_BACK',NULL,NULL,NULL));
        $users = !is_null($users) ? $users : SQLConnection::backendStoreProcedure('LN_Blue', array('USERS_BACK', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, env('PLATAFORMA')));
        //
        $usuarios_filtrados = self::filtrarUsuarios($users, $team); // se filtran los usuarios para se sepa cual es del team y cual es no
        // SE FORMATEA LAS FECHAS DE LAS TAREAS
        foreach ($tareas as $tarea) {
            /* if ( $tarea->tarea == '100566628' ){
                $tarea->tarea_padre = '100566627';
                $tarea->estadoTareaPadre = 'K';
            } */
            // $tarea->estadoTareaPadre = 'K';
            // ACTUALIZA LA PRIMERA TAREA EN READY TO START SI NO ESTÁ HABILITADO
            if ($tarea->ordTarea == 1 && $tarea->ready_to_start == 0) {
                $hoy = new DateTime();
                $inicio = new DateTime($datos_informe->inicio_informe);
                if ($inicio <= $hoy) {
                    SQLConnection::backendStoreProcedure('IV_ready2start', array('READY2START', $tarea->contraparte, $tarea->tarea, Session::get('usuario')->user_id, $tarea->servicio_contratado, $datos_informe->cliente));
                }
            }
            $tarea->objeto_fecha_inicio = NULL;
            $tarea->objeto_fecha_comprometida = NULL;
            //
            if (!is_null($tarea->fecha_inicio)) {
                $tarea->objeto_fecha_inicio = date_create_from_format('Y-m-d H:i:s', $tarea->fecha_inicio);
            }
            //
            if (isset($tarea->fecha_comprometidaTAR) && !is_null($tarea->fecha_comprometidaTAR)) {
                $tarea->objeto_fecha_comprometida = date_create_from_format('Y-m-d H:i:s', $tarea->fecha_comprometidaTAR);
            } elseif (isset($tarea->fecha_comprometida) && !is_null($tarea->fecha_comprometida)) {
                $tarea->objeto_fecha_comprometida = date_create_from_format('Y-m-d H:i:s', $tarea->fecha_comprometida);
            }
        }
        //
        // --Modificado 12/05/2023--
        //$feriados = SQLConnection::backendStoreProcedure('IVferiados',array('LIST_FERIADOS')); // obtenemos los feriados nacionales
        $feriados = SQLConnection::backendStoreProcedure('LN_feriados', array('FERIADOS_INFORME', 'AR', NULL, NULL));
        //--------------------------
        $feriados = json_encode($feriados);
        //

        // $tareas = SQLConnection::backendStoreProcedure('IV_panel_reports',array('informe_by_id',Session::get('usuario')->user_id,null,null,null,$informe),'selectOne');
        // dd($tareas);

        if ($desde_modal_actividad) {
            return '<div id="seccion-tareas-informe">' . view('/informes-blue/tareas-informe')->with(compact('tareas', 'usuarios_filtrados', 'datos_informe', 'feriados', 'deshabilito_acciones')) . '</div>';
        } else {
            // $vista = !$sin_contraparte ? '/informes-blue/tareas-informe' : '/informes-blue/tareas-informe-sc' ;
            return view('/informes-blue/tareas-informe')->with(compact('tareas', 'usuarios_filtrados', 'datos_informe', 'feriados', 'deshabilito_acciones'));
        }
    }

    // FUNCION QUE ACTUALIZA LAS TAREAS DEL INFORME DESDE EL MODAL.
    # Se modifica la funcion para que el estado de la tarea finalizado, sea el aprobado
    # esto es para evitar el doble paso de finalizar y despues aprobar la tarea -TB 27062024
    public static function modalActualizarTareasInforme() {
        $user_id = Session::get('usuario')->user_id;
        $estado = Request::input('estado_tarea');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $contraparte = Request::input('contraparte');
        $informe = Request::input('informe');
        $tarea = Request::input('tarea');
        $servicio_contratado = Request::input('servicio_contratado');
        $nombre_tarea = Request::input('nombre_tarea');
        $nombre_estado = Request::input('nombre_estado');
        //
        $id_tipo_tarea = Request::input('id_tipo_tarea');
        $tipo_actividad = Request::input('tipo_tarea');
        $orden_tarea = Request::input('orden');

        $todas_tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe));
        $ultima_tarea = end($todas_tareas)->ordTarea;
        //
        $tipo_doc = Request::input('tipo_doc');
        $integ_carga = Request::input('integridad_carga');
        $integ_verif = Request::input('integridad_verif');
        $integ_rech = Request::input('integridad_rech');
        //
        if ($tipo_actividad != 'E') {
            if ($estado == 'F') {
                $estado = 'K';
                $nombre_estado = 'Aprobado';
            }
        }
        //       
        $tareas_dependientes = self::actualizarEstadoTarea($tarea, $estado, $nombre_tarea, $nombre_estado, $cliente, $contraparte, $servicio_contratado, $id_tipo_tarea);
        // 
        //en caso que la tarea se aprueba , se solicita abrir las tareas que dependen de su cierre

        #Se saltea el paso de finalizar y aprobar la tarea, para solamente cerrar la tarea con el finalizar
        #Esto es para las tareas que no son de carga de documentacion - TB                       
        $es_aprobada = ($estado == 'K');
        if ($es_aprobada || $estado == 'N') {
            if ($orden_tarea == 1 && $id_tipo_tarea != '4071729') {
                // Recalculo de fechas de inicio y comprometida de tareas
                $inicio_tarea = date('Y-m-d H:i:s');
                $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($inicio_tarea)));
                $comprometida_tarea = date('Y-m-d H:i:s');
                foreach ($todas_tareas as $k => $tar) {
                    if ($tar->ordTarea == 1) {
                        continue;
                    }
                    $comprometida_tarea = date('Y-m-d H:i:s', strtotime('+ ' . strval($tar->duracion) . ' minutes', strtotime($comprometida_tarea)));
                    SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_INICIO_TAREA', $contraparte, $tar->tarea, $user_id, NULL, NULL, null, null, null, null, NULL, null, null, NULL, NULL, $comprometida_tarea, NULL, NULL, NULL, $inicio_tarea));
                    // SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_TAREA2',$contraparte,$tarea,$user_id,NULL,NULL,$id_tipo_tarea,$prioridad,$estado,$ingresado_por,NULL,$usuario_asignado,$cliente,NULL,NULL,$fecha_comprometida,NULL,NULL,NULL,$fecha_inicio));
                    $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ ' . strval($tar->duracion) . ' minutes', strtotime($inicio_tarea)));
                    $comprometida_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($comprometida_tarea)));

                }
            }
            //
            if ($tipo_doc > 0) {
                self::evaluarVerificarDocTarea($cliente, $contraparte, $gestion, $tipo_doc, $integ_carga, $integ_verif, $integ_rech);
            }
            // Para tareas de DAGA (interna o externa)
            if ($es_aprobada) {
                self::grabarKPIDAGA($tipo_actividad, $contraparte, $gestion, $informe, $cliente, $servicio_contratado);
            }
        } elseif ($estado == 'E') {
            // Si esta en proceso se verifica que el documento este ingresado para que pueda ser cargado
            if ($tipo_doc > 0) {
                self::ingresarDocTarea($cliente, $contraparte, $gestion, $tipo_doc);
            }
        }
        self::evaluarTareaDependencias($tareas_dependientes, $contraparte, $servicio_contratado, $cliente, $estado, $todas_tareas, $tarea);
        //-- SE EVAULA SI SE TIENE QUE CAMBIAR EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA
        $temp = self::cambiarEstadoInformePorEstadoTarea($informe, $tarea, $id_tipo_tarea, $tipo_actividad, $estado, null, null, $orden_tarea, $ultima_tarea);
        // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio el estado de la tarea '.$nombre_tarea.' a '.$nombre_estado, $cliente, 'CAMBIAR_ESTADO_TAREA','IV_BACK',$contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
        //--
if ($ultima_tarea == $orden_tarea && $estado == 'K') {
            $idTer = SQLConnection::backendStoreProcedure('LN_informe_terceros', array('GET_REFTERCERO', $informe), 'selectOne');
            if (!is_null($idTer->informeid_terceros)) {
                (new ActividadesTaskController())->finDCLInquiro($idTer->informeid_terceros, $informe);
            }
        }
        if ($temp != 2) {
            return self::editarTarea();
        }
        return 1;
    }

    // FUNCION QUE ACTUALIZA LAS TAREAS DEL INFORME DESDE EL MODAL.
    public static function modalActualizarTareasInformebkp_27062024() {
        $user_id = Session::get('usuario')->user_id;
        $estado = Request::input('estado_tarea');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $contraparte = Request::input('contraparte');
        $informe = Request::input('informe');
        $tarea = Request::input('tarea');
        $servicio_contratado = Request::input('servicio_contratado');
        $nombre_tarea = Request::input('nombre_tarea');
        $nombre_estado = Request::input('nombre_estado');
        //
        $id_tipo_tarea = Request::input('id_tipo_tarea');
        $tipo_actividad = Request::input('tipo_tarea');
        $orden_tarea = Request::input('orden');

        $todas_tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe));
        $ultima_tarea = end($todas_tareas)->ordTarea;
        //
        $tipo_doc = Request::input('tipo_doc');
        $integ_carga = Request::input('integridad_carga');
        $integ_verif = Request::input('integridad_verif');
        $integ_rech = Request::input('integridad_rech');
        //
        $tareas_dependientes = self::actualizarEstadoTarea($tarea, $estado, $nombre_tarea, $nombre_estado, $cliente, $contraparte, $servicio_contratado, $id_tipo_tarea);
        // 
        // en caso que la tarea se aprueba , se solicita abrir las tareas que dependen de su cierre
        $es_aprobada = ($estado == 'K');
        if ($es_aprobada || $estado == 'N') {
            if ($orden_tarea == 1 && $id_tipo_tarea != '4071729') {
                // Recalculo de fechas de inicio y comprometida de tareas
                $inicio_tarea = date('Y-m-d H:i:s');
                $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($inicio_tarea)));
                $comprometida_tarea = date('Y-m-d H:i:s');
                foreach ($todas_tareas as $k => $tar) {
                    if ($tar->ordTarea == 1) {
                        continue;
                    }
                    $comprometida_tarea = date('Y-m-d H:i:s', strtotime('+ ' . strval($tar->duracion) . ' minutes', strtotime($comprometida_tarea)));
                    SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_INICIO_TAREA', $contraparte, $tar->tarea, $user_id, NULL, NULL, null, null, null, null, NULL, null, null, NULL, NULL, $comprometida_tarea, NULL, NULL, NULL, $inicio_tarea));
                    // SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_TAREA2',$contraparte,$tarea,$user_id,NULL,NULL,$id_tipo_tarea,$prioridad,$estado,$ingresado_por,NULL,$usuario_asignado,$cliente,NULL,NULL,$fecha_comprometida,NULL,NULL,NULL,$fecha_inicio));
                    $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ ' . strval($tar->duracion) . ' minutes', strtotime($inicio_tarea)));
                    $comprometida_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($comprometida_tarea)));

                }
            }
            //
            if ($tipo_doc > 0) {
                self::evaluarVerificarDocTarea($cliente, $contraparte, $gestion, $tipo_doc, $integ_carga, $integ_verif, $integ_rech);
            }
            // Para tareas de DAGA (interna o externa)
            if ($es_aprobada) {
                self::grabarKPIDAGA($tipo_actividad, $contraparte, $gestion, $informe, $cliente, $servicio_contratado);
            }
        } elseif ($estado == 'E') {
            // Si esta en proceso se verifica que el documento este ingresado para que pueda ser cargado
            if ($tipo_doc > 0) {
                self::ingresarDocTarea($cliente, $contraparte, $gestion, $tipo_doc);
            }
        }
        self::evaluarTareaDependencias($tareas_dependientes, $contraparte, $servicio_contratado, $cliente, $estado, $todas_tareas, $tarea);
        //-- SE EVAULA SI SE TIENE QUE CAMBIAR EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA
        $temp = self::cambiarEstadoInformePorEstadoTarea($informe, $tarea, $id_tipo_tarea, $tipo_actividad, $estado, null, null, $orden_tarea, $ultima_tarea);
        // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio el estado de la tarea '.$nombre_tarea.' a '.$nombre_estado, $cliente, 'CAMBIAR_ESTADO_TAREA','IV_BACK',$contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
        //--
        if ($temp != 2) {
            return self::editarTarea();
        }
        return 1;
    }

    // FUNCION QUE ACTUALIZA LAS TAREAS DEL INFORME DESDE EL MODAL.
    // public static function modalActualizarTareasInformeOrg(){
    //     $user_id = Session::get('usuario')->user_id;
    //     $estado = Request::input('estado_tarea');
    //     $cliente = Request::input('cliente');
    //     $gestion = Request::input('gestion');
    //     $contraparte = Request::input('contraparte');
    //     $informe = Request::input('informe');
    //     $tarea = Request::input('tarea');
    //     $servicio_contratado = Request::input('servicio_contratado');
    //     $nombre_tarea = Request::input('nombre_tarea');
    //     $nombre_estado = Request::input('nombre_estado');
    //     //
    //     $tipo_doc = Request::input('tipo_doc');
    //     $integ_carga = Request::input('integridad_carga');
    //     $integ_verif = Request::input('integridad_verif');
    //     $integ_rech = Request::input('integridad_rech');
    //     //--
    //     //$datos_tarea = SQLConnection::backendStoreProcedure('IV_panel_reports',array('tarea_by_id',$user_id,null,null,null,$tarea),'selectOne');
    //     //$datos_tarea = self::datosTarea($tarea);
    //     //$tareas_dependientes = self::actualizarDatosTarea($contraparte,$tarea,$estado,$datos_tarea->idTipoTarea,$datos_tarea->tarea_prioridad,$datos_tarea->ingresado_por,$datos_tarea->userIDAsigandoTarea,$datos_tarea->fecha_comprometida_tarea,$datos_tarea->inicio_tarea);
    //     $tareas_dependientes = self::actualizarEstadoTarea($tarea,$estado,$nombre_tarea,$nombre_estado,$cliente,$contraparte,$servicio_contratado);
    //     //
    //     /*$tareas_dependientes = SQLConnection::backendStoreProcedure('LN_Blue_UPD',array('UPD_TAREA2',$contraparte,$tarea,
    //     $user_id,NULL,NULL,$datos_tarea->idTipoTarea,$datos_tarea->tarea_prioridad,$estado,$datos_tarea->ingresado_por,NULL,$datos_tarea->userIDAsigandoTarea,$datos_tarea->cliente,NULL,NULL,$datos_tarea->fecha_comprometida_tarea,NULL,NULL,NULL,$datos_tarea->inicio_tarea));*/
    //     //-- SI SE APRUEBA LA TAREA Y TIENE DOCUMENTO SE VERIFICA EL DOCUMENTO
    //     /* if ( $estado == 'K' ){
    //         self::evaluarTareaDependencias($tareas_dependientes,$contraparte,$servicio_contratado,$cliente);
    //         //
    //         if ( $datos_tarea->id_tip_doc_dependiente > 0 ){
    //             $datos_doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion',null,$datos_tarea->cliente,$contraparte,$datos_tarea->id_tip_doc_dependiente,null,null,null,null,null,null,null,null,null,null,$datos_tarea->gestion,$user_id,null,null), 'selectOne');
    //             //
    //             if ( !is_null($datos_doc) ){
    //                 self::verificarDoc($datos_doc->doc_id,$datos_tarea->integ_carga,$datos_tarea->integ_verif,$datos_tarea->integ_rech);
    //             }
    //         }
    //     } */
    //     // en caso que la tarea se aprueba , se solicita abrir las tareas que dependen de su cierre
    //     if ( $estado == 'K' ){
    //         self::evaluarTareaDependencias($tareas_dependientes,$contraparte,$servicio_contratado,$cliente);
    //         //
    //         if ( $tipo_doc > 0 ){
    //             self::evaluarVerificarDocTarea($cliente,$contraparte,$gestion,$tipo_doc,$integ_carga,$integ_verif,$integ_rech);
    //         }
    //     }
    //     //-- SE EVAULA SI SE TIENE QUE CAMBIAR EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA
    //     $temp = self::cambiarEstadoInformePorEstadoTarea($informe,$tarea);
    //     //
    //     // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio el estado de la tarea '.$nombre_tarea.' a '.$nombre_estado, $cliente, 'CAMBIAR_ESTADO_TAREA','IV_BACK',$contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
    //     //--
    //     if ($temp != 2) {
    //         return self::editarTarea();
    //     }
    //     return 1;
    // }

    // FUNCION QUE ACTUALIZA LAS TAREAS DEL INFORME
    public static function actualizarTareasInforme() {
        $informe = Request::input('informe');
        if (isset($_POST['informe']) && isset($_POST['contraparte']) && (!empty($_POST['tarea']) || !empty($_POST['_tareas']))) {
            $user_id = Session::get('usuario')->user_id;
            // $informe = Request::input('informe');
            $cliente = Request::input('cliente');
            $contraparte = Request::input('contraparte');
            $servicio_contratado = Request::input('servicio_contratado');
            $tarea = (empty(Request::input('tarea'))) ? NULL : Request::input('tarea');
            $todas_tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe));
            $ultima_tarea = end($todas_tareas)->ordTarea;
            //
            $tareas = (!empty($tarea)) ? [$tarea] : Request::input('_tareas');
            foreach ($tareas as $tr) {
                $fecha_inicio_actual = (!empty(Request::input('fecha_actual_tarea_inicio_' . $tr))) ? date_create_from_format('Y-m-d H:i:s', Request::input('fecha_actual_tarea_inicio_' . $tr)) : NULL;
                if (!is_null($fecha_inicio_actual)) {
                    $fecha_inicio_actual = $fecha_inicio_actual->setTime($fecha_inicio_actual->format('H'), $fecha_inicio_actual->format('i'), 0);
                }
                // $fecha_comprometida_actual = ( !is_null($tr->fecha_comprometidaTAR) ) ? date_create_from_format('Y-m-d H:i:s',$tr->fecha_comprometidaTAR) : NULL;
                $fecha_comprometida_actual = (!empty(Request::input('fecha_actual_tarea_comprometida_' . $tr))) ? date_create_from_format('Y-m-d H:i:s', Request::input('fecha_actual_tarea_comprometida_' . $tr)) : NULL;
                if ($fecha_comprometida_actual && !is_null($fecha_comprometida_actual)) {
                    $fecha_comprometida_actual->setTime($fecha_comprometida_actual->format('H'), $fecha_comprometida_actual->format('i'), 0);
                }
                // SI LA TAREA NO ESTA LISTA PARA INICIAR NO SE LE PUEDE CAMBIAR EL ESTADO
                $estado = Request::input('estado_tarea_' . $tr);
                $nombre_estado = Request::input('nombre_estado_' . $tr);
                $estado_actual = Request::input('estado_tarea_actual_' . $tr);
                //
                $usuario = Request::input('usuario_tarea_' . $tr);
                $usuario_actual = Request::input('usuario_actual_tarea_' . $tr);
                $tarea_usuario_asignado = Request::input('tarea_usuario_asignado_' . $tr);
                $nombre_usuario = Request::input('nombre_usuario_tarea_' . $tr);
                $fecha_inicio = Request::input('fecha_tarea_completa_inicio_' . $tr);
                $fecha_comprometida = Request::input('fecha_tarea_completa_comprometida_' . $tr);
                $dedicacion = Request::input('dedicacion_tareas_informe_' . $tr);
                $dedicacion_actual = Request::input('dedicacion_actual_tarea_' . $tr);
                $tipo_tarea = Request::input('tipo_tarea_' . $tr);
                $ingresado_por = Request::input('ingresado_por_' . $tr);
                $tipo_doc_dependiente = Request::input('tipo_doc_dependiente_' . $tr);
                $gestion = Request::input('gestion_' . $tr);
                $intregidad_carga = Request::input('intregidad_carga_' . $tr);
                $integridad_verificado = Request::input('integridad_verificado_' . $tr);
                $integridad_rechazado = Request::input('integridad_rechazado_' . $tr);
                $nombre_tipo_tarea = Request::input('nombre_tipo_tarea_' . $tr);
                $tipo_actividad = Request::input('tipo_actividad_' . $tr);
                $orden = Request::input('orden_' . $tr);
                //
                $fecha_completa_inicio = NULL;
                $fecha_completa_comprometida = NULL;
                $fecha_completa_inicio_object = NULL;
                $fecha_completa_comprometida_object = NULL;
                if (!is_null($fecha_inicio) && !empty($fecha_inicio)) {
                    $fecha_completa_inicio_object = date_create_from_format('d/m/Y H:i', $fecha_inicio);
                    $fecha_completa_inicio_object->setTime($fecha_completa_inicio_object->format('H'), $fecha_completa_inicio_object->format('i'), 0);
                    $fecha_completa_inicio = $fecha_completa_inicio_object->format('Y-m-d H:i:s');
                }
                if (!is_null($fecha_comprometida) && !empty($fecha_comprometida)) {
                    $fecha_completa_comprometida_object = date_create_from_format('d/m/Y H:i', $fecha_comprometida);
                    $fecha_completa_comprometida_object->setTime($fecha_completa_comprometida_object->format('H'), $fecha_completa_comprometida_object->format('i'), 0);
                    $fecha_completa_comprometida = $fecha_completa_comprometida_object->format('Y-m-d H:i:s');
                }
                //
                $tareas_dependientes = self::actualizarDatosTarea($cliente, $contraparte, $tr, $estado, $tipo_tarea, $dedicacion, $ingresado_por, $usuario, $fecha_completa_comprometida, $fecha_completa_inicio, $informe);
                // en caso que la tarea se aprueba , se solicita abrir las tareas que dependen de su cierre
                $es_aprobada = ($estado == 'K');
                $es_iniciada = ($estado == 'E' && $estado_actual != 'E');
                if ($es_aprobada || $estado == 'N') {
                    if ($tipo_doc_dependiente > 0) {
                        self::evaluarVerificarDocTarea($cliente, $contraparte, $gestion, $tipo_doc_dependiente, $intregidad_carga, $integridad_verificado, $integridad_rechazado);
                    }
                    if ($es_aprobada) {
                        self::grabarKPIDAGA($tipo_actividad, $contraparte, $gestion, $informe, $cliente, $servicio_contratado);
                    }
                    /* $datos_doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion',null,$cliente,$contraparte,$tipo_doc_dependiente,null,null,null,null,null,null,null,null,null,null,$gestion,$user_id,null,null), 'selectOne');
                    if ( !is_null($datos_doc) ){
                        self::verificarDoc($datos_doc->doc_id,$intregidad_carga,$integridad_verificado,$integridad_rechazado);
                    } */
                    Misc::calcularTATTarea($contraparte, $tr);
                } elseif ($es_iniciada) {
                    self::marcarTareaIniciada($tr);
                    if ($tipo_doc_dependiente > 0) {
                        self::ingresarDocTarea($cliente, $contraparte, $gestion, $tipo_doc_dependiente);
                    }
                }
                if ($estado == 'K' || $estado == 'N' || $estado == 'E' || $estado == 'A') {
                    $una_tar = count($tareas) > 1 ? false : true;
                    self::evaluarTareaDependencias($tareas_dependientes, $contraparte, $servicio_contratado, $cliente, $estado, $todas_tareas, $tr, $una_tar);
                }
                //
                if (($tipo_actividad == 'E' || $orden == '1' || $tipo_actividad == 'I' || $ultima_tarea == $orden) && $tareas_dependientes != 'error') {
                    // dd($tr,$fecha_inicio,$fecha_completa_inicio);
                    // SE EVAULA SI SE TIENE QUE CAMBIAR EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA
                    self::cambiarEstadoInformePorEstadoTarea($informe, $tr, $tipo_tarea, $tipo_actividad, $estado, $fecha_completa_inicio, null, $orden, $ultima_tarea);
                }
if ($ultima_tarea == $orden && $estado == 'K') {
                    $idTer = SQLConnection::backendStoreProcedure('LN_informe_terceros', array('GET_REFTERCERO', $informe), 'selectOne');
                    if (!is_null($idTer->informeid_terceros)) {
                        (new ActividadesTaskController())->finDCLInquiro($idTer->informeid_terceros, $informe);
                    }
                }



                // SE ARMAN COMPARACION PARA GUARDAR TRAZABILIDAD
                if ($estado_actual != $estado) {
                    $tipo_accion_tarea = NULL;
                    if ($estado == 'E') {
                        $tipo_accion_tarea = 'I';
                    } elseif ($estado == 'K') {
                        $tipo_accion_tarea = 'F';
                    }
                    //
                    if ($estado == 'E' || $estado == 'P') {
                        SQLConnection::logTrazabilidad('Se inicio la tarea ' . $nombre_tipo_tarea, 'INICIAR_TAREA', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL, $tr);
                    } elseif ($estado == 'N') {
                        SQLConnection::logTrazabilidad('Se anulo la tarea ' . $nombre_tipo_tarea, 'ANULAR_TAREA', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL, $tr);
                    } elseif ($estado == 'K') {
                        SQLConnection::logTrazabilidad('Se aprobo la tarea ' . $nombre_tipo_tarea, 'FIN_TAREA', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL, $tr);
                    } elseif ($estado == 'W') {
                        SQLConnection::logTrazabilidad('Se puso en Espera la tarea ' . $nombre_tipo_tarea, 'ESPERA_TAREA', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL, $tr);
                    }
                    //
                    $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió el estado de la tarea ' . $nombre_tipo_tarea . ' a ' . $nombre_estado, $cliente, 'CAMBIAR_ESTADO_TAREA', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado, NULL, NULL, NULL, NULL, $tr, $tipo_tarea), 'selectOne');
                }
                //
                if ($dedicacion_actual != $dedicacion) {
                    $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la prioridad de la tarea ' . $nombre_tipo_tarea . ' a ' . $dedicacion, $cliente, 'CAMBIAR_PRIORIDAD_TAREA', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado, NULL, NULL, NULL, NULL, $tr), 'selectOne');
                }
                //
                if ($usuario_actual != $usuario) {
                    if (!empty($usuario)) {
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se asignó la tarea ' . $nombre_tipo_tarea . ' al usuario ' . $nombre_usuario, $cliente, 'ASIGNAR_TAREA_USUARIO', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado, NULL, NULL, NULL, NULL, $tr), 'selectOne');
                    } else {
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se desasignó la tarea ' . $nombre_tipo_tarea . ' al usuario ' . $tarea_usuario_asignado, $cliente, 'DESASIGNAR_TAREA_USUARIO', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado, NULL, NULL, NULL, NULL, $tr), 'selectOne');
                    }
                }
                //
                if ($fecha_inicio_actual != $fecha_completa_inicio_object) {
                    if (!is_null($fecha_inicio_actual) && $fecha_inicio_actual != FALSE) {
                        // SE CAMBIO LA FECHA DE INICIO
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la fecha de inicio de la tarea ' . $nombre_tipo_tarea . ' : ' . $fecha_completa_inicio, $cliente, 'CAMBIAR_INICIO_TAREA', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado, NULL, NULL, NULL, NULL, $tr), 'selectOne');
                    } else {
                        // SE ESTABLECIO UNA FECHA DE INICIO
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se estableció un fecha de inicio para la tarea ' . $nombre_tipo_tarea . ' : ' . $fecha_completa_inicio, $cliente, 'ESTABLECER_INICIO_TAREA', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado, NULL, NULL, NULL, NULL, $tr), 'selectOne');
                    }
                }
                //
                if ($fecha_comprometida_actual != $fecha_completa_comprometida_object) {
                    if (!is_null($fecha_comprometida_actual) && $fecha_comprometida_actual != FALSE) {
                        // SE CAMBIO LA FECHA COMPROMETIDA
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la fecha comprometida de la tarea ' . $nombre_tipo_tarea . ' : ' . $fecha_completa_comprometida, $cliente, 'CAMBIAR_FECHA_COMPROMETIDA_TAREA', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado, NULL, NULL, NULL, NULL, $tr), 'selectOne');
                    } else {
                        // SE ESTABLECIO UNA FECHA COMPROMETIDA
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se estableció un fecha comprometida para la tarea ' . $nombre_tipo_tarea . ' : ' . $fecha_completa_comprometida, $cliente, 'ESTABLECER_FECHA_COMPROMETIDA_TAREA', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado, NULL, NULL, NULL, NULL, $tr), 'selectOne');
                    }
                    // DIEGO - POR EL MOMENTO SE DECIDIÓ QUE LA FECHA COMPORMETIDA DEL INFORME NO SE MODIFIQUE 10-10-2023
                    // if ($tipo_tarea == '9424755') {
                    //     self::cambiarEstadoInformePorEstadoTarea($informe,$tr,$tipo_tarea,$tipo_actividad,$estado,$fecha_inicio,$fecha_completa_comprometida);
                    // }
                }
            }
            return 1;
            //
            // return self::tareasInforme($informe);
        } else {
            return self::tareasInforme($informe);
        }
    }

    /**
     * Funcion que agrega la nota de
     * contraparte para el cliente
     * cuando se observa el informe
     * @access public
     * @static
     * @return string|null
     */
    public static function addNotaYRechazoDocsTarea() {
        if (isset($_POST['informe']) && isset($_POST['contraparte'])) {
            $user_id = Session::get('usuario')->user_id;
            $informe = Request::input('informe');
            $servicio_contratado = Request::input('servicio_contratado');
            $tarea = Request::input('tarea');
            $contraparte = Request::input('contraparte');
            $cliente = Request::input('cliente');
            $gestion = Request::input('gestion');
            //
            $nota_contraparte = Request::input('add_nota_contraparte');
            $docs_rechazados = Request::input('docs_rechazados');
            $estado_informe = Request::input('estado-informe');
            $codigo = 0;
            // CAMBIA ESTADOS DE LOS DOCS DE CARGA A RECHAZADO
            if (is_array($docs_rechazados)) {
                foreach ($docs_rechazados as $doc_id) {
                    $temp = SQLConnection::backendStoreProcedure('LN_docs_', array('RECHAZADO', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, null, $user_id), 'selectOne');
                }
            }
            //
            $fecha = new DateTime('now', new \DateTimeZone('UTC'));
            $nombre = ((isset(Session::get('usuario')->aliasname)) ? (Session::get('usuario')->aliasname) : (Session::get('usuario')->first_name . ' ' . Session::get('usuario')->last_name));
            $nota_contraparte = '[' . $nombre . '-' . $fecha->format('Y-m-d H:i') . ']: ' . $nota_contraparte;
            //
            SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_INFORME_OBS', $contraparte, $informe, $user_id, NULL, NULL, null, null, null, null, NULL, null, null, NULL, NULL, null, NULL, NULL, null, null, $nota_contraparte), 'selectOne');
            // Se cambia el estado del informe a OBSERVADO
            $busqueda = SQLConnection::backendStoreProcedure('IV_busquedas_', array('search', NULL, $contraparte), 'selectOne');
            $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', $user_id, null, null, null, $informe), 'selectOne');
            //
            if ($estado_informe == 'R') {
                $tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('TAREAS_TIPODOC', NULL, $informe));
                foreach ($tareas as $tarea) {
                    self::actualizarEstadoTarea($tarea->tarea, 'W', $tarea->nombre_tarea, 'En espera', $cliente, $contraparte, $servicio_contratado, $tarea->idTarea);
                }
                // observar el informe
                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_informe', $contraparte, $informe, $user_id, NULL, NULL, $datos_informe->id_tipo_informe, '5', $estado_informe, $user_id, NULL, $datos_informe->userIDAsigandoInforme, $cliente, NULL, NULL, $datos_informe->fecha_comprometida_informe, NULL, NULL, $datos_informe->idioma, $datos_informe->inicio_informe), 'selectOne');
            } else {
                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('CANCELA_INFORME', $contraparte, $informe, $user_id, NULL, NULL, $datos_informe->id_tipo_informe, '5', $estado_informe, $user_id, NULL, $datos_informe->userIDAsigandoInforme, $cliente, NULL, NULL, $datos_informe->fecha_comprometida_informe, NULL, NULL, $datos_informe->idioma, $datos_informe->inicio_informe), 'selectOne');
                SQLConnection::logTrazabilidad('Las tareas del informe fueron cerradas.', 'CERRAR_TAREAS_INFORME', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL);
                //self::verificarDocumentosInforme($contraparte);
            }
            //
            if ($cliente == '738156811' && ($estado_informe == 'R' || $estado_informe == 'C' || $estado_informe == 'N')) {
                $emails = $busqueda->notificado_emails;
                //
                $emails = str_replace(';', ',', $emails);
                $email = explode(',', $emails);
                $emailok = [];
                //
                $total = 0;
                $error = 0;
                $correctos = [];
                $errores = [];
                //
                foreach ($email as $key => $to) {
                    $to = trim($to);
                    if (filter_var($to, FILTER_VALIDATE_EMAIL)) {
                        $emailok[$key] = $to;
                        $correctos[$total] = new stdClass();
                        $correctos[$total]->contraparte = null;
                        $correctos[$total]->mail = $to;
                        $total++;
                    } else {
                        $errores[$error] = new stdClass();
                        $errores[$error]->contraparte = null;
                        $errores[$error]->mail = $to;
                        $error++;
                    }
                }
                //
                $to = $emailok;
                $codigo = 0;
                //
                if ($estado_informe == 'C') {
                    EmailController::emailHR($estado_informe, $to, $busqueda->referencia_externa, $busqueda->created_by_usuario, (Session::get('usuario')->first_name . ' ' . Session::get('usuario')->last_name));
                } else {
                    EmailController::emailHR($estado_informe, $to, $busqueda->referencia_externa, $busqueda->created_by_usuario);
                }

            }
            //
            if ($estado_informe == 'R') {
                // Observado
                SQLConnection::logTrazabilidad('El Informe fue Observado', 'OBS_IV', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL);
            } elseif ($estado_informe == 'C') {
                // Rechazado
                $codigo = 1;
                SQLConnection::logTrazabilidad('El Informe fue Rechazado', 'REJECT_IV', Session::get('webdata')['id_menu_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL);
            }
            //
            return Response::JSON(['error' => $codigo, 'mensaje' => 'OK']);
        }
    }

    /**
     * Funcion que filtra
     * la lista de usuarios
     * y devuelve una lista
     * filtrada
     * @access private
     * @static
     * @param array la lista de usuarios
     * @param string|int el id del team
     * @return array
     */
    private static function filtrarUsuarios($usuarios, $team) {
        $active_members = [];
        $team_members = SQLConnection::backendStoreProcedure('LN_Teams_', array('LSTTEAMMEMBER', Session::get('usuario')->user_id, $team), 'select');
        $filtered_users = [];
        //
        foreach ($team_members as $member) {
            if ($member->activo) {
                $active_members[] = $member->user_id;
            }
        }
        //
        foreach ($usuarios as $usuario) {
            if (in_array($usuario->user_id, $active_members)) {
                $filtered_users['miembros'][] = $usuario;
            } else {
                $filtered_users['externos'][] = $usuario;
            }
        }
        //
        return $filtered_users;
    }

    /**
     * FUNCION QUE CAMBIA EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA EN 
     * 
     * @access private
     * 
     * @param int id del informe
     * @param int id de la tarea
     * 
     * @deprecated
     * */
    private static function cambiarEstadoInformePorEstadoTareaOrg($informe, $tarea, $obj_tarea = null) {
        $user_id = Session::get('usuario')->user_id;
        if ($obj_tarea == null) {
            $datos_tarea = SQLConnection::backendStoreProcedure('IV_panel_reports', array('tarea_by_id', $user_id, null, null, null, $tarea), 'selectOne');
        } else {
            $datos_tarea = $obj_tarea;
        }
        $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', $user_id, null, null, null, $informe), 'selectOne');
        $estado = null;
        //
        if (!is_null($datos_tarea)) {
            if ($datos_tarea->tipo_actividad_tarea == 'E') {
                // SI LA TAREA ES TIPO DAGA
                if ($datos_tarea->codigo_estado_tarea == 'E' && $datos_informe->codigo_estado_informe != 'P') {
                    // SI LA TAREA ESTA EN PROCESO EL INFORME SE PONE EN GESTION
                    $estado = 'P';
                    $nombre_estado = 'En gestión';
                } elseif ($datos_tarea->codigo_estado_tarea == 'K' && $datos_informe->codigo_estado_informe != 'E') {
                    // SI LA TAREA ESTA APROBADA EL INFORME SE PONE EN PROCESO
                    $estado = 'E';
                    $nombre_estado = 'En proceso';
                } elseif ($datos_tarea->codigo_estado_tarea == 'W' && $datos_informe->codigo_estado_informe != 'W') {
                    // SI LA TAREA ESTA EN ESPERA EL INFORME SE PONE EN ESPERA
                    $estado = 'W';
                    $nombre_estado = 'En espera';
                }
                //
                if (!is_null($estado)) {
                    $actualizar = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_informe', $datos_informe->contraparte, $informe,
                        $user_id, NULL, NULL, $datos_informe->id_tipo_informe, $datos_informe->informe_prioridad, $estado, NULL, NULL, $datos_informe->userIDAsigandoInforme, $datos_informe->cliente, NULL, NULL, $datos_informe->fecha_comprometida_informe, NULL, NULL, $datos_informe->idioma, $datos_informe->inicio_informe));
                    //
                    $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió el estado del informe a ' . $nombre_estado, $datos_informe->cliente, 'CAMBIAR_ESTADO_INFORME', 'BACK', $datos_informe->contraparte, $user_id, NULL, $datos_informe->servicio_contratado), 'selectOne');
                }
            } elseif ($datos_tarea->idTipoTarea == '4071729') {
                // SI LA TAREA ES LA PRIMERA TAREA
                if ($datos_tarea->codigo_estado_tarea == 'E' && $datos_informe->codigo_estado_informe != 'E') {
                    // SI LA TAREA ESTA EN PROCESO EL INFORME SE PONE EN PROCESO
                    $estado = 'E';
                    $nombre_estado = 'En proceso';
                }
                //
                if (!is_null($estado)) {
                    $iniciado = new DateTime();

                    $actualizar = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_informe', $datos_informe->contraparte, $informe, $user_id, NULL, NULL, $datos_informe->id_tipo_informe, $datos_informe->informe_prioridad, $estado, NULL, NULL, $datos_informe->userIDAsigandoInforme, $datos_informe->cliente, NULL, NULL, $datos_informe->fecha_comprometida_informe, NULL, NULL, $datos_informe->idioma, $iniciado->format('Y-m-d H:i:s')));
                    //
                    $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió el estado del informe a ' . $nombre_estado, $datos_informe->cliente, 'CAMBIAR_ESTADO_INFORME', 'BACK', $datos_informe->contraparte, $user_id, NULL, $datos_informe->servicio_contratado), 'selectOne');
                    if ($estado == 'E') {
                        SQLConnection::logTrazabilidad('El Informe fue Iniciado', 'START_IV', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $datos_informe->servicio_contratado, $datos_informe->cliente, $datos_informe->contraparte, null, null, null, null, null, NULL, NULL);
                    }
                }
            }
            return 1;
        }
        //
        return 0;
    }

    /**
     * FUNCION QUE CAMBIA EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA EN 
     * 
     * @access private
     * @static
     * 
     * @param string id del informe
     * @param string id de la tarea
     * @param string id del tipo de tarea
     * @param string tipo de actividad de la tarea
     * @param string codigo del estado de la tarea
     * 
     * @return int
     * 
     * */
    /**
     * FUNCION QUE CAMBIA EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA EN 
     * 
     * @access private
     * @static
     * 
     * @param string id del informe
     * @param string id de la tarea
     * @param string id del tipo de tarea
     * @param string tipo de actividad de la tarea
     * @param string codigo del estado de la tarea
     * 
     * @return int
     * 
     * */
    private static function cambiarEstadoInformePorEstadoTarea($informe, $tarea, $idTipoTarea, $tipo_actividad_tarea, $codigo_estado_tarea, $inicio_tarea = NULL, $compromiso_tarea = NULL, $orden_tarea = null, $ultima_tarea = null) {
        // dd($inicio_tarea);
        $user_id = Session::get('usuario')->user_id;
        $estado = null;
        $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', $user_id, null, null, null, $informe), 'selectOne');
        // dd($datos_informe);
        //
        $iniciado = $datos_informe->inicio_informe;
        // dd($tipo_actividad_tarea,$datos_informe->codigo_estado_informe,$orden_tarea);
        // $fecha_comprometida = NULL;
        if ($tipo_actividad_tarea == 'E') {
            // SI LA TAREA ES TIPO DAGA
            if ($codigo_estado_tarea == 'E' && $datos_informe->codigo_estado_informe != 'P') {
                // SI LA TAREA ESTA EN PROCESO EL INFORME SE PONE EN GESTION
                $estado = 'P';
                $nombre_estado = 'En gestión';
                if (!empty($inicio_tarea) && !is_null($inicio_tarea)) {
                    $iniciado = new DateTime('now');
                    $iniciado = $iniciado->format('Y-m-d H:i:s');
                } else {
                    $iniciado = new DateTime();
                    $iniciado = $iniciado->format('Y-m-d H:i:s');
                }
            } elseif ($codigo_estado_tarea == 'K' && $datos_informe->codigo_estado_informe != 'E') {
                // SI LA TAREA ESTA APROBADA EL INFORME SE PONE EN PROCESO
                $estado = 'E';
                $nombre_estado = 'En proceso';
                //
            } elseif ($codigo_estado_tarea == 'W' && $datos_informe->codigo_estado_informe != 'W') {
                // SI LA TAREA ESTA EN ESPERA EL INFORME SE PONE EN ESPERA
                $estado = 'W';
                $nombre_estado = 'En espera';
            }

        } elseif ($datos_informe->codigo_estado_informe == 'A' && $orden_tarea == 1) {
            // SI LA TAREA ES LA PRIMERA TAREA ( ANALISIS Y DISTRIBUCION DE TAREAS )
            if ($codigo_estado_tarea == 'E' && $datos_informe->codigo_estado_informe != 'E') {
                // SI LA TAREA ESTA EN PROCESO EL INFORME SE PONE EN PROCESO
                $estado = 'E';
                $nombre_estado = 'En proceso';
            }
            //
            if (!empty($inicio_tarea) && !is_null($inicio_tarea)) {
                $iniciado = new DateTime('now');
                $iniciado = $iniciado->format('Y-m-d H:i:s');
            } else {
                $iniciado = new DateTime();
                $iniciado = $iniciado->format('Y-m-d H:i:s');
            }
//        } elseif ($orden_tarea > 1) {
       } else {
            if ($orden_tarea == $ultima_tarea && $codigo_estado_tarea == 'K') {
                $estado = 'K';
                $nombre_estado = 'Finalizado';
            }
        }
        //
        if (!is_null($estado)) {
            $actualizar = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_informe', $datos_informe->contraparte, $informe, $user_id, NULL, NULL, $datos_informe->id_tipo_informe, $datos_informe->informe_prioridad, $estado, NULL, NULL, $datos_informe->userIDAsigandoInforme, $datos_informe->cliente, NULL, NULL, $datos_informe->fecha_comprometida_informe, NULL, NULL, $datos_informe->idioma, $iniciado));
            //
            if ($estado == 'E') {
                // SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se inició la actividad del informe', $datos_informe->cliente, 'START_IV','IV_BACK', $datos_informe->contraparte,$user_id,NULL,$datos_informe->servicio_contratado,NULL,NULL,NULL,NULL,$informe), 'selectOne');
                SQLConnection::logTrazabilidad('Se inició la actividad del informe', 'START_LED', Session::get('webdata')['id_menu_plataforma'], $user_id, $datos_informe->servicio_contratado, $datos_informe->cliente, $datos_informe->contraparte, null, null, null, null, null, NULL, NULL, $informe);
                if (!is_null($inicio_tarea) && !empty($inicio_tarea)) {
                    SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la fecha de inicio del informe: ' . $inicio_tarea, $datos_informe->cliente, 'CAMBIAR_FECHA_INICIO_INFORME', Session::get('webdata')['id_plataforma'], $datos_informe->contraparte, $user_id, NULL, $datos_informe->servicio_contratado, NULL, NULL, NULL, NULL, $informe), 'selectOne');
                }
            } elseif ($estado == 'P') {
                SQLConnection::logTrazabilidad('El Informe esta en gestión', 'GESTION_LED', Session::get('webdata')['id_menu_plataforma'], $user_id, $datos_informe->servicio_contratado, $datos_informe->cliente, $datos_informe->contraparte, null, null, null, null, null, NULL, NULL, $informe);
            } elseif ($estado == 'K' || $estado == 'N') {
                return 2;
                // SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_informe',$datos_informe->contraparte,$informe,$user_id,NULL,NULL,$datos_informe->id_tipo_informe,$datos_informe->informe_prioridad,$estado,NULL,NULL,$datos_informe->userIDAsigandoInforme,$datos_informe->cliente,NULL,NULL,$compromiso_tarea,NULL,NULL,$datos_informe->idioma,$iniciado));
                // 
                SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se aprobó y publicó el informe.', $datos_informe->cliente, 'CIERRE_INFORME', Session::get('webdata')['id_plataforma'], $datos_informe->contraparte, $user_id, NULL, $datos_informe->servicio_contratado, NULL, NULL, NULL, NULL, $informe), 'selectOne');
                // 

                $cierre_total = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('CIERRE_TOTAL', $contraparte, $tarea, $user_id, NULL, NULL, NULL, NULL, 'K', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
                // SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('CERRAR_INFORME',$informe,NULL,Session::get('usuario')->user_id));
                // 

            } else {
                SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió el estado del informe a ' . $nombre_estado, $datos_informe->cliente, 'CAMBIAR_ESTADO_INFORME', Session::get('webdata')['id_plataforma'], $datos_informe->contraparte, $user_id, NULL, $datos_informe->servicio_contratado, NULL, NULL, NULL, NULL, $informe), 'selectOne');
            }
        }
        // Control de Calidad
        // if ( !is_null($compromiso_tarea) && $tipo_actividad_tarea == 'I' ) {
        //     SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_informe',$datos_informe->contraparte,$informe,$user_id,NULL,NULL,$datos_informe->id_tipo_informe,$datos_informe->informe_prioridad,$datos_informe->codigo_estado_informe,NULL,NULL,$datos_informe->userIDAsigandoInforme,$datos_informe->cliente,NULL,NULL,$compromiso_tarea,NULL,NULL,$datos_informe->idioma,$iniciado));
        //     // 
        //     SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la fecha comprometida del informe: '.$compromiso_tarea, $datos_informe->cliente, 'CAMBIAR_FECHA_COMPROMETIDA_INFORME',Session::get('webdata')['id_plataforma'], $datos_informe->contraparte,$user_id,NULL,$datos_informe->servicio_contratado,NULL,NULL,NULL,NULL,$informe), 'selectOne');
        // } 
        // Distribucion de Tareas
        /*if ( !is_null($inicio_tarea) && $idTipoTarea == '4071729' ) {
            SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_informe',$datos_informe->contraparte,$informe,$user_id,NULL,NULL,$datos_informe->id_tipo_informe,$datos_informe->informe_prioridad,$datos_informe->codigo_estado_informe,NULL,NULL,$datos_informe->userIDAsigandoInforme,$datos_informe->cliente,NULL,NULL,$datos_informe->fecha_comprometida_informe,NULL,NULL,$datos_informe->idioma,$inicio_tarea));
            // 
            SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la fecha de inicio del informe: '.$inicio_tarea, $datos_informe->cliente, 'CAMBIAR_FECHA_INICIO_INFORME',Session::get('webdata')['id_plataforma'], $datos_informe->contraparte,$user_id,NULL,$datos_informe->servicio_contratado,NULL,NULL,NULL,NULL,$informe), 'selectOne');
        }*/
        // Solícitud de Documentación
        /* if ( !is_null($fecha_comprometida) && $tipo_actividad_tarea == 'E' ){
            SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_informe',$datos_informe->contraparte,$informe,$user_id,NULL,NULL,$datos_informe->id_tipo_informe,$datos_informe->informe_prioridad,$datos_informe->codigo_estado_informe,NULL,NULL,$datos_informe->userIDAsigandoInforme,$datos_informe->cliente,NULL,NULL,$fecha_comprometida,NULL,NULL,$datos_informe->idioma,$iniciado));
            //
            SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la fecha comprometida del informe: '.$fecha_comprometida, $datos_informe->cliente, 'CAMBIAR_FECHA_COMPROMETIDA_INFORME',Session::get('webdata')['id_plataforma'], $datos_informe->contraparte,$user_id,NULL,$datos_informe->servicio_contratado,NULL,NULL,NULL,NULL,$informe), 'selectOne');
        } */
        //
        return 1;
    }

    // FUNCION QUE FUERZA ABRIR UNA TAREA (PONERLA EN READY_TO_START)
    public static function abrirTarea() {
        if (isset($_POST['tarea'])) {
            $tarea = (is_numeric(Request::input('tarea'))) ? Request::input('tarea') : NULL;
            //
            if (!is_null($tarea) && !empty($tarea)) {
                DB::select("UPDATE informes SET ready_to_start=1 WHERE informe = $tarea");
                return 1;
            }
        }
        return 0;
    }

    /**
     * FUNCION GENÉRICA QUE DEVUELVE LOS DATOS DE UNA TAREA PASADA POR PARÁMETRO
     * 
     * @access private
     * 
     * @param string id de la tarea
     * 
     * */
    private static function datosTarea($tarea = null) {
        if (!is_null($tarea) && is_numeric($tarea)) {
            $datos_tarea = SQLConnection::backendStoreProcedure("LN_datos_tarea", array($tarea))[0];
            // dd($datos_tarea);
            return $datos_tarea;
        } else {
            return null;
        }

    }

    ///////////////////////////////////
    ////// ACTIVIDAD DE LA TAREA //////
    ///////////////////////////////////

    public static function cargaBalancesCompleta() {
        //valido si el usuario tiene el permiso correspondiente para acceder a la sección solicitada.
        $task_id = Request::Input('task_id');
        $user_id = Session::get("usuario")->user_id;
        $token_por_secciones = Misc::obtenerTokenSeccion('contables');

        $cuit = Request::Input('identificacion');
        $nombre_persona = Request::Input('nombre_persona');
        $anios = 50;
        $visible = 1;
        $monedas = SQLConnection::obtenerMonedas();
        $ruta_archivo = ENV('RUTA_ARCHIVO_PDF') . '/balances/' . $cuit;
        //$balances = SQLConnection::backendBalancesContables($cuit,$anios,$visible,$task_id);
        $balances = SQLConnection::backendStoreProcedure('backend_balances_contables', array(null, $cuit, $anios, $visible, $task_id, $user_id), "select");
        //
        return view('/informes-blue/actividades-tarea/balances_estados_contables')->with(compact('balances', 'cuit', 'nombre_persona', 'user_id', 'visible', 'task_id', 'monedas', 'ruta_archivo', 'token_por_secciones'));
    }

    // FUNCION QUE DEVUELVE LA ACTIVIDAD DE LA TAREA
    public static function actividadTarea() {
        if (isset($_POST['tarea']) && isset($_POST['tipo_tarea'])) {
            $tarea = Request::input('tarea');
            $tipo_actividad = Request::input('tipo_tarea');

            //
            // if ( $tarea == 100768090 ){
            //     return self::cargaBalancesCompleta();
            // }
            //
            switch ($tipo_actividad) {
                case 'D':
                    // CARGAR DOCUMENTOS
                    $cliente = Request::input('cliente');
                    $gestion = Request::input('gestion');
                    $contraparte = Request::input('contraparte');
                    $tipo_doc = Request::input('tipo_doc');
                    return self::tareaCargaDocumento($cliente, $gestion, $contraparte, $tipo_doc);
                    break;
                case 'E':
                    // ACTIVIDAD DE GESTION
                    $contraparte = Request::input('contraparte');
                    $nombre = Request::input('nombre_contraparte');
                    $identificacion = Request::input('identificacion_informe');
                    $email = Request::input('email-candidato');
                    return self::tareaActividadGestion($contraparte, $tarea, $nombre, $identificacion, $email);
                    break;
                case 'I':
                    // ACTIVIDAD DE FINALIZAR INFORME
                    $estado_tarea = Request::input('estado');
                    //--
                    if ($estado_tarea == 'E') {
                        //
                        return self::tareaActividadGenerarInforme();
                    } else {
                        return 1;
                    }
                    /* if( $estado_tarea == 'F' ){
                        $contraparte = Request::input('contraparte');
                        $nombre = Request::input('nombre_contraparte');
                        $identificacion = Request::input('identificacion_informe'); 
                        $nombre_estado = Request::input('nombre_estado');
                        $servicio_contratado = Request::input('servicio_contratado');
                        
                        return self::tareaActividadFinalizarInforme($contraparte,$nombre,$identificacion,$estado_tarea,$tarea,$nombre_estado,$servicio_contratado);
                    } elseif ( $estado_tarea == 'E' ){
                        //
                        return self::tareaActividadGenerarInforme();
                    } else {
                        return 1;
                    } */
                    break;
                case 'B':
                case 'R':
                    // return self::cargarFidecheck();
                    $ruta = Request::input('ruta');
                    $estado_tarea = Request::input('estado');
                    if (!is_null($ruta) && !empty($ruta) && $estado_tarea != 'F') {
                        // $host = $_SERVER['HTTP_HOST'];                        
                        $host = ENV('HOST_PARCIAL');
                        if (isset($_SERVER['HTTPS'])) {
                            $host = 'https://' . $host;
                        } else {
                            $host = 'http://' . $host;
                        }
                        $ruta = $host . '/tareas/actividad-tarea' . $ruta;

                        // return redirect($ruta);
                        $request = Request::create($ruta, 'POST', Request::all());
                        // $response = app()->handle($request); 
                        return \Route::dispatch($request);
                        // if( $response->status() != '200' ){
                        //     dd($response->status());
                        //     return 0;
                        // }
                        // return $response->getContent();
                    } else {
                        return 1;
                    }
                    break;
                case 'A':
                case 'C':
                case 'T':
                    $ruta = Request::input('ruta');
                    if (!is_null($ruta) && !empty($ruta)) {
                        // $host = $_SERVER['HTTP_HOST'];                        
                        $host = ENV('HOST_PARCIAL');
                        if (isset($_SERVER['HTTPS'])) {
                            $host = 'https://' . $host;
                        } else {
                            $host = 'http://' . $host;
                        }
                        //
                        $ruta = $host . '/tareas/actividad-tarea' . $ruta;
                        $request = Request::create($ruta, 'POST', Request::all());
                        //$response = Route::dispatch($request);
                        $response = app()->handle($request);
                        return $response->getContent();
                        if ($response->status() != '200') {
                            return 0;
                        }
                    } else {
                        return 1;
                    }
                    break;
                /*  case 'F':
                     $idFuente = Request::input('idFuente');
                     return AdministrarFuentesController::controlFuente($idFuente);
                     break; */
                default:
                    return 1;
                    break;
            }
        } else {
            return 0;
        }
    }

    // FUNCION QUE DEVUELVE LA ACTIVIDAD DE FINALIZAR INFORME
    private static function tareaActividadFinalizarInforme($contraparte, $nombre, $identificacion, $estado_tarea, $tarea, $nombre_estado, $servicio_contratado) {
        $dossierdata = SQLConnection::backendStoreProcedure('LN_demo_', array('reports', $contraparte, NULL, NULL), 'selectOne');
        $datos_informe = SQLConnection::backendStoreProcedure('LN_demo_', array('SELECT', $contraparte, NULL, $dossierdata->producto));
        //-- devuelve todas las tareas del informe
        $cliente = Request::input('cliente');
        $tipo_actividad = Request::input('tipo_tarea');
        $informe = Request::input('informe');
        $gestion = Request::input('gestion');
        // $tareas = SQLConnection::backendStoreProcedure('LN_Blue',array('tareas_informe',null,$informe));
        $tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe));
        $tareas_no_aprobadas = [];
        foreach ($tareas as $key => $value) {
            if ($value->estado_tarea != 'K' && $value->tarea != $tarea) {
                array_push($tareas_no_aprobadas, $value);
            }
        }
        //
        $informe_dossier = Misc::obtenerInforme($cliente, $contraparte, $gestion);
        //--
        return view('/informes-blue/actividades-tarea/publicar_informe')->with(compact('contraparte', 'nombre', 'identificacion', 'estado_tarea', 'tarea', 'nombre_estado', 'servicio_contratado', 'tareas_no_aprobadas', 'tipo_actividad', 'informe_dossier'));
    }

    /**
     * @access private
     * @static
     * Funcion que devuelve la actividad de generar el informe
     */
    private static function tareaActividadGenerarInforme() {
        $contraparte = Request::input('contraparte');
        $gestion = Request::input('gestion');
        $tarea = Request::input('tarea');
        $nombre_tarea = Request::input('nombre_tarea');
        $cliente = Request::input('cliente');
        //
        $report_data = SQLConnection::backendStoreProcedure('LN_demo_', array('SELECCIONAR_INFORME', $contraparte, NULL, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $gestion), 'selectOne');
        $tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $report_data->informe));
        foreach ($tareas as $t) {
            if ($t->tarea == $tarea) {
                $orden = $t->ordTarea;
                break;
            }
        }
        //
        $ultima_tarea = count($tareas) == $orden ? 1 : 0;
        $id_tipo_informe = $tareas[0]->idTipoInforme;

        $producto = $report_data->producto;
        unset($report_data);

        return view('/informes-blue/actividades-tarea/cerrar_informe')->with(compact('nombre_tarea','cliente','contraparte', 'tarea', 'producto', 'ultima_tarea', 'id_tipo_informe'));
    }

    // FUNCION ENCARGADA DE ACTUALIZAR LOS DATOS DEL INQUIRO VITAE (VALORACION Y PUBLICACION)
    public function actualizarInformeInquiro() {
        $user_id = Session::get('usuario')->user_id;
        $cliente = Request::input('cliente');
        $contraparte = Request::input('contraparte');
        $emails = Request::input('emails');
        $tarea = Request::input('tarea');
        $informe = Request::input('informe');
        $gestion = Request::input('gestion');
        $tipo_actividad = Request::input('tipo_actividad');
        //
        $ref_ext = Request::input('ref_ext');
        $usuario_creador = Request::input('usuario_creador');
        // $visible = !empty(Request::input('visible')) ? intval(Request::input('visible')) : 0;
        if (!self::permitirAprobarTarea($tipo_actividad, $cliente, $contraparte, $gestion, 'F')) {
            Traducciones::$blade = 'publicar_informe';
            $mensaje = 'el informe no esta generado';
            $mensaje = Traducciones::get($mensaje);
            return json_encode(['error' => 1, 'mensaje' => $mensaje]);
        }
        // Envio de e-mail de informe finalizado
        $enviar = !empty(Request::input('enviar_mail')) ? true : false;
        /* if ($enviar) {
            $emails = Request::input('emails');
            //--
            $emails = str_replace(';',',', $emails);
            $email =  explode(',', $emails);
            $emailok = [];
            $total = 0;
            $error = 0;
            $correctos = []; 
            $errores = []; 
            //--
            foreach ($email as $key => $to) {
                $to = trim($to);
                if (filter_var($to, FILTER_VALIDATE_EMAIL)){
                    $emailok[$key] = $to;
                    $correctos[$total] = new stdClass(); 
                    $correctos[$total]->contraparte = null; 
                    $correctos[$total]->mail = $to; 
                    $total++;
                } else {
                    $errores[$error] = new stdClass(); 
                    $errores[$error]->contraparte = null;
                    $errores[$error]->mail = $to; 
                    $error++;
                }
            }
            //--
            $to = $emailok;
            $false = false; 
            $null = null; 
            //--
            if ( $cliente == 738156811 || $cliente == 2254875 ){
                // Cliente HireRight    
                EmailController::emailHR('K',$to,$ref_ext,$usuario_creador);
            } else {
                EmailController::enviarMail('IV','', '', $contraparte, '', '', $false, $null, $null, $to); 
            }
            
        } */
        //
        self::verificarDocumentosInforme($contraparte);
        //-- SE CAMBIA EL ESTADO DE TODAS LAS TAREAS DEL INFORME A APROBADO Y LO PUBLICA --//        
        $cierre_total = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('CIERRE_TOTAL', $contraparte, $tarea, $user_id, NULL, NULL, NULL, NULL, 'K', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        SQLConnection::logTrazabilidad('Se cerró y publicó el informe', 'CLOSE_PUB_IV_REPORT', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, Session::get('webdata')['servicio_contratado'], $cliente, $contraparte, null, null, null, $informe, null, $tarea, 'F');
        Misc::calcularTATTarea($contraparte, $tarea);
        //
        //if ( $cliente == 738156811 || $cliente == 2254875 ){
        $this->procesarHitContraparte($contraparte);
        Misc::calcularTAT($contraparte, $gestion);
        // $tatFront = SQLConnection::backendStoreProcedure('LN_TATime_', array('UPDBYCONTRA', $contraparte, $gestion, $calculoTAT['minutos_totales'], $calculoTAT['bloque_jornada']));
        //}
        // Reprocesa el json del cliente
        SQLConnection::backendStoreProcedure('LN_contrapartes_queue_', array('insert', null, $contraparte), 'selectOne');
        //
        return json_encode(['error' => 0, 'mensaje' => 'OK']);

    }

    // FUNCION QUE DEVUELVE LA ACTIVIDAD DE LA TAREA EN GESTION
    private static function tareaActividadGestion($contraparte, $tarea) {
        //$datos_tarea = SQLConnection::backendStoreProcedure('LN_panel_reports',array('tarea_by_id',Session::get('usuario')->user_id,null,null,null,$tarea),'selectOne');
        // $datos_tarea = SQLConnection::backendStoreProcedure('IV_panel_reports',array('tarea_by_id',Session::get('usuario')->user_id,null,null,null,$tarea),'selectOne');
        $datos_tarea = self::datosTarea($tarea);
        $historial_informe_padre = $datos_tarea->historial_informe_padre;
        //
        $datos_contraparte = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('SELECT', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), 'selectOne');
        //
        $limite_carga_inicial = $datos_contraparte->limite_carga_inicial;
        $ultimo_login = $datos_contraparte->ultimo_acceso_str;
        $fecha_ultimo_contacto = !empty($datos_tarea) && isset($datos_tarea->proximo_llamado) ? date('d/m/Y', strtotime($datos_tarea->proximo_llamado)) : '';

        $fecha_ultimo_cierre = $datos_contraparte->fecha_ultimo_cierre;
        $mes_cierre_ejercicio = NULL;
        $perdiocidad = NULL;
        //
        if (!is_null($fecha_ultimo_cierre)) {
            $fecha_ultimo_cierre = date_create_from_format('d/m/Y', $fecha_ultimo_cierre);
            $fecha_ultimo_cierre = $fecha_ultimo_cierre->format('n');
            //
            switch ($fecha_ultimo_cierre) {
                case 1:
                    $mes_cierre_ejercicio = 'Enero';
                    break;
                case 2:
                    $mes_cierre_ejercicio = 'Febrero';
                    break;
                case 3:
                    $mes_cierre_ejercicio = 'Marzo';
                    break;
                case 4:
                    $mes_cierre_ejercicio = 'Abril';
                    break;
                case 5:
                    $mes_cierre_ejercicio = 'Mayo';
                    break;
                case 6:
                    $mes_cierre_ejercicio = 'Junio';
                    break;
                case 7:
                    $mes_cierre_ejercicio = 'Julio';
                    break;
                case 8:
                    $mes_cierre_ejercicio = 'Agosto';
                    break;
                case 9:
                    $mes_cierre_ejercicio = 'Septiembre';
                    break;
                case 10:
                    $mes_cierre_ejercicio = 'Octubre';
                    break;
                case 11:
                    $mes_cierre_ejercicio = 'Noviembre';
                    break;
                case 12:
                    $mes_cierre_ejercicio = 'Diciembre';
                    break;
            }
        }
        //
        switch ($datos_contraparte->periodicidad_ejercicio) {
            case 'A':
                $perdiocidad = 'Anual (12 meses)';
                break;
            case 'E':
                $perdiocidad = '18 meses';
                break;
            case 'B':
                $perdiocidad = 'Bianual (24 meses)';
                break;
            case 'S':
                $perdiocidad = 'Semetral (6 meses)';
                break;
            case 'T':
                $perdiocidad = 'Trimestral (3 meses)';
                break;
            case 'C':
                $perdiocidad = 'Cuatrimestral (4 meses)';
                break;
        }
        //
        if ($datos_contraparte->periodicidad_ejercicio == 'A') {
            $perdiocidad = 'Anual (12 meses)';
        } elseif ($datos_contraparte->periodicidad_ejercicio == 'E') {
            $perdiocidad = '18 meses';
        } elseif ($datos_contraparte->periodicidad_ejercicio == 'B') {
            $perdiocidad = 'Bianual (24 meses)';
        } elseif ($datos_contraparte->periodicidad_ejercicio == 'S') {
            $perdiocidad = 'Semetral (6 meses)';
        } elseif ($datos_contraparte->periodicidad_ejercicio == 'T') {
            $perdiocidad = 'Trimestral (3 meses)';
        } elseif ($datos_contraparte->periodicidad_ejercicio == 'C') {
            $perdiocidad = 'Cuatrimestral (4 meses)';
        }
        //
        unset($datos_contraparte);
        $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        //

        return view('informes-blue/actividades-tarea/enviar_mail')->with(compact('contraparte', 'datos_tarea', 'docs', 'limite_carga_inicial', 'ultimo_login', 'fecha_ultimo_contacto', 'perdiocidad', 'historial_informe_padre', 'mes_cierre_ejercicio'));
    }

    public static function fechaProximoContacto() {
        if (isset($_POST['contraparte'])) {
            $id = Request::input('contraparte');
            $informe = Request::input('informe');
            $tarea = Request::input('tarea');
            $enviar = Request::input('enviar');
            $email = Request::input('email');
            $expira = Request::input('fecha_expira');
            $proximo_contacto = Request::input('fecha_proximo_contacto');
            $nombre_tipo_tarea = Request::input('nombre_tarea');
            //
            $formato_fecha = date_create_from_format('!d/m/Y', $expira);
            if (!$formato_fecha) {
                return json_encode(array('error' => 2, 'mensaje' => 'La fecha es inválida.'));
            }
            //
            $limite_carga_inicial = date_add(date_add($formato_fecha, date_interval_create_from_date_string("1 day")), date_interval_create_from_date_string('-1 second'));
            //
            $limite_carga_inicial = date_format($limite_carga_inicial, 'Y-m-d H:i:s');
            $proximo_contacto = date_create_from_format('!d/m/Y', $proximo_contacto);
            $fecha_proximo_contacto = date_format($proximo_contacto, 'Y-m-d H:i:s');
            $temp = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('actualizar_carga_inicial', $id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $limite_carga_inicial, NULL, NULL, NULL, NULL, null, 0, null, 'CC', NULL, NULL, 'AR', NULL, 'spa', NULL, NULL, NULL, NULL, 'F,C,L', 0, $fecha_proximo_contacto), 'selectOne');

        }
    }

    // FUNCION QUE HACE EL ENVIO DEL MAIL DE LA CONTRAPARTE
    public static function enviarMailContraparte() {
        if (isset($_POST['contraparte'])) {
            $id = Request::input('contraparte');
            $informe = Request::input('informe');
            $tarea = Request::input('tarea');
            $enviar = Request::input('enviar');
            $email = Request::input('email');
            $expira = Request::input('fecha_expira');
            $proximo_contacto = Request::input('fecha_proximo_contacto');
            $nombre_tipo_tarea = Request::input('nombre_tarea');
            $conMail = '';

            // Si no tengo fecha de proximo contacto, calculo dos dias antes de la fecha de expiracion de el link 
            if (empty($proximo_contacto)) {
                // Creo un objeto DateTime a partir de la fecha inicial
                $fechaProximoContactoNuevo = DateTime::createFromFormat('d/m/Y', $expira);
                // Restar dos días
                $fechaProximoContactoNuevo->sub(new DateInterval('P2D'));
                // Se formatea la respuesta
                $proximo_contacto = $fechaProximoContactoNuevo->format('d/m/Y');
            }

            $formato_fecha = date_create_from_format('!d/m/Y', $expira);
            if (!$formato_fecha || empty($proximo_contacto) || empty($expira)) {
                return json_encode(array('error' => 2, 'mensaje' => 'La fecha es inválida.'));
            }

            $limite_carga_inicial = date_add(date_add($formato_fecha, date_interval_create_from_date_string("1 day")), date_interval_create_from_date_string('-1 second'));
            //
            $limite_carga_inicial = date_format($limite_carga_inicial, 'Y-m-d H:i:s');
            $proximo_contacto = date_create_from_format('!d/m/Y', $proximo_contacto);
            $fecha_proximo_contacto = !empty($proximo_contacto) ? date_format($proximo_contacto, 'Y-m-d H:i:s') : null;
            //
            //$temp = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('actualizar_carga_inicial', $id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $limite_carga_inicial, NULL, NULL, NULL, NULL,null, 0, null, 'CC', NULL, NULL, 'AR', NULL, 'spa', NULL, NULL, NULL, NULL, 'F,C,L', 0, $fecha_proximo_contacto), 'selectOne');
            //
            $clave = Misc::generateRandomString(6);
            //	
            DB::selectOne("update LN_contrapartes set
				clave = '" . $clave . "', clave_temporal = 1, 
				clave_cambio = NULL, modified = GETDATE(), modified_by = " . Session::get('usuario')->user_id .
                ", clave_expira = '" . $limite_carga_inicial . "' where contraparte = " . $id
            );

            $qcontrap = DB::selectOne('EXEC dbo.LN_contrapartes_ ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?', array('select', $id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));

            if ($qcontrap->servicio_contratado == env('IMPE_PRODUCTO')) {
                $impe = SQLConnection::backendStoreProcedure('Imperium_cliente_contraparte_led', array('buscar_contratista_imperium', $id), 'selectOne');
                DB::selectOne("update users set password = '" . $clave . "' where user_id = " . $impe->user_id);

                if ($enviar != 3) {
                    $result = EmailController::enviarMail('EMAIL-IMPE', 'ALTA-USUARIO', 'ALTA-USUARIO-SUBJECT', $id, $expira, ($enviar == 0) ? '' : trim($email), true);
                    $conMail = 1;
                } else {
                    $conMail = 0;
                }

            } else {
                if ($enviar != 3) {
                    $result = EmailController::enviarMail('EMAIL-LED', 'ALTA', '', $id, $expira, ($enviar == 0) ? '' : trim($email), true);
                    $conMail = 1;
                } else {
                    $conMail = 0;
                }

                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_FECHA_COMPROMETIDA_TAREA', NULL, $tarea, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $limite_carga_inicial, NULL, NULL, NULL, NULL));

                // SE CAMBIO LA FECHA COMPROMETIDA
                SQLConnection::logTrazabilidad('Se cambió la fecha comprometida de la tarea ' . $nombre_tipo_tarea . ' : ' . $limite_carga_inicial, 'CAMBIAR_FECHA_COMPROMETIDA_TAREA', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $qcontrap->servicio_contratado, $qcontrap->cliente, $id, null, null, null, null, null, $tarea, null);
            }

            $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', Session::get('usuario')->user_id, null, null, null, $informe), 'selectOne');

            $duracion_informe = !empty($datos_informe) && isset($datos_informe->duracion_informe) ? $datos_informe->duracion_informe : 5;
            $servicio_contratado = $datos_informe->servicio_contratado;
            $cliente = $datos_informe->cliente;
            $contraparte = $datos_informe->contraparte;

            // Se cambia la fecha comprometida de la tarea a 2 dias para adelante desde el envio del mail
            $cambioComprometidaTarea = Misc::extensionFechaComprometidaTarea($tarea, $expira, $nombre_tipo_tarea, $limite_carga_inicial, $qcontrap, $id, $fecha_proximo_contacto);
            // Se cambia la fecha comprometida del informe 7 días hacia adelante desde el envío del mail
            $cambioComprometidaInforme = Misc::extensionFechaComprometidaInforme($datos_informe, $expira, $informe, $servicio_contratado, $cliente, $contraparte, $duracion_informe);

            if ($conMail == 0) {
                return json_encode(array('error' => 3, 'mensaje' => 'Datos guardados con exito'));
            } else {
                if ($result == true) {
                    $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Envío de link de acceso a la contraparte para cargar documentación', $qcontrap->cliente, 'ENVIO_LINK_CONTRAPARTE', Session::get('webdata')['id_plataforma'], $id, Session::get('usuario')->user_id), 'selectOne');
                    SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_ESTADO', NULL, $tarea, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, "E"));
                    SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se ha realizado la actualización del estado de la tarea a en proceso', $qcontrap->cliente, 'CAMBIO_DE_ESTADO', Session::get('webdata')['id_plataforma'], $id, Session::get('usuario')->user_id), 'selectOne');
                }
                $msg = $result ? 'El mensaje fue enviado correctamente.' : 'La dirección de e-mail es inválida.';
                $error = $result ? 0 : 1;
                //
                return json_encode(array('error' => $error, 'mensaje' => $msg));
            }

        } else {
            return json_encode(array('error' => 1, 'mensaje' => 'Fallo en el envio de datos'));
        }
    }

    // FUNCION QUE HACE EL ENVIO DEL MAIL DE LA CONTRAPARTE
    public static function enviarMailContraparte17072024() {
        if (isset($_POST['contraparte'])) {
            $id = Request::input('contraparte');
            $informe = Request::input('informe');
            $tarea = Request::input('tarea');
            $enviar = Request::input('enviar');
            $email = Request::input('email');
            $expira = Request::input('fecha_expira');
            $proximo_contacto = Request::input('fecha_proximo_contacto');
            $nombre_tipo_tarea = Request::input('nombre_tarea');
            $conMail = '';

            // Si no tengo fecha de proximo contacto, calculo dos dias antes de la fecha de expiracion de el link 
            if (empty($proximo_contacto)) {
                // Creo un objeto DateTime a partir de la fecha inicial
                $fechaProximoContactoNuevo = DateTime::createFromFormat('d/m/Y', $expira);
                // Restar dos días
                $fechaProximoContactoNuevo->sub(new DateInterval('P2D'));
                // Se formatea la respuesta
                $proximo_contacto = $fechaProximoContactoNuevo->format('d/m/Y');
            }

            $formato_fecha = date_create_from_format('!d/m/Y', $expira);
            if (!$formato_fecha || empty($proximo_contacto) || empty($expira)) {
                return json_encode(array('error' => 2, 'mensaje' => 'La fecha es inválida.'));
            }

            $limite_carga_inicial = date_add(date_add($formato_fecha, date_interval_create_from_date_string("1 day")), date_interval_create_from_date_string('-1 second'));
            //
            $limite_carga_inicial = date_format($limite_carga_inicial, 'Y-m-d H:i:s');
            $proximo_contacto = date_create_from_format('!d/m/Y', $proximo_contacto);
            $fecha_proximo_contacto = !empty($proximo_contacto) ? date_format($proximo_contacto, 'Y-m-d H:i:s') : null;
            //
            $temp = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('actualizar_carga_inicial', $id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $limite_carga_inicial, NULL, NULL, NULL, NULL, null, 0, null, 'CC', NULL, NULL, 'AR', NULL, 'spa', NULL, NULL, NULL, NULL, 'F,C,L', 0, $fecha_proximo_contacto), 'selectOne');
            //
            $clave = Misc::generateRandomString(6);
            //	
            DB::selectOne("update LN_contrapartes set
									clave = '" . $clave . "', clave_temporal = 1, 
									clave_cambio = NULL, modified = GETDATE(), modified_by = " . Session::get('usuario')->user_id .
                ", clave_expira = '" . $limite_carga_inicial . "' where contraparte = " . $id);
            //
            $qcontrap = DB::selectOne('EXEC dbo.LN_contrapartes_ ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?', array('select', $id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
            //
            if ($qcontrap->servicio_contratado == env('IMPE_PRODUCTO')) {
                $impe = SQLConnection::backendStoreProcedure('Imperium_cliente_contraparte_led', array('buscar_contratista_imperium', $id), 'selectOne');
                DB::selectOne("update users set password = '" . $clave . "' where user_id = " . $impe->user_id);

                if ($enviar != 3) {
                    $result = EmailController::enviarMail('EMAIL-IMPE', 'ALTA-USUARIO', 'ALTA-USUARIO-SUBJECT', $id, $expira, ($enviar == 0) ? '' : trim($email), true);
                    $conMail = 1;
                } else {
                    $conMail = 0;
                }

            } else {
                if ($enviar != 3) {
                    $result = EmailController::enviarMail('EMAIL-LED', 'ALTA', '', $id, $expira, ($enviar == 0) ? '' : trim($email), true);
                    $conMail = 1;
                } else {
                    $conMail = 0;
                }

                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_FECHA_COMPROMETIDA_TAREA', NULL, $tarea, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $limite_carga_inicial, NULL, NULL, NULL, NULL));

                // SE CAMBIO LA FECHA COMPROMETIDA
                SQLConnection::logTrazabilidad('Se cambió la fecha comprometida de la tarea ' . $nombre_tipo_tarea . ' : ' . $limite_carga_inicial, 'CAMBIAR_FECHA_COMPROMETIDA_TAREA', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $qcontrap->servicio_contratado, $qcontrap->cliente, $id, null, null, null, null, null, $tarea, null);
            }

            $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', Session::get('usuario')->user_id, null, null, null, $informe), 'selectOne');
            $servicio_contratado = $datos_informe->servicio_contratado;
            $cliente = $datos_informe->cliente;
            $contraparte = $datos_informe->contraparte;
            // Se cambia la fecha comprometida de la tarea a 2 dias para adelante desde el envio del mail
            //$datos_tarea = '';
            //$fecha_comprometida_tarea = '';
            if (isset($tarea) && !empty($tarea)) {
                $datos_tarea = self::datosTarea($tarea);
                if (!empty($datos_tarea->fecha_comprometida_tarea)) {
                    //$fecha_comprometida_tarea = $datos_tarea->fecha_comprometida_tarea;                    
                    $fecha = DateTime::createFromFormat('d/m/Y', $expira);
                    $fecha_expiracion = $fecha->format('Y-m-d H:i:s');
                    $fecha = new DateTime($fecha_expiracion);

                    // Se suma dos días a la fecha comprometida de la tarea
                    $fecha->modify('+2 days');
                    $fechaModificadaTarea = $fecha->format('Y-m-d H:i:s');

                    // Verifica el día de la semana (0 para domingo, 6 para sábado)
                    $diaDeLaSemana = $fecha->format('w');

                    // Evaluar si es fin de semana
                    if ($diaDeLaSemana == 6) {
                        // Sumar 2 días si es Sábado
                        $fecha->modify('+2 days');
                        $fechaModificadaTarea = $fecha->format('Y-m-d H:i:s');
                    } elseif ($diaDeLaSemana == 0) {
                        // Sumar 1 día si es Domingo
                        $fecha->modify('+1 day');
                        $fechaModificadaTarea = $fecha->format('Y-m-d H:i:s');
                    }
                    SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array(
                        'UPD_FECHA_COMPROMETIDA_TAREA', NULL, $tarea, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $fechaModificadaTarea,
                    ));

                    SQLConnection::logTrazabilidad('Se cambió la fecha comprometida de la tarea ' . $nombre_tipo_tarea . ' : ' . $limite_carga_inicial, 'CAMBIAR_FECHA_COMPROMETIDA_TAREA', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $qcontrap->servicio_contratado, $qcontrap->cliente, $id, null, null, null, null, null, $tarea, null);

                }
            }

            // Se cambia la fecha comprometida del informe 7 días hacia adelante desde el envío del mail
            if (!empty($datos_informe) && isset($datos_informe->fecha_comprometida_informe)) {
                //$fecha_comprometida_informe = $datos_informe->fecha_comprometida_informe;
                $fecha_expiracion_informe1 = DateTime::createFromFormat('d/m/Y', $expira);
                $fecha_expiracion_informe2 = $fecha_expiracion_informe1->format('Y-m-d H:i:s');
                $fecha = new DateTime($fecha_expiracion_informe2);

                // Sumar 7 días
                $fecha->modify('+7 days');
                // Nueva fecha como string
                $fechaComprometidaInforme = $fecha->format('Y-m-d H:i:s');
                // Verifica el día de la semana (0 para domingo, 6 para sábado)
                $diaDeLaSemana = $fecha->format('w');

                // Evaluar si es fin de semana
                if ($diaDeLaSemana == 6) {
                    // Sumar 2 días si es Sábado
                    $fecha->modify('+2 days');
                    $fechaComprometidaInforme = $fecha->format('Y-m-d H:i:s');
                } elseif ($diaDeLaSemana == 0) {
                    // Sumar 1 día si es Domingo
                    $fecha->modify('+1 day');
                    $fechaComprometidaInforme = $fecha->format('Y-m-d H:i:s');
                }

                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array(
                    'UPD_informe', $datos_informe->contraparte, $informe, Session::get('usuario')->user_id, NULL, NULL, $datos_informe->id_tipo_informe, $datos_informe->informe_prioridad, $datos_informe->codigo_estado_informe, NULL, NULL, $datos_informe->userIDAsigandoInforme, $datos_informe->cliente, NULL, NULL, $fechaComprometidaInforme
                ));

                SQLConnection::logTrazabilidad('Se cambió la fecha comprometida del informe: ' . $fechaComprometidaInforme, 'CAMBIAR_FECHA_COMPROMETIDA_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $informe, null);
            }

            if ($conMail == 0) {
                return json_encode(array('error' => 3, 'mensaje' => 'Datos guardados con exito'));
            } else {
                if ($result == true) {
                    $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Envío de link de acceso a la contraparte para cargar documentación', $qcontrap->cliente, 'ENVIO_LINK_CONTRAPARTE', Session::get('webdata')['id_plataforma'], $id, Session::get('usuario')->user_id), 'selectOne');
                    SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_ESTADO', NULL, $tarea, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, "E"));
                    SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se ha realizado la actualización del estado de la tarea a en proceso', $qcontrap->cliente, 'CAMBIO_DE_ESTADO', Session::get('webdata')['id_plataforma'], $id, Session::get('usuario')->user_id), 'selectOne');
                }
                $msg = $result ? 'El mensaje fue enviado correctamente.' : 'La dirección de e-mail es inválida.';
                $error = $result ? 0 : 1;
                //
                return json_encode(array('error' => $error, 'mensaje' => $msg));
            }

        } else {
            return json_encode(array('error' => 1, 'mensaje' => 'Fallo en el envio de datos'));
        }
    }

    // FUNCION QUE HACE EL ENVIO DEL MAIL DE LA CONTRAPARTE
    public static function enviarMailContrapartebkp() {

        if (isset($_POST['contraparte']) && isset($_POST['fecha_expira'])) {
            $id = Request::input('contraparte');
            $informe = Request::input('informe');
            $tarea = Request::input('tarea');
            $enviar = Request::input('enviar');
            $email = Request::input('email');
            $expira = Request::input('fecha_expira');
            $proximo_contacto = Request::input('fecha_proximo_contacto');
            $nombre_tipo_tarea = Request::input('nombre_tarea');
            //
            $formato_fecha = date_create_from_format('!d/m/Y', $expira);
            if (!$formato_fecha || empty($proximo_contacto) || empty($expira)) {
                return json_encode(array('error' => 2, 'mensaje' => 'La fecha es inválida.'));
            }
            //
            $limite_carga_inicial = date_add(date_add($formato_fecha, date_interval_create_from_date_string("1 day")), date_interval_create_from_date_string('-1 second'));
            //
            $limite_carga_inicial = date_format($limite_carga_inicial, 'Y-m-d H:i:s');
            $proximo_contacto = date_create_from_format('!d/m/Y', $proximo_contacto);
            $fecha_proximo_contacto = !empty($proximo_contacto) ? date_format($proximo_contacto, 'Y-m-d H:i:s') : null;
            //
            $temp = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('actualizar_carga_inicial', $id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $limite_carga_inicial, NULL, NULL, NULL, NULL, null, 0, null, 'CC', NULL, NULL, 'AR', NULL, 'spa', NULL, NULL, NULL, NULL, 'F,C,L', 0, $fecha_proximo_contacto), 'selectOne');
            //
            $clave = Misc::generateRandomString(6);
            //	
            DB::selectOne("update LN_contrapartes set
									clave = '" . $clave . "', clave_temporal = 1, 
									clave_cambio = NULL, modified = GETDATE(), modified_by = " . Session::get('usuario')->user_id .
                ", clave_expira = '" . $limite_carga_inicial . "' where contraparte = " . $id);
            //
            $qcontrap = DB::selectOne('EXEC dbo.LN_contrapartes_ ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?', array('select', $id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
            //
            if ($qcontrap->servicio_contratado == env('IMPE_PRODUCTO')) {
                $impe = SQLConnection::backendStoreProcedure('Imperium_cliente_contraparte_led', array('buscar_contratista_imperium', $id), 'selectOne');
                DB::selectOne("update users set password = '" . $clave . "' where user_id = " . $impe->user_id);
                $result = EmailController::enviarMail('EMAIL-IMPE', 'ALTA-USUARIO', 'ALTA-USUARIO-SUBJECT', $id, $expira, ($enviar == 0) ? '' : trim($email), true);

            } else {
                /* 24/02/2021 Cambiamos el envio de mail de alta, usando EmailController en vez de LEDEmailController
                            $result = LEDEmailController::enviarMailLED('ALTA-LINK-INQUIROVITAE', 'ALTA-LINK-SUBJECT-INQUIROVITAE', $id, $expira, ($enviar==0) ? '' : trim($email) , true);
                            */
                $result = EmailController::enviarMail('EMAIL-LED', 'ALTA', '', $id, $expira, ($enviar == 0) ? '' : trim($email), true);
                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_FECHA_COMPROMETIDA_TAREA', NULL, $tarea, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $limite_carga_inicial, NULL, NULL, NULL, NULL));
                // SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_FECHA_COMPROMETIDA_TAREA',NULL,$informe,Session::get('usuario')->user_id,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,$limite_carga_inicial,NULL,NULL,NULL,NULL));
                //
                // SE CAMBIO LA FECHA COMPROMETIDA
                // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la fecha comprometida de la tarea '.$nombre_tipo_tarea.' : '.$limite_carga_inicial, $qcontrap->cliente, 'CAMBIAR_FECHA_COMPROMETIDA_TAREA',Session::get('webdata')['id_plataforma'], $id,Session::get('usuario')->user_id,NULL,$qcontrap->cliente,NULL,NULL,NULL,NULL,$tarea), 'selectOne');
                SQLConnection::logTrazabilidad('Se cambió la fecha comprometida de la tarea ' . $nombre_tipo_tarea . ' : ' . $limite_carga_inicial, 'CAMBIAR_FECHA_COMPROMETIDA_TAREA', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $qcontrap->servicio_contratado, $qcontrap->cliente, $id, null, null, null, null, null, $tarea, null);
                // SQLConnection::logTrazabilidad('Se cambió la fecha comprometida del informe: '.$limite_carga_inicial,'CAMBIAR_FECHA_COMPROMETIDA_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$qcontrap->servicio_contratado,$qcontrap->cliente,$id,null,null,null,null,null,$informe,null);
            }
            // Se cambia la fecha comprometida de la tarea a 2 dias para adelante desde el envio del mail

            // Se cambia la fecha comprometida del informe 7 dias para adelante desde el envio del mail            
            //
            if ($result == true) {
                $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Envío de link de acceso a la contraparte para cargar documentación', $qcontrap->cliente, 'ENVIO_LINK_CONTRAPARTE', Session::get('webdata')['id_plataforma'], $id, Session::get('usuario')->user_id), 'selectOne');
                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_ESTADO', NULL, $tarea, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, "E"));
                SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se ha realizado la actualización del estado de la tarea a en proceso', $qcontrap->cliente, 'CAMBIO_DE_ESTADO', Session::get('webdata')['id_plataforma'], $id, Session::get('usuario')->user_id), 'selectOne');
            }
            $msg = $result ? 'El mensaje fue enviado correctamente.' : 'La dirección de e-mail es inválida.';
            $error = $result ? 0 : 1;
            //
            return json_encode(array('error' => $error, 'mensaje' => $msg));
        } else {
            return json_encode(array('error' => 1, 'mensaje' => 'La dirección de e-mail es inválida.'));
        }
    }

    // FUNCION QUE DEVUELVE LA ACTIVIDAD DE CARGAR UN DOCUMENTO ESPECIFICO
    private static function tareaCargaDocumento($cliente, $gestion, $contraparte, $tipo_doc) {
        $user_id = Session::get('usuario')->user_id;
        //--
        if ($tipo_doc != '') {
            //--
            $datos_doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, $user_id, null, null), 'select');
           
            // Verificar que $datos_doc no sea nulo o vacío
            if (!empty($datos_doc) && isset($datos_doc[0])) {
                $doc = SQLConnection::backendStoreProcedure(
                    'LN_docs_',
                    array('select', $datos_doc[0]->doc_id, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null),
                    'selectOne'
                );

                return view('informes-blue/actividades-tarea/cargar-docs')->with(compact('datos_doc', 'doc'));
            } else {
                return 'No se encontraron documentos.';
            }

        } else {
            return '0';
        }
    }

    // FUNCION QUE DEVUELVE LA BUSQUEDA DE JUICIOS
    public static function actualizacionJuicios() {
        //--
        $nombre_contraparte = Request::input('nombre_contraparte');
        $identificacion = Request::input('identificacion');
        //--
        return view('informes-blue/actividades-tarea/actualizar-juicios')->with(compact('identificacion', 'nombre_contraparte'));
    }

    // FUNCION QUE BUSCA LOS JUICIOS.
    public static function buscarJuicios() {
        //$menu = Misc::obtenerPermisosNavigatorNoCuit();
        //--
        $cuit = Request::input('cuit');
        $razon_social = Request::input('nombreb');
        //
        $tipoPersona = Misc::tipoPersona($cuit);
        // Preparo $razon_social para el CONTAINS()
        $razon_social = preg_replace("/[ \t]{2,}/", " ", trim($razon_social));
        $razon_social = '"*' . str_replace(' ', '*" NEAR "*', $razon_social) . '*"';
        $params = array($razon_social, 'D');
        //
        $juicios_demandado = SQLConnection::backendStoreProcedure('backend_buscar_juicios_sc', $params);
        foreach ($juicios_demandado as $key => $value) {
            if ($value->fecha_causa == null) {
                $juicios_demandado[$key]->fecha_causa = strval($value->anio) . '-01-01';
                $juicios_demandado[$key]->fecha_causa_dmy = $value->anio;
            }
        }
        $params = array($razon_social, 'A');
        $juicios_actor = SQLConnection::backendStoreProcedure('backend_buscar_juicios_sc', $params);
        foreach ($juicios_actor as $key => $value) {
            if ($value->fecha_causa == null) {
                $juicios_actor[$key]->fecha_causa = strval($value->anio) . '-01-01';
                $juicios_actor[$key]->fecha_causa_dmy = $value->anio;
            }
        }
        //
        return view('informes-blue/actividades-tarea/tabla_buscar_juicios_sin_cuit')->with(compact('juicios_demandado', 'juicios_actor', 'cuit', 'tipoPersona'));
    }

    // FUNCION QUE BUSCA LOS JUICIOS.
    public static function buscarJuiciosOrg() {
        $menu = Misc::obtenerPermisosNavigatorNoCuit();
        //--
        $cuit = Request::input('cuit');
        $razon_social = Request::input('nombreb');

        $tipoPersona = Misc::tipoPersona($cuit);
        // preparo $razon_social para el CONTAINS()
        $razon_social = preg_replace("/[ \t]{2,}/", " ", trim($razon_social));
        $razon_social = '"*' . str_replace(' ', '*" NEAR "*', $razon_social) . '*"';
        $params = array($razon_social, 'D');

        $juicios_demandado = SQLConnection::backendStoreProcedure('backend_buscar_juicios_sc', $params);
        foreach ($juicios_demandado as $key => $value) {
            if ($value->fecha_causa == null) {
                $juicios_demandado[$key]->fecha_causa = strval($value->anio) . '-01-01';
                $juicios_demandado[$key]->fecha_causa_dmy = $value->anio;
            }
        }
        $params = array($razon_social, 'A');
        $juicios_actor = SQLConnection::backendStoreProcedure('backend_buscar_juicios_sc', $params);
        foreach ($juicios_actor as $key => $value) {
            if ($value->fecha_causa == null) {
                $juicios_actor[$key]->fecha_causa = strval($value->anio) . '-01-01';
                $juicios_actor[$key]->fecha_causa_dmy = $value->anio;
            }
        }
        if (count($juicios_demandado) == 0) {
            echo json_encode(array("error" => 0, "mensaje" => "No hay juicios para dicha búsqueda"));
        } else {
            return view('informes-blue/actividades-tarea/tabla_buscar_juicios_sin_cuit')->with(compact('juicios_demandado', 'juicios_actor', 'menu', 'cuit', 'tipoPersona'));
        }
    }

    // FUNCION QUE DEVUELVE LA DISTRIBUCION DE LA TAREAS DE UN INFORME
    public static function distribuirTareas() {
        if (isset($_POST['informe'])) {
            $informe = Request::input('informe');
            //
            return self::tareasInforme($informe, 1);
        } else {
            return '0';
        }
    }

    // FUNCION QUE DEVUELVE LA FUNCION DE CARGAR PRENSA
    public static function cargarPrensa() {
        $contraparte = Request::input('contraparte');
        //
        $qcontrap = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('select', $contraparte, null, null, null, null, null, null, null, null, null, null, null, null, Session::get('usuario')->user_id), 'selectOne');
        $prensa = SQLConnection::backendStoreProcedure('LN_contraparte_prensa', array('backend_obtener_prensa', $contraparte, Session::get('usuario')->user_id), 'selectOne');
        $busqueda_google_nombre = explode(' ', $qcontrap->nombre_persona);
        $busqueda_google = '';
        if (count($busqueda_google_nombre) == 2) {
            $busqueda_google =
                '"' . $busqueda_google_nombre[0] . ' ' . $busqueda_google_nombre[1]
                . '"+OR+"' . $busqueda_google_nombre[1] . ', ' . $busqueda_google_nombre[0]
                . '"+OR+"' . $busqueda_google_nombre[0] . ' ' . substr($busqueda_google_nombre[1], 0, 1) . '."'
                . '"+OR+"' . $busqueda_google_nombre[1] . ' ' . substr($busqueda_google_nombre[0], 0, 1) . '."';
        } else if (count($busqueda_google_nombre) == 3) {
            $busqueda_google =
                '"' . $busqueda_google_nombre[1] . ' ' . $busqueda_google_nombre[2] . ' ' . $busqueda_google_nombre[0]
                . '"+OR+"' . $busqueda_google_nombre[0] . ', ' . $busqueda_google_nombre[1] . ' ' . $busqueda_google_nombre[2]
                . '"+OR+"' . $busqueda_google_nombre[0] . ', ' . $busqueda_google_nombre[1] . ' ' . substr($busqueda_google_nombre[2], 0, 1) . '.'
                . '"+OR+"' . $busqueda_google_nombre[0] . ', ' . substr($busqueda_google_nombre[1], 0, 1) . '. ' . substr($busqueda_google_nombre[2], 0, 1) . '.'
                . '"+OR+"' . $busqueda_google_nombre[1] . ' ' . $busqueda_google_nombre[0]
                . '"+OR+"' . $busqueda_google_nombre[0] . ', ' . $busqueda_google_nombre[1]
                . '"+OR+"' . $busqueda_google_nombre[0] . ' ' . substr($busqueda_google_nombre[1], 0, 1) . '."';

            /*
                } else if (count($busqueda_google_nombre) == 3) {
                $busqueda_google = 
                    '"' . $busqueda_google_nombre[2] . ' ' . $busqueda_google_nombre[1] . ' ' . $busqueda_google_nombre[0] 
                    . '"+OR+"' . $busqueda_google_nombre[0] . ', ' . $busqueda_google_nombre[1] . ' ' . $busqueda_google_nombre[2]
                    . '"+OR+"' . $busqueda_google_nombre[1] . ' ' . $busqueda_google_nombre[2] . ' ' . $busqueda_google_nombre[0]
                    . '"+OR+"' . $busqueda_google_nombre[0] . ', ' . $busqueda_google_nombre[2] . ' ' . $busqueda_google_nombre[1] 
                    . '"+OR+"' . $busqueda_google_nombre[0] . ', ' . $busqueda_google_nombre[2] . ' ' . substr($busqueda_google_nombre[1],0,1) . '.'
                    . '"+OR+"' . $busqueda_google_nombre[0] . ', ' . substr($busqueda_google_nombre[2],0,1) . '. ' . substr($busqueda_google_nombre[1],0,1) . '.'
                    . '"+OR+"' . $busqueda_google_nombre[2] . ' ' . $busqueda_google_nombre[0]
                    . '"+OR+"' . $busqueda_google_nombre[0] . ', ' . $busqueda_google_nombre[2]
                    . '"+OR+"' . $busqueda_google_nombre[2] . ' ' . substr($busqueda_google_nombre[0],0,1) . '."'
                    . '"+OR+"' . $busqueda_google_nombre[0] . ' ' . substr($busqueda_google_nombre[2],0,1) . '."';*/
        } else if (count($busqueda_google_nombre) == 4) {
            $busqueda_google =
                '"' . $busqueda_google_nombre[2] . ' ' . $busqueda_google_nombre[3] . ' ' . $busqueda_google_nombre[0] . ' ' . $busqueda_google_nombre[1]
                . '"+OR+"' . $busqueda_google_nombre[0] . ' ' . $busqueda_google_nombre[1] . ', ' . $busqueda_google_nombre[2] . ' ' . $busqueda_google_nombre[3] . '"';
        }
        $valor_valoracion = SQLConnection::backendStoreProcedure('LN_contraparte_prensa', array('backend_obtener_valoracion', $contraparte, Session::get('usuario')->user_id, null, null, $qcontrap->cliente), 'selectOne');
        $valoracion = SQLConnection::backendStoreProcedure('LN_contraparte_prensa', array('backend_obtener_valoracion_todas', $contraparte, Session::get('usuario')->user_id, null, null, $qcontrap->cliente), 'select');
        //
        return view('/informes-blue/actividades-tarea/cargar-prensa')->with(compact('busqueda_google', 'qcontrap', 'valoracion', 'valor_valoracion', 'prensa'));
    }

    //-- FUNCION QUE DEVUELVE LA VISTA DE LA CARGA DE FIDECHECK AL MODAL DE EDICION TAREA
    public static function cargarFidecheck() {
        return view('/informes-blue/actividades-tarea/cargar-fidecheck');
    }

    public static function dagasFidelitas() {
        $contraparte = Request::input('contraparte');
        $informe = Request::input('informe');
        $tarea = Request::input('tarea');
        //
        $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        // dd($docs);
        foreach ($docs as $key => $doc) {
            if ($doc->estado_doc != 'N' || $doc->aplica == '0' || $doc->tipo_doc == env('TIPO_DOC_CODEM') || $doc->tipo_doc == env('TIPO_DOC_CERTIFICACION_NEGATIVA') || $doc->tipo_doc == env('TIPO_DOC_REFERENCIAS_ACADEMICAS') || $doc->tipo_doc == env('TIPO_DOC_REFERENCIA_LABORAL')) {
                unset($docs[$key]);
            }
        }
        //
        $iv_busqueda = SQLConnection::backendStoreProcedure('IV_busquedas_', array('search', NULL, $contraparte), 'selectOne');
        $cv = NULL;
        if ( !is_null($iv_busqueda) ){
            $cv = self::BuscarFotoCV($iv_busqueda);
            $cv = $cv->cv;
        }
        // $cv = env('URL_BASE_DOMAIN') . env('RUTA_DOCUMENTOS_IV') . '/' . $docs[0]->cliente . '/190279/188512/00007737_foto.JPG';
        // $cv = env('PATH_DOCUMENTOS_IV') . '/' . $docs[0]->cliente . '/190279/188512/00007737_foto.JPG';
        // dd(scandir($cv));
        return view('/informes-blue/actividades-tarea/tabla_dagas')->with(compact('docs', 'informe', 'tarea', 'cv'));
    }

    protected static function BuscarFotoCV($busqueda) {
        $foto_path = '';
        $foto_url = '';
        if (file_exists(env('PATH_DOCUMENTOS_IV') . '/' . $busqueda->foto)) {
            $foto_path = $busqueda->contraparte . '.pdf';
            $foto_url = env('RUTA_DOCUMENTOS_IV') . '/' . $busqueda->foto;
        }
        // busqueda del cv y la foto de perfil
        $rootpath = env('PATH_DOCUMENTOS_IV') . '/' . $busqueda->cliente . '/' . $busqueda->contraparte . '/' . $busqueda->gestion;
        $pattern = str_pad($busqueda->iv_busqueda, 8, '0', STR_PAD_LEFT) . '_*.*';
        $cv_exists = FALSE;
        $cv_full_url = NULL;
        $cv_url = NULL;
        $foto_exists = FALSE;
        $foto_full_url = NULL;
        //
        if (is_dir($rootpath)) {
            //
            $files = glob($rootpath . '/' . $pattern);
            foreach ($files as $f => $file) {
                $extn = strtolower(substr($file, strrpos($file, '.') + 1));
                //
                if ($cv_full_url == NULL) {
                    if ($extn == 'pdf' or $extn == 'doc' or $extn == 'docx') {
                        $cv_file = basename($file);
                        //
                        $cv_full_url = env('RUTA_DOCUMENTOS_IV') . '/' . $busqueda->cliente . '/' . $busqueda->contraparte . '/' . $busqueda->gestion . '/' . $cv_file . '?r=' . time();
                        $cv_url = env('PATH_DOCUMENTOS_IV') . '/' . $busqueda->cliente . '/' . $busqueda->contraparte . '/' . $busqueda->gestion . '/' . $cv_file;
                        //
                        $cv_exists = TRUE;
                    }
                }
                //
                if ($foto_full_url == NULL) {
                    if ($extn == 'jpg' or $extn == 'png') {
                        $foto_file = basename($file);
                        if ($foto_file == str_pad($busqueda->iv_busqueda, 8, '0', STR_PAD_LEFT) . '_foto_sq.' . $extn) {
                            $foto_full_url = env('RUTA_DOCUMENTOS_IV') . '/' . $busqueda->cliente . '/' . $busqueda->contraparte . '/' . $busqueda->gestion . '/' . $foto_file . '?r=' . time();
                            $foto_exists = TRUE;
                        }
                    }
                }
            }
        }
        //
        $resultado = (object) [];
        $resultado->foto_perfil = $foto_full_url;
        $resultado->cv = $cv_full_url;
        // $resultado->cv = env('RUTA_DOCUMENTOS_IV') . '/' . $busqueda->cliente . '/' . $busqueda->contraparte . '/' . $busqueda->gestion . '/test.pdf';
        $resultado->cv_path = $cv_url;
        return $resultado;
    }

    /**
     * @access public
     */
    public static function CargarInformeExterior() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        //
        $score = NULL;
        $motivo = NULL;
        $ruta_informe_comercial_exterior = NULL;
        $nombre_doc = NULL;
        // obtenemos el archivo del documento antecedentes comerciales
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        $nombre_doc = $doc->nombre_tipo_doc;
        if ($doc && $doc->estado_doc == 'V') {
            $path = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
            //
            if (file_exists($path)) {
                $ruta_informe_comercial_exterior = env('RUTA_DOCUMENTOS_CLOUD') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
            }
        }
        // obtenemos el score y la descripcion
        $score_res = SQLConnection::backendStoreProcedure('LN_dashboard_cliente', array('indicadores_contraparte', NULl, NULL, NULL, $contraparte, 'SCORE_IC'), 'selectOne');
        if (isset($score_res)) {
            $score = $score_res->valor;
            $motivo = $score_res->valor_memo;
        }
        //
        return view('/informes-blue/actividades-tarea/cargar-informe-comercial-exterior', ['archivo' => $ruta_informe_comercial_exterior, 'score' => $score, 'motivo' => $motivo, 'nombre_doc' => $nombre_doc, 'contraparte' => $contraparte]);
    }


    /////////////// CRIMINAL CHECK COLOMBIA //////////////////

    /**
     * Funcion que devuelve la actividad
     * de verificar la cedula de Colombia
     * @access public
     * @return string
     */
    public static function verificarCedulaColombianaOrg() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        // buscar el dni
        $contrap = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('select', $contraparte, null, null, null, null, null, null, null, null, null, null, null, null, Session::get('usuario')->user_id), 'selectOne');
        $ident = SQLConnection::backendStoreProcedure('backend_obtener_identificadores_pais', array($contrap->country_code, 'F'));
        //
        $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        $ruta_dni1 = null;
        $ruta_dni2 = null;
        $docid_cedula = NULL;
        //       
        foreach ($docs as $doc) {
            if ($doc->es_dni == '1') {
                $path_dni1 = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/1_dni_' . $doc->contraparte . '_' . $doc->gestion . '.png';
                $path_dni2 = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/2_dni_' . $doc->contraparte . '_' . $doc->gestion . '.png';
                $files_array = ['.png', '.pdf', '.jpeg', '.jpg'];
                // foreach ($files_array as $end) {
                foreach ($files_array as $e) {
                    $path_dni1 = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/1_dni_' . $doc->contraparte . '_' . $doc->gestion . $e;
                    $path_dni2 = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/2_dni_' . $doc->contraparte . '_' . $doc->gestion . $e;
                    if (file_exists($path_dni1) && !$ruta_dni1) {
                        $ruta_dni1 = env('RUTA_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/1_dni_' . $doc->contraparte . '_' . $doc->gestion . $e;
                    }
                    if (file_exists($path_dni2) && !$ruta_dni2) {
                        $ruta_dni2 = env('RUTA_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/2_dni_' . $doc->contraparte . '_' . $doc->gestion . $e;
                    }
                }
                //
                $docid_cedula = $doc->doc_id;
                // }
            } elseif ($doc->tipo_doc == '1248') {
                // Form de carga
                $flds = self::generarCamposDocumento($doc->doc_id);
                $flds = $flds['data']['Residence address'];
            } elseif ($doc->tipo_doc == '1251') {
                // Certificado de Cedula Colombiana
                $tipo_doc = $doc->tipo_doc;
            }
        }
        //mando el estado del documento
        $documentoColombia = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        $doc_id = $documentoColombia->doc_id;
        $estadoDocumento = self::generarCamposDocumento($doc_id);
        //
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        $fld = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doc->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL), 'selectOne');
        //
        $ruta_cert_cedula = NULL;
        //
        if ($doc) {
            $path = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
            //
            if (file_exists($path)) {
                $ruta_cert_cedula = env('RUTA_DOCUMENTOS_CLOUD') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
            }
        }
        //
        $dom_nacimiento = NULL;
        $dom_id = NULL;
        $dom_vivienda = NULL;
        //
        $domicilios = SQLConnection::obtenerDomicilios($contrap->identificacion);
        foreach ($domicilios as $domicilio) {
            if ($domicilio->tipo_domicilio == 'N') {
                $dom_nacimiento = $domicilio;
            } elseif ($domicilio->tipo_domicilio == 'I') {
                $dom_id = $domicilio;
            } elseif ($domicilio->tipo_domicilio == 'V') {
                $dom_vivienda = $domicilio;
            }
        }
        //
        return view('/informes-blue/actividades-tarea/validar_id_colombia', compact('tipo_doc', 'ruta_cert_cedula', 'ruta_dni1', 'ruta_dni2', 'cliente', 'contraparte', 'gestion', 'tipo_doc', 'fld', 'contrap', 'ident', 'flds', 'estadoDocumento', 'docid_cedula', 'dom_nacimiento', 'dom_id', 'dom_vivienda'));
    }

    public static function verificarCedulaColombiana() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        // buscar el dni
        $contrap = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('select', $contraparte, null, null, null, null, null, null, null, null, null, null, null, null, Session::get('usuario')->user_id), 'selectOne');
        $ident = SQLConnection::backendStoreProcedure('backend_obtener_identificadores_pais', array($contrap->country_code, 'F'));
        //
        $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        //
        $doc_certificacion = NULL;
        $ruta_dni1 = NULL;
        $ruta_dni2 = NULL;
        $docid_cedula = NULL;
        // 1. buscar los archivos cargados de cada doc
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        if ($doc->es_dni == '1') {
            $files_array = ['.png', '.pdf', '.jpeg', '.jpg'];
            //
            foreach ($files_array as $e) {
                $path_dni1 = env('PATH_DOCUMENTOS') . DIRECTORY_SEPARATOR . $doc->cliente . DIRECTORY_SEPARATOR . $doc->contraparte . DIRECTORY_SEPARATOR . $doc->gestion . '/1_dni_' . $doc->contraparte . '_' . $doc->gestion . $e;
                $path_dni2 = env('PATH_DOCUMENTOS') . DIRECTORY_SEPARATOR . $doc->cliente . DIRECTORY_SEPARATOR . $doc->contraparte . DIRECTORY_SEPARATOR . $doc->gestion . '/2_dni_' . $doc->contraparte . '_' . $doc->gestion . $e;
                if (is_null($ruta_dni1) && file_exists($path_dni1)) {
                    $ruta_dni1 = env('RUTA_DOCUMENTOS') . DIRECTORY_SEPARATOR . $doc->cliente . DIRECTORY_SEPARATOR . $doc->contraparte . DIRECTORY_SEPARATOR . $doc->gestion . '/1_dni_' . $doc->contraparte . '_' . $doc->gestion . $e;
                }
                if (is_null($ruta_dni2) && file_exists($path_dni2)) {
                    $ruta_dni2 = env('RUTA_DOCUMENTOS') . DIRECTORY_SEPARATOR . $doc->cliente . DIRECTORY_SEPARATOR . $doc->contraparte . DIRECTORY_SEPARATOR . $doc->gestion . '/2_dni_' . $doc->contraparte . '_' . $doc->gestion . $e;
                }
            }
        }
        //
        $estados = NULL;
        $doc_id_evidencia = NULL;
        $evidencia_cargada = false;
        $ruta_evidencia_dni1 = NULL;
        $ruta_evidencia_dni2 = NULL;
        $ruta_cert_cedula = NULL;
        $fld = NULL;
        //
        foreach ($docs as $doci) {
            if ($doci->tipo_doc == '1248') {
                // Domicilio Cargado por el cliente
                $flds = self::generarCamposDocumento($doci->doc_id);
                $flds = $flds['data']['Residence address'];
                foreach ($flds as $key => $value) {
                    if ($value->tipo_campo == 'S' && $value->campo == '1326') {
                        $estados = $value->opciones[0];
                    }
                }
            } elseif ($doci->tipo_doc == '1251') {
                // 3. ver si estan cargados las evidencias de Cert de Cedu
                $doc_certificacion = $doci;
                $path = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $doci->cliente . DIRECTORY_SEPARATOR . $doci->contraparte . DIRECTORY_SEPARATOR . $doci->gestion . '/evidencias/' . $doci->doc_id . '.pdf';
                //
                if (file_exists($path)) {
                    $ruta_cert_cedula = env('RUTA_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $doci->cliente . DIRECTORY_SEPARATOR . $doci->contraparte . DIRECTORY_SEPARATOR . $doci->gestion . '/evidencias/' . $doci->doc_id . '.pdf';
                }
                //
                $fld = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doci->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL), 'selectOne');
            } elseif ($doci->es_evidencia && $doci->es_dni) {
                // Doc: Evidencia del foto de DNI
                $doc_id_evidencia = $doci->doc_id;
                $path_evidencia_dni1 = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $doci->cliente . DIRECTORY_SEPARATOR . $doci->contraparte . DIRECTORY_SEPARATOR . $doci->gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . '1_dni.png';
                $path_evidencia_dni2 = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $doci->cliente . DIRECTORY_SEPARATOR . $doci->contraparte . DIRECTORY_SEPARATOR . $doci->gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . '2_dni.png';
                // Evidencia de los foto de tax_id
                if (file_exists($path_evidencia_dni1)) {
                    $ruta_evidencia_dni1 = env('RUTA_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $doci->cliente . DIRECTORY_SEPARATOR . $doci->contraparte . DIRECTORY_SEPARATOR . $doci->gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . '1_dni.png';
                    $evidencia_cargada = true;
                }
                if (file_exists($path_evidencia_dni2)) {
                    $ruta_evidencia_dni2 = env('RUTA_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $doci->cliente . DIRECTORY_SEPARATOR . $doci->contraparte . DIRECTORY_SEPARATOR . $doci->gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . '2_dni.png';
                    $evidencia_cargada = true;
                }
            }
        }
        // 4. domicilios y padron
        $contrap = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('select', $contraparte, null, null, null, null, null, null, null, null, null, null, null, null, Session::get('usuario')->user_id), 'selectOne');
        $ident = SQLConnection::backendStoreProcedure('backend_obtener_identificadores_pais', array($contrap->country_code, 'F'));
        //
        $dom_nacimiento = NULL;
        $dom_id = NULL;
        $dom_vivienda = NULL;
        //
        $domicilios = SQLConnection::obtenerDomicilios($contrap->identificacion);
        foreach ($domicilios as $domicilio) {
            if ($domicilio->tipo_domicilio == 'N') {
                $dom_nacimiento = $domicilio;
            } elseif ($domicilio->tipo_domicilio == 'I') {
                $dom_id = $domicilio;
            } elseif ($domicilio->tipo_domicilio == 'V') {
                $dom_vivienda = $domicilio;
            }
        }
        //
        return view('/informes-blue/actividades-tarea/validar_id_colombia', compact('doc', 'doc_certificacion', 'ruta_dni1', 'ruta_dni2', 'ruta_evidencia_dni1', 'ruta_evidencia_dni2', 'contrap', 'ident', 'evidencia_cargada', 'doc_id_evidencia', 'ruta_cert_cedula', 'flds', 'dom_nacimiento', 'dom_id', 'dom_vivienda', 'estados'));
    }

    public function guardarDomicilioColombia() {
        if (isset($_POST['docid']) && ((isset($_POST['seccion_ciudad']) && isset($_POST['campo_ciudad']) && isset($_POST['ciudad'])) || (isset($_POST['seccion_domicilio']) && isset($_POST['campo_domicilio']) && isset($_POST['domicilio'])) || (isset($_POST['seccion_depto']) && isset($_POST['campo_depto']) && isset($_POST['departamento'])))) {
            $docid = Request::input('docid');
            $seccion_ciudad = Request::input('seccion_ciudad');
            $seccion_domicilio = Request::input('seccion_domicilio');
            $seccion_depto = Request::input('seccion_depto');
            $campo_ciudad = Request::input('campo_ciudad');
            $campo_domicilio = Request::input('campo_domicilio');
            $campo_depto = Request::input('campo_depto');
            $ciudad = Request::input('ciudad');
            $domicilio = Request::input('direccion');
            $departamento = Request::input('departamento');
            if (!empty($seccion_ciudad) && !empty($campo_ciudad) && !empty($ciudad)) {
                $city = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $seccion_ciudad, $campo_ciudad, null, $ciudad, null, null, null, null), 'selectOne');
            }
            if (!empty($seccion_domicilio) && !empty($campo_domicilio) && !empty($domicilio)) {
                $dom = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $seccion_domicilio, $campo_domicilio, null, $domicilio, null, null, null, null), 'selectOne');
            }
            if (!empty($seccion_depto) && !empty($campo_depto) && !empty($departamento)) {
                $depto = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $seccion_depto, $campo_depto, null, $departamento, null, null, null, null), 'selectOne');
            }
            return 1;
        }
        return 0;
    }

    /**
     * Funcion que devuelve la actividad de Colombia
     * @access public
     * @return string
     */
    public static function antecedentesColombia() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        //
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        $doc_es = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
        //
        $ruta_antecedentes = null;
        $path_antecedentes = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc->doc_id . '.pdf';
        //
        if (file_exists($path_antecedentes)) {
            $ruta_antecedentes = env('RUTA_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc->doc_id . '.pdf';
        }
        //envia el estado del documento
        $doc_id = $doc->doc_id;
        $estadoDocumento = self::generarCamposDocumento($doc_id);
        //
        return view('/informes-blue/actividades-tarea/valorar_cert_pol_colombia', compact('contraparte', 'cliente', 'gestion', 'tipo_doc', 'doc_es', 'ruta_antecedentes', 'estadoDocumento'));
    }

    /**
     * Funcion que tiene los datos
     * de juicios penales de Colombia
     * @access public
     * @static
     * @return string
     */
    public static function juiciosPenalesColombia() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        $doc_id = "";
        //
        if (!is_null($tipo_doc)) {
            $documentoColombia = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
            $doc_id = $documentoColombia->doc_id;
        } else {
            return 'El tipo del documento no esta disponible';
        }
        //
        Traducciones::$blade = 'juicios_penales_colombia';
        $flds = self::generarCamposDocumento($doc_id, 'juicios_penales_colombia');
        $doc_es = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
        //        
        $ruta_juicios = null;
        $path_juicios = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc_es->doc_id . '.pdf';
        if (file_exists($path_juicios)) {
            $ruta_juicios = env('RUTA_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc_es->doc_id . '.pdf';
        }
        //
        $cant_juicios = 0;
        $sin_datos = 0;
        //
        if (empty($flds['data']['Carga de Juicios'][0]->values['1']['3']['valor_texto'])) {
            $sin_datos = 1;
        } else {
            foreach ($flds['data']['Carga de Juicios'][0]->values as $fila) {
                if (!empty($fila['3']['valor_texto'])) {
                    $cant_juicios++;
                }
            }
        }
        //
        $domicilios = SQLConnection::obtenerDomicilios($doc_es->identificacion);
        //
        return view('/informes-blue/actividades-tarea/juicios_penales_colombia', compact('contraparte', 'cliente', 'gestion', 'tipo_doc', 'flds', 'doc_id', 'ruta_juicios', 'sin_datos', 'doc_es', 'cant_juicios', 'docs', 'domicilios'));
    }

    /**
     * 
     */
    public static function verificarConsentimientoColombiana() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        // buscar el dni
        $contrap = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('select', $contraparte, null, null, null, null, null, null, null, null, null, null, null, null, Session::get('usuario')->user_id), 'selectOne');
        //
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        $doc_evidencia = NULL;
        //
        $ruta_consentimiento = NULL;
        $es_verificado = false;
        //
        if (isset($doc->consentimiento) && $doc->consentimiento == 1) {
            $path_consentimiento = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
            if (file_exists($path_consentimiento)) {
                $ruta_consentimiento = env('RUTA_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
            }
        }
        //
        $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        $docs_carga = [];
        //
        foreach ($docs as $doc) {
            if ($doc->tipo_doc == '1275') {
                $doc_evidencia = $doc;
                $path_evidencia = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc->doc_id . '.pdf';
                if (file_exists($path_evidencia)) {
                    $es_verificado = true;
                }
            }
        }
        //
        return view('/informes-blue/actividades-tarea/validar_consentimiento')->with(compact('ruta_consentimiento', 'doc', 'contraparte', 'cliente', 'gestion', 'tipo_doc', 'es_verificado', 'doc_evidencia'));
    }

    public static function guardarEvidenciaConsentimiento() {
        if (isset($_POST['cliente']) && isset($_POST['contraparte']) && isset($_POST['gestion']) && isset($_POST['tipo_doc'])) {
            $cliente = Request::input('cliente');
            $contraparte = Request::input('contraparte');
            $gestion = Request::input('gestion');
            $tipo_doc = Request::input('tipo_doc');
            $doc_id = decrypt(Request::input('doc_id'));
            //
            $doc_es = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
            $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
            //
            $path_consentimiento = env('PATH_DOCUMENTOS') . DIRECTORY_SEPARATOR . $doc->cliente . DIRECTORY_SEPARATOR . $doc->contraparte . DIRECTORY_SEPARATOR . $doc->gestion . DIRECTORY_SEPARATOR . $doc->doc_id . '.pdf';
            if (file_exists($path_consentimiento)) {
                //          
                $path_evidencia = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente;
                //
                if (!is_dir($path_evidencia)) {
                    mkdir($path_evidencia);
                }
                $path_evidencia .= DIRECTORY_SEPARATOR . $contraparte;
                //
                if (!is_dir($path_evidencia)) {
                    mkdir($path_evidencia);
                }
                $path_evidencia .= DIRECTORY_SEPARATOR . $gestion;
                //
                if (!is_dir($path_evidencia)) {
                    mkdir($path_evidencia);
                }
                $path_evidencia .= DIRECTORY_SEPARATOR . 'evidencias';
                if (!is_dir($path_evidencia)) {
                    mkdir($path_evidencia);
                }
                //
                $path_evidencia .= DIRECTORY_SEPARATOR . $doc_es->doc_id . '.pdf';
                //
                if (file_exists($path_evidencia)) {
                    unlink($path_evidencia);
                }
                //
                copy($path_consentimiento, $path_evidencia);
                SQLConnection::logTrazabilidad('El formulario de Consentimiento guardado como evidencia', 'VERIF_CONSENT_FORM', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, '10', $doc->cliente, $doc->contraparte, null, null, null, null, null, NULL, NULL);
            } else {
                return Response::JSON(['error' => 1, 'mensaje' => 'No se encontro el Archivo de consentimiento']);
            }
            //
            return Response::JSON(['error' => 0, 'mensaje' => 'OK']);
        }
        //
        return Response::JSON(['error' => 1, 'mensaje' => 'Datos Invalidos']);
    }

    public static function guardarEvidenciaConsentimientoOrg() {
        if (isset($_POST['cliente']) && isset($_POST['contraparte']) && isset($_POST['gestion']) && isset($_POST['tipo_doc'])) {
            $cliente = Request::input('cliente');
            $contraparte = Request::input('contraparte');
            $gestion = Request::input('gestion');
            $tipo_doc = Request::input('tipo_doc');
            //
            $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
            //            
            $path = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente;
            //
            if (!is_dir($path)) {
                mkdir($path);
            }
            $path .= DIRECTORY_SEPARATOR . $contraparte;
            //
            if (!is_dir($path)) {
                mkdir($path);
            }
            $path .= DIRECTORY_SEPARATOR . $gestion;
            //
            if (!is_dir($path)) {
                mkdir($path);
            }
            $path .= DIRECTORY_SEPARATOR . 'evidencias';
            if (!is_dir($path)) {
                mkdir($path);
            }
            //
            $path .= DIRECTORY_SEPARATOR . 'consentimiento.pdf';
            //
            if ($doc->consentimiento == 1) {
                $path_consentimiento = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
                if (file_exists($path_consentimiento)) {
                    copy($path_consentimiento, $path);
                    SQLConnection::logTrazabilidad('El formulario de Consentimiento guardado como evidencia', 'VERIF_CONSENT_FORM', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, '10', $doc->cliente, $doc->contraparte, null, null, null, null, null, NULL, NULL);
                } else {
                    return Response::JSON(['error' => 1, 'mensaje' => 'No se encontro el Archivo de consentimiento']);
                }
            }
            //
            return Response::JSON(['error' => 0, 'mensaje' => 'OK']);
        }
        //
        return Response::JSON(['error' => 1, 'mensaje' => 'Datos Invalidos']);
    }

    //////////////////////////////////////////////////////
    //////////////// PROCURADURIA COLOMBIA //////////////
    /////////////////////////////////////////////////////

    /**
     * Funcion que tiene los datos
     * de procuraduria de Colombia
     * @access public
     * @static
     * @return string
     */
    public function procuraduriaColombia() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        //
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        $doc_es = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
        //
        $flds = self::generarCamposDocumento($doc->doc_id);
        $flds = $flds['data'];
        //
        $proc_data = [];
        //
        $path = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc->doc_id . '.pdf';
        $ruta = NULL;
        if (file_exists($path)) {
            $ruta = env('RUTA_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc->doc_id . '.pdf';
        }
        //
        $inhabilidades = [];
        $descartados = [];
        $siris = self::procesarSiris($flds, $descartados);
        //
        if (!empty($siris)) {
            self::procesarDatosSiri($flds, $siris, $inhabilidades);
        }
        $cant_inhabilidades = count($inhabilidades);
        /* foreach( $flds as $seccion_name => $seccion ){
            foreach( $seccion as $campo ){
                for($x=1;$x <= $campo->filas;$x++){
                    $proc_data[$x][] = $campo->values[$x];
                }
            }
            break;
        } */
        //
        return view('/informes-blue/actividades-tarea/procuraduria_colombia')->with(compact('contraparte', 'cliente', 'gestion', 'doc', 'flds', 'siris', 'ruta', 'descartados', 'inhabilidades', 'cant_inhabilidades', 'doc_es'));
    }

    /**
     * @access private
     * @param array
     * @static
     */
    private function procesarSiris($flds, &$descartados) {
        $siris = [];
        //
        foreach ($flds as $seccion_nombre => $seccion) {
            foreach ($seccion as $campo) {
                if ($campo->campo == '1330') {
                    foreach ($campo->values as $fila) {
                        if ($fila[1]['etiqueta'] == 'Siri' && $fila[1]['valor_numerico']) {
                            if ($fila[2]['valor_numerico'] != '1') {
                                $siris[$fila[1]['valor_numerico']] = NULL;
                            } else {
                                $descartados[$fila[1]['valor_numerico']] = 1;
                            }

                        }
                    }
                }
            }
        }
        return $siris;
    }

    /**
     * @access private
     * @static
     * @param array
     * @param array
     * @return void
     */
    private static function procesarDatosSiri($flds, &$siris, &$inhabilidades) {
        //
        foreach ($flds as $seccion_nombre => $seccion) {
            foreach ($seccion as $campo) {
                if ($campo->campo == '1331') {
                    foreach ($campo->values as $fila) {
                        $siri = 0;
                        //
                        foreach ($fila as $col) {
                            if ($col['etiqueta'] == 'Siri') {
                                $siri = $col['valor_numerico'];
                            } elseif ($siri) {
                                if ($col['tipo_campo'] == 'N') {
                                    $siris[$siri]['sanciones'][$col['etiqueta']][] = $col['valor_numerico'];
                                } elseif ($col['tipo_campo'] == 'T') {
                                    $siris[$siri]['sanciones'][$col['etiqueta']][] = $col['valor_texto'];
                                } elseif ($col['tipo_campo'] == 'M') {
                                    $siris[$siri]['sanciones'][$col['etiqueta']][] = $col['valor_texto'];
                                } elseif ($col['tipo_campo'] == 'D') {
                                    $siris[$siri]['sanciones'][$col['etiqueta']][] = $col['valor_fecha_str'];
                                }
                            }
                        }
                    }
                    // sanciones
                } elseif ($campo->campo == '1332') {
                    foreach ($campo->values as $fila) {
                        $siri = 0;
                        //
                        foreach ($fila as $col) {
                            if ($col['etiqueta'] == 'Siri') {
                                $siri = $col['valor_numerico'];
                            } elseif ($siri) {
                                if ($col['tipo_campo'] == 'N') {
                                    $siris[$siri]['delitos'][$col['etiqueta']][] = $col['valor_numerico'];
                                } elseif ($col['tipo_campo'] == 'T') {
                                    $siris[$siri]['delitos'][$col['etiqueta']][] = $col['valor_texto'];
                                } elseif ($col['tipo_campo'] == 'M') {
                                    $siris[$siri]['delitos'][$col['etiqueta']][] = $col['valor_texto'];
                                } elseif ($col['tipo_campo'] == 'D') {
                                    $siris[$siri]['delitos'][$col['etiqueta']][] = $col['valor_fecha_str'];
                                }
                            }
                        }
                    }
                    // delitos
                } elseif ($campo->campo == '1333') {
                    foreach ($campo->values as $fila) {
                        $siri = 0;
                        //
                        foreach ($fila as $col) {
                            if ($col['etiqueta'] == 'Siri') {
                                $siri = $col['valor_numerico'];
                            } elseif ($siri) {
                                if ($col['tipo_campo'] == 'N') {
                                    $siris[$siri]['instancias'][$col['etiqueta']][] = $col['valor_numerico'];
                                } elseif ($col['tipo_campo'] == 'T') {
                                    $siris[$siri]['instancias'][$col['etiqueta']][] = $col['valor_texto'];
                                } elseif ($col['tipo_campo'] == 'M') {
                                    $siris[$siri]['instancias'][$col['etiqueta']][] = $col['valor_texto'];
                                } elseif ($col['tipo_campo'] == 'D') {
                                    $siris[$siri]['instancias'][$col['etiqueta']][] = $col['valor_fecha_str'];
                                }
                            }
                        }
                    }
                    // instancias
                } elseif ($campo->campo == '1334') {
                    foreach ($campo->values as $fila) {
                        $siri = 0;
                        //
                        foreach ($fila as $col) {
                            if ($col['etiqueta'] == 'Siri') {
                                $siri = $col['valor_numerico'];
                            } elseif ($siri) {
                                if ($col['tipo_campo'] == 'N') {
                                    $siris[$siri]['eventos'][$col['etiqueta']][] = $col['valor_numerico'];
                                } elseif ($col['tipo_campo'] == 'T') {
                                    $siris[$siri]['eventos'][$col['etiqueta']][] = $col['valor_texto'];
                                } elseif ($col['tipo_campo'] == 'M') {
                                    $siris[$siri]['eventos'][$col['etiqueta']][] = $col['valor_texto'];
                                } elseif ($col['tipo_campo'] == 'D') {
                                    $siris[$siri]['eventos'][$col['etiqueta']][] = $col['valor_fecha_str'];
                                }
                            }
                        }
                    }
                    // eventos
                } elseif ($campo->campo == '1335') {
                    foreach ($campo->values as $fila) {
                        $siri = 0;
                        //
                        foreach ($fila as $col) {
                            if ($col['etiqueta'] == 'Siri') {
                                $siri = $col['valor_numerico'];
                            } elseif ($siri) {
                                if ($col['tipo_campo'] == 'N') {
                                    $inhabilidades[$siri][$col['etiqueta']] = $col['valor_numerico'];
                                } elseif ($col['tipo_campo'] == 'T') {
                                    $inhabilidades[$siri][$col['etiqueta']] = $col['valor_texto'];
                                } elseif ($col['tipo_campo'] == 'M') {
                                    $inhabilidades[$siri][$col['etiqueta']] = $col['valor_texto'];
                                } elseif ($col['tipo_campo'] == 'D') {
                                    $inhabilidades[$siri][$col['etiqueta']] = ($col['valor_fecha']) ? (new DateTime($col['valor_fecha'])) : NULL;
                                }
                            }
                        }
                    }
                    // inhabilidades
                }
            }
        }
        //
    }

    public function agregarInhabilidadProcuraduria() {
        if (isset($_POST['doc_id']) && is_numeric($_POST['doc_id'])) {
            $doc_id = Request::input('doc_id');
            //
            $inhabilidades_siri = Request::input('inhabilidad_siri');
            $inhabilidades_modulo = Request::input('inhabilidad_modulo');
            $inhabilidades_legal = Request::input('inhabilidad_legal');
            $inhabilidades_inicio = Request::input('inhabilidad_inicio');
            $inhabilidades_fin = Request::input('inhabilidad_fin');
            $cant_inhabilidades = (!is_null($inhabilidades_siri)) ? count($inhabilidades_siri) : 0;
            //
            if ($cant_inhabilidades > 0) {
                $flds = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doc_id, null, null, null, null, null, null, null, null), 'select');
                //
                foreach ($flds as $fld) {
                    if ($fld->campo == '1335') {
                        for ($i = 0; $i < $cant_inhabilidades; $i++) {
                            SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $doc_id, $fld->seccion, $fld->campo, NULL, NULL, $inhabilidades_siri[$i], ($i + 1), 1, null), 'selectOne');
                            SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $doc_id, $fld->seccion, $fld->campo, NULL, $inhabilidades_modulo[$i], NULL, ($i + 1), 2, null), 'selectOne');
                            SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $doc_id, $fld->seccion, $fld->campo, NULL, $inhabilidades_legal[$i], NULL, ($i + 1), 3, null), 'selectOne');
                            SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $doc_id, $fld->seccion, $fld->campo, $inhabilidades_inicio[$i], NULL, NULL, ($i + 1), 4, null), 'selectOne');
                            SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $doc_id, $fld->seccion, $fld->campo, $inhabilidades_fin[$i], NULL, NULL, ($i + 1), 5, null), 'selectOne');
                        }
                        break;
                    }
                }
            }
            //
            return json_encode(['error' => 0, 'mensaje' => 'Inhabilidades guardados con exito.']);
        }
    }

    public function descartarSiriProcuraduria() {
        $user_id = Session::get('usuario')->user_id;
        $cliente = Request::input('cliente');
        $contraparte = Request::input('contraparte');
        $gestion = Request::input('gestion');
        $doc_id = Request::input('doc_id');
        $siri = Request::input('siri');
        $cant_siris = Request::input('cant_siris');
        $cant_siris = intval($cant_siris);
        //
        $flds = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doc_id, null, null, null, null, null, null, null, null), 'select');
        //
        foreach ($flds as $campo) {
            if ($campo->campo == '1330') {
                $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($campo->doc_id, $campo->seccion, $campo->campo), 'select');
                //
                foreach ($c2 as $fila) {
                    if ($fila->etiqueta == 'Siri' && $fila->valor_numerico == $siri) {
                        SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fila->doc_id, $fila->seccion, $fila->campo, NULL, NULL, 1, $fila->fila, 2, null), 'selectOne');
                        break;
                    }
                }
            }
        }
        //
        $valoracion = ($cant_siris > 0) ? ($cant_siris - 1) : 0;
        SQLConnection::backendStoreProcedure('LN_docs_', array('VALORACION', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, $user_id, $valoracion), 'selectOne');
        $this->procesarHitContraparte($contraparte);
        //
        return json_encode(['error' => 0, 'mensaje' => 'Siri descartado con exito.']);
    }

    public function rescatarSiriProcuraduria() {
        $user_id = Session::get('usuario')->user_id;
        $cliente = Request::input('cliente');
        $contraparte = Request::input('contraparte');
        $gestion = Request::input('gestion');
        $doc_id = Request::input('doc_id');
        $siri = Request::input('siri');
        $cant_siris = Request::input('cant_siris');
        $cant_siris = intval($cant_siris);
        //
        $flds = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doc_id, null, null, null, null, null, null, null, null), 'select');
        //
        foreach ($flds as $campo) {
            if ($campo->campo == '1330') {
                $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($campo->doc_id, $campo->seccion, $campo->campo), 'select');
                //
                foreach ($c2 as $fila) {
                    if ($fila->etiqueta == 'Siri' && $fila->valor_numerico == $siri) {
                        SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fila->doc_id, $fila->seccion, $fila->campo, NULL, NULL, 0, $fila->fila, 2, null), 'selectOne');
                        break;
                    }
                }
            }
        }
        //
        $valoracion = $cant_siris + 1;
        SQLConnection::backendStoreProcedure('LN_docs_', array('VALORACION', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, $user_id, $valoracion), 'selectOne');
        $this->procesarHitContraparte($contraparte);
        //
        return json_encode(['error' => 0, 'mensaje' => 'Siri rescatado con exito.']);
    }

    /**
     * 
     */
    public function cargarProcuraduria() {
        if (isset($_POST['doc_id']) && is_numeric($_POST['doc_id'])) {
            $user_id = Session::get('usuario')->user_id;
            $doc_id = Request::input('doc_id');
            $contraparte = Request::input('contraparte');
            $cant_siris = Request::input('cant_siris');
            $cant_siris = intval($cant_siris);
            //
            $flds = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doc_id, null, null, null, null, null, null, null, null), 'select');
            $siri = Request::input('siri');
            //
            $ya_cargados = Request::input('ya_cargados');
            //
            $fila = 1;
            //
            $sin_siri = NULL;
            //
            foreach ($flds as $fld) {
                if ($fld->campo == '1330' && !$ya_cargados) {
                    $this->cargarSiri($fld, $siri, $ya_cargados);
                } elseif ($fld->campo == '1331') {
                    // sanciones
                    $this->cargarSanciones($fld, $siri, $ya_cargados);
                } elseif ($fld->campo == '1332') {
                    // delitos
                    $this->cargarDelitos($fld, $siri, $ya_cargados);
                } elseif ($fld->campo == '1333') {
                    // instancias
                    $this->cargarInstancias($fld, $siri, $ya_cargados);
                } elseif ($fld->campo == '1334') {
                    // eventos
                    $this->cargarEventos($fld, $siri, $ya_cargados);
                }
            }
            //
            $valoracion = ($cant_siris > 0) ? ($cant_siris + 1) : 0;
            SQLConnection::backendStoreProcedure('LN_docs_', array('VALORACION', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, $user_id, $valoracion), 'selectOne');
            $this->procesarHitContraparte($contraparte);
        }
    }

    private function cargarSiri($fld, $siri) {
        $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($fld->doc_id, $fld->seccion, $fld->campo), 'select');
        $cant_filas = count($c2);
        //
        $stop = 1;
        $i = 1;
        $v = 0;
        //
        while ($v < $cant_filas) {
            if (isset($c2[$v]) && $c2[$v]->col == '1') {
                if (!$c2[$v]->valor_numerico) {
                    $stop = $i;
                    break;
                }
                //
                $i++;
            }
            //
            $v++;
        }
        //
        $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, NULL, $siri, $stop, 1, null), 'selectOne');
        //
    }

    /**
     * Funcion que carga las sanciones
     * del siri
     * @access private
     */
    private function cargarSanciones($fld, $siri, $ya_cargados = 0) {
        $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($fld->doc_id, $fld->seccion, $fld->campo), 'select');
        $cant_filas = count($c2);
        //
        if (!isset($_POST['sancion']) || empty($_POST['sancion']) || (isset($_POST['sancion'][0]) && empty($_POST['sancion'][0]))) {
            return 0;
        }
        //
        $c_sanciones = count($_POST['sancion']);
        $sanciones = $_POST['sancion'];
        $terminos = $_POST['termino'];
        $clases = $_POST['clase'];
        $suspendida = $_POST['suspendida'];
        //
        if ($ya_cargados && !empty($sanciones)) {
            foreach ($c2 as $camp) {
                if ($camp->col == '1' && $siri == $camp->valor_numerico) {
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $sanciones[0], NULL, $camp->fila, $camp->col, null), 'selectOne');
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $terminos[0], NULL, $camp->fila, $camp->col, null), 'selectOne');
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $clases[0], NULL, $camp->fila, $camp->col, null), 'selectOne');
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $suspendida[0], NULL, $camp->fila, $camp->col, null), 'selectOne');
                    //
                    unset($sanciones[0]);
                    unset($terminos[0]);
                    unset($clases[0]);
                    unset($suspendida[0]);
                    //
                    array_values($sanciones);
                    array_values($terminos);
                    array_values($clases);
                    array_values($suspendida);
                }
            }
        }
        if (!empty($sanciones)) {
            //
            $stop = 1;
            $i = 1;
            $d = 0;
            //
            while ($d < $cant_filas) {
                if ($c2[$d]->col == '1') {
                    if (!$c2[$d]->valor_numerico) {
                        $stop = $i;
                        break;
                    }
                    $i++;
                }
                //
                $d++;
            }
            //
            $s = 0;
            for ($v = $stop; $v < ($stop + $c_sanciones); $v++) {
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, NULL, $siri, $v, 1, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $sanciones[$s], NULL, $v, 2, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $terminos[$s], NULL, $v, 3, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $clases[$s], NULL, $v, 4, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $suspendida[$s], NULL, $v, 5, null), 'selectOne');
                $s++;
            }
            //
        }
    }

    private function cargarDelitos($fld, $siri, $ya_cargados) {
        $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($fld->doc_id, $fld->seccion, $fld->campo), 'select');
        $cant_filas = count($c2);
        //
        if (!isset($_POST['descripcion_delito']) || empty($_POST['descripcion_delito']) || (isset($_POST['descripcion_delito'][0]) && empty($_POST['descripcion_delito'][0]))) {
            return 0;
        }
        //
        $c_del = count($_POST['descripcion_delito']);
        $del = $_POST['descripcion_delito'];
        //
        if ($ya_cargados && !empty($del)) {
            foreach ($c2 as $camp) {
                if ($camp->col == '1' && $siri == $camp->valor_numerico) {
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $del[0], NULL, $camp->fila, $camp->col, null), 'selectOne');
                    unset($del[0]);
                    array_values($del);
                }
            }
        }
        //
        if (!empty($del)) {
            $stop = 1;
            $i = 1;
            $d = 0;
            //
            while ($d < $cant_filas) {
                if ($c2[$d]->col == '1') {
                    if (!$c2[$d]->valor_numerico) {
                        $stop = $i;
                        break;
                    }
                    $i++;
                }
                //
                $d++;
            }
            //
            $s = 0;
            for ($v = $stop; $v < ($stop + $c_del); $v++) {
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, NULL, $siri, $v, 1, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $del[$s], NULL, $v, 2, null), 'selectOne');
                $s++;
            }
            //
        }

    }

    private function cargarInstancias($fld, $siri, $ya_cargados) {
        $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($fld->doc_id, $fld->seccion, $fld->campo), 'select');
        $cant_filas = count($c2);
        //
        if (!isset($_POST['nombre']) || empty($_POST['nombre']) || (isset($_POST['nombre'][0]) && empty($_POST['nombre'][0]))) {
            return 0;
        }
        //
        $c_nombres = count($_POST['nombre']);
        $nombres = $_POST['nombre'];
        $autoridad = $_POST['autoridad'];
        $fecha_prov = $_POST['fecha_prov'];
        $fecha_ef_jur = $_POST['fecha_ef_jur'];
        //
        if ($ya_cargados && !empty($nombres)) {
            foreach ($c2 as $camp) {
                if ($camp->col == '1' && $siri == $camp->valor_numerico) {
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $nombres[0], NULL, $camp->fila, $camp->col, null), 'selectOne');
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $autoridad[0], NULL, $camp->fila, $camp->col, null), 'selectOne');
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, $fecha_prov[0], NULL, NULL, $camp->fila, $camp->col, null), 'selectOne');
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, $fecha_ef_jur[0], NULL, NULL, $camp->fila, $camp->col, null), 'selectOne');
                    // 
                    unset($nombres[0]);
                    unset($autoridad[0]);
                    unset($fecha_prov[0]);
                    unset($fecha_ef_jur[0]);
                    //
                    array_values($nombres);
                    array_values($autoridad);
                    array_values($fecha_prov);
                    array_values($fecha_ef_jur);
                }
            }
        }
        if (!empty($nombres)) {
            //
            $stop = 1;
            $i = 1;
            $d = 0;
            //
            while ($d < $cant_filas) {
                if ($c2[$d]->col == '1') {
                    if (!$c2[$d]->valor_numerico) {
                        $stop = $i;
                        break;
                    }
                    //
                    $i++;
                }
                //
                $d++;
            }
            //
            $s = 0;
            for ($v = $stop; $v < ($stop + $c_nombres); $v++) {
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, NULL, $siri, $v, 1, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $nombres[$s], NULL, $v, 2, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $autoridad[$s], NULL, $v, 3, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, $fecha_prov[$s], NULL, NULL, $v, 4, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, $fecha_ef_jur[$s], NULL, NULL, $v, 5, null), 'selectOne');
                $s++;
            }
            //   
        }
    }

    private function cargarEventos($fld, $siri, $ya_cargados) {
        $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($fld->doc_id, $fld->seccion, $fld->campo), 'select');
        $cant_filas = count($c2);
        //
        if (!isset($_POST['nombre_causa']) || empty($_POST['nombre_causa']) || (isset($_POST['nombre_causa'][0]) && empty($_POST['nombre_causa'][0]))) {
            return 0;
        }
        //
        $c_nombres_causa = count($_POST['nombre_causa']);
        $nombres = $_POST['nombre_causa'];
        $entidad = $_POST['entidad'];
        $tipo_acto = $_POST['tipo_acto'];
        $fecha_acto = $_POST['fecha_acto'];
        //
        if ($ya_cargados && !empty($nombres)) {
            foreach ($c2 as $camp) {
                if ($camp->col == '1' && $siri == $camp->valor_numerico) {
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $nombres[0], NULL, $camp->fila, $camp->col, null), 'selectOne');
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $entidad[0], NULL, $camp->fila, $camp->col, null), 'selectOne');
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $tipo_acto[0], NULL, $camp->fila, $camp->col, null), 'selectOne');
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, $fecha_acto[0], NULL, NULL, $camp->fila, $camp->col, null), 'selectOne');
                    // 
                    unset($nombres[0]);
                    unset($entidad[0]);
                    unset($tipo_acto[0]);
                    unset($fecha_acto[0]);
                    //
                    array_values($nombres);
                    array_values($entidad);
                    array_values($tipo_acto);
                    array_values($fecha_acto);
                }
            }
        }
        //
        if (!empty($nombres)) {
            $stop = 1;
            $i = 1;
            $d = 0;
            //
            while ($d < $cant_filas) {
                if ($c2[$d]->col == '1') {
                    if (!$c2[$d]->valor_numerico) {
                        $stop = $i;
                        break;
                    }
                    $i++;
                }
                //
                $d++;
            }
            //
            $s = 0;
            for ($v = $stop; $v < ($stop + $c_nombres_causa); $v++) {
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, NULL, $siri, $v, 1, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $nombres[$s], NULL, $v, 2, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $entidad[$s], NULL, $v, 3, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, NULL, $tipo_acto[$s], NULL, $v, 4, null), 'selectOne');
                $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $fld->doc_id, $fld->seccion, $fld->campo, $fecha_acto[$s], NULL, NULL, $v, 5, null), 'selectOne');
                $s++;
            }
        }
        //
    }

    public function grabarValoracionDoc() {
        if (isset($_POST['doc_id']) && isset($_POST['valoracion'])) {
            $user_id = Session::get('usuario')->user_id;
            $doc_id = Request::input('doc_id');
            $contraparte = Request::input('contraparte');
            $valoracion = Request::input('valoracion');
            //
            $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
            //
            SQLConnection::backendStoreProcedure('LN_docs_', array('VALORACION', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, $user_id, $valoracion), 'selectOne');
            //  
            $this->procesarHitContraparte($contraparte);
            //
            $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se grabo la valoracion del documento ' . $doc->nombre_tipo_doc, $doc->cliente, 'GRABAR_HIT', Session::get('webdata')['id_plataforma'], $doc->contraparte, $user_id, NULL, env('IV_PRODUCTO'), NULL, NULL, NULL, NULL, NULL, NULL), 'selectOne');
            //
            return 1;
        } else {

            return 0;
        }
    }

    /**
     * @access private
     * @param string|int contraparte
     * @return void
     * Funcion que reprocesa si
     * la contraparte es hit o
     * no hit
     */
    private function procesarHitContraparte($contraparte) {
        $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        $valoracion = 0;
        $hit = 0;
        //
        foreach ($docs as $doc) {
            $valoracion += intval($doc->valoracion);
        }
        //        
        if ($valoracion > 0) {
            $hit = 1;
        }
        //
        SQLConnection::backendStoreProcedure('LN_contrapartes_', array('HITVALUE', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 'CC', NULL, NULL, 'AR', null, 'spa', null, NULL, NULL, NULL, 'F,C,L', $hit), 'selectOne');
    }

    /**
     * Funcion que tiene la actividad
     * de cargar el excel procuraduria de Colombia
     */
    public static function excelProcuraduriaColombia() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        //        
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        //
        $flds = self::generarCamposDocumento($doc->doc_id);
        //
        return view('/informes-blue/actividades-tarea/cargar_excel_procuraduria_colombia')->with(compact('contraparte', 'cliente', 'gestion', 'doc'));
    }

    /**
     * Funcion que tiene la actividad
     * de guardar el excel de procuraduria de Colombia
     * PARSEA EXCEL, NO PDF. HAY QUE CAMBIAR EL NOMBRE DE LA FUNCION
     */
    public static function procuraduriaPdfParser() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $docid = Request::input('doc_id');

        $file = Request::input('valorInputPdf');

        if ($_FILES['cargarExcel']['name'] !== '') {
            //Se harcodea el nombre del archivo para que no ocurran problemas
            //a la hora de subirlo
            $namePdf = $_FILES['cargarExcel']['name'];

            $namePdf = "archivoProcu.xlsx";

            $file_temp = $_FILES['cargarExcel']['tmp_name'];
            $pdf_path = '/var/www/html/compartido/excel-parser/' . $namePdf;

            if (!(move_uploaded_file($file_temp, $pdf_path))) {
                return 'error';
            }
            $result = shell_exec(escapeshellcmd("python3 /var/www/html/compartido/excel-parser/juiciosPenalesParser.py " . $pdf_path));
            $result_py = json_decode($result, true);
            unlink($pdf_path);


            $flds = self::generarCamposDocumento($docid);

            $siriAuxiliar = $result_py['Datos_Inhabilidades']['inhabilidad_siri'];

            $nuevoSiri = "";

            foreach ($flds['data']['Datos de Juicios'] as $h => $fld) {
                if ($fld->campo == '1330') {
                    // SIRI                    
                    $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($docid, $fld->seccion, $fld->campo), 'select');
                    $cant_filas = count($c2);

                    if (!isset($result_py['siri_procuraduria']['siri_D']) || empty($result_py['siri_procuraduria']['siri_D']) || $result_py['siri_procuraduria']['siri_D'] == 'SIRI') {
                        break;
                    }

                    $eliminarSiriPrefijo = $result_py['siri_procuraduria']['siri_D'];
                    $nuevoSiri = preg_replace("/^SIRI:/", "", $eliminarSiriPrefijo);

                    $stop = 1;
                    $i = 1;
                    $v = 0;

                    while ($v < $cant_filas) {
                        if (isset($c2[$v]) && $c2[$v]->col == '1') {
                            if (!$c2[$v]->valor_numerico) {
                                $stop = $i;
                                break;
                            }
                            $i++;
                        }
                        $v++;
                    }
                    $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, NULL, $nuevoSiri, $stop, 1, null), 'selectOne');
                } elseif ($fld->campo == '1331') {
                    //SANCIONES
                    $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($docid, $fld->seccion, $fld->campo), 'select');
                    $cant_filas = count($c2);

                    if (!isset($result_py['siri_sanciones']['sancion']) || empty($result_py['siri_sanciones']['sancion'])) {
                        break;
                    }

                    $c_sanciones = count($result_py['siri_sanciones']['sancion']);
                    $sanciones = $result_py['siri_sanciones']['sancion'];
                    $terminos = $result_py['siri_sanciones']['termino'];
                    $clases = $result_py['siri_sanciones']['clase'];
                    //$suspendida = $result_py['siri_sanciones']['suspendida'];


                    if (!empty($sanciones)) {

                        $stop = 1;
                        $i = 1;
                        $d = 0;

                        while ($d < $cant_filas) {
                            if ($c2[$d]->col == '1') {
                                if (!$c2[$d]->valor_numerico) {
                                    $stop = $i;
                                    break;
                                }
                                $i++;
                            }
                            $d++;
                        }
                        $s = 0;
                        for ($v = $stop; $v < ($stop + $c_sanciones); $v++) {
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, NULL, $nuevoSiri, $v, 1, null), 'selectOne');
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $sanciones[$s], NULL, $v, 2, null), 'selectOne');
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $terminos[$s], NULL, $v, 3, null), 'selectOne');
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $clases[$s], NULL, $v, 4, null), 'selectOne');
                            //$temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $suspendida, NULL, $v, 5, null), 'selectOne');
                            $s = $s + 1;
                        }
                    }
                } elseif ($fld->campo == '1332') {
                    //DELITOS                    
                    $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($docid, $fld->seccion, $fld->campo), 'select');
                    $cant_filas = count($c2);

                    if (!isset($result_py['siri_delitos']['descripcion_delito']) || empty($result_py['siri_delitos']['descripcion_delito'])) {
                        break;
                    }

                    $c_del = count($result_py['siri_delitos']['descripcion_delito']);
                    $del = $result_py['siri_delitos']['descripcion_delito'];

                    if (!empty($del)) {
                        $stop = 1;
                        $i = 1;
                        $d = 0;

                        while ($d < $cant_filas) {
                            if ($c2[$d]->col == '1') {
                                if (!$c2[$d]->valor_numerico) {
                                    $stop = $i;
                                    break;
                                }
                                $i++;
                            }
                            $d++;
                        }
                        $s = 0;
                        for ($v = $stop; $v < ($stop + $c_del); $v++) {
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, NULL, $nuevoSiri, $v, 1, null), 'selectOne');
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $del[$s], NULL, $v, 2, null), 'selectOne');
                            $s = $s + 1;
                        }
                    }
                } elseif ($fld->campo == '1333') {
                    //INSTANCIAS                    
                    $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($docid, $fld->seccion, $fld->campo), 'select');
                    $cant_filas = count($c2);

                    if (!isset($result_py['siri_instancias']['nombre']) || empty($result_py['siri_delitos']['descripcion_delito'])) {
                        break;
                    }

                    $c_nombres = count($result_py['siri_instancias']['nombre']);
                    $nombres = $result_py['siri_instancias']['nombre'];
                    $autoridad = $result_py['siri_instancias']['autoridad'];
                    $fecha_prov = $result_py['siri_instancias']['fecha_prov'];
                    $fecha_ef_jur = $result_py['siri_instancias']['fecha_ef_jur'];
                    //if (str_contains($fecha_prov, '/')) {
                    //    $porciones = explode("/", $fecha_prov);                
                    //    $date =  $porciones[0]. "-" . $porciones[1]. "-" . $porciones[2];
                    //    $dateFormat = date_create($date);
                    //    $fecha_prov = date_format($dateFormat, 'Y-m-d H:i:s');
                    //}                                        
                    //$date_prov =date_create($fecha_prov);
                    //$fecha_prov = date_format($date_prov,"Y/m/d H:i:s");
                    //$fecha_ef_jur = $result_py['siri_instancias']['fecha_ef_jur'];
                    //if (str_contains($fecha_ef_jur, '/')) {
                    //    $porciones = explode("/", $fecha_ef_jur);                
                    //    $date =  $porciones[0]. "-" . $porciones[1]. "-" . $porciones[2];
                    //    $dateFormat = date_create($date);
                    //    $fecha_ef_jur = date_format($dateFormat, 'Y-m-d H:i:s');
                    //}
                    //$date_ef_jur = date_create($fecha_prov);
                    //$fecha_ef_jur = date_format($date_ef_jur,"Y/m/d H:i:s");

                    if (!empty($nombres)) {

                        $stop = 1;
                        $i = 1;
                        $d = 0;

                        while ($d < $cant_filas) {
                            if ($c2[$d]->col == '1') {
                                if (!$c2[$d]->valor_numerico) {
                                    $stop = $i;
                                    break;
                                }
                                $i++;
                            }
                            $d++;
                        }
                        $s = 0;
                        for ($v = $stop; $v < ($stop + $c_nombres); $v++) {
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, NULL, $nuevoSiri, $v, 1, null), 'selectOne');
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $nombres[$s], NULL, $v, 2, null), 'selectOne');
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $autoridad[$s], NULL, $v, 3, null), 'selectOne');

                            if (str_contains($fecha_prov[$s], '/')) {
                                $porciones = explode("/", $fecha_prov[$s]);
                                $date = $porciones[0] . "-" . $porciones[1] . "-" . $porciones[2];
                                $dateFormat = date_create($date);
                                $fecha_prov = date_format($dateFormat, 'Y-m-d H:i:s');
                            }

                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, $fecha_prov[$s], NULL, NULL, $v, 4, null), 'selectOne');

                            if (str_contains($fecha_ef_jur[$s], '/')) {
                                $porciones = explode("/", $fecha_ef_jur[$s]);
                                $date = $porciones[0] . "-" . $porciones[1] . "-" . $porciones[2];
                                $dateFormat = date_create($date);
                                $fecha_ef_jur = date_format($dateFormat, 'Y-m-d H:i:s');
                            }
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, $fecha_ef_jur[$s], NULL, NULL, $v, 5, null), 'selectOne');
                            $s = $s + 1;
                        }
                    }
                } elseif ($fld->campo == '1334') {
                    //EVENTOS                    
                    $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($docid, $fld->seccion, $fld->campo), 'select');
                    $cant_filas = count($c2);
                    if (!isset($result_py['siri_eventos']['nombre_causa']) || empty($result_py['siri_eventos']['nombre_causa'])) {
                        break;
                    }


                    $c_nombres_causa = count($result_py['siri_eventos']['nombre_causa']);
                    $nombres = $result_py['siri_eventos']['nombre_causa'];
                    $entidad = $result_py['siri_eventos']['entidad'];
                    $tipo_acto = $result_py['siri_eventos']['tipo_acto'];
                    $fecha_acto = $result_py['siri_eventos']['fecha_acto'];
                    //$date_fecha_acto = date_create($fecha_acto);
                    //$fecha_acto = date_format($date_fecha_acto,"Y/m/d H:i:s");



                    if (!empty($nombres)) {
                        $stop = 1;
                        $i = 1;
                        $d = 0;

                        while ($d < $cant_filas) {
                            if ($c2[$d]->col == '1') {
                                if (!$c2[$d]->valor_numerico) {
                                    $stop = $i;
                                    break;
                                }
                                $i++;
                            }
                            $d++;
                        }
                        $s = 0;
                        for ($v = $stop; $v < ($stop + $c_nombres_causa); $v++) {
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, NULL, $nuevoSiri, $v, 1, null), 'selectOne');
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $nombres[$s], NULL, $v, 2, null), 'selectOne');
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $entidad[$s], NULL, $v, 3, null), 'selectOne');
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $tipo_acto[$s], NULL, $v, 4, null), 'selectOne');
                            $date_fecha_acto = date_create($fecha_acto[$s]);
                            $fecha_acto = date_format($date_fecha_acto, "Y/m/d H:i:s");
                            $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, $fecha_acto, NULL, NULL, $v, 5, null), 'selectOne');
                            $s = $s + 1;
                        }
                    }
                }
            }

            foreach ($flds['data']['Inhabilidades'] as $h => $fld) {
                //INHABILIDADES
                $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($docid, $fld->seccion, $fld->campo), 'select');
                $cant_filas = count($c2);
                if (!isset($result_py['Datos_Inhabilidades']['inhabilidad_modulo']) || empty($result_py['Datos_Inhabilidades']['inhabilidad_modulo'])) {
                    break;
                }

                $cant_inhabilidades = count($result_py['Datos_Inhabilidades']['inhabilidad_siri']);
                $inhabilidades_siri = $result_py['Datos_Inhabilidades']['inhabilidad_siri'];
                $inhabilidades_modulo = $result_py['Datos_Inhabilidades']['inhabilidad_modulo'];
                $inhabilidades_legal = $result_py['Datos_Inhabilidades']['inhabilidad_legal'];
                $inhabilidades_inicio = $result_py['Datos_Inhabilidades']['inhabilidad_inicio'];
                ////$porciones = explode("/", $inhabilidades_inicio);                
                ////$date =  $porciones[0]. "-" . $porciones[1]. "-" . $porciones[2];
                ////$dateFormat = date_create($date);
                ////$inhabilidades_inicio = date_format($dateFormat, 'Y-m-d H:i:s');
                $inhabilidades_fin = $result_py['Datos_Inhabilidades']['inhabilidad_fin'];
                if (!empty($cant_inhabilidades)) {
                    $stop = 1;
                    $i = 1;
                    $d = 0;

                    while ($d < $cant_filas) {
                        if ($c2[$d]->col == '1') {
                            if (!$c2[$d]->valor_numerico) {
                                $stop = $i;
                                break;
                            }
                            $i++;
                        }
                        $d++;
                    }
                    $s = 0;
                    for ($v = $stop; $v < ($stop + $cant_inhabilidades); $v++) {
                        SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, NULL, $inhabilidades_siri[$s], $v, 1, null), 'selectOne');
                        SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $inhabilidades_modulo[$s], NULL, $v, 2, null), 'selectOne');
                        SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, NULL, $inhabilidades_legal[$s], NULL, $v, 3, null), 'selectOne');
                        SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, $inhabilidades_inicio[$s], NULL, NULL, $v, 4, null), 'selectOne');
                        SQLConnection::backendStoreProcedure('LN_doc_campos_', array('update', $docid, $fld->seccion, $fld->campo, $inhabilidades_fin[$s], NULL, NULL, $v, 5, null), 'selectOne');
                        $s = $s + 1;
                    }
                }
            }
        } else {
            return '0';
        }
    }

    //////////////////////////////////////////////
    ///////// INFORME CANDIDADTO COLOMBIA ///////
    /////////////////////////////////////////////

    /**
     * Funcion que tiene la actividad
     * de cargar el informe de Colombia
     * @access public
     * @static
     * @return string
     */
    public static function informeColombia() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        //
        $ruta_informe = NULL;
        //
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        $fld = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $doc->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL), 'selectOne');
        // manda estado de documento
        $doc_id = $doc->doc_id;
        $estadoDocumento = self::generarCamposDocumento($doc_id);
        //
        if ($doc) {
            $path = env('PATH_DOCUMENTOS_IV') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/evidencias/' . $doc->doc_id . '.pdf';
            //
            if (file_exists($path)) {
                $ruta_informe = env('RUTA_DOCUMENTOS_IV') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/evidencias/' . $doc->doc_id . '.pdf';
            }
        }
        //
        return view('/informes-blue/actividades-tarea/cargar_informe_cand_colombia')->with(compact('doc', 'fld', 'ruta_informe', 'estadoDocumento'));
    }

    /**
     * @access public
     */
    public static function poblacionCarcelColombia() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        // 
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        $doc_es = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
        //
        $ruta_poblacion_carcelaria = null;
        $path_poblacion_carcelaria = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc->doc_id . '.pdf';
        if (file_exists($path_poblacion_carcelaria)) {
            $ruta_poblacion_carcelaria = env('RUTA_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc->doc_id . '.pdf';
        }
        //
        $flds = self::generarCamposDocumento($doc->doc_id);
        $doc_id = $doc->doc_id;
        $sin_datos = 0;
        $cards_ocultos = [];
        $cant_inpec = 0;
        if (empty($flds['data']['Registro de Personas Privadas de Libertad de Colombia (INPEC)'][0]->values['1']['1']['valor_numerico'])) {
            $sin_datos = 1;
        }
        //
        foreach ($flds['data']['Registro de Personas Privadas de Libertad de Colombia (INPEC)'][0]->values as $rows) {
            if (!empty($rows['1']['valor_numerico'])) {
                array_push($cards_ocultos, 1);
                $cant_inpec++;
            } else {
                array_push($cards_ocultos, 0);
            }
        }
        //
        return view('/informes-blue/actividades-tarea/valorar_poblacion_carcel_inpec_colombia', compact('contraparte', 'cliente', 'gestion', 'tipo_doc', 'flds', 'ruta_poblacion_carcelaria', 'doc_id', 'sin_datos', 'cards_ocultos', 'cant_inpec', 'doc_es'));
    }

    public function getHitSummaryColombia() {
        $cliente = Request::input('cliente');
        $contraparte = Request::input('contraparte');
        $gestion = Request::input('gestion');
        //
        $flds = NULL;
        $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        foreach ($docs as $doc) {
            if ($doc->tipo_doc == '1252' || $doc->tipo_doc == '1253' || $doc->tipo_doc == '1254' || $doc->tipo_doc == '1255') {
                // Datos judiciales
                $valoraciones[$doc->doc_id] = ['valoracion' => $doc->valoracion, 'tipo_doc' => $doc->tipo_doc];
                $valoraciones[$doc->doc_id]['val_hit'] = 1;
                if ($doc->tipo_doc == '1252') {
                    $flds = self::generarCamposDocumento($doc->doc_id);
                    $valoraciones[$doc->doc_id]['val_hit'] = 0;
                    // Datos Judiciales
                    if (!empty($flds['data']['Carga de Juicios'][0]->values['1']['3']['valor_texto'])) {
                        foreach ($flds['data']['Carga de Juicios'][0]->values as $fila) {
                            if (!empty($fila['3']['valor_texto'])) {
                                $valoraciones[$doc->doc_id]['val_hit']++;
                            }
                        }
                    }
                } elseif ($doc->tipo_doc == '1255') {
                    $valoraciones[$doc->doc_id]['val_hit'] = 0;
                    $flds = self::generarCamposDocumento($doc->doc_id);
                    $flds = $flds['data'];
                    // Procuraduria
                    $descartados = [];
                    $siris = self::procesarSiris($flds, $descartados);
                    $valoraciones[$doc->doc_id]['val_hit'] = (count($siris)) ?? 1;
                }
            }
        }
        //
        return view('/informes-blue/actividades-tarea/hit_summary')->with(compact('cliente', 'contraparte', 'gestion', 'valoraciones'));
    }

    private static function generarCamposDocumento($docid, $blade = null) {
        //
        $temp = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('GENERATE', $docid, null, null, null, null, null, null, null, null), 'select');
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $docid, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), 'selectOne');
        $flds = SQLConnection::backendStoreProcedure('LN_doc_campos_', array('search', $docid, null, null, null, null, null, null, null, null), 'select');
        //
        // Traducciones::$blade = 'doc_etiquetas';
        if ($blade != null) {
            SQLConnection::obtenerTraducciones(Traducciones::$blade);
        }
        //** Documento foto de Inquiro vitae
        $foto_perfil_url = NULL;
        if ($doc->es_foto_perfil > 0) {
            $busqueda = SQLConnection::backendStoreProcedure('IV_busquedas_', array('search', NULL, $doc->contraparte), 'selectOne');
            if (!empty($busqueda)) {
                $foto_perfil_url = env('RUTA_DOCUMENTOS_IV') . '/' . $busqueda->foto;
            }
        }
        //
        $hay_campos = false;
        $hay_archivo = false;
        foreach ($flds as $fld) {
            $hay_campos = !$hay_campos ? ($fld->tipo_campo != 'F' ? true : $hay_campos) : $hay_campos;
            $hay_archivo = !$hay_archivo ? ($fld->tipo_campo == 'F' ? true : $hay_archivo) : $hay_archivo;
        }
        //
        $secciones = [];
        //
        $data = [];
        foreach ($flds as $k => $fld) {
            /*if ($doc->tipo_doc == '1147' && $fld->campo == '87'){
                         unset($flds[$k]);
                     }*/
            if ($fld->tipo_campo == 'G') {
                /* encabezados de la tabla */
                $c1 = SQLConnection::backendStoreProcedure('LN_campos_col_', array('search', $fld->campo, null, null, null, null, null, null), 'select');
                $cols = [];
                foreach ($c1 as $clm) {
                    // $clm->etiqueta = Traducciones::get($clm->etiqueta);
                    $cols[] = $clm->etiqueta;
                }
                /* configuración de los campos y valores de la tabla */
                $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array($fld->doc_id, $fld->seccion, $fld->campo), 'select');
                // dd($c2);
                //dd($c2);

                // $c2 = SQLConnection::backendStoreProcedure('LN_doc_campos_col_', array(310812, 0, 638), 'select');
                // var_dump($c2);
                $valores = [];
                foreach ($c2 as $k1 => $valor) {
                    $valores[$valor->fila][$valor->col]['valor_texto'] = $valor->valor_texto;
                    $valores[$valor->fila][$valor->col]['valor_fecha'] = $valor->valor_fecha;
                    $valores[$valor->fila][$valor->col]['valor_fecha_str'] = $valor->valor_fecha_str;
                    $valores[$valor->fila][$valor->col]['valor_numerico'] = $valor->valor_numerico;
                    $valores[$valor->fila][$valor->col]['tipo_campo'] = $valor->tipo_campo;
                    $valores[$valor->fila][$valor->col]['longitud'] = $valor->longitud;
                    $valores[$valor->fila][$valor->col]['decimales'] = $valor->decimales;
                    $valores[$valor->fila][$valor->col]['etiqueta'] = $valor->etiqueta;
                    //
                    $valores[$valor->fila][$valor->col]['file_exists'] = false;
                    $valores[$valor->fila][$valor->col]['file_path'] = NULL;
                    $path_row = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '/' . $fld->campo . '/' . $valor->fila . '.pdf';
                    if (file_exists($path_row)) {
                        $valores[$valor->fila][$valor->col]['file_exists'] = true;
                        $valores[$valor->fila][$valor->col]['file'] = env('RUTA_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '/' . $fld->campo . '/' . $valor->fila . '.pdf';
                    }
                    //-------
                    //$valores[$valor->fila]['es_vacio'] = (empty($valor->valor_texto) and empty($valor->valor_fecha) and empty($valor->valor_numerico)) ? 1 : 0;
                    //
                    if ($valor->tipo_campo == 'S' or $valor->tipo_campo == 'R' or $valor->tipo_campo == 'C') {
                        if (strlen($valor->opciones) > 0) {
                            $r = explode("^", $valor->opciones);
                            $txt = [];
                            $val = [];
                            if (sizeof($r) >= 2) {
                                $txt = explode("|", $r[0]);
                                $val = explode("|", $r[1]);
                            }
                            //
                            $text_len = count($txt);
                            for ($i = 0; $i < $text_len; $i++) {
                                $txt[$i] = Traducciones::get($txt[$i]);
                            }
                            //
                            $valores[$valor->fila][$valor->col]['opciones']['txt'] = $txt;
                            $valores[$valor->fila][$valor->col]['opciones']['val'] = $val;
                        }
                    }
                    // elseif ( $valor->tipo_campo == 'D' ){
                    // 	// fecha
                    //     //var_dump("entra");   
                    // }
                }
                //
                $fld->headers = $cols;
                $fld->values = $valores;
            } else {
                // $fld->etiqueta = Traducciones::get($fld->etiqueta);
                /* campo no tabla */
                if (($fld->tipo_campo == 'S' or $fld->tipo_campo == 'R' or $fld->tipo_campo == 'C')) {
                    $valores = [];
                    //
                    if (strlen($fld->opciones) > 0) {
                        $r = explode("^", $fld->opciones);
                        $txt = [];
                        $val = [];
                        if (sizeof($r) >= 2) {
                            $txt = explode("|", $r[0]);
                            $val = explode("|", $r[1]);
                        }
                        //
                        $text_len = count($txt);
                        for ($i = 0; $i < $text_len; $i++) {
                            $txt[$i] = Traducciones::get($txt[$i]);
                        }
                        //
                        $valores[] = $txt;
                        $valores[] = $val;
                    }
                    $fld->opciones = $valores;
                }
            }
            //
            $data[$fld->titulo_seccion][] = $fld;
            //
            if ($fld->titulo_seccion != '') {
                $secciones[$fld->titulo_seccion]['texto_bajada'] = $fld->texto_bajada;
                $secciones[$fld->titulo_seccion]['texto_pie'] = $fld->texto_pie;
            }
        }
        //
        if ($doc->es_balance > 0) {
            $file_path = env('PATH_COMPARTIDO') . '/' . $doc->ruta_archivo;
            $file_url = env('RUTA_COMPARTIDO') . '/' . $doc->ruta_archivo;
        } else {
            $file_path = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
            $file_url = env('RUTA_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
        }
        //
        $file_exists = file_exists($file_path);
        //
        $search_array = array('%inicio_vigencia_fecha%', '%fin_vigencia_fecha%', '%inicio_vigencia_periodo%', '%fin_vigencia_periodo%');
        $replace_array = array($doc->inicio_vigencia, $doc->fecha_vigencia, (null !== $doc->inicio_vigencia) ? substr($doc->inicio_vigencia, 3, 7) : null, (null !== $doc->fecha_vigencia) ? substr($doc->fecha_vigencia, 3, 7) : null);
        //
        return ['docid' => $docid, 'doc_data' => $doc, 'data' => $data, 'secciones' => $secciones, 'file_path' => $file_path, 'file_url' => $file_url, 'file_exists' => $file_exists, 'hay_campos' => $hay_campos, 'hay_archivo' => $hay_archivo, 'search_array' => $search_array, 'replace_array' => $replace_array, 'foto_perfi_url' => $foto_perfil_url];
        //return [$docid, $doc, $data, $secciones,$file_path,$file_url, $file_exists, $hay_campos, $hay_archivo, $search_array, $replace_array, $foto_perfil_url];
    }

    /////////////////////////////////////////////
    ///////// DATOS JUDICIALES COSTA RICA ///////
    /////////////////////////////////////////////

    public static function JudicialesCostaRica() {
        $contraparte = Request::input('contraparte');
        $cliente = Request::input('cliente');
        $gestion = Request::input('gestion');
        $tipo_doc = Request::input('tipo_doc');
        // 
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, Session::get('usuario')->user_id, null, null), 'selectOne');
        $doc_es = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
        $flds = self::generarCamposDocumento($doc->doc_id);
        $doc_id = $doc->doc_id;
        $sin_datos = 0;
        $cards_ocultos = [];
        $cant_juicios_cr = 0;
        // 
        $ruta_juicios_cr_ev = null;
        $path_juicios_cr_ev = env('PATH_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc_id . '.pdf';
        if (file_exists($path_juicios_cr_ev)) {
            $ruta_juicios_cr_ev = env('RUTA_DOCUMENTOS_IV') . DIRECTORY_SEPARATOR . $cliente . DIRECTORY_SEPARATOR . $contraparte . DIRECTORY_SEPARATOR . $gestion . DIRECTORY_SEPARATOR . 'evidencias' . DIRECTORY_SEPARATOR . $doc_id . '.pdf';
        }
        // 
        if (empty($flds['data']['Datos Judiciales'][0]->values['1']['1']['valor_numerico'])) {
            $sin_datos = 1;
        }

        foreach ($flds['data']['Datos Judiciales'][0]->values as $rows) {
            if (!empty($rows['1']['valor_texto'])) {
                array_push($cards_ocultos, 1);
                $cant_juicios_cr++;
            } else {
                array_push($cards_ocultos, 0);
            }
        }
        // 
        return view('/informes-blue/actividades-tarea/datos_judiciales_costa_rica', compact('contraparte', 'cliente', 'gestion', 'tipo_doc', 'flds', 'doc_es', 'cant_juicios_cr', 'doc_id', 'ruta_juicios_cr_ev', 'cards_ocultos'));
    }

    //////////////////////////////
    ///// NOTAS DEL INFORME //////
    //////////////////////////////

    // FUNCION QUE AGREGAR NOTA AL INFORME
    public static function agregarNotaInforme() {
        if (isset($_POST['informe']) && isset($_POST['contraparte'])) {
            $user_id = Session::get('usuario')->user_id;
            $informe = Request::input('informe');
            $contraparte = Request::input('contraparte');
            $tarea = is_null(Request::input('tarea')) ? $informe : Request::input('tarea');
            //
            // $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports',array('informe_by_id',$user_id,null,null,null,$informe),'selectOne');
            $historial_informe = Request::input('editor_historial_informe');
            $historial_informe = '[' . Session::get('usuario')->first_name . ' ' . Session::get('usuario')->last_name . ' - ' . date('d/m/Y H:i') . ']' . ' ' . $historial_informe;
            $historial_informe = str_replace('<br><br>', '<br>', $historial_informe);
            //
            SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_HIST_INFORME', $contraparte, $tarea, $user_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $historial_informe));
            //
            if (!is_null(Request::input('tarea'))) {
                $datos_tarea = self::datosTarea($tarea);
                return str_replace('<br><br>', '<br>', $datos_tarea->historial_informe_padre);
            } else {
                $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', $user_id, null, null, null, $informe), 'selectOne');
                //
                return str_replace('<br><br>', '<br>', $datos_informe->historial_informe);
            }
        }
    }

    ///////////////////////////////////////
    ///// PAUSAR Y CONTINUAR LA TAREA /////
    ///////////////////////////////////////

    // FUNCION QUE PAUSA UNA TAREA INICIADA Y DETIENE LA CUENTA DEL TIEMPO DE LA TAREA
    public static function pausarTarea() {
        if (isset($_POST['tarea']) && isset($_POST['informe']) && isset($_POST['contraparte']) && isset($_POST['cliente'])) {
            $user_id = Session::get('usuario')->user_id;
            $tarea = Request::input('tarea');
            $nombre_tarea = Request::input('nombre_tarea');
            $informe = Request::input('informe');
            $contraparte = Request::input('contraparte');
            $cliente = Request::input('cliente');
            $servicio_contratado = Request::input('servicio');
            //
            $pausar_tarea = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array(
                'PAUSA_TAREA',
                $contraparte,
                $tarea,
                $user_id,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                $cliente,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                1
            ));
            //
            $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se pausó la tarea ' . $nombre_tarea, $cliente, 'PAUSAR_TAREA', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado, NULL, NULL, NULL, NULL, NULL, 'P', $tarea), 'selectOne');
            //
            if (isset($_POST['desde_modal']) && $_POST['desde_modal'] == '1') {
                return self::editarTarea();
            } else {
                return self::tareasInforme($informe);
            }
        } else {
            return 0;
        }
    }

    // FUNCION QUE CONTINUA UNA TAREA PAUSADA Y RETOMA LA CUENTA DE TIEMPO DE LA TAREA
    public static function continuarTarea() {
        if (isset($_POST['tarea']) && isset($_POST['informe']) && isset($_POST['contraparte']) && isset($_POST['cliente'])) {
            $user_id = Session::get('usuario')->user_id;
            $tarea = Request::input('tarea');
            $nombre_tarea = Request::input('nombre_tarea');
            $informe = Request::input('informe');
            $contraparte = Request::input('contraparte');
            $cliente = Request::input('cliente');
            $servicio_contratado = Request::input('servicio');
            //
            $continuar_tarea = $pausar_tarea = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array(
                'PAUSA_TAREA',
                $contraparte,
                $tarea,
                $user_id,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                0
            ));
            //
            $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se reanudó la tarea ' . $nombre_tarea, $cliente, 'CONTINUAR_TAREA', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado, NULL, NULL, NULL, NULL, NULL, 'C', $tarea), 'selectOne');
            //
            if (isset($_POST['desde_modal']) && $_POST['desde_modal'] == '1') {
                return self::editarTarea();
            } else {
                return self::tareasInforme($informe);
            }
        } else {
            return 0;
        }
    }

    /////////////////////////
    //// ARCHIVOS INFORME ///
    /////////////////////////

    /**
     * FUNCION QUE DEVUELE LA VISTA DE CARGA DE ARCHIVOS RELACIONADOS AL INFORME
     *
     * @param string $informe ID_informe
     * @return void
     */
    protected static function archivosInforme($contraparte, $informe) {
        $archivos = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('list_archivos', $contraparte, $informe, NULL));
        $no_visibles = [];
        //
        foreach ($archivos as $k => $archivo) {
            $archivo->ruta = env('RUTA_ARCHIVOS_INFORMES') . '/' . $informe . '/' . $archivo->path_archivo;
            if (!$archivo->visible) {
                array_push($no_visibles, $archivo);
                // unset($archivos[$k]);
            }
        }
        // $archivos = array_values($archivos);
        //
        return view('/informes-blue/archivos-informe')->with(compact('archivos'));
    }

    // FUNCION QUE GUARDA EL ARCHIVO DEL INFORME CARGADO
    public static function guardarArchivoInforme() {
        if (isset($_POST['informe']) && isset($_POST['contraparte']) && isset($_FILES['archivo_informe']) && $_FILES['archivo_informe']['error'] == '0') {
            $user_id = Session::get('usuario')->user_id;
            $informe = Request::input('informe');
            $contraparte = Request::input('contraparte');
            $numero_archivos = Request::input('numero_archivos');
            //
            $archivo_informe = $_FILES['archivo_informe']['tmp_name'];
            $nombre_archivo_informe = $_FILES['archivo_informe']['name'];
            //
            $extension = pathinfo($nombre_archivo_informe, PATHINFO_EXTENSION);
            //
            $nombre_archivo = $informe . '-' . (intval($numero_archivos) + 1) . '.' . $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, $user_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $nombre_archivo, $extension));
                }
            }
            //
            if (isset($_POST['archivosInformeTarea']) && $_POST['archivosInformeTarea'] == 1) {
                return self::archivosInformeTarea($contraparte, $informe);
            }
            return self::archivosInforme($contraparte, $informe);
        } else {
            return 0;
        }
    }

    public static function guardarArchivoInformeDos() {
        if (isset($_POST['informe']) && isset($_POST['contraparte']) && isset($_FILES['archivo_informe']) && $_FILES['archivo_informe']['error'] == '0') {
            $user_id = Session::get('usuario')->user_id;
            $informe = Request::input('informe');
            $contraparte = Request::input('contraparte');
            $cliente = Request::input('cliente');
            $servicio_contratado = Request::input('servicio_contratado');
            $numero_archivos = Request::input('numero_archivos');
            $estado_tarea = Request::input('estado_tarea');



            $archivo_informe = $_FILES['archivo_informe']['tmp_name'];
            $nombre_archivo_informe = $_FILES['archivo_informe']['name'];

            $extension = pathinfo($nombre_archivo_informe, PATHINFO_EXTENSION);

            //$nombre_archivo = $informe.'-'.( intval($numero_archivos)+1 ).'.'.$extension;
            $nombre_archivo = $nombre_archivo_informe;
            if (strlen($nombre_archivo_informe) > 150) {
                return 0;
            }
            $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)) {
                $nombre_archivo = (intval($numero_archivos) + 1) . '_' . $nombre_archivo;
                $path_guardar = env('PATH_ARCHIVOS_INFORMES') . '/' . $informe . '/' . $nombre_archivo;
            }

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

                    // SQLConnection::logTrazabilidad('Se guardó el archivo del informe '.$nombre_archivo,'ARCHIVO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,null,null,$informe);
                }
            }

            if (isset($_POST['archivosInformeTarea']) && $_POST['archivosInformeTarea'] == 1) {
                return self::archivosInformeTarea($contraparte, $informe);
            }
            return self::archivosInforme($contraparte, $informe);
        } else {
            return 0;
        }
    }

    public static function borrarArchivoInformeDos() {
        if (isset($_POST['informe']) && isset($_POST['contraparte']) && isset($_POST['nombre_archivo'])) {
            $user_id = Session::get('usuario')->user_id;
            $informe = Request::input('informe');
            $contraparte = Request::input('contraparte');
            $cliente = Request::input('cliente');
            $servicio_contratado = Request::input('servicio_contratado');
            $nombre_archivo = Request::input('nombre_archivo');
            $id_archivo = Request::input('id_archivo');
            $visible = Request::input('accion') == 'desact' ? 0 : (Request::input('accion') == 'act' ? 1 : null);

            $path_guardar = env('PATH_ARCHIVOS_INFORMES') . '/' . $informe . '/' . $nombre_archivo;
            $extension = pathinfo($nombre_archivo, PATHINFO_EXTENSION);
            if (!is_dir(env('PATH_ARCHIVOS_INFORMES') . '/' . $informe)) {
                return 0;
            }
            if (file_exists($path_guardar) || $visible == 1) {
                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('ESTADO_ARCHIVO', $contraparte, $informe, $user_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $nombre_archivo, $extension, null, null, 0, null, $id_archivo, $visible));
                if ($visible == 1) {
                    SQLConnection::logTrazabilidad('Se activo el archivo del informe ' . $nombre_archivo, 'ARCHIVO_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, null, null, $informe);
                } else {
                    SQLConnection::logTrazabilidad('Se desactivo el archivo del informe ' . $nombre_archivo, 'ARCHIVO_INFORME', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, null, null, $informe);
                }

                if (isset($_POST['archivosInformeTarea']) && $_POST['archivosInformeTarea'] == 1) {
                    return self::archivosInformeTarea($contraparte, $informe);
                }
                return self::archivosInforme($contraparte, $informe);
            }
        } else {
            return 0;
        }
    }


    ////////////////////////////////////////////////
    /////////// TAREAS DEL INFORMES ////////////////
    ////////////////////////////////////////////////

    // FUNCION QUE DEUVELVE LAS TAREAS DEL INFORME
    // PARAMETROS 1.id_informe
    public static function tablaTareasInforme() {
        if (isset($_POST['informe']) && Misc::validacionesGenerica($_POST['informe'], 'numero')) {
            $informe = Request::input('informe');
            // $tareas = SQLConnection::backendStoreProcedure('LN_Blue',array('tareas_informe',null,$informe));
            $tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe));
            return view('/informes-blue/tabla-tareas-informe')->with(compact('tareas'));
        } else {
            return 0;
        }
    }

    ////////////////////////////////////////////
    ///////// DOCUMENTOS DEL INFORMES //////////
    ////////////////////////////////////////////

    // FUNCION QUE DEVUELVE LOS DOCUMENTOS DE LA CONTRAPARTE DEL INFORME
    // PARAMETROS 1.contraparte 2.gestion
    public function documentosInforme() {
        if (isset($_POST['contraparte']) && isset($_POST['gestion']) && Misc::validacionesGenerica($_POST['contraparte'], 'numero') && Misc::validacionesGenerica($_POST['gestion'], 'numero')) {
            $contraparte = Request::input('contraparte');
            $gestion = Request::input('gestion');
            $informe = isset($_POST['informe']) ? $_POST['informe'] : NULL;
            $desde = Request::input('gestion_desde');
            //
            // $data = SQLConnection::backendStoreProcedure('LN_gestiones_', array('search', null, null, $contraparte, null, null, 1, null), 'selectOne');
            $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $desde));
            // dd($docs);
            // dd(Misc::recalcularIntegridadGestion($contraparte,$gestion));
            //
            // $temp = SQLConnection::backendStoreProcedure('LN_actualizar_legajo', array($contraparte,$gestion, NULL), 'selectOne');
            // SE MUESTRA LOS ARCHIVOS DE LOS DOCUMENTOS
            foreach ($docs as $k => $doc) {
                $this->buscarArchivoDoc($doc);
            }
            //
            return view('/informes-blue/tabla-documentos-informe')->with(compact('docs', 'informe', 'desde'));
        } else {
            return 0;
        }
    }

    // FUNCION QUE REGENERA LOS DOCUMENTOS
    public function regenerarDocs() {
        if (isset($_POST['contraparte']) && isset($_POST['gestion'])) {
            $contraparte = Request::input('contraparte');
            $gestion = Request::input('gestion');
            //
            $temp = SQLConnection::backendStoreProcedure('LN_actualizar_legajo', array($contraparte, $gestion, NULL), 'selectOne');
        } else {
            return 0;
        }
    }

    /**
     * 
     */
    private function buscarArchivoDoc(stdClass $doc = NULL) {
        // Si es dni tiene imagenes
        if ($doc->es_dni && $doc->es_evidencia) {
            $file_path_dni1 = env('PATH_DOCUMENTOS_IV') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/evidencias/1_dni.png';
            $file_url_dni1 = env('RUTA_DOCUMENTOS_IV') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/evidencias/1_dni.png' . '?rnd=' . time();
            //
            $file_path_dni2 = env('PATH_DOCUMENTOS_IV') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/evidencias/2_dni.png';
            $file_url_dni2 = env('RUTA_DOCUMENTOS_IV') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/evidencias/2_dni.png' . '?rnd=' . time();
            //
            $file_exists_dni1 = file_exists($file_path_dni1);
            $file_exists_dni2 = file_exists($file_path_dni2);
            //
            if ($file_exists_dni1) {
                $doc->file_dni1 = $file_url_dni1;
            }
            //
            if ($file_exists_dni2) {
                $doc->file_dni2 = $file_url_dni2;
            }
        } else {
            if ($doc->es_evidencia) {
                $file_path = env('PATH_DOCUMENTOS_IV') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/evidencias/' . $doc->doc_id . '.pdf';
                $file_url = env('RUTA_DOCUMENTOS_IV') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/evidencias/' . $doc->doc_id . '.pdf' . '?rnd=' . time();
                // } elseif ( $doc->es_balance == '1' && is_file($doc->ruta_archivo) ){
                //     $file_path = env('PATH_COMPARTIDO') . $doc->ruta_archivo;
                //     $file_url = env('RUTA_COMPARTIDO') . $doc->ruta_archivo;
            } elseif ($doc->es_balance == '1') {
                $ruta = "/balances" . '/' . $doc->numero . '/' . $doc->id_balance . '.pdf';
                $file_path = env('PATH_COMPARTIDO') . $ruta;
                $file_url = env('RUTA_COMPARTIDO') . $ruta;
            } else {
                $file_path = env('PATH_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf';
                $file_url = env('RUTA_DOCUMENTOS') . '/' . $doc->cliente . '/' . $doc->contraparte . '/' . $doc->gestion . '/' . $doc->doc_id . '.pdf' . '?rnd=' . time();
            }
            //
            $file_exists = file_exists($file_path);
            //
            if ($file_exists) {
                $doc->file_url = $file_url;
            }
        }
    }

    // FUNCION QUE DEVUELVE EL MODAL DE EDICION DEL DOCUMENTO DE LA CONTRAPARTE
    // PARAMETROS 1.doc_id
    public static function editarDocumentoInforme() {
        if (isset($_POST['doc_id']) && Misc::validacionesGenerica($_POST['doc_id'], 'numero')) {
            $doc_id = Request::input('doc_id');
            $integ_carga = Request::input('integ_carga');
            $integ_rech = Request::input('integ_rech');
            $integ_verif = Request::input('integ_verif');
            $carga = Request::input('carga');
            $desde_daga = Request::input('desde_daga') ?? 0;
            $tarea = Request::input('tarea');
            $informe = Request::input('informe');
            $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
            // Para que funcionen los eventos del facon
            $nombre_doc = null;
            if (isset($doc->tipo_doc)) {
                switch ($doc->tipo_doc) {
                    case (env('DOC_ID_PERFIL_EDUCATIVO_INICIAL')):
                        $nombre_doc = 'perfil-academico';
                        break;
                    case (env('DOC_ID_EXPERIENCIA_LABORAL')):
                        $nombre_doc = 'experiencia-laboral';
                        break;
                    case (env('DOC_ID_GRUPO_FAMILIAR')):
                        $nombre_doc = 'grupo-familiar';
                        break;
                }
            }
            //
            return view('/informes-blue/edicion-documento-informe')->with(compact('doc', 'carga', 'integ_carga', 'integ_rech', 'integ_verif', 'desde_daga', 'tarea', 'informe', 'nombre_doc'));
        } else {
            return 0;
        }
    }

    // FUNCION QUE GUARDA LOS DATOS DEL DOCUMENTO
    public static function guardarDocumentoInforme() {
        if (isset($_POST['doc_id']) && Misc::validacionesGenerica($_POST['doc_id'], 'numero')) {
            $doc_id = Request::input('doc_id');
            $integ_carga = Request::input('integ_carga');
            $integ_rech = Request::input('integ_rech');
            $integ_verif = Request::input('integ_verif');
            //
            if (isset($_POST['no_aplica'])) {
                // ENTRA ACA CUANDO DESCARTA EL DOC
                self::descartarRestaurarDoc('D', $doc_id);
            } elseif (isset($_POST['devolver'])) {
                // ENTRA ACA CUANDO DEVUELVE EL DOCUMENTO A ESTADO INGRESADO
                self::devolverEstadoDoc($doc_id);
            } elseif (isset($_POST['rechazar'])) {
                // ENTRA ACA PARA RECHAZAR EL DOC
                $texto_rechazo = Request::input('texto_rechazo');
                self::rechazarDoc($doc_id, $integ_carga, $integ_verif, $integ_rech, $texto_rechazo);
            } elseif (isset($_POST['verificar'])) {
                // ENTRA ACA PARA VERIFICAR EL DOC
                self::verificarDoc($doc_id, $integ_carga, $integ_verif, $integ_rech);
            } elseif (isset($_POST['ingresar'])) {
                // ENTRA ACA PARA INGRESAR EL DOC
                self::ingresarDoc($doc_id, $integ_carga, $integ_verif, $integ_rech);
            } else {
                // ENTRA ACA CUANDO RESTAURA EL DOC
                self::descartarRestaurarDoc('R', $doc_id);
            }
            return 1;
        } else {
            return 0;
        }
    }

    /**
     * FUNCION QUE DESCARTA O RESTAURA EL DOCUMENTO DADO
     * 
     * @access protected
     * @static
     * 
     * @param string accion que indica si se restaura el documento o se descarta
     * @param string|int el id del documento
     * 
     * @return int
     */
    protected static function descartarRestaurarDoc($accion, $doc_id) {
        $user_id = Session::get('usuario')->user_id;
        //
        if ($accion == 'D') {
            // DESCARTAR DOC
            $temp = SQLConnection::backendStoreProcedure('LN_docs_backend', array('no_aplica', $doc_id, NULL, $user_id), 'selectOne');
            $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
            $temp = Misc::integridadDocStore($doc, 3, 0, 0, 0, 1);
            //
            $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Documento Descartado: ' . $doc->nombre_tipo_doc, $doc->cliente, 'DESCARTA_DOCUMENTO', Session::get('webdata')['id_plataforma'], $doc->contraparte, $user_id, $doc_id, $doc->servicio_contratado), 'selectOne');
        } elseif ($accion == 'R') {
            // RESTAURAR DOC
            $temp = SQLConnection::backendStoreProcedure('LN_docs_backend', array('aplica', $doc_id, NULL, $user_id), 'selectOne');
            $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
            $temp = Misc::integridadDocStore($doc, 3, 0, 0, 0, 1);
            //
            $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Documento Restaurado: ' . $doc->nombre_tipo_doc, $doc->cliente, 'RESTAURA_DOCUMENTO', Session::get('webdata')['id_plataforma'], $doc->contraparte, $user_id, $doc_id, $doc->servicio_contratado), 'selectOne');
        }
        //
        return 1;
    }

    /**
     * FUNCION QUE DEVUELVE EL ESTADO DE UN DOCUMENTO RECHAZADO O VERIFICADO AL ESTADO INGRESADO
     * 
     * @access protected
     * @static
     * 
     * @param numeric el id del documento
     * @return int
     */
    protected static function devolverEstadoDoc($doc_id) {
        $user_id = Session::get('usuario')->user_id;
        $dependencias_docs = SQLConnection::backendStoreProcedure('LN_docs_AGB', array('SELECT', $doc_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), 'select');
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
        //
        if (!empty($doc)) {
            if (empty($dependencias_docs) || (is_array($dependencias_docs) && count($dependencias_docs) == 1)) {
                $temp = SQLConnection::backendStoreProcedure('LN_docs_verif', array('UNDO', null, $user_id, $doc->doc_id, 0), 'selectOne');
                // $check = SQLConnection::backendStoreProcedure('LN_docs_verificar_carga', array($doc_id), 'selectOne');
                Misc::integridadDocStore($doc, 0, 0, 0, 0, 1);
            } else {
                foreach ($dependencias_docs as $docs) {
                    if ($docs->estado_doc == 'V') {
                        $temp = SQLConnection::backendStoreProcedure('LN_docs_verif', array('UNDO', null, $user_id, $docs->doc_id, 0), 'selectOne');
                    } else if ($docs->estado_doc == 'R') {
                        $temp = SQLConnection::backendStoreProcedure('LN_docs_verif', array('UNDO', null, $user_id, $docs->doc_id, 0), 'selectOne');
                    }
                    Misc::integridadDocStore($doc, 0, 0, 0, 0, 1);
                }
            }
            $temp = SQLConnection::backendStoreProcedure('LN_contrapartes_queue_', array('insert', NULL, $doc->contraparte), 'selectOne');
            $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Documento devuelto a pendiente: ' . $doc->nombre_tipo_doc, $doc->cliente, 'DEVUELVE_DOCUMENTO', Session::get('webdata')['id_plataforma'], $doc->contraparte, $user_id, $doc_id, $doc->servicio_contratado), 'selectOne');
        }
        //
        return 1;
    }

    /**
     * FUNCION QUE CAMBIA EL ESTADO DE UN DOCUMENTO A SER VERIFICADO
     * 
     * @access protected
     * @static
     * 
     * @param numeric el id del documento
     * @param numeric la integridad de carga
     * @param numeric la integridad de verificacion
     * @param numeric la integridad de rechazo
     * 
     * @return int
     */
    protected static function verificarDoc($doc_id, $integ_carga, $integ_verif, $integ_rech) {
        $user_id = Session::get('usuario')->user_id;
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
        $dependencias_docs = SQLConnection::backendStoreProcedure('LN_docs_AGB', array('SELECT', $doc_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), 'select');
        if (empty($dependencias_docs) || (is_array($dependencias_docs) && count($dependencias_docs) == 1)) {
            // ENTRA SI NO TIENE DOCUMENTOS HIJOS
            Misc::integridadDocStore($doc, 1, $integ_carga, $integ_verif, $integ_rech);
            $temp = SQLConnection::backendStoreProcedure('LN_docs_', array('VERIFICA_BACKEND', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, $user_id), 'selectOne');
        } else {
            // ENTRA SI TIENE DOCUMENTOS HIJOS
            foreach ($dependencias_docs as $docs) {
                if ($docs->estado_doc != 'V') {
                    Misc::integridadDocStore($doc, 1, $integ_carga, $integ_verif, $integ_rech);
                    $temp = SQLConnection::backendStoreProcedure('LN_docs_', array('VERIFICA_BACKEND', $docs->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, $user_id), 'selectOne');
                }
            }
        }
        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Documento aprobado: ' . $doc->nombre_tipo_doc, $doc->cliente, 'APRUEBA_DOCUMENTO', Session::get('webdata')['id_plataforma'], $doc->contraparte, $user_id, $doc_id, $doc->servicio_contratado), 'selectOne');
        $temp = SQLConnection::backendStoreProcedure('LN_contrapartes_queue_', array('insert', NULL, $doc->contraparte), 'selectOne');
        /* Chequeo de finalización de carga en caso de existir un report activo en gestión en producción */
        $temp = SQLConnection::backendStoreProcedure('LN_informes', array('check_docs_ok', $doc->contraparte, NULL, $user_id), 'selectOne');
        //
        return 1;
    }

    /**
     * FUNCION QUE CAMBIA EL ESTADO DE UN DOCUMENTO A SER RECHAZADO
     * 
     * @access protected
     * @static
     * 
     * @param numeric el id del documento
     * @param numeric la integridad de carga
     * @param numeric la integridad de verificacion
     * @param numeric la integridad de rechazo
     * 
     * @return int
     */
    protected static function rechazarDoc($doc_id, $integ_carga, $integ_verif, $integ_rech, $texto_rechazo) {
        $user_id = Session::get('usuario')->user_id;
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
        $dependencias_docs = SQLConnection::backendStoreProcedure('LN_docs_AGB', array('SELECT', $doc_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), 'select');
        //
        if (empty($dependencias_docs) || (is_array($dependencias_docs) && count($dependencias_docs) == 1)) {
            Misc::integridadDocStore($doc, 2, $integ_carga, $integ_verif, $integ_rech);
            $temp = SQLConnection::backendStoreProcedure('LN_docs_', array('RECHAZADO', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $texto_rechazo, NULL, null, $user_id), 'selectOne');
        } else {
            foreach ($dependencias_docs as $docs) {
                if ($doc->estado_doc != 'R') {
                    Misc::integridadDocStore($doc, 2, $integ_carga, $integ_verif, $integ_rech);
                    $temp = SQLConnection::backendStoreProcedure('LN_docs_', array('RECHAZADO', $docs->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $texto_rechazo, NULL, null, $user_id), 'selectOne');
                }
            }
        }
        //
        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Documento rechazado: ' . $doc->nombre_tipo_doc, $doc->cliente, 'RECHAZA_DOCUMENTO', Session::get('webdata')['id_plataforma'], $doc->contraparte, $user_id, $doc_id, $doc->servicio_contratado), 'selectOne');
        $temp = EmailController::enviarMail('EMAIL-LED', 'DOCUMENTACION-RECHAZADA', 'DOCUMENTACION-RECHAZADA-SUBJECT', $doc->contraparte, NULL, NULL, NULL, $doc_id);
        //
        $temp = SQLConnection::backendStoreProcedure('LN_contrapartes_queue_', array('insert', NULL, $doc->contraparte), 'selectOne');
        //
        return 1;
    }

    /**
     * FUNCION QUE CAMBIA EL ESTADO DE UN DOCUMENTO A SER INGRESADO
     * 
     * @access protected
     * @static
     * 
     * @param numeric el id del documento
     * @param numeric la integridad de carga
     * @param numeric la integridad de verificacion
     * @param numeric la integridad de rechazo
     * 
     * @return int
     */
    protected static function ingresarDoc($doc_id, $integ_carga, $integ_rech, $integ_verif) {
        $user_id = Session::get('usuario')->user_id;
        $docs = SQLConnection::backendStoreProcedure('LN_docs_backend', array('enviar', $doc_id, 'I', $user_id), 'select');
        $doc = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
        $temp = Misc::integridadDocStore($doc, 3, $integ_carga, $integ_verif, $integ_rech, 1);
        //
        return 1;
    }

    /**
     * Funcion que verifica los 
     * documentos restantes de un informe
     * que se cerro
     * @access private
     * @static
     * @param int|string contraparte 
     * @return void
     */
    private static function verificarDocumentosInforme($contraparte) {
        $user_id = Session::get('usuario')->user_id;
        $docs = SQLConnection::backendStoreProcedure('LN_contrapartes_', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        $docs_verificados = 0;
        //
        if (!empty($docs)) {
            $doc_dato = SQLConnection::backendStoreProcedure('LN_docs_', array('select', $docs[0]->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, NULL), 'selectOne');
            //
            foreach ($docs as $doc) {
                if ($doc->estado_doc != 'V') {
                    $dependencias_docs = SQLConnection::backendStoreProcedure('LN_docs_AGB', array('SELECT', $doc->doc_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), 'select');
                    if (empty($dependencias_docs) || (is_array($dependencias_docs) && count($dependencias_docs) == 1)) {
                        // ENTRA SI NO TIENE DOCUMENTOS HIJOS
                        $temp = SQLConnection::backendStoreProcedure('LN_docs_', array('VERIFICA_BACKEND', $doc->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, $user_id), 'selectOne');
                    } else {
                        // ENTRA SI TIENE DOCUMENTOS HIJOS
                        foreach ($dependencias_docs as $doc_dependencia) {
                            if ($doc_dependencia->estado_doc != 'V') {
                                $temp = SQLConnection::backendStoreProcedure('LN_docs_', array('VERIFICA_BACKEND', $doc_dependencia->doc_id, null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, null, $user_id), 'selectOne');
                            }
                        }
                    }
                    $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Documento aprobado: ' . $doc->nombre_tipo_doc, $doc->cliente, 'APRUEBA_DOCUMENTO', Session::get('webdata')['id_plataforma'], $doc->contraparte, $user_id, $doc->doc_id, $doc_dato->servicio_contratado), 'selectOne');
                    $docs_verificados++;
                }
            }
            //
            if ($docs_verificados > 0) {
                $temp = SQLConnection::backendStoreProcedure('LN_contrapartes_queue_', array('insert', NULL, $contraparte), 'selectOne');
                /* Chequeo de finalización de carga en caso de existir un report activo en gestión en producción */
                $temp = SQLConnection::backendStoreProcedure('LN_informes', array('check_docs_ok', $doc->contraparte, NULL, $user_id), 'selectOne');
                //
                $doc_integ = $docs[0];
                $integ_carga = $docs[0]->integ_carga;
                $integ_rech = $docs[0]->integ_rech;
                $integ_verif = $docs[0]->integ_verif;
                //
                Misc::integridadDocStore($doc_dato, 1, $integ_carga, $integ_verif, $integ_rech);
            }
        }
    }

    ///////////////////////////////
    ////// PANEL DE USUARIOS //////
    ///////////////////////////////

    /**
     * Funcion que devuelve el
     * panel de usuarios
     * @access public
     * @static
     * @return string
     */
    public static function panelUsuarios() {
        $usuarios_teams = SQLConnection::backendStoreProcedure('IV_panel_teams', array('PANEL_TEAMS', env('PLATAFORMA')));
        //
        // dd($usuarios_teams);
        $teams = [];
        $usuarios_sistemas = [793639331, 422946826, 725499615, 461605648];
        //
        foreach ($usuarios_teams as $usuario) {
            if (in_array($usuario->user_id, $usuarios_sistemas)) {
                continue;
            }
            if (isset($teams[$usuario->idTeam])) {
                $teams[$usuario->idTeam]->tareas[] = $usuario;
            } else {
                $teams[$usuario->idTeam] = (object) ['nombre_team' => $usuario->nombre_team, 'tareas' => [$usuario]];
            }
        }
        //
        unset($usuario);
        unset($usuarios_teams);
        //
        $titulo_navbar = 'Panel Usuarios';

        return view('/panel-usuarios/panel_usuarios')->with(compact('teams', 'titulo_navbar'));
    }

    /**
     * Funcion que devuelve los datos
     * de los usuarios
     * @access public
     * @return string|null
     */
    public function panelUsuariosData() {
        if (isset($_POST['user_id']) && isset($_POST['team_id']) && Misc::validacionesGenerica($_POST['team_id'], 'numero') && Misc::validacionesGenerica($_POST['user_id'], 'numero')) {
            $user_id = Request::input('user_id');
            $team_id = Request::input('team_id');
            //
            // $tareas = $this->ordenarTareasPorEstado($user_id,$team_id);
            // //
            // return view('/panel-usuarios/tabla_tareas_usuario',compact('tareas','team_id','user_id'));
            // $clientes = [1226057645,7500717,6086009,632095719,2400056,1310336827,9878630,5281581,9017721,1702664090,5546348,528397,431136419,861672084,2046807993,1530289645];
            $indicadores_tareas = $this->misTareasData($user_id, $team_id);

            //
            return view('informes-blue/tabla-mis-tareas-panel-usuarios', compact('indicadores_tareas', 'team_id'));
        }
    }

    public function panelUsuariosDataDos() {
        if (isset($_POST['user_id'])) {
            $user_id = Request::input('user_id');
            $team_id = "";
            //
            // $tareas = $this->ordenarTareasPorEstado($user_id,$team_id);

            // $clientes = [1226057645,7500717,6086009,632095719,2400056,1310336827,9878630,5281581,9017721,1702664090,5546348,528397,431136419,861672084,2046807993,1530289645];
            $indicadores_tareas = $this->misTareasData($user_id);
            // dd($indicadores_tareas);
            //
            return view('informes-blue/tabla-mis-tareas-panel-usuarios', compact('indicadores_tareas'));
            // return view('/panel-usuarios/tabla_tareas_usuarios_nuevo',compact('tareas','user_id'));
        }
    }

    /**
     * Funcion que devuelve el arreglo
     * de las tareas ordenandas por estado
     * @access private
     * @param string el id del team
     * @param string el id del usuario
     * @return array
     */
    private function ordenarTareasPorEstado($user_id,$team_id = "") {
        if ($team_id) {
            $tareas = SQLConnection::backendStoreProcedure('IV_panel_teams', array('PANEL_TEAMS', env('PLATAFORMA'), $team_id, $user_id));
        } else {
            $tareas = SQLConnection::backendStoreProcedure('IV_panel_teams', array('PANEL_TEAMS', env('PLATAFORMA'), '0', $user_id));
        }
        // dd($tareas);
        //
        Traducciones::$blade = 'panel_usuarios';
        //
        $ready_to_start = 'Listo para iniciar';
        $ready_to_start = Traducciones::get($ready_to_start);
        //
        $en_pausa = 'En pausa';
        $en_pausa = Traducciones::get($en_pausa);
        //
        $tareas_filtradas = [];
        //
        $tareas_filtradas['E'] = null; // Seccion en proceso
        $tareas_filtradas['Z'] = (object) ['estado' => $ready_to_start, 'tareas' => []]; // Seccion listas para iniciar
        $tareas_filtradas['Y'] = (object) ['estado' => $en_pausa, 'tareas' => []]; // Seccion en pausa
        //
        $nombre_estados = Misc::NombreEstadosInforme();
        //
        foreach ($nombre_estados as $estado => $nombre_estado) {
            $nombre_estados[$estado] = Traducciones::get($nombre_estado);
        }
        //
        foreach ($tareas as $tarea) {
            if ($tarea->estado_informe == 'I') { // A pedido de Jorge se sacó las tareas en estado I del panel de USUARIOS, es un estado heredado del BLUE
                continue;
            } elseif ($tarea->ready_to_start == '1' && $tarea->estado_informe == 'A') {
                // listas para iniciar
                $tareas_filtradas['Z']->tareas[] = $tarea;
            } elseif ($tarea->pausa == '1' && $tarea->estado_informe == 'E') {
                // en pausa
                $tareas_filtradas['Y']->tareas[] = $tarea;
            } elseif (isset($tareas_filtradas[$tarea->estado_informe])) {
                // estado ya existe
                $tareas_filtradas[$tarea->estado_informe]->tareas[] = $tarea;
            } else {
                // nuevo estado
                $tareas_filtradas[$tarea->estado_informe] = (object) ['estado' => $nombre_estados[$tarea->estado_informe], 'tareas' => [$tarea]];
            }
        }
        // en caso de no haber tareas en proceso
        if (is_null($tareas_filtradas['E'])) {
            unset($tareas_filtradas['E']);
        }
        // dd($tareas_filtradas);
        //
        return $tareas_filtradas;
    }

    ///////////////////////////////
    ////////// MIS TAREAS /////////
    ///////////////////////////////

    // FUNCION QUE DEVUELVE LA VISTA DE MIS TAREAS
    public function misTareas() {
        // 5546717,41904867,28750576,87455253,78993863,11903680
        Traducciones::$blade = 'mis-tareas_datatable';
        SQLConnection::obtenerTraducciones(Traducciones::$blade);

        $indicadores_tareas = SQLConnection::backendStoreProcedure('LN_panel_reports', array('PANEL_USUARIOS', Session::get('usuario')->user_id, null, null, null, null, env('PLATAFORMA'), null));
        // $id_tarea = Request::input('tarea') ?? null;
        // $marcado = 0;
        // foreach( $indicadores_tareas as $indicador => $valor ){
        //     $valor->marcado = 0;
        //     if ( $valor->estado_informe == 'Z' || $valor->estado_informe == 'Y' ){
        //         $valor->marcado = 1;
        //         $marcado++;
        //     } else {
        //         // Si no son tareas listas para iniciar
        //         $valor->nombre_estado  = (!is_null($valor->estado_informe)) ? Traducciones::get(Misc::NombreEstadosInforme($valor->estado_informe)) : NULL;
        //     }
        //     //
        //     $valor->tareas = SQLConnection::backendStoreProcedure('LN_panel_reports',array('PANEL_TASKS_FILTRADO',$valor->user_id,null,null,null,null,env('PLATAFORMA'),$valor->estado_informe));
        //     $valor->cant_tareas = ( !is_null($valor->tareas) ) ? count($valor->tareas) : NULL;
        // }
        // //
        // if ( !$marcado && !empty($indicadores_tareas) ){
        //     $indicadores_tareas[0]->marcado = 1;
        // }
        // 
        $id_tarea = Request::input('tarea') ?? null;
        $indicadores_tareas = $this->misTareasData(Session::get('usuario')->user_id);
        $wsp = SQLConnection::backendStoreProcedure('LN_tickets_', array('SEARCHTICKETS', '', '', env('PLATAFORMA'), '', Session::get('usuario')->user_id, '', 'F'));
        if (!empty($wsp)) {
            foreach ($wsp as $k => $msg) {
                if ($msg->sector == 'B') {
                    unset($wsp[$k]);
                }
            }
        }
        $wsp = array_values($wsp);
        // $clientes = [1226057645,7500717,6086009,632095719,2400056,1310336827,9878630,5281581,9017721,1702664090,5546348,528397,431136419,861672084,2046807993,1530289645];
        //
        return view('/informes-blue/mis-tareas_datatable')->with(compact('indicadores_tareas', 'id_tarea', 'wsp'));
    }

    /**
     * Funcion genérica que devuelve el arreglo
     * de las tareas ordenandas por estado
     * @access private
     * @param string el id del team
     * @param string el id del usuario
     * @return array
     */
    private function misTareasData($usuario) {
        $indicadores_tareas = SQLConnection::backendStoreProcedure('LN_panel_reports', array('PANEL_USUARIOS', $usuario, null, null, null, null, env('PLATAFORMA'), null));
        $marcado = 0;
        foreach ($indicadores_tareas as $indicador => $valor) {
            $valor->marcado = 0;
            if ($valor->estado_informe == 'Z' || $valor->estado_informe == 'Y') {
                $valor->marcado = 1;
                $marcado++;
            } else {
                // Si no son tareas listas para iniciar
                $valor->nombre_estado = (!is_null($valor->estado_informe)) ? Traducciones::get(Misc::NombreEstadosInforme($valor->estado_informe)) : NULL;
            }
            //
            $valor->tareas = SQLConnection::backendStoreProcedure('LN_panel_reports', array('PANEL_TASKS_FILTRADO', $valor->user_id, null, null, null, null, env('PLATAFORMA'), $valor->estado_informe));
            $valor->cant_tareas = (!is_null($valor->tareas)) ? count($valor->tareas) : NULL;
        }
        //
        if (!$marcado && !empty($indicadores_tareas)) {
            $indicadores_tareas[0]->marcado = 1;
        }
        return $indicadores_tareas;
    }

    // FUNCION QUE DEVUELVE LA VISTA DE MAPA INFORMES
    public function mapaInformes() {
        $contraparte = Request::input('contraparte');
        $informe = Request::input('informe');
        //
        $docs = DB::select('EXEC dbo.LN_contrapartes_ ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
        //
        $tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe));
        //
        foreach ($docs as $doc) {
            if ($doc->estado_doc == 'V') {
                $doc->icon_code = '\uF633';
                $doc->color_code = '#198754';
            } elseif ($doc->estado_doc == 'R') {
                $doc->icon_code = '\uF659';
                $doc->color_code = '#dc3545';
            } elseif ($doc->estado_doc == 'I') {
                $doc->icon_code = '\uF63C';
                $doc->color_code = '#ffc107';
            } elseif ($doc->estado_doc == 'N' && $doc->aplica == '0') {
                $doc->icon_code = '\uF2AD';
                $doc->color_code = '#212529';
            } else {
                $doc->icon_code = '\uF296';
                $doc->color_code = '#0dcaf0';
            }
            $doc->icon_code = json_decode('"' . $doc->icon_code . '"');
        }
        //
        foreach ($tareas as $tarea) {
            if ($tarea->estado_tarea == 'K' || $tarea->estado_tarea == 'F') {
                $tarea->icon_code = '\uF407';
                $tarea->color_code = '#198754';
            } elseif ($tarea->estado_tarea == 'A' || $tarea->estado_tarea == 'I') {
                $tarea->icon_code = '\uF1BE';
                $tarea->color_code = '#34ebe8';
            } elseif ($tarea->estado_tarea == 'W' || $tarea->estado_tarea == 'M' || $tarea->estado_tarea == 'R') {
                $tarea->icon_code = '\uF41F';
                $tarea->color_code = '#d3eb34';
            } elseif ($tarea->estado_tarea == 'P') {
                $tarea->icon_code = '\uF347';
                $tarea->color_code = '#3d0dd9';
            } elseif ($tarea->estado_tarea == 'T' || $tarea->estado_tarea == 'E') {
                $tarea->icon_code = '\uF347';
                $tarea->color_code = '#198754';
            } elseif ($tarea->estado_tarea == 'N' || $tarea->estado_tarea == 'C') {
                $tarea->icon_code = '\uF628';
                $tarea->color_code = '#f2210a';
            }
            $tarea->icon_code = json_decode('"' . $tarea->icon_code . '"');
        }
        //
        return json_encode(['docs' => $docs, 'tareas' => $tareas]);
    }

    public function responderTicker() {
        if (!empty($_POST['msg']) && !empty($_POST['informe']) && !empty($_POST['id_ticket']) && !empty($_POST['gestion']) && !empty($_POST['contraparte'])) {
            $contraparte = Request::input('contraparte');
            $gestion = Request::input('gestion');
            $informe = Request::input('informe');
            $cliente = Request::input('cliente');
            $referencia = Request::input('referencia');
            $usuario_creador = Request::input('usuario_creador');
            $to = Request::input('to');
            $msg = Request::input('msg');
            // 
            $estado_informe = Request::input('estado_informe');
            $id_ticket = Request::input('id_ticket');

            $wsp = SQLConnection::backendStoreProcedure('LN_tickets_', array('ANSWERTICKET', $contraparte, $gestion, Session::get('webdata')['servicio_contratado'], $cliente, Session::get('usuario')->user_id, $msg, 'B', $estado_informe, $informe, null, $id_ticket));

            EmailController::emailHR('R_TICKET', $to, $referencia, $usuario_creador, (Session::get('usuario')->first_name . ' ' . Session::get('usuario')->last_name));

            // dd($contraparte,$gestion,$informe,$cliente,$msg,$estado_informe,$id_ticket,$to,$referencia,$usuario_creador);

            return 1;

        } else {
            return 0;
        }
    }

    ///////////////////////////////
    /////// TAREAS A APROBAR //////
    ///////////////////////////////

    // FUNCION QUE RETORNA LA VISTA DE TAREAS A APROBAR
    public static function taskAprobar() {
        $user_id = Session::get('usuario')->user_id;
        //--
        $task_aprobar = SQLConnection::backendStoreProcedure('LN_panel_reports', array('TAREAS_APROBAR', $user_id, null, null, null, null, env('PLATAFORMA'), null), 'select');
        //--
        $total_task = count($task_aprobar);
        return view('/informes-blue/task_aprobar')->with(compact('task_aprobar', 'total_task'));
    }

    /**
     * FUNCION QUE APRUEBA LAS TAREAS FINALIZADAS.
     * @access public
     * @static
     * @return string
     * @deprecated
     * */
    public static function aprobarTareaInforme() {
        $user_id = Session::get('usuario')->user_id;
        $contraparte = Request::input('contraparte');
        $informe = Request::input('informe');
        $tarea = Request::input('tarea');
        $servicio_contratado = Request::input('servicio_contratado');
        //--
        //$datos_tarea = SQLConnection::backendStoreProcedure('LN_panel_reports',array('tarea_by_id',$user_id,null,null,null,$tarea),'selectOne');
        $datos_tarea = SQLConnection::backendStoreProcedure('IV_panel_reports', array('tarea_by_id', $user_id, null, null, null, $tarea), 'selectOne');
        //--Se cambia el estado a aprobado
        $actualizar = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_TAREA', $contraparte, $tarea,
            $user_id, NULL, NULL, $datos_tarea->idTipoTarea, $datos_tarea->tarea_prioridad, 'K', $datos_tarea->ingresado_por, NULL, $datos_tarea->userIDAsigandoTarea, $datos_tarea->cliente, NULL, NULL, $datos_tarea->fecha_comprometida_tarea, NULL, NULL, NULL, $datos_tarea->inicio_tarea));
        // SE EVAULA SI SE TIENE QUE CAMBIAR EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA
        self::cambiarEstadoInformePorEstadoTareaOrg($informe, $tarea, $datos_tarea);
        //--
        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se aprobó la tarea ' . $datos_tarea->nombre_tarea, $datos_tarea->cliente, 'CAMBIAR_ESTADO_TAREA', Session::get('webdata')['id_plataforma'], $contraparte, $user_id, NULL, $servicio_contratado), 'selectOne');
        //--
        return '1';
    }

    ////////////////////////////////////////////////
    ////// ACCIONES TAREAS Y SUS DEPENDENCIAS //////
    ////////////////////////////////////////////////

    /**
     * Funcion que actualiza los datos de la tarea
     * 
     * @author Rami Aleid
     * @access private
     * @static
     * 
     * @param string id cliente
     * @param string id contraparte
     * @param string id tarea
     * @param string estado de tarea
     * @param string id tipo tarea
     * @param string prioridad
     * @param string usuario ingresado por
     * @param string usuario que le esta asignada la tarea
     * @param string fecha comprometida
     * @param string fecha de inicio
     * 
     * @return null
     */
    private static function actualizarDatosTarea($cliente, $contraparte, $tarea, $estado, $id_tipo_tarea, $prioridad, $ingresado_por, $usuario_asignado, $fecha_comprometida, $fecha_inicio, $informe = NULL) {
        $user_id = Session::get('usuario')->user_id;
        // SOLO ACTUALIZA LOS DATOS SI VIENE EL DATO DE ID DE INFORME, PARA COMPARAR FECHAS Y QUE NO PUEDA GRABAR FECHAS POR FUERA DE LAS DELIMITADAS EN EL INFORME.
        if (isset($informe)) {
            $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports', array('informe_by_id', $user_id, null, null, null, $informe), 'selectOne');
            // 
            $inicio_informe = isset($datos_informe->inicio_informe) ? new DateTime($datos_informe->inicio_informe) : NULL;
            $comprometida_informe = new DateTime($datos_informe->fecha_comprometida_informe);
            $inicio_tarea = new DateTime($fecha_inicio);
            $comprometida_tarea = new DateTime($fecha_comprometida);
            //
            // 
            /* if ( (!is_null($inicio_informe) && $inicio_tarea < $inicio_informe && $id_tipo_tarea != '4071729') || $comprometida_tarea > $comprometida_informe) {
                return 'error';
            } */
            return SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_TAREA2', $contraparte, $tarea, $user_id, NULL, NULL, $id_tipo_tarea, $prioridad, $estado, $ingresado_por, NULL, $usuario_asignado, $cliente, NULL, NULL, $fecha_comprometida, NULL, NULL, NULL, $fecha_inicio));

        }
    }

    /**
     * Funcion que actualiza el estado de la tarea
     * 
     * @author Rami Aleid
     * @access private
     * @static
     * 
     * @param string id de tarea
     * @param string estado nuevo de la tarea
     * 
     * @return null|string
     */
    public static function actualizarEstadoTarea($tarea, $estado, $nombre_tarea, $nombre_estado, $cliente, $contraparte, $servicio_contratado, $id_tipo_tarea) {
        $tipo_accion_tarea = null;
        $iniciada = false;
        //
        if ($estado == 'A' || $estado == 'W' || $estado == 'E' || $estado == 'M' || $estado == 'K' || $estado == 'N' || $estado == 'F') {
            switch ($estado) {
                case 'A':
                    $nombre_estado = "No Calificado";
                    break;
                case 'W':
                    $nombre_estado = "En Espera";
                    break;
                case 'E':
                    $nombre_estado = "En proceso";
                    $tipo_accion_tarea = 'I';
                    $iniciada = true;
                    break;
                case 'M':
                    $nombre_estado = "A completar";
                    break;
                case 'K':
                    $nombre_estado = "Aprobado";
                    $tipo_accion_tarea = 'F';
                    break;
                case 'N':
                    $nombre_estado = "Cancelado";
                    break;
                case 'F':
                    $nombre_estado = "Finalizado";
                    break;
            }
        }
        // SI NO EXISTE PDF NO PERMITE CERRAR CONTROL DE CALIDAD
        if ($nombre_estado == 'Aprobado' && $id_tipo_tarea == '247') {
            $informe_path = env('PATH_DOCUMENTOS') . '/dossier/' . $contraparte . '.pdf';
            //
            if (!file_exists($informe_path)) {
                return 'No se puede aprobar la actividad Control de Calidad sin crear el pdf del informe';
            }
        }
        //$temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió el estado de la tarea '.$nombre_tarea.' a '.$nombre_estado, $cliente, 'CAMBIAR_ESTADO_TAREA','IV_BACK',$contraparte,Session::get('usuario')->user_id,NULL,$servicio_contratado), 'selectOne');
        SQLConnection::logTrazabilidad('Se cambió el estado de la tarea ' . $nombre_tarea . ' a ' . $nombre_estado, 'CAMBIAR_ESTADO_TAREA', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $id_tipo_tarea, $tipo_accion_tarea);
        if ($estado == 'K') {
            SQLConnection::logTrazabilidad('Se aprobo la tarea ' . $nombre_tarea, 'FIN_TAREA', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL, $tarea);
            Misc::calcularTATTarea($contraparte, $tarea);
            //
            if ($id_tipo_tarea == '247') {
                SQLConnection::logTrazabilidad('Se cerró y se publicó el informe', 'END_PUBLISH_IV_REPORT', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, $id_tipo_tarea);
            }
        } elseif ($iniciada) {
            self::marcarTareaIniciada($tarea);
        }
        //
        if ($estado == 'N') {
            SQLConnection::logTrazabilidad('Se anulo la tarea ' . $nombre_tarea, 'ANULAR_TAREA', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL, $tarea);
            Misc::calcularTATTarea($contraparte, $tarea);
        } elseif ($estado == 'E' || $estado == 'P') {
            SQLConnection::logTrazabilidad('Se inicio la tarea ' . $nombre_tarea, 'INICIAR_TAREA', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL, $tarea);
        } elseif ($estado == 'W') {
            SQLConnection::logTrazabilidad('Se puso en Espera la tarea ' . $nombre_tarea, 'ESPERA_TAREA', Session::get('webdata')['id_menu_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, null, null, null, null, null, NULL, NULL, $tarea);
        }
        /* if ( $nombre_estado == 'Aprobado' && $id_tipo_tarea == '247' ) {
            SQLConnection::logTrazabilidad('Se cerró y se publicó el informe','END_PUBLISH_IV_REPORT',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,$tarea);
        } elseif ( $iniciada ){
            self::marcarTareaIniciada($tarea);
        } */
        // 
        return SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_ESTADO', NULL, $tarea, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, $estado));
    }

    /**
     * Funcion que verifica el documento que depende de la tarea
     * 
     * @access private
     * @static
     * 
     * @param string id cliente
     * @param string id contraparte
     * @param string id gestion
     * @param string id del tipo de documento el cual usa la tarea en su actividad
     * @param string porcentaje de la integridad de carga
     * @param string porcentaje de la integridad de rechazo
     * @param string porcentaje de la integridad de verificacion
     * 
     * @return void
     */
    private static function evaluarVerificarDocTarea($cliente, $contraparte, $gestion, $id_tipo_doc, $integ_carga, $integ_rech, $integ_verif) {
        $user_id = Session::get('usuario')->user_id;
        $datos_doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $id_tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, $user_id, null, null), 'selectOne');
        //
        if (!is_null($datos_doc)) {
            self::verificarDoc($datos_doc->doc_id, $integ_carga, $integ_verif, $integ_rech);
        }
    }

    /**
     * Funcion que devuelve el documento 
     * de la tarea a estado ingresado 
     * cuando esta en proceso
     * 
     * @access private
     * @static
     * 
     * @param string|int id cliente
     * @param string|int id contraparte
     * @param string|int id gestion
     * @param string|int id del tipo de documento el cual usa la tarea en su actividad
     * 
     * @return void
     */
    private static function ingresarDocTarea($cliente, $contraparte, $gestion, $id_tipo_doc) {
        $user_id = Session::get('usuario')->user_id;
        $datos_doc = SQLConnection::backendStoreProcedure('LN_docs_', array('sin_accion', null, $cliente, $contraparte, $id_tipo_doc, null, null, null, null, null, null, null, null, null, null, $gestion, $user_id, null, null), 'selectOne');
        //
        if (!is_null($datos_doc) && $datos_doc->estado_doc != 'I') {
            self::devolverEstadoDoc($datos_doc->doc_id);
        }
    }

    /**
     * Funcion que evalua las tareas que dependen
     * de la aprobacion de una tarea 
     * 
     * @author Rami Aleid
     * @access private
     * @static
     * 
     * @param array Lista de tareas dependientes
     * @param string Numero Contraparte
     * @param string Servicio Contratado 
     * @param string Cliente
     * @param string Estado tarea
     * 
     * @return void
     */
    private static function evaluarTareaDependencias($tareas_dependientes, $contraparte, $servicio_contratado, $cliente, $estado = NULL, $todas_tareas = NULL, $tarea_actual = NULL, $una_tar = NULL) {
        $user_id = Session::get('usuario')->user_id;
        // dd($tareas_dependientes);
        if (($estado == 'K' || $estado == 'N')) {
            // ABRE LAS DEPENDENCIAS
            foreach ($tareas_dependientes as $tarea) {
                // 
                if (isset($tarea->ready_to_start) && $tarea->ready_to_start == '0' && isset($tarea->pend_aprobar) && isset($tarea->informe) && $tarea->pend_aprobar == '0') {
                    SQLConnection::backendStoreProcedure('IV_ready2start', array('READY2START', $contraparte, $tarea->informe, $user_id, $servicio_contratado, $cliente));
                    $datos_tarea = self::datosTarea($tarea->informe);
                    SQLConnection::logTrazabilidad('Se abrió la tarea ' . $datos_tarea->nombre_tarea, 'READY2START_TASK', Session::get('webdata')['id_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, NULL, NULL, NULL, NULL, NULL, $tarea->informe);
                }
            }
        } elseif ($estado == 'A' || $estado == 'E') {
            foreach ($todas_tareas as $tar) {
                if ($tarea_actual == $tar->tarea) {
                    $tarea_actual = $tar;
                    break;
                }
            }
            // EVALUA QUE SI EL ESTADO ENVIADO ES EN PROCESO, NO PROVENGA DEL ESTADO ANTERIOR CORRECTO (SIN CALIFICAR)
            if ($tarea_actual->estado_tarea != 'A') {
                // CIERRA DEPENDENCIAS POR VUELTA ATRAS DE ESTADO
                foreach ($tareas_dependientes as $tarea) {
                    if ($tarea->estado_informe != 'A') {
                        $tar = self::datosTarea($tarea->informe);
                        $aux = self::actualizarDatosTarea($tar->cliente, $tar->contraparte, $tar->idTarea, 'A', $tar->idTipoTarea, $tar->tarea_prioridad, $tar->ingresado_por, $tar->userIDAsigandoTarea, $tar->fecha_comprometida_tarea, $tar->inicio_tarea, $tar->informe_padre);
                    }
                    if ($tarea->ready_to_start == '1') {
                        $tar = self::datosTarea($tarea->informe);
                        SQLConnection::backendStoreProcedure('IV_ready2start', array('UNDO_READY2START', $contraparte, $tar->idTarea, Session::get('usuario')->user_id, $servicio_contratado, $cliente));
                        SQLConnection::logTrazabilidad('Se cerró la tarea ' . $tar->nombre_tarea, 'UNDO_READY2START_TASK', Session::get('webdata')['id_plataforma'], Session::get('usuario')->user_id, $tar->servicio_contratado, $cliente, $contraparte, NULL, NULL, NULL, NULL, NULL, $tar->informe_padre);
                    }
                }
                if (!is_null($una_tar) && $una_tar && isset($tarea_actual->ready_to_start) && $tarea_actual->ready_to_start == '0') {
                    // CAMBIA LA TAREA EN CUESTION A READY TO START
                    SQLConnection::backendStoreProcedure('IV_ready2start', array('READY2START', $contraparte, $tarea_actual->tarea, $user_id, $servicio_contratado, $cliente));
                    SQLConnection::logTrazabilidad('Se abrió la tarea ' . $tarea_actual->nombre_tipo_tarea, 'READY2START_TASK', Session::get('webdata')['id_plataforma'], Session::get('usuario')->user_id, $servicio_contratado, $cliente, $contraparte, NULL, NULL, NULL, NULL, NULL, $tarea_actual->tarea);
                }
            }
        }
    }

    /**
     * Funcion que graba
     * las fechas de KPI
     * de las tareas de DAGA
     * @access private
     * @param string tipo de actividad
     * @param string|int id de contraparte
     * @param string|int id de gestion
     * @param string|int id de informe
     * @param string|int id de cliente
     * @param string|int id de servicio contratado
     * @return void
     */
    private static function grabarKPIDAGA($tipo_actividad, $contraparte, $gestion, $informe, $cliente, $servicio_contratado) {
        $user_id = Session::get('usuario')->user_id;
        if ($tipo_actividad == 'B') {
            // Daga interna
            SQLConnection::backendStoreProcedure('IV_Kpi', array('KPI_DAGA_INTERNO', $contraparte, $gestion, $informe, $user_id));
            SQLConnection::logTrazabilidad('Fin de la carga de la DAGA interna', 'FIN_DAGA_INTERNA', Session::get('webdata')['id_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, NULL, NULL, NULL, NULL, NULL, NULL);
        } elseif ($tipo_actividad == 'E') {
            // Daga externa
            SQLConnection::backendStoreProcedure('IV_Kpi', array('KPI_DAGA_EXTERNO', $contraparte, $gestion, $informe, $user_id));
            SQLConnection::logTrazabilidad('Fin de la carga de la DAGA externa', 'FIN_DAGA_EXTERNA', Session::get('webdata')['id_plataforma'], $user_id, $servicio_contratado, $cliente, $contraparte, NULL, NULL, NULL, NULL, NULL, NULL);
        }
    }

    /**
     * Funcion que
     * traba una tarea
     * para que no avance en el 
     * cambio de estado
     * @access private
     * @static
     * @param string tipo de actividad de la tarea
     * @param string id del cliente
     * @param string id de la contraparte
     * @param string id de la gestion
     * @param string estado de la tarea
     * @return bool
     */
    private static function permitirAprobarTarea($tipo_actividad, $cliente, $contraparte, $gestion, $estado_tarea) {
        if ($tipo_actividad == 'I' && $estado_tarea == 'F') {
            $informe = Misc::obtenerInforme($cliente, $contraparte, $gestion);
            if (!isset($informe->informe_existe) || !$informe->informe_existe) {
                return false;
            }
        }
        return true;
    }

    /**
     * Funcion que
     * marca una tarea
     * como iniciada
     * para grabar su 
     * fecha de inicio
     * @access private
     * @static
     * @param string|int el id de la tarea
     * @return void
     */
    private static function marcarTareaIniciada($tarea) {
        SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_INCIADO', NULL, $tarea, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, NULL));
    }

    ////////////////////////////////
    ////// REPORTE DE TAREAS ///////
    ////////////////////////////////

    /**
     * FUNCION QUE DEVUELVE EL REPORTE DE TEAMS
     * @return \Illuminate\View\View 
     * */
    public static function reporteTeams() {
        $user_id = Session::get('usuario')->user_id;
        $teams = SQLConnection::backendStoreProcedure('LN_Teams_', array('LSTTEAMS', $user_id), 'select');
        // Desfiltrar los activos y calcula el numero de activos
        $c_teams = 0;
        foreach ($teams as $id => $team) {
            if ($team->activo == 0) {
                $c_teams++;
                unset($teams[$id]);
            }
        }
        //
        return view('/reporte-teams/dashboard', compact('teams', 'c_teams'));
    }

    public function actualizarIdTarea() {
        $informe = Request::input('informe');
        $id_tipo_informe = Request::input('id_tipo_informe');
        if (isset($informe) and !empty($informe)) {
            if (isset($id_tipo_informe) and !empty($id_tipo_informe)) {
                if ($informe != "") {
                    if ($id_tipo_informe != "") {
                        $tareaSinIdtarea = SQLConnection::backendStoreProcedure('informes_', array('actualizar_idtarea', $informe, $id_tipo_informe));
                        echo json_encode(array("error" => 0, "mensaje" => "Los subinformes han sido actualizados"));
                    } else {
                        echo json_encode(array("error" => 4, "mensaje" => "El tipo de informe recepcionado no puede estar vacío"));
                    }
                } else {
                    echo json_encode(array("error" => 3, "mensaje" => "El informe recepcionado no puede estar vacío"));
                }
            } else {
                echo json_encode(array("error" => 2, "mensaje" => "No hay tipo de informe disponible"));
            }
        } else {
            echo json_encode(array("error" => 1, "mensaje" => "No hay informe disponible"));
        }
    }

    public function enviarMailInforme() {
        //Evalua que el mensaje no sea vacio y que exista un mail a donde enviar
        if (Request::input("mensaje") != "" && Request::input("mailTo") != "") {
            $cliente = Request::input("cliente");
            $contraparte = Request::input("contraparte");
            $gestion = Request::input("gestion");

            //Datos para crear la trazabilidad del envio del mail        
            $id_tipo_informe = Request::input("id_tipo_informe");
            $servicio_contratado = Request::input("servicio_contratado");
            $informe = Request::input("informe");
            $familia = Request::input("familia");

            //Datos para enviar y formar el mail
            $emailTo = Request::input("mailTo");
            $mensaje = Request::input("mensaje");
            $nombre_contraparte = Request::input("nombre_contraparte");
            $id_plataforma = Session::get('webdata')['id_plataforma'];

            $plataformmaId = Session::get('webdata')["web_id"];
            $multiweb = SQLConnection::backendStoreProcedure('multi_web_', array('editar', $plataformmaId));

            $sender = $multiweb[0]->sender;
            //$logo = $multiweb[0]->uri_email_logo;
            $logo = $multiweb[0]->uri_logo;


            $content = array("sender" => $sender, "logo" => $logo, "mensaje" => $mensaje, "nombre_contraparte" => $nombre_contraparte);
            $eml = Misc::enviarMail('/mails/consultas_generales', $emailTo, $content, $sender);
            $historial_informe = '[' . Session::get('usuario')->first_name . ' ' . Session::get('usuario')->last_name . ' - ' . date('d/m/Y H:i') . ']' . ' ' . $mensaje;
            $historial_informe = str_replace('<br><br>', '<br>', $historial_informe);
            SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_HIST_INFORME', $contraparte, $informe, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $historial_informe));

            //Inserta la trazabilidad
            $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array("Mensaje a la contraparte fue enviado", $cliente, "ENVIO_DE_MENSAJE", $id_plataforma, $contraparte, Session::get('usuario')->user_id, null, $servicio_contratado, null, $familia, $id_tipo_informe, null, null, ), 'selectOne');

            $respuesta = array("error" => "1", "respuesta" => "Su email ha sido exitosamente enviado");

            return json_encode($respuesta);
        } else {
            $respuesta = array("error" => "0", "respuesta" => "Falta completar campo de mensajes o mail");

            return json_encode($respuesta);
        }
    }

    public function modificarBalanceNuevo(){
        $nombre_persona = Request::Input('nombre_persona');            
        $cuit = Request::Input('cuit');
        $id_balance = Request::input('id_balance');
        $task_id = Request::Input('task_id');
        $task_id1 = Request::Input('task_id1');
        //print_r('task_id1: '.$task_id1); 
        $fecha_inicio = Request::Input('fecha_inicio_tarea');
        $usuario_tarea  = Request::Input('usuario_tarea');
        $user_id 		    = Session::get("usuario")->user_id;
        if ($fecha_inicio == '')
                { $fecha_inicio = null; }
        //$balances = SQLConnection::backendBalancesContablesid($id_balance);
        $balances = SQLConnection::backendStoreProcedure('backend_balances_contables',array($id_balance,null,null,null,null,$user_id),"selectOne");
        
        $monedas  = SQLConnection::obtenerMonedas();

        $archivo = ENV('PATH_COMPARTIDO').$balances->ruta_archivo; 
        $existe_pdf = false;
        if (file_exists($archivo)){
            $archivo = ENV('RUTA_ARCHIVO_PDF').$balances->ruta_archivo;
            $existe_pdf = true; 
        }

        if ($task_id != null && $task_id != 0 && $fecha_inicio == null && $usuario_tarea == $user_id) // solo se unicia la tarea, si usuario es el asignado
        {
            $fecha_inicio = SQLConnection::backendStoreProcedure('backend_iniciar_tarea',array($task_id),"selectOne");
        }
        
        return view('informes-blue/actividades-tarea/modal_balances_nuevo')->with(compact('balances','monedas','existe_pdf','cuit','nombre_persona','task_id','archivo'));
    }

    public function altaBalancesNuevo() {
        $user_id = Session::get("usuario")->user_id;
        //$id_padron 	= Session::get("id_padron");
        $id_padron = null;
        $id_balance = Request::input("id_balance");
        $cuit = Request::input('cuit');
        $nombre_persona = Request::Input('nombre_persona');
        $accion = Request::input('accion');
        $anios = Request::input('anios');
        $visible = Request::input('visible');
        $usuario_tarea = Request::Input('usuario_tarea_alta');
        $estado_actual = Request::input('grabar_estado');



        $valores = [];
        $valores['cuit'] = $cuit;
        $valores['id_padron'] = $id_padron;
        $valores['user_id'] = $user_id;

        //var_dump(request()->except('_token','accion','anios','visible','usuario','cuit','nombre_persona','task_id','usuario_tarea_alta')); 
        //die(); 

        // SE DEFIENEN VARIABLES NUEVAS DE VALORES
        $rec_fin_cash = '';
        $rec_fin_no_cash = '';
        $rec_pam = '';
        //

        foreach (request()->except('_token', 'accion', 'anios', 'visible', 'usuario', 'cuit', 'nombre_persona', 'task_id', 'usuario_tarea_alta') as $key => $valor) {
            $parte = substr($key, 0, 4);
            //if ($parte != "ind_") { 
            $valor = str_replace(",", "", $valor);
            //}
            //
            if (empty($valor)) {
                //$valor = '0';
                $valor = NULL;
            }
            if ($key == "bal_man" && $valor == null) {
                $valor = "B";
            }
            //
            if ($key == 'res_fin_cash') {
                $rec_fin_cash = $valor;
                continue;
            }
            //
            if ($key == 'res_fin_no_cash') {
                $rec_fin_no_cash = $valor;
                continue;
            }
            //
            if ($key == 'rec_pam') {
                $rec_pam = $valor;
                continue;
            }
            $valores[$key] = $valor;
        }

        //var_dump($valores); die(); 
        if ($accion == 'M') {
            if ($user_id == $usuario_tarea) {
                $valores['tarea_otro'] = 'tarea';
            } else {
                $valores['tarea_otro'] = 'otro';
            }
        }

        //var_dump($valores);die();
        $valores = array_values($valores);
        // SE AGREGAN LOS NUEVOS CAMPOS AL FINAL DEL ARRAY
        array_push($valores, $rec_fin_cash);
        array_push($valores, $rec_fin_no_cash);
        array_push($valores, $rec_pam);
        
        dd($valores);
        
        $task_id = Request::Input('task_id');
        //
        $estado_anterior = new stdClass();
        if ($accion == 'A') {
            $estado_anterior->estado = '';
            $store_procedure = 'backend_alta_balances_contables';
            $mensaje_balances = SQLConnection::backendStoreProcedure($store_procedure, $valores, "selectOne");
        } else {
            $estado_anterior = SQLConnection::backendStoreProcedure('backend_estado_balances_contables', array($id_balance), "selectOne");
            $store_procedure = 'backend_modificacion_balances_contables';
            $mensaje_balances = SQLConnection::backendStoreProcedure($store_procedure, $valores, "selectOne");
        }

        $anios = 50;
        $visible = 1;

        $menu = Misc::obtenerPermisosNavigator();
        //$balances = SQLConnection::backendBalancesContables($cuit,$anios,$visible,$task_id);
        $balances = SQLConnection::backendStoreProcedure('backend_balances_contables', array(null, $cuit, $anios, $visible, $task_id, $user_id), "select");

        $balances2 = [];
        if ($task_id != null && $task_id != 0 && isset($menu['BALANCE'])) {
            //$balances2 = SQLConnection::backendBalancesContables($cuit,$anios,$visible,'');
            $balances2 = SQLConnection::backendStoreProcedure('backend_balances_contables', array(null, $cuit, $anios, $visible, '', $user_id), "select");
        }
        // Avisar a LED - cambio en balance
        if ((isset($estado_anterior->estado) && $estado_anterior->estado == 'PUBLICADO') || (isset($estado_actual) && $estado_actual == 'PUBLICADO')) {
            //TODO: llamarLED no existe en la clase
            self::llamarLED($cuit);
        }
        return json_encode(array('error' => $mensaje_balances->error, 'mensaje' => $mensaje_balances->mensaje));

    }

    public function visibleBalancesNuevo() {
        $id_balance = Request::Input('id_balance');
        $estado_anterior = SQLConnection::backendStoreProcedure('backend_estado_balances_contables', array($id_balance), "selectOne");
        $visible_balance = SQLConnection::backendVisible($id_balance, 'backend_eliminar_activar_balances');
        // Avisar a LED - cambio en balance
        if (isset($estado_anterior->estado) && $estado_anterior->estado == 'PUBLICADO') {
            self::llamarLEDNuevo($cuit);
        }

        return json_encode(array('error' => $visible_balance->error, 'mensaje' => $visible_balance->mensaje));
    }

    public static function llamarLEDNuevo($cuit) {
        $html = ENV('URL_LED_CUIT') . '?cuit=' . $cuit;
        $urlLed = file_get_contents($html);
    }

    //FUNCIONES PARA EL PANEL DE USUARIOS DISCRIMINADO POR TAREAS
    public function panelUsuariosPorTarea() {
        $usuarios = SQLConnection::backendStoreProcedure('IV_panel_teams', array('PANEL_TODOS', env('PLATAFORMA'), null, null));

        $usuarios_id = [];
        $usuarios_sistemas = [793639331, 422946826, 725499615, 461605648];
        foreach ($usuarios as $k => $usuario) {
            if (in_array($usuario->user_id, $usuarios_sistemas)) {
                unset($usuarios[$k]);
                continue;
            }
            $usuarios_id[] = $usuario->user_id;
        }
        $usuarios = array_values($usuarios);
        // dd($usuarios);
        return view('/panel-usuarios/panel_usuarios_tareas')->with(compact('usuarios', 'usuarios_id'));
    }

    public static function envioProximaIndividual() {
        if (isset($_POST['fecha_prox']) && !empty($_POST['fecha_prox']) && isset($_POST['id_tarea'])) {
            $proximo_contacto = date_create_from_format('!d/m/Y', $_POST['fecha_prox']);
            $fecha_proximo_contacto = date_format($proximo_contacto, 'Y-m-d H:i:s');
            $tarea = $_POST['id_tarea'];
            SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_FECHA_PROX_LLAMADO', NULL, $tarea, Session::get('usuario')->user_id, NULL, NULL, NULL, NULL, null, null, null, null, null, null, null, null, null, null, 'spa', null, null, null, null, null, null, 0, $fecha_proximo_contacto));
        }
    }

    // EDITOR MASIVO DE INFORMES Y TAREAS

    public static function editorMasivoInformeTarea() {
        $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT', NULL, NULL, NULL, NULL, 0, env('PLATAFORMA')), 'select');
        $paises = SQLConnection::backendStoreProcedure('backend_obtener_paises', array(), 'select');
        $tipos_informes = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('LISTAR', null, null, null, null, null, null, null, null, null, null, null, env('PLATAFORMA')), 'select');
        $tipos_tareas = SQLConnection::backendStoreProcedure('LN_Tareas_', array('LISTAR', NULL, NULL), 'select');
        $usuarios_disponibles = SQLConnection::backendStoreProcedure('LN_Blue', array('USERS_BACK', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, env('PLATAFORMA')));
        //
        $titulo_navbar = 'Editor Masivo de Informes y Tareas';
        //
        return view('/editor-masivo-informes-tareas/panel_informes_tareas')->with(compact('clientes', 'paises', 'tipos_informes', 'tipos_tareas', 'usuarios_disponibles', 'titulo_navbar'));
    }

    public static function obtenerInformesCliente() {
        $cliente = Request::input('cliente');
        $familias_cliente = SQLConnection::backendStoreProcedure('LN_familias_', array('search', NULL, NULL, $cliente, NULL, NULL, NULL), 'select');
        $informes_cliente = [];
        foreach ($familias_cliente as $fam) {
            if (is_null($fam->total_contrapartes) || $fam->visible == '0') {
                continue;
            }
            $informes_familia = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('LISTAR_FAMILIA', '', '', NULL, 1, 5, 20, $cliente, $fam->familia, 'spa', NULL, Session::get('usuario')->user_id), 'select');
            foreach ($informes_familia as $inf) {
                if (!isset($informes_cliente[$inf->idTipoInforme])) {
                    $informes_cliente[$inf->idTipoInforme] = $inf;
                }

            }
        }
        $informes_cliente = array_values($informes_cliente);
        return $informes_cliente;
    }

    public static function obtenerTareasTipoInforme() {
        $informe = Request::input('informe_select');
        $tareas_informe = [];
        $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITARINF', $informe, null, null, null, null, null, null, null, null, null), 'select');
        if (!empty($informe)) {
            foreach ($partes_informe as $part) {
                if ($part->tipo_elem == 'T') {
                    array_push($tareas_informe, $part);
                }
            }
        }
        return $tareas_informe;
    }

    public static function resultFiltroEditorMasivo() {
        $cliente = Request::input('cliente');
        $selector_inf_tar = Request::input('sel_informe_tarea');
        $tipo_informe = Request::input('informe_select');
        $tipo_informe = is_array($tipo_informe) ? implode(',', $tipo_informe) : $tipo_informe;
        $pais = (!empty(Request::input('pais'))) ? Request::input('pais') : NULL;
        $estado = (!empty(Request::input('estado'))) ? Request::input('estado') : NULL;
        $fecha_desde = Request::input('fecha_desde');
        $fecha_hasta = Request::input('fecha_hasta');
        $user_id = (!empty(Request::input('usuario'))) ? Request::input('usuario') : NULL;
        $estado_tarea = Request::input('estado_tar');
        $orden_tarea_select = Request::input('orden_tarea_select');
        $id_elem_tar = Request::input('id_elem_tar');
        $rol_tar = Request::input('rol_tar');
        //--
        $fecha_desde = date_create_from_format('Y-m-d', $fecha_desde) ?? NULL;
        $fecha_hasta = date_create_from_format('Y-m-d', $fecha_hasta) ?? NULL;
        //--
        $fecha_desde->setTime(0, 0, 0);
        $fecha_hasta->setTime(23, 59, 59);
        //--
        $fecha_desde = ($fecha_desde != FALSE && $fecha_desde != NULL) ? $fecha_desde->format('Y-m-d H:i:s') : NULL;
        $fecha_hasta = ($fecha_hasta != FALSE && $fecha_hasta != NULL) ? $fecha_hasta->format('Y-m-d H:i:s') : NULL;
        $datos = [];
        // 
        $miembros_team = [];
        // $teams_tar = [];
        if ($selector_inf_tar == 'I') {
            // POR EL MOMENTO LA BÚSQUEDA DE INFORMES ES PARA INFORMES SIN PUBLICAR
            if (!is_null($estado)) {
                $datos = SQLConnection::backendStoreProcedure('LN_panel_reports', array('filt_panel_informes', $user_id, $cliente, null, null, null, env('PLATAFORMA'), $estado, $fecha_desde, $fecha_hasta, NULL, 0, NULL, $tipo_informe, $pais));
            } else {
                $datos = SQLConnection::backendStoreProcedure('LN_panel_reports', array('filt_panel_informes', $user_id, $cliente, null, null, null, env('PLATAFORMA'), 'A', $fecha_desde, $fecha_hasta, NULL, 0, NULL, $tipo_informe, $pais));
                $estados_inf = ['P', 'W', 'E'];
                foreach ($estados_inf as $est) {
                    $aux = SQLConnection::backendStoreProcedure('LN_panel_reports', array('filt_panel_informes', $user_id, $cliente, null, null, null, env('PLATAFORMA'), $est, $fecha_desde, $fecha_hasta, NULL, 0, NULL, $tipo_informe, $pais));
                    if (!empty($aux)) {
                        foreach ($aux as $reg) {
                            array_push($datos, $reg);
                        }
                    }
                }
            }
        } elseif ($selector_inf_tar == 'T') {
            // BUSQUEDA DE TAREAS
            $tipo_tarea = Request::input('tipo_tarea');
            $tipo_tarea = is_array($tipo_tarea) ? implode(',', $tipo_tarea) : $tipo_tarea;
            $usuario = Request::input('usuario');
            if (!is_null($estado_tarea)) {
                $datos = SQLConnection::backendStoreProcedure('LN_panel_reports', array('filt_panel_tareas', $usuario, $cliente, null, null, null, env('PLATAFORMA'), $estado_tarea, $fecha_desde, $fecha_hasta, NULL, 0, NULL, $tipo_informe, $pais, NULL, NULL, $tipo_tarea));
            } else {
                $datos = SQLConnection::backendStoreProcedure('LN_panel_reports', array('filt_panel_tareas', $usuario, $cliente, null, null, null, env('PLATAFORMA'), 'A', $fecha_desde, $fecha_hasta, NULL, 0, NULL, $tipo_informe, $pais, NULL, NULL, $tipo_tarea));
                if (!empty($datos)) {
                    foreach ($datos as $k => $reg) {
                        if (($reg->nombre_estado == 'Aprobado') || ($reg->nombre_estado == 'Anulado')) {
                            unset($datos[$k]);
                        }
                    }
                }
                $estados_tar = ['P', 'W', 'E'];
                foreach ($estados_tar as $est) {
                    $aux = SQLConnection::backendStoreProcedure('LN_panel_reports', array('filt_panel_tareas', $usuario, $cliente, null, null, null, env('PLATAFORMA'), $est, $fecha_desde, $fecha_hasta, NULL, 0, NULL, $tipo_informe, $pais, NULL, NULL, $tipo_tarea));
                    if (!empty($aux)) {
                        foreach ($aux as $reg) {
                            if (!($reg->nombre_estado == 'Aprobado') || !($reg->nombre_estado == 'Anulado')) {
                                continue;
                            }
                            array_push($datos, $reg);
                        }
                    }
                }
            }
            $datos = array_values($datos);
        }

        $usuarios_disponibles = SQLConnection::backendStoreProcedure('LN_demo_', array('usuarios_solicitantes', null, $cliente), 'select');
        $teams = SQLConnection::backendStoreProcedure('LN_Teams_', array('LSTTEAMS', $user_id), 'select');
        // ORGANIZANDO DATA PARA MOSTRAR
        foreach ($datos as $reg) {
            // SI ES INFORME PARSEAR FECHA COMPROMETIDA PARA MOSTRAR - PEDIR PARA MODIFICAR A MARITA
            if (!is_null($reg->fecha_comprometida) && !isset($reg->fecha_comprometida_dmy)) {
                $reg->fecha_comprometida_dmy = new DateTime($reg->fecha_comprometida);
                $reg->fecha_comprometida_dmy = $reg->fecha_comprometida_dmy->format('d/m/Y');
            }
            foreach ($teams as $t) {
                // CREA LISTA DE MIEMBROS DE UN TEAM - PEDIR A MARITA
                $aux = SQLConnection::backendStoreProcedure('LN_Teams_', array('LSTTEAMMEMBER', $user_id, $t->id_team), 'select');
                foreach ($aux as $i => $m) {
                    //if (!isset($miembros_team[$i]) && $m->id_rol != $rol_tar) {
                    if ( !isset($miembros_team[$i]) ) {
                        $miembros_team[$m->user_id] = $m;
                    }
                }
                // AGREGA NOMBRE DEL TEAM PARA MOSTRAR - PEDIR PARA MODIFICAR A MARITA
                if (isset($reg->idTeam)) {
                    if ($t->id_team == $reg->idTeam) {
                        $reg->nombre_team = $t->nombre;
                    }
                }
            }
        }
        $miembros_team = array_values($miembros_team);
        //--
        return view('/editor-masivo-informes-tareas/tabla-panel-informes-tareas')->with(compact('cliente', 'pais', 'tipo_informe', 'estado', 'estado_tarea', 'fecha_desde', 'fecha_hasta', 'datos', 'selector_inf_tar', 'teams', 'usuarios_disponibles', 'miembros_team', 'orden_tarea_select', 'id_elem_tar', 'rol_tar'));
    }

    public static function updMasivoInformes() {
        $tipo_informe = Request::input('id_tipo_inf');
        $informes = Request::input('lista_informes');
        $informes = rtrim($informes, ",");
        $estado = Request::input('estado_inf_lote');
        $fecha_inicio = Request::input('fecha_ini_inf');
        $fecha_comprometida = Request::input('fecha_comp_inf');
        $dedicacion = Request::input('dedicacion_inf_lote');
        $team = Request::input('team_inf_lote');
        $cliente = Request::input('cliente');
        $nota = Request::input('nota');

        $datos_tipo_inf = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR', null, null, null, null, null, null, null, null, null, $tipo_informe, null), 'selectOne');

        $fecha_ini_obj = !empty($fecha_inicio) ? new DateTime($fecha_inicio) : NULL;
        $fecha_comp_obj = !empty($fecha_comprometida) ? new DateTime($fecha_comprometida) : NULL;
        if (is_object($fecha_ini_obj)) {
            $fecha_ini_obj->setTime(9, 0, 0);
        }
        if (is_object($fecha_comp_obj)) {
            $fecha_comp_obj->setTime(18, 0, 0);
        }
        $user_id = Session::get('usuario')->user_id;
        // VALIDA QUE SE HAYAN ENVIADO ALGÚN PARAMETRO PARA CAMBIAR
        if ((!is_null($fecha_ini_obj) || !is_null($fecha_comp_obj) || !empty($estado) || !empty($dedicacion) || !empty($team)) && !empty($informes)) {
            // VALIDACION TEAM
            if (!empty($team)) {
                foreach (explode(',', $informes) as $inf) {
                    $tareas_inf = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $inf));
                    $miembros = SQLConnection::backendStoreProcedure('LN_Teams_', array('LSTTEAMMEMBER', $user_id, $team), 'select');
                    foreach ($tareas_inf as $tar_roles) {
                        $existe_rol = false;
                        foreach ($miembros as $m) {
                            if ($tar_roles->rol_tarea == $m->id_rol) {
                                $existe_rol = true;
                            }
                        }
                        if (!$existe_rol) {
                            return json_encode(['error' => 1, 'msg' => '<br>El Team no tiene alguno de los roles necesarios para el Modelo de Informe', 'opt' => null]);
                        }
                    }
                }
            }
            // VALIDA QUE LA FECHA DE INICIO SEA MENOR A LA FECHA COMPROMETIDA ENVIADA
            $hoy = new DateTime();
            $hoy->setTime(9, 0, 0);
            if (!is_null($fecha_ini_obj) && !is_null($fecha_comp_obj) && $fecha_ini_obj >= $fecha_comp_obj) {
                return json_encode(['error' => 1, 'msg' => '<br>La fecha de inicio elegida es mayor o igual a la fecha comprometida elegida', 'opt' => null]);
            }
            if (!is_null($fecha_ini_obj) && $fecha_ini_obj < $hoy) {
                return json_encode(['error' => 1, 'msg' => '<br>La Fecha de Inicio no puede ser menor a la fecha de hoy', 'opt' => null]);
            }
            // SI USUARIO ENVIA FECHA DE INICIO Y COMPROMETIDA, Y LA COMPROMETIDA ENVIADA ES MENOR A LA DURACIÓN DEL INFORME, REESCRIBE LO QUE EL USUARIO SELECCIONÓ POR LA FECHA CALCULADA
            $fecha_comp_default = null;
            if (!is_null($fecha_ini_obj)) {
                $aux = Misc::establecerFechasInforme($datos_tipo_inf->duracion, $fecha_inicio);
                $aux = new DateTime($aux['fecha_comprometida']);
                if (!is_null($fecha_comp_obj) && $aux > $fecha_comp_obj) {
                    $fecha_comp_default = $aux; // PARA DEFIINIR FECHA COMPROMETIDA DEFAULT ES NECESARIO QUE EL USUARIO ENVÍE FECHA INICIO Y FECHA COMPROMETIDA, Y ADEMÁS QUE LA FECHA COMPROMETIDA SEA MENOR AL CÁLCULO ENTRE LA FECHA DE INICIO ENVIADA POR EL USUARIO Y LA DURACIÓN QUE TIENE EL INFORME
                }
            }
            $data_informes_tareas = SQLConnection::backendStoreProcedure('informes_updates', array('SELECT', $informes), 'select');
            // 
            $validacion_comp = 0;
            $fecha_comp_valida = new DateTime($fecha_comprometida);
            // 
            $validacion_ini = 0;
            $fecha_ini_valida = null;
            $result = [];
            $informe_padre = null;
            $recalculo_tareas = false;
            foreach ($data_informes_tareas as $k => $tarea) {
                if (is_null($tarea->informe_padre)) {
                    // DATOS DE LOS INFORMES SELECCIONADOS
                    $result[$tarea->informe] = ['inicio' => $tarea->fecha_inicio, 'comprometida' => $tarea->fecha_comprometida, 'tareas' => []];
                } else {
                    // DATOS DE LAS TAREAS DE LOS INFORMES
                    // SI EL USUARIO ENVÍA FECHA COMPROMETIDA, SE TIENEN QUE EVALUAR TODAS LAS TAREAS PARA QUE NINGUNA TENGA UNA FECHA COMPROMETIDA MAYOR
                    if (!is_null($fecha_comp_obj)) {
                        $fecha_comp_valida = is_null($fecha_comp_valida) ? new DateTime($fecha_comprometida) : $fecha_comp_valida;
                        $comprometida_tarea = new DateTime($tarea->fecha_comprometida);
                        // SI FECHA COMPROMETIDA DE CUALQUIER TAREA ES MAYOR A LA COMPROMETIDA ENVIADA, SE CONTEMPLA COMO ERROR Y NO GENERA CAMBIOS. SE GUARDA LA MAYOR FECHA COMPROMETIDA ENTRE TODAS LAS TAREAS PARA DEVOLVERLA AL USUARIO POR PANTALLA DÁNDOLE UN VALOR ADECUADO PARA ENVIAR
                        if ($fecha_comp_valida < $comprometida_tarea) {
                            $validacion_comp++;
                            $fecha_comp_valida = $comprometida_tarea;
                        }
                    } elseif (is_null($fecha_comp_obj) && !is_null($fecha_ini_obj)) {
                        // SI NO ENVIA FECHA COMPROMETIDA PERO SI ENVIA FECHA DE INICIO, HACE EL RECALCULO DE FECHAS, SIEMPRE Y CUANDO LA FECHA NO SEA MENOR A HOY
                        if ($informe_padre != $tarea->informe_padre) {
                            $recalculo_tareas = true;
                            // Recalculo de fechas de inicio y comprometida de tareas
                            $todas_tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $tarea->informe_padre));
                            $inicio_tarea = date($fecha_ini_obj->format('Y-m-d H:i:s'));
                            $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($inicio_tarea)));
                            $comprometida_tarea = date($fecha_ini_obj->format('Y-m-d H:i:s'));
                            foreach ($todas_tareas as $k => $tar) {
                                $comprometida_tarea = date('Y-m-d H:i:s', strtotime('+ ' . strval($tar->duracion) . ' minutes', strtotime($comprometida_tarea)));
                                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_TAREA2', $tar->contraparte, $tar->tarea, $user_id, NULL, NULL, $tar->id_tipo_tarea, $tar->dedicacion, $tar->estado_tarea, $tar->ingresado_por, NULL, $tar->tar_asignado, $cliente, NULL, NULL, $comprometida_tarea, NULL, NULL, NULL, $inicio_tarea));
                                $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ ' . strval($tar->duracion) . ' minutes', strtotime($inicio_tarea)));
                                $comprometida_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($comprometida_tarea)));
                            }
                        }
                        $informe_padre = $tarea->informe_padre;
                    }
                }
                //
            }
            if (is_null($fecha_ini_obj) && $validacion_comp > 0) {
                // SI ENVIO FECHA COMPROMETIDA PERO EN LA REVISIÓN DE LA COMRPOMETIDA DE LAS TAREAS ALGUNA ES MAYOR ENVIA ESTE ERROR.
                return json_encode(['error' => 1, 'msg' => 'Algunas tareas tienen Fecha Comrpometida mayor a la seleccionada', 'opt' => '<br> Fecha Comprometida Sugerida: ' . $fecha_comp_valida->format('d/m/Y')]);
            } elseif (is_null($fecha_ini_obj) && !is_null($fecha_comp_obj) && $validacion_comp == 0) {
                // SI NO ENVIA FECHA DE INICIO Y SI FECHA COMPROMETIDA Y NO HAY ERRORES, PREPARA FECHA COMPROMENTIDA
                $fecha_comprometida = $fecha_comp_obj->format('Y-m-d H:i:s');
            } elseif (!is_null($fecha_ini_obj) && is_null($fecha_comp_obj)) {
                // SI NO ENVIA FECHA DE COMPROMETIDA Y SI FECHA INICIO, PREPARA FECHA DE INICIO
                $fecha_inicio = $fecha_ini_obj->format('Y-m-d H:i:s');
            } elseif (!is_null($fecha_comp_obj) && !is_null($fecha_ini_obj) && $validacion_comp == 0) {
                // SI ENVIA FECHA DE INICIO Y FECHA COMRPOMETIDA Y NO SE ENCONTRO ERROR EN LAS TAREAS, PREPARA FECHA DE INICIO, EVALUA SI USA COMO FECHA COMPROMETIDA LA ENVIADA POR EL USUARIO O LA COMRPOMETIDA DEFAULT DEL INFORME Y RECALCULA LAS TAREAS
                $fecha_inicio = $fecha_ini_obj->format('Y-m-d H:i:s');
                $fecha_comprometida = ($fecha_comp_default > $fecha_comp_obj) ? $fecha_comp_default->format('Y-m-d H:i:s') : $fecha_comp_obj->format('Y-m-d H:i:s');
                foreach ($result as $k => $inf) {
                    $recalculo_tareas = true;
                    $todas_tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $k));
                    $inicio_tarea = date($fecha_inicio);
                    $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($inicio_tarea)));
                    $comprometida_tarea = date($fecha_inicio);
                    foreach ($todas_tareas as $k => $tar) {
                        $comprometida_tarea = date('Y-m-d H:i:s', strtotime('+ ' . strval($tar->duracion) . ' minutes', strtotime($comprometida_tarea)));
                        SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_TAREA2', $tar->contraparte, $tar->tarea, $user_id, NULL, NULL, $tar->id_tipo_tarea, $tar->dedicacion, $tar->estado_tarea, $tar->ingresado_por, NULL, $tar->tar_asignado, $cliente, NULL, NULL, $comprometida_tarea, NULL, NULL, NULL, $inicio_tarea));
                        $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ ' . strval($tar->duracion) . ' minutes', strtotime($inicio_tarea)));
                        $comprometida_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($comprometida_tarea)));

                    }
                }
            }
            // PREPARA EL MENSAJE DE EXITO PARA EL USUARIO
            $mensaje_ok = $recalculo_tareas ? '<br><ul><li>Se recalcularon las fechas de las tareas.</li>' : '';
            $mensaje_ok .= (!is_null($fecha_comp_obj) && !is_null($fecha_comp_default) && $fecha_comp_default > $fecha_comp_obj) ? '<li>Se cambió la fecha comprometida seleccionada debido a que la duración del informe es mayor. <br> Nueva Fecha Comprometida: ' . $fecha_comp_default->format('Y-m-d') . '</li></ul>' : '</ul>';
            // PREPARA VARIABLES PARA ENVIO AL SORE
            $fecha_inicio = !empty($fecha_inicio) ? $fecha_inicio : NULL;
            $fecha_comprometida = !empty($fecha_comprometida) ? $fecha_comprometida : NULL;
            // UPDATE MASIVO
            SQLConnection::backendStoreProcedure('informes_updates', array('UPDATE', $informes, $estado, $dedicacion, $fecha_inicio, $fecha_comprometida, NULL, NULL, NULL, $user_id, NULL, NULL, $nota), 'select');
            //
            return json_encode(['error' => 0, 'msg' => $mensaje_ok, 'opt' => NULL]);
        } else {
            return json_encode(['error' => 1, 'msg' => 'No envió datos para cambiar', 'opt' => NULL]);
        }
    }

    public static function updMasivoTareas() {
        $tipo_informe = Request::input('id_tipo_inf');
        $tareas = Request::input('lista_tar');
        $tareas = rtrim($tareas, ",");
        $estado = Request::input('estado_tar_lote');
        $dedicacion = Request::input('dedicacion_tar_lote');
        $usuario = Request::input('usuario_tar_lote');
        $fecha_inicio = Request::input('fecha_ini_tar');
        $fecha_comprometida = Request::input('fecha_comp_tar');
        $fecha_prox = Request::input('fecha_prox_tar');
        $cliente = Request::input('cliente');
        $nota = Request::input('nota');
        $orden_tar = Request::input('orden_tar');
        $id_elem = Request::input('id_elem');
        // 
        $user_id = Session::get('usuario')->user_id;
        $data_informes_tareas = SQLConnection::backendStoreProcedure('informes_updates', array('SELECT', $tareas), 'select');
        $fecha_ini_obj = !empty($fecha_inicio) ? new DateTime($fecha_inicio) : NULL;
        $fecha_inicio_correcta = NULL;
        $hoy = new DateTime();
        $fecha_comp_obj = !empty($fecha_comprometida) ? new DateTime($fecha_comprometida) : NULL;
        $fecha_prox_obj = !empty($fecha_prox) ? new DateTime($fecha_prox) : NULL;
        $fecha_comp_obj = !is_null($fecha_comp_obj) ? $fecha_comp_obj->setTime(10, 0, 0) : $fecha_comp_obj;
        $fecha_ini_obj = !is_null($fecha_ini_obj) ? $fecha_ini_obj->setTime(9, 0, 0) : $fecha_ini_obj;
        $hoy = $hoy->setTime(0, 0, 0);
        $validacion = 0;
        $recalculo_tareas = false;
        if (!empty($tareas) && (!empty($estado) || !empty($fecha_inicio) || !empty($fecha_comprometida) || !empty($fecha_prox) || !empty($dedicacion) || !empty($usuario))) {
            // VALIDACION DE USUARIO - SI EN ALGUN TEAM DE LAS TAREAS SELECCIONADAS, EL USUARIO SELECCIONADO NO EXISTE, ENTONCES DEVUELVE UN ERROR Y NO REALIZA CAMBIOS
            if (!empty($usuario)) {
                foreach ($data_informes_tareas as $tar_inf) {
                    if (is_null($tar_inf->informe_padre)) {
                        continue;
                    }
                    $aux = SQLConnection::backendStoreProcedure('LN_Teams_', array('LSTTEAMMEMBER', $user_id, $tar_inf->idTeam), 'select');
                    $val_us = 0;
                    foreach ($aux as $m) {
                        if ($m->user_id == $usuario) {
                            $val_us++;
                        }
                    }
                    if ($val_us == 0) {
                        return json_encode(['error' => 4, 'msg' => 'El usuario no pertenece a ningún miembro del TEAM de alguno de los informes de las tareas seleccionadas.', 'opt' => NULL]);
                    }
                }
            } else {
                $usuario = NULL;
            }
            // VALIDACION DE FECHAS
            if (!empty($fecha_inicio)) {
                if ($fecha_ini_obj < $hoy) {
                    // SI ENVÍA FECHA DE INICIO PERO ES MENOR A HOY
                    return json_encode(['error' => 1, 'msg' => 'La fecha de inicio tiene que ser mayor o igual a hoy.', 'opt' => '<br>Fecha de hoy: ' . $hoy->format('d-m-Y')]);
                } elseif ($orden_tar != '1') {
                    // SI ENVÍA FECHA DE INICIO PERO LA TAREA NO ES LA PRIMERA TAREA
                    return json_encode(['error' => 2, 'msg' => 'No se puede cambiar la Fecha de Inicio de cualquier tarea, solo la Primera Tarea.', 'opt' => NULL]);
                }
                // SI TAMBIÉN ENVÍA FECHA COMPROMETIDA O FECHA PRÓXIMO LLAMADO
                if (!empty($fecha_comprometida) || !empty($fecha_prox)) {
                    if ($id_elem != '287') {
                        // SI NO ES LA TAREA DE GESTIÓN
                        return json_encode(['error' => 3, 'msg' => 'No se puede cambiar la Fecha Comprometida o Fecha de Próximo Contacto de cualquier tarea, solo la Solicitud de Documentación.', 'opt' => NULL]);
                    }
                    if (!is_null($fecha_prox_obj) && $fecha_prox_obj < $hoy) {
                        // SI ENVÍA FECHA DE PROXIMO LLAMADO PERO ES MENOR A HOY
                        return json_encode(['error' => 1, 'msg' => 'La fecha de próximo llamado tiene que ser mayor o igual a hoy.', 'opt' => '<br>Fecha de hoy: ' . $hoy->format('d-m-Y')]);
                    }
                    if (!is_null($fecha_comp_obj) && $fecha_comp_obj < $hoy) {
                        // SI ENVÍA FECHA COMPROMETIDA PERO ES MENOR A HOY
                        return json_encode(['error' => 1, 'msg' => 'La fecha comrpometida tiene que ser mayor o igual a hoy.', 'opt' => '<br>Fecha de hoy: ' . $hoy->format('d-m-Y')]);
                    }
                    foreach ($data_informes_tareas as $tf) {
                        if (!is_null($tf->informe_padre)) {
                            break;
                        }
                        $aux_comp = new DateTime($tf->fecha_comprometida);
                        $aux_ini = new DateTime($tf->fecha_inicio);
                        if ((!is_null($fecha_comp_obj) && $aux_comp <= $fecha_comp_obj) || (!is_null($fecha_prox_obj) && $fecha_prox_obj >= $aux_comp)) {
                            // SI LA FECHA COMPROMETIDA O FECHA PROXIMO LLAMADO ENVIADA ES  MAYOR A LA FECHA COMROMETIDA DE ALGÚN INFORME
                            return json_encode(['error' => 4, 'msg' => 'La Fecha Comprometida o Fecha de Próximo Llamado seleccionada es mayor que la Fecha Comprometida de alguno de los Informes.', 'opt' => NULL]);
                        } elseif ((!is_null($fecha_comp_obj) && $aux_ini >= $fecha_comp_obj) || (!is_null($fecha_prox_obj) && $fecha_prox_obj <= $aux_ini)) {
                            // SI LA FECHA COMPROMETIDA SELECCIONADA ES MENOR O IGUAL A LA FECHA DE INICIO DE ALGÚN INFORME
                            return json_encode(['error' => 5, 'msg' => 'La Fecha de Comprometida o Fecha de Próximo Llamado seleccionada es menor o igual que la Fecha de Inicio de alguno de los Informes.', 'opt' => NULL]);
                        } elseif ($aux_comp <= $fecha_ini_obj) {
                            // SI LA FECHA INICIO SELECCIONADA ES MAYOR O IGUAL A LA FECHA DE COMRPOMETIDA DE ALGÚN INFORME
                            return json_encode(['error' => 5, 'msg' => 'La Fecha de Inicio seleccionada es mayor o igual que la Fecha de Comprometida de alguno de los Informes.', 'opt' => NULL]);
                        } elseif ($aux_ini > $fecha_ini_obj) {
                            // SI LA FECHA INICIO SELECCIONADA ES MENOR A LA FECHA DE INICIO DE ALGÚN INFORME
                            return json_encode(['error' => 5, 'msg' => 'La Fecha de Inicio seleccionada es menor que la Fecha de Inicio de alguno de los Informes.', 'opt' => NULL]);
                        }
                    }
                } else {
                    // SI NO ENVIA FECHA COMP O FECHA PROX LLAMADO COMPARA FECHA INICIO CON FECHAS DE INFORME
                    foreach ($data_informes_tareas as $tf) {
                        if (!is_null($tf->informe_padre)) {
                            break;
                        }
                        $aux_comp = new DateTime($tf->fecha_comprometida);
                        $aux_ini = new DateTime($tf->fecha_inicio);
                        if ($aux_comp <= $fecha_ini_obj) {
                            // SI LA FECHA INICIO ENVIADA ES MAYOR A LA FECHA COMROMETIDA DE ALGÚN INFORME
                            return json_encode(['error' => 4, 'msg' => 'La Fecha de Inicio seleccionada es mayor que la Fecha Comprometida de alguno de los Informes.', 'opt' => NULL]);
                        } elseif ($aux_ini >= $fecha_ini_obj) {
                            // SI LA FECHA INICIO SELECCIONADA ES MENOR A LA FECHA DE INICIO DE ALGÚN INFORME
                            return json_encode(['error' => 5, 'msg' => 'La Fecha de Inicio seleccionada es menor que la Fecha de Inicio de alguno de los Informes.', 'opt' => NULL]);
                        }
                    }

                }
            } elseif (empty($fecha_inicio) && (!empty($fecha_comprometida) || !empty($fecha_prox))) {
                if ($id_elem != '287') {
                    // SI NO ES LA TAREA DE GESTIÓN
                    return json_encode(['error' => 3, 'msg' => 'No se puede cambiar la Fecha Comprometida o Fecha de Próximo Contacto de cualquier tarea, solo la Solicitud de Documentación.', 'opt' => NULL]);
                }
                foreach ($data_informes_tareas as $tf) {
                    if (!is_null($tf->informe_padre)) {
                        break;
                    }
                    $aux_comp = new DateTime($tf->fecha_comprometida);
                    if (!is_null($fecha_comp_obj) && $aux_comp <= $fecha_comp_obj || !is_null($fecha_prox_obj) && $fecha_prox_obj <= $aux_comp) {
                        // SI LA FECHA COMPROMETIDA ENVIADA ES  MAYOR A LA FECHA COMROMETIDA DE ALGÚN INFORME
                        return json_encode(['error' => 4, 'msg' => 'La Fecha Comprometida seleccionada es mayor que la Fecha Comprometida de alguno de los Informes.', 'opt' => NULL]);
                    }
                }
            }
            // UPDATE MASIVO
            // RECALCULO DE FECHAS
            if ($orden_tar == '1' && !empty($fecha_inicio)) {
                $recalculo_tareas = true;
                foreach ($data_informes_tareas as $tar) {
                    if (empty($tar->informe_padre)) {
                        continue;
                    }
                    $todas_tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $tar->informe_padre));
                    if (!empty($fecha_comprometida)) {
                        $inicio_tarea = date($fecha_comp_obj->format('Y-m-d H:i:s'));
                        $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($inicio_tarea)));
                        $comprometida_tarea = date($fecha_inicio);
                    } else {
                        $inicio_tarea = date($fecha_ini_obj->format('Y-m-d H:i:s'));
                        $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($inicio_tarea)));
                        $comprometida_tarea = date($fecha_inicio);
                    }
                    foreach ($todas_tareas as $k => $tar) {
                        // if ($tar->ordTarea == 1) {
                        //     continue;
                        // }
                        $comprometida_tarea = date('Y-m-d H:i:s', strtotime('+ ' . strval($tar->duracion) . ' minutes', strtotime($comprometida_tarea)));
                        SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array('UPD_TAREA2', $tar->contraparte, $tar->tarea, $user_id, NULL, NULL, $tar->id_tipo_tarea, $tar->dedicacion, $tar->estado_tarea, $tar->ingresado_por, NULL, $tar->tar_asignado, $cliente, NULL, NULL, $comprometida_tarea, NULL, NULL, NULL, $inicio_tarea));
                        $inicio_tarea = date('Y-m-d H:i:s', strtotime('+ ' . strval($tar->duracion) . ' minutes', strtotime($inicio_tarea)));
                        $comprometida_tarea = date('Y-m-d H:i:s', strtotime('+ 1 minute', strtotime($comprometida_tarea)));

                    }
                }

            }
            // MENSAJE OK
            $mensaje_ok = "Se realizó cambio masivo de tareas de forma satisfactoria.";
            $mensaje_ok .= $recalculo_tareas ? '<br><ul><li>Se recalcularon las fechas de las tareas.</li></ul>' : '';
            // PREPARA VARIABLES PARA EL STORE
            $estado = !empty($estado) ? $estado : NULL;
            $dedicacion = !empty($dedicacion) ? $dedicacion : NULL;
            $fecha_inicio = !empty($fecha_inicio) ? $fecha_inicio : NULL;
            $fecha_comprometida = !empty($fecha_comprometida) ? $fecha_comprometida : NULL;
            $fecha_prox = !empty($fecha_prox) ? $fecha_prox : NULL;
            $nota = !empty($nota) ? $nota : NULL;
            // UPDATE MASIVO
            // dd(array('UPDATE',$tareas,$estado,$dedicacion,$fecha_inicio,$fecha_comprometida,NULL,NULL,NULL,$user_id,$fecha_prox,$usuario,$nota));
            SQLConnection::backendStoreProcedure('informes_updates', array('UPDATE', $tareas, $estado, $dedicacion, $fecha_inicio, $fecha_comprometida, NULL, NULL, NULL, $user_id, $fecha_prox, $usuario, $nota), 'select');
            // 
            return json_encode(['error' => 0, 'msg' => $mensaje_ok, 'opt' => NULL]);

        } else {
            return json_encode(['error' => 6, 'msg' => 'No envió ningún parametro para modificar o no seleccionó ninguna tarea para ser modificada', 'opt' => NULL]);
        }
    }
    // FIN EDITOR MASIVO INFORMES Y TAREAS 

public static function recalcularFechasMasivoTareas() {
        $lista_tar          = Request::input('lista_tar');
        $cliente            = Request::input('cliente');
        $fecha_comprometida = Request::input('fecha_comprometida');
        $user_id            = Session::get('usuario')->user_id;

        if (empty($lista_tar)) {
            return json_encode(['error' => 1, 'msg' => 'No se enviaron tareas.']);
        }
        if (empty($fecha_comprometida)) {
            return json_encode(['error' => 1, 'msg' => 'No se envio fecha comprometida.']);
        }

        $lista_tar_trimmed = rtrim($lista_tar, ',');
        $data_tareas = SQLConnection::backendStoreProcedure('informes_updates', array('SELECT', $lista_tar_trimmed), 'select');

        if (empty($data_tareas)) {
            return json_encode(['error' => 1, 'msg' => 'No se encontraron datos para las tareas enviadas.']);
        }

        $feriados_raw = SQLConnection::backendStoreProcedure('LN_feriados', array('FERIADOS_INFORME', 'AR', NULL, NULL));
        $feriados = array_map(function($f) {
            return date('n/j/Y', strtotime($f->fecha_feriado ?? $f->fecha ?? ''));
        }, $feriados_raw);

        $informes_procesados = [];
        $tareas_recalculadas = 0;

        foreach ($data_tareas as $tar_sel) {
            $informe_id = $tar_sel->informe_padre ?? null;
            if (empty($informe_id)) continue;
            if (in_array($informe_id, $informes_procesados)) continue;
            $informes_procesados[] = $informe_id;

            $todas_tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe', array('tareas_informe', NULL, $informe_id));
            if (empty($todas_tareas)) continue;

            $primera_tarea = $todas_tareas[0];
            if (empty($primera_tarea->fecha_inicio)) continue;

            $inicio_tarea = DateTime::createFromFormat('Y-m-d H:i:s', $primera_tarea->fecha_inicio);
            if ($inicio_tarea === false) {
                $inicio_tarea = new DateTime($primera_tarea->fecha_inicio);
            }
            $inicio_tarea->setTime(9, 0, 0);
            $inicio_tarea = self::omitirDiasLibresPHP($inicio_tarea);
            $inicio_tarea = self::omitirFeriadosPHP($inicio_tarea, $feriados);

            $comprometida_primera = new DateTime($fecha_comprometida);
            $comprometida_primera->setTime(18, 0, 0);
            $comprometida_primera = self::omitirDiasLibresPHP($comprometida_primera);
            $comprometida_primera = self::omitirFeriadosPHP($comprometida_primera, $feriados);

            foreach ($todas_tareas as $index => $tar) {
                $duracion_minutos = intval($tar->duracion);
                if ($index === 0) {
                    $comprometida_tarea = clone $comprometida_primera;
                } else {
                    $comprometida_tarea = clone $inicio_tarea;
                    $comprometida_tarea->modify('+' . $duracion_minutos . ' minutes');
                    $comprometida_tarea = self::omitirDiasLibresPHP($comprometida_tarea);
                    $comprometida_tarea = self::omitirFeriadosPHP($comprometida_tarea, $feriados);
                }
                SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB', array(
                    'UPD_TAREA2',
                    $tar->contraparte,
                    $tar->tarea,
                    $user_id,
                    NULL, NULL,
                    $tar->id_tipo_tarea,
                    $tar->dedicacion,
                    $tar->estado_tarea,
                    $tar->ingresado_por,
                    NULL,
                    $tar->tar_asignado,
                    $cliente,
                    NULL, NULL,
                    $comprometida_tarea->format('Y-m-d H:i:s'),
                    NULL, NULL, NULL,
                    $inicio_tarea->format('Y-m-d H:i:s')
                ));
                $inicio_tarea = clone $comprometida_tarea;
                $inicio_tarea->modify('+1 minute');
                $inicio_tarea = self::omitirDiasLibresPHP($inicio_tarea);
                $inicio_tarea = self::omitirFeriadosPHP($inicio_tarea, $feriados);
                $tareas_recalculadas++;
            }
        }

        if (empty($informes_procesados)) {
            return json_encode(['error' => 1, 'msg' => 'No se encontraron informes para recalcular.']);
        }

        return json_encode([
            'error' => 0,
            'msg'   => 'Se recalcularon las fechas de ' . count($informes_procesados) . ' informe(s) y ' . $tareas_recalculadas . ' tarea(s).'
        ]);
    }

    private static function omitirDiasLibresPHP(DateTime $fecha): DateTime {
        $dia = (int) $fecha->format('w');
        if ($dia === 6) {
            $fecha->modify('+2 days');
            $fecha->setTime(9, 0, 0);
        } elseif ($dia === 0) {
            $fecha->modify('+1 day');
            $fecha->setTime(9, 0, 0);
        }
        return $fecha;
    }

    private static function omitirFeriadosPHP(DateTime $fecha, array $feriados): DateTime {
        $limite = 0;
        while (in_array($fecha->format('n/j/Y'), $feriados) && $limite < 30) {
            $fecha->modify('+1 day');
            $fecha->setTime(9, 0, 0);
            $fecha = self::omitirDiasLibresPHP($fecha);
            $limite++;
        }
        return $fecha;
    } 



    public function vistaTareasBuscador()
    {
        return view('informes-blue/actividades-tarea/cendeu_buscador');
    }
        
    public function centralDeudoresActData()
    {
        $cuit    = Request::input('cuit');
        $meses = 60;
        $visible = (int) Request::input('visible', 1); // <-- default 1

        $central_deudores = SQLConnection::backendCentralDeudores($cuit, $meses, $visible);
        $ent_bancaria = SQLConnection::obtenerCodigos("obtener_EntidadesBancarias");

        $fuentes = SQLConnection::obtenerCodigos("obtener_Fuentes");

        $eventos = SQLConnection::obtenerCodigos("obtener_Eventos_deudas");
    
        // SOLO el fragmento HTML para insertar
        return view( 'legales/tabla-central-deudores-staff',
            compact('central_deudores','meses','visible','cuit','ent_bancaria','fuentes','eventos')
        )->render();
    }



    public function filtrarCentralDeudores() {    
        $cuit = Request::Input('cuit');
    
        $meses = 60;
        $visible = Request::input('visible');
        $central_deudores = SQLConnection::backendCentralDeudores($cuit, $meses, $visible);

        return view('legales/tabla-central-deudores-staff')->with(compact('central_deudores', 'meses', 'visible', 'cuit'));
    }


    public function bloqueoCendeu() {
        $cuit = Request::Input('cuit');
        $bloqueo_cendeu = SQLConnection::obtenerCendeuBloqueo($cuit);
        $ent_bancaria = (self::$ent_bancaria) ? self::$ent_bancaria : SQLConnection::obtenerCodigos("obtener_EntidadesBancarias");

        return view('legales/tabla_bloqueo_cendeu')->with(compact('bloqueo_cendeu', 'ent_bancaria', 'cuit'));
    }

    public function visibleBloqueoCendeu() {
        $id_cendeu_bloqueo = Request::input('id_cendeu_bloqueo');
        $visible_central_deudores = SQLConnection::backendVisible($id_cendeu_bloqueo, 'backend_visible_bloqueo_cendeu');
        return self::bloqueoCendeu();
    }

    public function altaBloqueoCendeu() {
        $cuit = Request::Input('cuit');
        $codigo_ent = Request::input('blq_banco');
        $periodo_hta = Request::input('blq_periodo_hta');
        $blq_observaciones = Request::input('blq_observaciones');
        //$id_persona = Session::get('id_padron');
        $id_persona = null;
        $usuario = Session::get("usuario")->user_id;

        $params = array($cuit, $codigo_ent, $periodo_hta, $blq_observaciones, $id_persona, $usuario);
        $blq_mensaje = SQLConnection::backendStoreProcedure("backend_alta_cendeu_bloqueo", $params, 'selectOne');
        $tabla = self::bloqueoCendeu();

        return json_encode(array('error' => $blq_mensaje->error, 'mensaje' => $blq_mensaje->mensaje, 'tabla' => $tabla->render()));
    }


    public function cancelaCendeu() {
        //$cuit = Session::get('cuit');
        $cuit = Request::Input('cuit');
        $cancela_cendeu = SQLConnection::obtenerCendeuCancela($cuit);
        //$ent_bancaria  = (self::$ent_bancaria) ? self::$ent_bancaria : SQLConnection::obtenerEntidadesBancarias();
        $ent_bancaria = (self::$ent_bancaria) ? self::$ent_bancaria : SQLConnection::obtenerCodigos("obtener_EntidadesBancarias");
        $fuentes = (self::$fuentes) ? self::$fuentes : SQLConnection::obtenerCodigos("obtener_Fuentes");
        $eventos = (self::$eventos) ? self::$eventos : SQLConnection::obtenerCodigos("obtener_Eventos_Deudas");
        //print_r($eventos); die(); 

        return view('legales/tabla_cancela_cendeu')->with(compact('cancela_cendeu', 'ent_bancaria', 'fuentes', 'eventos', 'cuit'));
    }

    public function visibleCancelaCendeu() {
        $id_cendeu_cancela = Request::input('id_cendeu_cancela');
        $visible_central_deudores = SQLConnection::backendVisible(
            $id_cendeu_cancela,
            'backend_visible_cancela_cendeu'
        );
        return self::cancelaCendeu();
    }


    public function altaCancelaCendeu() {
        //$cuit 			= Session::get('cuit');
        $cuit = Request::Input('cuit');
        $codigo_ent = Request::input('can_banco');
        $periodo_dde = Request::input('can_periodo_dde');
        $periodo_hta = Request::input('can_periodo_hta');
        $can_evento = Request::input('can_evento');
        $can_fecha = Request::input('can_fecha');
        $can_fuente = Request::input('can_fuente');
        $can_fecha_fuente = Request::input('can_fecha_fuente');
        $can_observaciones = Request::input('can_observaciones');
        //$id_persona = Session::get('id_padron');
        $id_persona = null;
        $usuario = Session::get("usuario")->user_id;

        $params = array($cuit, $codigo_ent, $periodo_dde, $periodo_hta, $can_evento, $can_fecha, $can_fuente, $can_fecha_fuente, $can_observaciones, $id_persona, $usuario);
        $can_mensaje = SQLConnection::backendStoreProcedure("backend_alta_cendeu_cancela", $params, 'selectOne');
        $tabla = self::cancelaCendeu();

        return json_encode(array('error' => $can_mensaje->error, 'mensaje' => $can_mensaje->mensaje, 'tabla' => $tabla->render()));
    }
}
