<?php
namespace App\Http\Controllers;

use Request;
use Session;
use DB;
use App\Custom\Misc;
use App\Custom\SQLConnection;

class InformesController extends Controller
{
    // ------------------------------------------------------------------- //
    // ------------------------- ALTA DE INFORME ------------------------- //
    // ------------------------------------------------------------------- //

    // FUNCION QUE DEVUELVE LA VISTA DE ALTA DE NUEVO INFORME
    public static function nuevoInforme(){
        $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',NULL,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select'); // Clientes LED
        $documentos_disponibles = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_', array('available'), 'select');
        //
        $clientes = json_encode($clientes);
        $titulo_navbar = 'Nuevo Tipo Informe';
        $ruta = '/configuracion-informes/editar-informe';
        // dd(SQLConnection::backendStoreProcedure('LN_informe_design_', array('LISTAR',9876013,NULL,NULL,NULL,NULL,NULL,NULL,NULL,null,null), 'select'));
        //
		return view('/configuracion-informes/nuevo-informe')->with(compact('documentos_disponibles','clientes','titulo_navbar','ruta'));
    }

    // FUNCION QUE DEVUELVE LOS COMPONENTES PARA LOS POSIBLES CLIENTES
    public static function componentesClientesInforme(){
        if ( ( isset($_POST['cliente']) && Misc::validacionesGenerica($_POST['cliente'],'numero') ) || isset($_POST['informe_generico']) ){
            if ( isset($_POST['informe_generico']) ){
                // SI ES GENERICO
                $componentes = SQLConnection::backendStoreProcedure('LN_componente_', array('GENERICO',NULL,NULL,NULL,NULL,NULL,NULL,NULL), 'select');
            } else {
                $cliente = Request::input('cliente');
                // SI ES DE CLIENTE
                $componentes = SQLConnection::backendStoreProcedure('LN_componente_', array('CLIENTE',NULL,NULL,NULL,NULL,NULL,NULL,$cliente), 'select');
            }
            //
            return view('/configuracion-informes/cliente_componentes_informe')->with(compact('componentes'));
        } else {
            return 0;
        }
    }

    // FUNCION QUE DEVUELVE LAS TAREAS DISPONIBLES PARA QUE SEAN CONVOCADAS EN EL INFORME
    public static function tareasInforme(){
        $tareas = SQLConnection::backendStoreProcedure('LN_Tareas_', array('LISTAR',NULL,NULL), 'select'); // Tareas Disponibles
        //
        // dd($tareas);
        return view('/configuracion-informes/tareas_componentes_informe')->with(compact('tareas'));
    }

    // FUNCION QUE DEVUELVE LA VISTA DE FORMULARIO NUEVO INFORME
    public static function formularioNuevoInforme(){
        if ( (( isset($_POST['cliente']) && Misc::validacionesGenerica($_POST['cliente'],'numero') ) || isset($_POST['informe_generico'])) && isset($_POST['tareas_informe']) && !empty($_POST['tareas_informe']) ){
            $cliente = ( !is_null(Request::input('informe_generico')) ) ?  NULL : Request::input('cliente');
            $cliente_input = Request::input('clienteOk');
            $componentes_elegidas = Request::input('componentes_informe');
            $tareas_elegidas = Request::input('tareas_informe');
            //
            $componentes = [];
            $tareas = [];
            // SE TRAEN LOS DATOS DE LOS COMPONENTES
            if ( !is_null($componentes_elegidas) ){
                foreach( $componentes_elegidas as $c ){
                    $componentes[] = SQLConnection::backendStoreProcedure('LN_componente_',array('EDITAR',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,$c),'selectOne');
                }
            }
            // SE TRAEN LOS DATOS DE LAS TAREAS
            foreach( $tareas_elegidas as $t ){
                $tareas[] = SQLConnection::backendStoreProcedure('LN_Tareas_',array('EDITAR',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,$t),'selectOne');
            }
            //
            $familias = NULL;
            if ( !is_null($cliente) ){
                $familias = SQLConnection::backendStoreProcedure('LN_familias_', array('search',NULL,NULL,$cliente,NULL,NULL,NULL), 'select');
            }
            //
            return view('/configuracion-informes/formulario_nuevo_informe')->with(compact('cliente','componentes','tareas','cliente_input','familias'));
        } else {
            return 0;
        }
    }

    // FUNCION QUE DA DE ALTA UN NUEVO INFORME
    public function crearInforme(){
        if( isset($_POST['nombre_informe']) && !empty($_POST['nombre_informe']) && isset($_POST['usuarios_informe']) && isset($_POST['prioridad_informe']) && !empty($_POST['prioridad_informe']) && isset($_POST['duracion_informe']) && !empty($_POST['duracion_informe']) && isset($_POST['cliente']) && isset($_POST['tareas']) ){
            $nombre_tipo_informe = $_POST['nombre_informe'];
            $perfil_usr_default = $_POST['usuarios_informe'];
            $descripcion = $_POST['descripcion_informe'] != '' ? $_POST['descripcion_informe'] : NULL;
            $prioridad = $_POST['prioridad_informe'];
            $duracion = $_POST['duracion_informe'];
            $cliente = ( !empty($_POST['cliente']) ) ? $_POST['cliente'] : NULL;
            $familia = ( isset($_POST['familia_informe']) && $_POST['familia_informe'] != '') ? $_POST['familia_informe'] : NULL; 
            //  
            // dd('LN_tipo_informes_', 'AGREGAR',$nombre_tipo_informe,$perfil_usr_default,$descripcion,'1',$prioridad,$duracion,$cliente,$familia,'spa',null,Session::get('usuario')->user_id,env('PLATAFORMA'));
            $idInforme = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('AGREGAR',$nombre_tipo_informe,$perfil_usr_default,$descripcion,'1',$prioridad,$duracion,$cliente,$familia,'spa',null,Session::get('usuario')->user_id,env('PLATAFORMA')),'selectOne');
            //
            if ( isset($idInforme->idTipoInf) && $idInforme->idTipoInf ){
                $componentes = isset($_POST['componentes']) ? $_POST['componentes'] : null;
                $tareas = $_POST['tareas'];
                // Recorre cada componente para agregarlo al nuevo informe
                if ( is_array($componentes) && !empty($componentes)){
                    //
                    for($i=0;$i < count($componentes); $i++){
                        SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$idInforme->idTipoInf,$componentes[$i],'C','3',($i+1),'1',null,null,null,Session::get('usuario')->user_id),'select');
                    }
                    /* foreach ($componentes as $idComp){
                        $orden = $_POST['orden_componente_' . $idComp];
                        $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$idInforme->idTipoInf,$idComp,'C',$duracion,$orden,'1',null,$prioridad,null,Session::get('usuario')->user_id), 'select');
                    } */
                }
                // Recorre cada tarea para agregarla al nuevo informe
                if ( is_array($tareas) && !empty($tareas) ){
                    for($t=0;$t < count($tareas); $t++){
                        $tipo_tarea = $_POST['tipo_tarea_' . $tareas[$t]];
                        $prioridad_tarea = $_POST['prioridad_tarea_' . $tareas[$t]];
                        //
                        if ($tipo_tarea == 'S'){
                            $duracion_tarea = $_POST['duracion_tarea_' . $tareas[$t]];
                        } else if ($tipo_tarea == 'R'){
                            $duracion_tarea = $_POST['periodo_carga_' . $tareas[$t]];
                        }
                        //
                        SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$idInforme->idTipoInf,$tareas[$t],'T',$duracion_tarea,($t+1),'1',null,$prioridad_tarea,$tipo_tarea,Session::get('usuario')->user_id), 'select');
                    }
                    /* foreach ($tareas as $idTarea){
                        $tipo_tarea = $_POST['tipo_tarea_' . $idTarea];
                        $prioridad_tarea = $_POST['prioridad_tarea_' . $idTarea];
                        if ($tipo_tarea == 'S'){
                            $duracion_tarea = $_POST['duracion_tarea_' . $idTarea];
                        } else if ($tipo_tarea == 'R'){
                            $duracion_tarea = $_POST['periodo_carga_' . $idTarea];
                        }
                        $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$idInforme->idTipoInf,$idTarea,'T',$duracion_tarea,null,'1',null,$prioridad_tarea,$tipo_tarea,Session::get('usuario')->user_id), 'select');
                    } */
                }
                // SECCION PARA OBSERVAR SI EL DATO DE ORDEN ES INCONSISTENTE, SI ES ASÍ REORDENA SEGÚN CANTIDAD DE COMPONENTES
                /* $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('LISTAR',$idInforme->idTipoInf,null,null,null,null,null,null,null,null,null), 'select');
                $componentes_inf = [];
                $auxOrden = 0;
                foreach ($partes_informe as $comp){
                    if($comp->tipo_elem == 'C' && $comp->idTipoInforme == $idInforme && $comp->activo == '1'){
                        array_push($componentes_inf,$comp);
                        if($comp->orden > $auxOrden){
                            $auxOrden = $comp->orden;
                        }
                    }
                }
                //
                if (count($componentes_inf) < $auxOrden || $auxOrden == 0 ){
                    foreach ($componentes_inf as $ind => $comp){
                        $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$comp->idTipoInforme,$comp->idElem,'C','3',$ind+1,'1',$comp->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
                    }
                } */
                //
                SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Informe creado con nombre '. $nombre_tipo_informe, $cliente, 'INFORME_CREADO',Session::get('webdata')['id_menu_plataforma'], NULL,Session::get('usuario')->user_id), 'selectOne');
                //
                return 'Informe creado con éxito';
            } else {
                return 'Error en el alta de informe';
            }
        } else {
            return 0;
        }        
    }

    // ---------------------------------------------------------------------- //
    // ------------------------- EDICION DE INFORME ------------------------- //
    // ---------------------------------------------------------------------- //

    // FUNCION QUE DEVUELVE EL UNA TABLA DE CON LOS INFORMES CREADOS
    public static function panelInformesEditar(){
        $titulo_navbar = 'Edición de Informes Existentes';
        
        $informes = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('LISTAR',null,null,null,null,null,null,null,null,null,null,null,env('PLATAFORMA')),'select');
        $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',NULL,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select'); // Clientes LED
        
		return view('/configuracion-informes/edicion/tabla_informe_existentes')->with(compact('informes','clientes','titulo_navbar'));
    }

    /**
     * FUNCION QUE DEVUELVE LA VISTA DE UN FORMULARIO PARA EDITAR LOS DATOS DEL INFORME
     */
    public static function formularioEditarInforme(){
        $idInforme = $_POST['informe'];
        //
        $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR',null,null,null,null,null,null,null,null,null,$idInforme,null),'selectOne');
        $cliente = (object)['cliente' => NULL,'nombre_cliente' => 'GENERICO'];
        //
        if ( $informe->cliente ){
            $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',$informe->cliente,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select'); // Clientes LED
            if ( !empty($clientes) ){
                $cliente->cliente = $clientes[0]->cliente;
                $cliente->nombre_cliente = $clientes[0]->nombre_cliente;
            }
        }
        //
        $familias = NULL;
        if ( $cliente->cliente !== NULL ){
            $familias = SQLConnection::backendStoreProcedure('LN_familias_', array('search',NULL,NULL,$cliente->cliente,NULL,NULL,NULL), 'select');
        }
        //
        return view('/configuracion-informes/edicion/formulario_editar_informe')->with(compact('informe','cliente','familias'));
    }

    // FUNCION QUE DEVUELVE LA VISTA DE UN FORMULARIO PARA EDITAR LOS DATOS DEL INFORME
    public static function formularioEditarInformeOrg(){
        $idInforme = $_POST['informe'];
        $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('LISTAR',null,null,null,null,null,null,null,null,null,null,null),'select');
        $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',NULL,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select'); // Clientes LED
        $cliente = null;
        foreach($informe as $inf){
            if ($inf->idTipoInforme == $idInforme){
                $informe = $inf;
                foreach($clientes as $cli){
                    if($informe->cliente == $cli->cliente){
                        $cliente = $cli;
                        break;
                    }
                }
                if (!isset($cliente)){
                    $cliente = (object)[];
                    $cliente->cliente = null;
                    $cliente->nombre_cliente = 'GENERICO';
                }
                break;
            }

        }
        $familias = NULL;
        if ( isset($cliente) && $cliente->cliente != null){
            $familias = SQLConnection::backendStoreProcedure('LN_familias_', array('search',NULL,NULL,$cliente->cliente,NULL,NULL,NULL), 'select');
        }
        $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('LISTAR',$idInforme,null,null,null,null,null,null,null,null,null), 'select');

        if ( isset($cliente) && $cliente->cliente ){
            // SI ES GENERICO
            $componentes = SQLConnection::backendStoreProcedure('LN_componente_', array('GENERICO',NULL,NULL,NULL,NULL,NULL,NULL,NULL), 'select');
        } else {
            // $cliente = Request::input('cliente');
            // SI ES DE CLIENTE
            $componentes = SQLConnection::backendStoreProcedure('LN_componente_', array('CLIENTE',NULL,NULL,NULL,NULL,NULL,NULL,$cliente->cliente), 'select');
        }
        $componentes_inf = [];
        foreach ($partes_informe as $comp){
            if($comp->tipo_elem == 'C'){
                foreach($componentes as $c){
                    if ($c->idComponente == $comp->idElem){
                        array_push($componentes_inf,$c);
                    }
                }
            }   
        }
        return view('/configuracion-informes/edicion/formulario_editar_informe')->with(compact('partes_informe','componentes_inf','informe','cliente','familias'));
    }

    // FUNCIÓN QUE GRABA LOS CAMBIOS EN UN INFORME
    public static function grabarCambiosInforme(){
        if( isset($_POST['id_informe']) && Misc::validacionesGenerica($_POST['id_informe'],'numero') ){
            $nombre_informe = $_POST['nombre_informe'];
            $perfil_usr = $_POST['usuarios_informe'];
            $descripcion = $_POST['descripcion_informe'];
            $activo = $_POST['activo'];
            $prioridad = $_POST['prioridad_informe'];
            $duracion = $_POST['duracion_informe'];
            $cliente = $_POST['cliente'] ?? null;
            $familia = $_POST['familia_informe'] ?? null;
            $id_informe = $_POST['id_informe'];
            $etiqueta = $_POST['etiqueta'] ?? null;
            $visibilidad_por_pais = $_POST['visibilidad_por_pais'] != '' ? $_POST['visibilidad_por_pais'] : null;
            $visibilidad_cliente = $_POST['visibilidad_cliente'] ?? 0;
            //
            $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('ACTUALIZAR',$nombre_informe,$perfil_usr,$descripcion,$activo,$prioridad,$duracion,$cliente,$familia,'spa',$id_informe,Session::get('usuario')->user_id, null, null, $etiqueta, $visibilidad_por_pais, $visibilidad_cliente),'select');
            //
            // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Informe cambiado', $cliente, 'INFORME_CAMBIADO',Session::get('webdata')['id_menu_plataforma'], NULL,Session::get('usuario')->user_id), 'selectOne');
            $temp = SQLConnection::logTrazabilidad('Se actualizó el informe '.$nombre_informe,'UPD_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],(empty($cliente)) ? 0 : $cliente,null,null,null,$familia,$id_informe);

            return 'Los cambios fueron grabados con éxito';
        } else {
            return 0;
        }
    }

    /**
     * FORMULARIO PARA DESACTIVAR EL FORMULARIO 
     * */ 
    public static function formularioDesactivarInforme(){
        if ( isset($_POST['informe']) && isset($_POST['status']) ){
            $idInforme = $_POST['informe'];
            $estado = $_POST['status'];
            if( $estado == '1' ){
                $vista = '/configuracion-informes/edicion/formulario_desactivar_informe';
            } else {
                $vista = '/configuracion-informes/edicion/formulario_activar_informe';
            }
            //
            $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR',null,null,null,null,null,null,null,null,null,$idInforme,null),'selectOne');
            $cliente = (object)['cliente' => NULL,'nombre_cliente' => 'GENERICO'];
            //
            if ( !is_null($informe) ){
                if ( $informe->cliente ){
                    $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',$informe->cliente,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select'); // Clientes LED
                    if ( !empty($clientes) ){
                        $cliente->cliente = $clientes[0]->cliente;
                        $cliente->nombre_cliente = $clientes[0]->nombre_cliente;
                    }
                }
            } else {
                return 0;
            }
            return view($vista)->with(compact('informe','cliente'));
        }
        
    }

    // FORMULARIO PARA DESACTIVAR EL FORMULARIO
    public static function formularioDesactivarInformeOrg(){
        if ( isset($_POST['informe']) && isset($_POST['status']) ){
            $idInforme = $_POST['informe'];
            $estado = $_POST['status'];
            if( $estado == '1' ){
                $vista = '/configuracion-informes/edicion/formulario_desactivar_informe';
            } else {
                $vista = '/configuracion-informes/edicion/formulario_activar_informe';
            }
            //$informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('LISTAR',null,null,null,null,null,null,null,null,null,null,null),'select');
            $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR',null,null,null,null,null,null,null,null,null,$idInforme,null),'selectOne');
            $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',NULL,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select'); // Clientes LED
            $cliente = null;
            //
            if ( !is_null($informe) ){
                if ( is_null($informe->cliente) ){
                    $cliente = (object)[];
                    $cliente->cliente = null;
                    $cliente->nombre_cliente = 'GENERICO';
                } else {
                    $cliente = (object)[];
                    $cliente->cliente = $informe->cliente;
                    foreach( $clientes as $cli ){
                        if ( $informe->cliente == $cli->cliente ){
                            $cliente->nombre_cliente = $cli->nombre_cliente;
                            break;
                        }
                    }
                    
                }
            } else {
                return 0;
            }
            return view($vista)->with(compact('informe','cliente'));
        }
        
    }
    
    // FUNCIÓN QUE ACTIVA O INACTIVA UN INFORME
    public static function cambiarEstadoInforme(){
        if( isset($_POST['cliente']) && Misc::validacionesGenerica($_POST['cliente'],'numero',1) && isset($_POST['id_informe']) && Misc::validacionesGenerica($_POST['id_informe'],'numero') ){
            $nombre_informe = $_POST['nombre_informe'];
            $perfil_usr = $_POST['usuarios_informe'];
            $descripcion = $_POST['descripcion_informe'];
            $activo = $_POST['status'];
            $prioridad = $_POST['prioridad_informe'];
            $duracion = $_POST['duracion_informe'];
            $cliente = $_POST['cliente'];
            $familia = $_POST['familia_informe'] ?? null;
            $id_informe = $_POST['id_informe'];
            //
            $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('ACTUALIZAR',$nombre_informe,$perfil_usr,$descripcion,$activo,$prioridad,$duracion,$cliente,$familia,'spa',$id_informe,Session::get('usuario')->user_id),'select');
            //
            // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Informe desactivado', $cliente, 'INFORME_DESACTIVADO',Session::get('webdata')['id_menu_plataforma'], NULL,Session::get('usuario')->user_id), 'selectOne');
            $nombre_estado = ($activo == 1) ? 'activo' : 'inactivo';
            $temp = SQLConnection::logTrazabilidad('Se actualizó el estado del informe '.$nombre_informe.' a '.$nombre_estado,'UPD_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],empty($cliente) ? 0 : $cliente,null,null,null,$familia,$id_informe);

            return $activo;
        } else {
            return 0;
        }
    }

    //
    public static function vistaAsignarFamilia(){
        $idInforme = Request::input('informe');
        $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR',null,null,null,null,null,null,null,null,null,$idInforme,null),'selectOne');
        $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',NULL,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select');
        //
        return view('/configuracion-informes/edicion/asignar-informe-familia')->with(compact('informe','clientes'));
    }

    // FUNCION QUE DEVUELVE LA VISTA DE TABLA DE FAMILIAS CLIENTE PARA ASIGNAR INFORME A FAMILIA
    public static function listaFamiliasCliente(){
        $cliente = Request::input('cliente');
        $idInforme = Request::input('informe');
        $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR',null,null,null,null,null,null,null,null,null,$idInforme,null),'selectOne');
        $tiene_familia = 0;
        $familia_del_informe = null;
        //
        if ($informe->familia != '0' XOR is_null($informe->familia) ){
            $tiene_familia++;
        }
        //
        $familias_cliente = SQLConnection::backendStoreProcedure('LN_familias_', array('search',NULL,NULL,$cliente,NULL,NULL,NULL), 'select');
        if ($tiene_familia != 0){
            foreach($familias_cliente as $fam){
                if($fam->familia == $informe->familia){
                    $familia_del_informe = $fam;
                    break;
                }
            }
            $familias_cliente = [];
            $familias_cliente[0] = $familia_del_informe;
        }
        $familias_informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('LISTAR_XINFORME',$informe->nombre_tipo_informe,$informe->perfil_usr_default,$informe->descripcion,1,$informe->prioridad,$informe->duracion,$cliente,null,$informe->idioma,$idInforme,Session::get('usuario')->user_id),'select');
        //
        foreach($familias_cliente as $k => $familias){
            $informe_familia = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('LISTAR_FAMILIA',$informe->nombre_tipo_informe,$informe->perfil_usr_default,$informe->descripcion,1,$informe->prioridad,$informe->duracion,$cliente,$familias->familia,$informe->idioma,$idInforme,Session::get('usuario')->user_id),'select');
            if(!empty($informe_familia)){
                foreach ($informe_familia as $informe){
                    $familias_cliente[$k]->informe_asc = $informe->nombre_tipo_informe;
                }
                
            } else {
                $familias_cliente[$k]->informe_asc = null;
            }
        }
        // dd($familias_informe);
        return view('/configuracion-informes/edicion/familias-subfamilias-cliente')->with(compact('familias_cliente','idInforme','familias_informe','tiene_familia'));
    }

    // FUNCION QUE ASIGNA O DESASIGNA UNA FAMILIA A UN INFORME
    function asignarDesasignarInformeFamilia(){
        if(isset($_POST['informe']) && $_POST['informe'] != '' && isset($_POST['cliente']) && $_POST['cliente'] != '' && isset($_POST['familia']) && $_POST['familia'] != '' && isset($_POST['accion']) && $_POST['accion'] != ''){
            $idInforme = Request::input('informe');
            $cliente = Request::input('cliente');
            $familia = Request::input('familia');
            $nombre_familia = Request::input('nombre_familia');
            $accion = Request::input('accion');
            $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR',null,null,null,null,null,null,null,null,null,$idInforme,null),'selectOne');
            $informe_familia = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('LISTAR_FAMILIA',$informe->nombre_tipo_informe,$informe->perfil_usr_default,$informe->descripcion,1,$informe->prioridad,$informe->duracion,$cliente,$familia,$informe->idioma,$idInforme,Session::get('usuario')->user_id),'select');
            
            if ($accion == 'A'){
                if (!empty($informe_familia)){
                    // foreach ($informe_familia as $informe){
                    //     if( $informe->idTipoInforme != $idInforme && $informe->activo_fam_inf == 1 ){
                    //         return $informe->nombre_tipo_informe;
                    //     } 
                    // }
                    
                    $familia_upd = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('UPD_FAMILIA',$informe->nombre_tipo_informe,$informe->perfil_usr_default,$informe->descripcion,1,$informe->prioridad,$informe->duracion,$cliente,$familia,$informe->idioma,$idInforme,Session::get('usuario')->user_id),'select');

                    // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Informe asignado a familia', $cliente, 'ASIGN_DESASIGN_FAM',Session::get('webdata')['id_menu_plataforma'], NULL,Session::get('usuario')->user_id), 'selectOne');

                    $temp = SQLConnection::logTrazabilidad('Se asignó la familia '.$nombre_familia.' al tipo de informe '.$informe->nombre_tipo_informe,'UPD_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],empty($cliente) ? 0 : $cliente,null,null,null,$familia,$idInforme);

                    return 1;
                } else {
                    $familia_upd = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('ASIGNAR_FAMILIA',$informe->nombre_tipo_informe,$informe->perfil_usr_default,$informe->descripcion,1,$informe->prioridad,$informe->duracion,$cliente,$familia,$informe->idioma,$idInforme,Session::get('usuario')->user_id),'select');
    
                    // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Informe asignado a familia', $cliente, 'ASIGN_DESASIGN_FAM',Session::get('webdata')['id_menu_plataforma'], NULL,Session::get('usuario')->user_id), 'selectOne');

                    $temp = SQLConnection::logTrazabilidad('Se asignó la familia '.$nombre_familia.' al tipo de informe '.$informe->nombre_tipo_informe,'UPD_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],$cliente,null,null,null,$familia,$idInforme);
    
                    return 1;
                }
            } else if ($accion == 'D') {
                if (!empty($informe_familia)){
                    $familia_upd = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('UPD_FAMILIA',$informe->nombre_tipo_informe,$informe->perfil_usr_default,$informe->descripcion,0,$informe->prioridad,$informe->duracion,$cliente,$familia,$informe->idioma,$idInforme,Session::get('usuario')->user_id),'select');
    
                    // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Familia desasignada de informe', $cliente, 'ASIGN_DESASIGN_FAM',Session::get('webdata')['id_menu_plataforma'], NULL,Session::get('usuario')->user_id), 'selectOne');

                    $temp = SQLConnection::logTrazabilidad('Se desasignó la familia '.$nombre_familia.' al tipo de informe '.$informe->nombre_tipo_informe,'UPD_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],$cliente,null,null,null,$familia,$idInforme);
    
                    return 1;
                }
            }
        } else {
            return 0;
        }
        
    }

    ////////////////////////////////////////////
    ////// COMPONENTES Y TAREAS DEL INFORME ////
    ////////////////////////////////////////////

    // FUNCION INTERNA QUE DEVUELVE LA VISTA DE LA TABLA LOS COMPONENTES DEL INFORME
    private static function tablaComponentesInforme($idInforme){
        $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('LISTAR',$idInforme,null,null,null,null,null,null,null,null,null), 'select');
        $componentes_inf = [];
        $tareas_inf = [];
        $check_orden = [];
        $last_orden = 0;
        foreach ($partes_informe as $comp){
            if($comp->tipo_elem == 'C' && $comp->idTipoInforme == $idInforme){
                array_push($componentes_inf,$comp);
                if ($last_orden < $comp->orden){
                    $last_orden = $comp->orden;
                }
                array_push($check_orden,$comp->orden);
            }
        }
        // VERIFICA QUE EL ORDEN NO SEA MAYOR QUE LA CANTIDAD DE COMPONENTES
        if(count($componentes_inf) < $last_orden){
            foreach ($componentes_inf as $ind => $comp){
                $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$comp->idTipoInforme,$comp->idElem,'C',$comp->duracion,$ind+1,$comp->activo,$comp->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
            }
        } else {
            // VERIFICA QUE NO HAYAN ORDENES REPETIDOS
            foreach($check_orden as $k => $ch){
                if(isset($check_orden[$k-1]) && $ch == $check_orden[$k-1]){
                    $error_orden = 1;
                }
            }
            // REORDENA DE VUELTA
            if(isset($error_orden) && $error_orden == 1){
                foreach ($componentes_inf as $ind => $comp){
                    $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$comp->idTipoInforme,$comp->idElem,'C',$comp->duracion,$ind+1,$comp->activo,$comp->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
                }
            }
        }
        //
        usort($componentes_inf, function($a, $b) {
            return $a->orden < $b->orden ? -1 : 1;
        });
        //
        //TODO: NO EXISTE
        return view('/configuracion-informes/edicion/tabla_solo_componentes')->with(compact('componentes_inf'));
    }

    // FUNCION QUE DEVUELVE UNA TABLA DE LOS COMPONENTES Y TAREAS DE UN INFORME
    public static function tablaCompTareasInformeORG(){
        $idInforme = $_POST['informe'];
        $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('LISTAR',null,null,null,null,null,null,null,null,null,null,null),'select');
        $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',NULL,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select'); // Clientes LED
        foreach($informe as $inf){
            if ($inf->idTipoInforme == $idInforme){
                $informe = $inf;
                foreach($clientes as $cli){
                    if($informe->cliente == $cli->cliente){
                        $cliente = $cli;
                        break;
                    }
                }
                if (!isset($cliente)){
                    $cliente = (object)[];
                    $cliente->cliente = null;
                    $cliente->nombre_cliente = 'GENERICO';
                }
                break;
            }
        }
        //
        $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITARINF',$idInforme,null,null,null,null,null,null,null,null,null), 'select');
        //
        $componentes_inf = [];
        $tareas_inf = [];
        $check_orden_c = [];
        $check_orden_t = [];
        $last_orden_c = 0;
        $last_orden_t = 0;
        foreach ($partes_informe as $key => $comp){
            if( $comp->tipo_elem == 'C' ){
                // ORDENA COMPONENTES
                if (isset($partes_informe[$key-1]) && $partes_informe[$key-1]->idLNInformeDesign == $comp->idLNInformeDesign){
                    continue;
                }
                array_push($componentes_inf,$comp);
                if ($last_orden_c < $comp->orden){
                    $last_orden_c = $comp->orden;
                }
                array_push($check_orden_c,$comp->orden);
            } else if ($comp->tipo_elem == 'T' ){
                // ORDENA TAREAS
                if (isset($partes_informe[$key-1]) && $partes_informe[$key-1]->idLNInformeDesign == $comp->idLNInformeDesign){
                    continue;
                }
                array_push($tareas_inf,$comp);
                if ($last_orden_t < $comp->orden){
                    $last_orden_t = $comp->orden;
                }
                array_push($check_orden_t,$comp->orden);
            }
        }
        // VERIFICA QUE EL ORDEN_C NO SEA MAYOR QUE LA CANTIDAD DE COMPONENTES
        if(count($componentes_inf) < $last_orden_c){
            foreach ($componentes_inf as $ind => $comp){
                $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$comp->idTipoInforme,$comp->idElem,'C',$comp->duracion,$ind+1,$comp->activo,$comp->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
            }
        } else {
            // VERIFICA QUE NO HAYAN ORDENES REPETIDOS
            foreach($check_orden_c as $k => $ch){
                if(isset($check_orden_c[$k-1]) && $ch == $check_orden_c[$k-1]){
                    $error_orden = 1;
                }
            }
            // REORDENA DE VUELTA
            if(isset($error_orden) && $error_orden == 1){
                foreach ($componentes_inf as $ind => $comp){
                    $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$comp->idTipoInforme,$comp->idElem,'C',$comp->duracion,$ind+1,$comp->activo,$comp->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
                }
            }
        }
        //
        usort($componentes_inf, function($a, $b) {
            return $a->orden < $b->orden ? -1 : 1;
        });
        // VERIFICA QUE EL ORDEN_T NO SEA MAYOR QUE LA CANTIDAD DE TAREAS
        if(count($tareas_inf) < $last_orden_t){
            foreach ($tareas_inf as $ind => $comp){
                $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$comp->idTipoInforme,$comp->idElem,'T',$comp->duracion,$ind+1,$comp->activo,$comp->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
            }
        } else {
            // VERIFICA QUE NO HAYAN ORDENES REPETIDOS
            foreach($check_orden_t as $k => $ch){
                if(isset($check_orden_t[$k-1]) && $ch == $check_orden_t[$k-1]){
                    $error_orden = 1;
                }
            }
            // REORDENA DE VUELTA
            if(isset($error_orden) && $error_orden == 1){
                foreach ($tareas_inf as $ind => $comp){
                    $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$comp->idTipoInforme,$comp->idElem,'T',$comp->duracion,$ind+1,$comp->activo,$comp->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
                }
            }
        }
        //
        usort($tareas_inf, function($a, $b) {
            return $a->orden < $b->orden ? -1 : 1;
        });
        //
        $titulo_navbar = 'Edición de Componentes y Tareas';
        $ruta = '/configuracion-informes/editar-informe';
        //--
        return view('/configuracion-informes/edicion/tabla_componentes_y_tareas')->with(compact('componentes_inf','informe','cliente','tareas_inf','titulo_navbar','ruta'));
    }

    // FUNCION QUE AGREGA COMPONENTES AL INFORME
    public static function addComponentesTareas(){
        $idInforme = $_POST['idTipoInforme'];
        if (isset($idInforme) && !empty($idInforme)) {
            $componentes_nuevas = isset($_POST['componentes_informe']) ? $_POST['componentes_informe'] : null;            
            $tareas_nuevas = $_POST['tareas_informe'] ?? null;
            $ultimo_orden = $_POST['ultimo_orden'] ?? null;
            $cliente = $_POST['cliente'] ?? null;
            $auxTar = 0;
            $tareas_dep = [];
            $vistaComp = '';
            $vistaTar = '';
            $comp_desactivados = [];
            $respuesta = [0,0];
            //
            $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('LISTAR',NULL,null,null,null,null,null,null,null,null,null), 'select');
            foreach($partes_informe as $compo){
                if(!empty($componentes_nuevas)){
                    foreach ($componentes_nuevas as $key => $comp){
                        if($compo->idElem == $comp && $compo->idTipoInforme == $idInforme) {
                            $ultimo_orden++;
                            $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$comp,'C','3',$ultimo_orden,'1',$compo->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
                            if($compo->idTarea_dependiente != null){
                                array_push($tareas_dep,$compo->idTarea_dependiente);
                            }
                            unset($componentes_nuevas[$key]);
                            $respuesta[0] = 2;
                        }
                    }
                } else if (!empty($tareas_nuevas)) {
                    foreach($tareas_nuevas as $g => $tarea){
                        if($compo->idElem == $tarea && $compo->idTipoInforme == $idInforme){
                            if ($g > 1 && $g <= count($tareas_nuevas)-1 && $tareas_nuevas[$g-1] == $tarea){
                                unset($tareas_nuevas[$g]);
                                continue;
                            }
                            $ultimo_orden++;
                            $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$tarea,'T','3','1',$ultimo_orden,$compo->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
                            unset($tareas_nuevas[$g]);
                            $respuesta[1] = 2;
                        }
                    }
                }
            }
            //
            foreach($partes_informe as $compo){
                if(!empty($tareas_dep)){
                    foreach($tareas_dep as $k => $tr){
                        if($compo->idElem == $tr && $compo->idTipoInforme == $idInforme){                            
                            if ($k > 1 && $tareas_dep[$k-1] == $tr){
                                unset($tareas_dep[$k]);
                                continue;
                            }
                            $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$tr,'T','3','1','1',$compo->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
                            unset($tareas_dep[$k]);
                            $respuesta[1] = 2;
                        }
                    }
                }
                else {
                    break;
                }
            }
            //
            if(!empty($componentes_nuevas)){

                foreach($componentes_nuevas as $compo){
                    $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$idInforme,$compo,'C','3',$ultimo_orden,'1',NULL,null,null,Session::get('usuario')->user_id), 'select');
                    $respuesta[0] = 1;
                }                
            }
            //
            if(!empty($tareas_dep)){
                foreach($partes_informe as $compo){
                    foreach($tareas_dep as $k => $tr){
                        if($compo->idElem == $tr && $compo->idTipoInforme == $idInforme){
                            $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$tr,'T','3','1','1',$compo->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
                            unset($tareas_dep[$k]);
                            $respuesta[1] = 2;
                        }
                    }                    
                }
                if(!empty($tareas_dep)){
                    foreach($tareas_dep as $k => $tr){
                        if ($k > 1 && $tareas_dep[$k-1] == $tr && $compo->idTipoInforme == $idInforme){
                            unset($tareas_dep[$k]);
                            continue;
                        }
                        // $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$idInforme,$tr,'T','3','1','1',NULL,null,null,Session::get('usuario')->user_id), 'select');
                        $respuesta[1] = 1;
                    }
                }
            }
            //
            if(!empty($tareas_nuevas)){
                foreach($tareas_nuevas as $g => $tar){
                    if ($g > 1 && $tareas_nuevas[$g-1] == $tarea){
                        unset($tareas_nuevas[$g]);
                        continue;
                    }
                    // dd($tareas_nuevas);
                    // $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$idInforme,$compo,'C','3',$ultimo_orden,'1',NULL,null,null,Session::get('usuario')->user_id), 'select');
                    $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$idInforme,$tar,'T','3','1','1',NULL,null,null,Session::get('usuario')->user_id), 'select');
                    $respuesta[1] = 1;
                }
            }

            $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('LISTAR',$idInforme,null,null,null,null,null,null,null,null,null), 'select');
            $componentes_inf = [];
            $tareas_inf = [];
            foreach ($partes_informe as $comp){
                if($comp->tipo_elem == 'C' && $comp->idTipoInforme == $idInforme && $comp->activo == '1'){
                    array_push($componentes_inf,$comp);
                } else if ($comp->tipo_elem == 'T' && $comp->idTipoInforme == $idInforme && $comp->activo == '1') {                
                    array_push($tareas_inf,$comp);                    
                }
            }

            usort($componentes_inf, function($a, $b) {
                return $a->orden < $b->orden ? -1 : 1;
            });

            // $vistaComp = \View::make('/configuracion-informes/edicion/tabla_solo_componentes')->with(compact('componentes_inf'))->render();
            // $vistaTar = \View::make('/configuracion-informes/edicion/tabla_solo_tareas')->with(compact('tareas_inf'))->render();
            // $vistas = [];
            // if (isset($vistaComp) && isset($vistaTar)){
            //     array_push($vistas, $vistaComp);
            //     array_push($vistas, $vistaTar);
            //     array_push($vistas, $tareas_inf);
            // } else if (!isset($vistaTar)) {
            //     array_push($vistas, $vistaComp);
            //     array_push($vistas, '');
            // } else {
            //     array_push($vistas, '');
            //     array_push($vistas, $vistaTar);
            // }
            
            // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Componentes y/o tareas agregadas', $cliente, 'INFORME_CAMBIADOO','BACK', NULL,Session::get('usuario')->user_id), 'selectOne');
            //
            SQLConnection::logTrazabilidad('Componentes y/o tareas agregadas','INFORME_CAMBIADOO',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],$cliente);
            return $respuesta;
        }
    }

    /////////////////////////////
    // ACCIONES DE COMPONENTES //
    /////////////////////////////

    // FUNCION QUE DESACTIVA UN COMPONENTE DEL INFORME
    public static function desactivarComponentesOrg(){
        if (isset($_POST['idInforme']) && !empty($_POST['idInforme'])) {
            $idInforme = $_POST['idInforme'];
            $comp_elim = $_POST['idComp'] ?? null;
            $id_informe_design = $_POST['idInfDes'] ?? null;
            $cliente = $_POST['cliente'] ?? null;
            //
            $datos_comp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITAR',$idInforme,NULL,NULL,NULL,NULL,NULL,$id_informe_design,null,null,Session::get('usuario')->user_id), 'selectOne');
            $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$comp_elim,'C',$datos_comp->duracion,$datos_comp->orden,'0',$id_informe_design,null,null,Session::get('usuario')->user_id), 'select');            
            $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Componente desactivado', $cliente, 'INFORME_CAMBIADOO','BACK', NULL,Session::get('usuario')->user_id), 'selectOne');
            //
            return 1;
            //return self::tablaComponentesInforme($idInforme);
        } else {
            return 0;
        }
    }

    // FUNCION QUE ACTIVA UN COMPONENTE DEL INFORME
    public static function activarComponentesOrg(){
        if (isset($_POST['idInforme']) && !empty($_POST['idInforme'])) {
            $idInforme = $_POST['idInforme'];
            $comp_elim = $_POST['idComp'] ?? null;
            $id_informe_design = $_POST['idInfDes'] ?? null;
            $cliente = $_POST['cliente'] ?? null;
            //
            $datos_comp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITAR',$idInforme,NULL,NULL,NULL,NULL,NULL,$id_informe_design,null,null,Session::get('usuario')->user_id), 'selectOne');
            $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$comp_elim,'C',$datos_comp->duracion,$datos_comp->orden,'1',$id_informe_design,null,null,Session::get('usuario')->user_id), 'select');
            $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Componente activado', $cliente, 'INFORME_CAMBIADOO','BACK', NULL,Session::get('usuario')->user_id), 'selectOne');
            //
            return 1;
            //return self::tablaComponentesInforme($idInforme);
        } else {
            return 0;
        }
    }

    // FUNCION QUE MUEVE EL ORDEN DE LOS COMPONENTES DE UN INFORME
    public static function moverComponentes(){
        $accion = $_POST['accion'];
        $idInforme = $_POST['idInforme'];
        $idComp = $_POST['idComp'];
        $idComp_anterior = $_POST['idComp_anterior'];
        $orden = $_POST['orden'];
        $id_informe_design = $_POST['idInfDes'] ?? null;
        $id_informe_design_anterior = $_POST['idInfDes_anterior'] ?? null;

        // dd($accion,$idInforme,$idComp,$idComp_anterior,$orden,$orden-1,$id_informe_design,$id_informe_design_anterior);

        // SECCION PARA OBSERVAR SI EL DATO DE ORDEN ES INCONSISTENTE, SI ES ASÍ REORDENA SEGÚN CANTIDAD DE COMPONENTES
        $partes_informe = SQLConnection::backendStoreProcedure('ign_', array('LISTAR',$idInforme,null,null,null,null,null,null,null,null,null), 'select');
        $componentes_inf = [];
        $tareas_inf = [];
        foreach ($partes_informe as $comp){
            //if($comp->tipo_elem == 'C' && $comp->idTipoInforme == $idInforme && $comp->activo == '1'){
            if($comp->tipo_elem == 'C' && $comp->idTipoInforme == $idInforme ){
                array_push($componentes_inf,$comp);
            } else if( $comp->tipo_elem == 'T' && $comp->idTipoInforme == $idInforme ) {
                //else if ($comp->tipo_elem == 'T' && $comp->idTipoInforme == $idInforme && $comp->activo == '1') {                
                array_push($tareas_inf,$comp);                    
            }
        }
        //
        $datos_comp = null;
        $datos_comp_anterior = null;
        foreach ($componentes_inf as $componente){
            if ( $componente->idLNInformeDesign == $id_informe_design ){
                $datos_comp = $componente;
            }
            if ( $componente->idLNInformeDesign == $id_informe_design_anterior ){
                $datos_comp_anterior = $componente;
            }
        }
        //
        if (count($componentes_inf) < $orden || $orden == 0 ){
            foreach ($componentes_inf as $ind => $comp){
                $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$comp->idTipoInforme,$comp->idElem,'C',$comp->duracion,$ind+1,$comp->activo,$comp->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
                if($comp->idLNInformeDesign == $id_informe_design){
                    $orden = $ind+1;
                }
            }
        }
        // SE HACE EL MECANISMO DE SUBIR O BAJAR EL ORDEN DEL COMPONENTE
        if($accion == 'subir'){
            if( $orden > 1 && count($componentes_inf) >= $orden) {
                $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$idComp,'C',$datos_comp->duracion,$orden-1,$datos_comp->activo,$id_informe_design,null,null,Session::get('usuario')->user_id), 'select'); /* Componente que sube de lugar */
                SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$idComp_anterior,'C',$datos_comp_anterior->duracion,$orden,$datos_comp_anterior->activo,$id_informe_design_anterior,null,null,Session::get('usuario')->user_id), 'select'); /* Componente que cambia de lugar con el anterior */
            }
        } else if ($accion == 'bajar'){
            if($orden >= 1 && count($componentes_inf) > $orden) {
                $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$idComp,'C',$datos_comp->duracion,$orden+1,$datos_comp->activo,$id_informe_design,null,null,Session::get('usuario')->user_id), 'select'); /* Componente que baja de lugar */
                SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$idComp_anterior,'C',$datos_comp_anterior->duracion,$orden,$datos_comp_anterior->activo,$id_informe_design_anterior,null,null,Session::get('usuario')->user_id), 'select'); /* Componente que cambia de lugar con el anterior */
            }
        }

        return 1;
    }

    /////////////////////////////
    //// ACCIONES DE TAREAS /////
    /////////////////////////////

    // FUNCION QUE CAMBIA EL ESTADO DE ACTIVO DE UNA TAREA A '0'
    public static function activarDesactivarTareas(){
        if (isset($_POST['idInforme']) && !empty($_POST['idInforme'])) {
            $idInforme = $_POST['idInforme'];
            $comp_elim = $_POST['idTarea'] ?? null;
            $idInfDes = $_POST['idInfDes'] ?? null;
            $cliente = $_POST['cliente'] ?? null;
            $accion = $_POST['accion'] ?? null;
            $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$comp_elim,'T','3','1',$accion,$idInfDes,null,null,Session::get('usuario')->user_id), 'select');
            $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Tarea desactivada', $cliente, 'INFORME_CAMBIADOO','BACK', NULL,Session::get('usuario')->user_id), 'selectOne');

            return 1;

            // return view('/configuracion-informes/edicion/tabla_solo_tareas')->with(compact('tareas_inf'));
        } else {
            return 0;
        }
    }

    // FUNCIÓN QUE GRABA LOS CAMBIOS DE LAS TAREAS DE UN INFORME
    public static function grabarCambiosTareas(){
        if ( isset($_POST['idInforme']) && isset($_POST['tareas']) ){
            $idInforme = $_POST['idInforme'];
            $listaTar = $_POST['tareas'];
            //
            $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITARINF',$idInforme,null,null,null,null,null,null,null,null,null), 'select');
            $respuesta = 0;
            //
            foreach($partes_informe as $key => $tarea){
                foreach($listaTar as $tar){
                    if( $tarea->tipo_elem == 'T' && $tarea->idElem == $tar ){
                        $duracion = ($_POST['tipo_tarea_'.$tar] == 'S') ? $_POST['duracion_tarea_'.$tar] : $_POST['periodo_carga_'.$tar];
                        //
                        $tarea_dependencia = Request::input('tareas_dependencia_'.$tar);
                        if( is_array($tarea_dependencia) ){
                            $tarea_dependencia = implode(',',$tarea_dependencia);
                        }
                        //
                        SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$tarea->idElem,'T',$duracion,$tarea->orden,'1',$tarea->idLNInformeDesign,$_POST['prioridad_tarea_'.$tar],$_POST['tipo_tarea_'.$tar],Session::get('usuario')->user_id,NULL,NULL,$tarea_dependencia));
                        $respuesta = 1;
                        break;
                    }
                }
            }
            //
            return $respuesta;
        } else {
            return 0;
        }
    }

    // FUNCIÓN QUE GRABA LOS CAMBIOS DE LAS TAREAS DE UN INFORME
    public static function grabarCambiosTareasORG(){
        if ( isset($_POST['idInforme']) && isset($_POST['tareas']) ){
            $idInforme = $_POST['idInforme'];
            $listaTar = $_POST['tareas'];
            //
            $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITARINF',$idInforme,null,null,null,null,null,null,null,null,null), 'select');
            $respuesta = 0;
            //
            foreach($partes_informe as $tarea){
                foreach($listaTar as $key => $tar){
                    if( $tarea->idElem == $tar ){
                        $duracion = $_POST['tipo_tarea_'.$tar] == 'S' ? $_POST['duracion_tarea_'.$tar] : $_POST['periodo_carga_'.$tar];
                        $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$tarea->idTipoInforme,$tarea->idElem,'T',$duracion,'1','1',$tarea->idLNInformeDesign,$_POST['prioridad_tarea_'.$tar],$_POST['tipo_tarea_'.$tar],Session::get('usuario')->user_id,NULL,NULL), 'select');
                        unset($listaTar[$key]);
                        $respuesta = 1;
                        break;
                    }
                }
            }


            // $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('LISTAR',$idInforme,null,null,null,null,null,null,null,null,null), 'select');
            // $tareas_inf = [];
            // $componentes_inf = [];
            // foreach ($partes_informe as $comp){
            //     if($comp->tipo_elem == 'C' && $comp->idTipoInforme == $idInforme && $comp->activo == '1' ){
            //         array_push($componentes_inf,$comp);
            //     } else if ($comp->tipo_elem == 'T' && $comp->idTipoInforme == $idInforme && $comp->activo == '1') {                
            //         array_push($tareas_inf,$comp);                    
            //     }
            // }

            return $respuesta;
            // return view('/configuracion-informes/edicion/tabla_solo_tareas')->with(compact('tareas_inf'));   
        } else {
            return 0;
        }
    }

    // FUNCIÓN PARA MOVER LA TAREA
    public static function moverTareas(){
        $accion = $_POST['accion'];
        $idInforme = $_POST['idInforme'];
        $idComp = $_POST['idComp'];
        $idComp_anterior = $_POST['idComp_anterior'];
        $orden = $_POST['orden'];
        $id_informe_design = $_POST['idInfDes'] ?? null;
        $id_informe_design_anterior = $_POST['idInfDes_anterior'] ?? null;

        // dd($accion,$idInforme,$idComp,$idComp_anterior,$orden,$orden-1,$id_informe_design,$id_informe_design_anterior);

        // SECCION PARA OBSERVAR SI EL DATO DE ORDEN ES INCONSISTENTE, SI ES ASÍ REORDENA SEGÚN CANTIDAD DE COMPONENTES
        $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('LISTAR',$idInforme,null,null,null,null,null,null,null,null,null), 'select');
        $tareas_inf = [];
        foreach ($partes_informe as $comp){
            //if($comp->tipo_elem == 'C' && $comp->idTipoInforme == $idInforme && $comp->activo == '1'){
            if($comp->tipo_elem == 'T' && $comp->idTipoInforme == $idInforme ) {
                //else if ($comp->tipo_elem == 'T' && $comp->idTipoInforme == $idInforme && $comp->activo == '1') {                
                array_push($tareas_inf,$comp);                    
            }
        }
        //
        $datos_comp = null;
        $datos_comp_anterior = null;
        foreach ($tareas_inf as $componente){
            if ( $componente->idLNInformeDesign == $id_informe_design ){
                $datos_comp = $componente;
            }
            if ( $componente->idLNInformeDesign == $id_informe_design_anterior ){
                $datos_comp_anterior = $componente;
            }
        }
        //
        if (count($tareas_inf) < $orden || $orden == 0 ){
            foreach ($tareas_inf as $ind => $comp){
                $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$comp->idTipoInforme,$comp->idElem,'T',$comp->duracion,$ind+1,$comp->activo,$comp->idLNInformeDesign,null,null,Session::get('usuario')->user_id), 'select');
                if($comp->idLNInformeDesign == $id_informe_design){
                    $orden = $ind+1;
                }
            }
        }
        // SE HACE EL MECANISMO DE SUBIR O BAJAR EL ORDEN DEL COMPONENTE
        if($accion == 'subir'){
            if( $orden > 1 && count($tareas_inf) >= $orden) {
                $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$idComp,'T',$datos_comp->duracion,$orden-1,$datos_comp->activo,$id_informe_design,null,null,Session::get('usuario')->user_id), 'select'); /* Componente que sube de lugar */
                SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$idComp_anterior,'T',$datos_comp_anterior->duracion,$orden,$datos_comp_anterior->activo,$id_informe_design_anterior,null,null,Session::get('usuario')->user_id), 'select'); /* Componente que cambia de lugar con el anterior */
            }
        } else if ($accion == 'bajar'){
            if($orden >= 1 && count($tareas_inf) > $orden) {
                $temp = SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$idComp,'T',$datos_comp->duracion,$orden+1,$datos_comp->activo,$id_informe_design,null,null,Session::get('usuario')->user_id), 'select'); /* Componente que baja de lugar */
                SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,$idComp_anterior,'T',$datos_comp_anterior->duracion,$orden,$datos_comp_anterior->activo,$id_informe_design_anterior,null,null,Session::get('usuario')->user_id), 'select'); /* Componente que cambia de lugar con el anterior */
            }
        }

        return 1;
    }


    //////////////////////////////////////////////////////////
    ///// REMODELACION COMPONENTES Y TAREAS DEL INFORME //////
    //////////////////////////////////////////////////////////

    /**
     * Funcion que devuelve una tabla de los componentes y tareas de un informe
     * 
     * @access public
     */
    public function tablaCompTareasInforme(){
        if ( isset($_POST['informe']) ){
            $idInforme = Request::input('informe');
            // DATOS DEL INFORME
            $informe = SQLConnection::backendStoreProcedure('LN_tipo_informes_', array('EDITAR',null,null,null,null,null,null,null,null,null,$idInforme,null),'selectOne');
            // COMPONENTES Y TAREAS
            $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITARINF',$idInforme,null,null,null,null,null,null,null,null,null),'select');
            $componentes_inf = [];
            $tareas_inf = [];
            $cant_tareas = 0;
            $cant_componentes = 0;
            //
            foreach ($partes_informe as $key => $comp){
                if( $comp->tipo_elem == 'C' ){
                    // componentes
                    array_push($componentes_inf,$comp);
                    $cant_componentes++;
                } else {
                    // tareas
                    $comp->dependency_tree_arr = null;
                    if ( !is_null($comp->dependency_tree) ){
                        $comp->dependency_tree_arr = explode(',',$comp->dependency_tree);
                    }
                    array_push($tareas_inf,$comp);
                    $cant_tareas++;
                }
            }
            //
            $informe->cant_tareas = $cant_tareas;
            $informe->cant_componentes = $cant_componentes;
            unset($partes_informe);
            $componentes = SQLConnection::backendStoreProcedure('LN_componente_', array('GENERICO',NULL,NULL,NULL,NULL,NULL,NULL,NULL), 'select');
            $tareas = SQLConnection::backendStoreProcedure('LN_Tareas_', array('LISTAR',NULL,NULL), 'select');
            //
            // dd($componentes);
            return view('/configuracion-informes/edicion/tabla_componentes_y_tareas')->with(compact('informe','componentes_inf','tareas_inf','componentes','tareas'));
        }
        //
        throw new \Exception('El id del informe no fue recibido');
    }

    /**
     * Funcion que agregar un componente al informe
     * 
     * @access public
     */
    public function agregarComponentesInforme(){
        if ( isset($_POST['idTipoInforme']) && !empty($_POST['idTipoInforme']) ){
            // if ( isset($_POST['componentes_informe']) ){
            if ( isset($_POST['comp_nuevo']) ){
                $id_tipo_informe = $_POST['idTipoInforme'];
                $cliente = Request::input('cliente') ?? 0;
                $familia = Request::input('familia');
                $nombre_tipo_informe = Request::input('nombre_tipo_informe');
                // $componentes_nuevos = $_POST['componentes_informe'];
                $componentes_nuevos = $_POST['comp_nuevo'];
                $tareas_nuevas = $_POST['tareas_dependientes'] ?? null;
                $ultimo_orden_componentes = $_POST['ultimo_orden_componente'] ?? null;
                $ultimo_orden_tareas = $_POST['ultimo_orden_tarea'] ?? null;
                $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITARINF',$id_tipo_informe,null,null,null,null,null,null,null,null,null),'select');
                // SE TRANSFORMA EL ORDEN A UN ENTERO
                $ultimo_orden_componentes = intval($ultimo_orden_componentes);
                // SE AGREGAN LOS COMPONENTES
                foreach( $componentes_nuevos as $componente ){
                    $ultimo_orden_componentes++;
                    SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$id_tipo_informe,$componente,'C','3',$ultimo_orden_componentes,'1',NULL,NULL,NULL,Session::get('usuario')->user_id),'select');
                }
                // SE AGREGAN LAS TAREAS DEPENDIENTES
                if ( !is_null($tareas_nuevas) ){
                    $ultimo_orden_tareas = intval($ultimo_orden_tareas);
                    //
                    $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITARINF',$id_tipo_informe,null,null,null,null,null,null,null,null,null),'select');
                    // SI VERIFICA QUE LA TAREA NO ESTA DADA DE ALTA ANTES
                    foreach( $tareas_nuevas as $c => $tarea ){
                        foreach( $partes_informe as $componentes_tareas ){
                            if ( $componentes_tareas->idElem == $tarea ){
                                continue 2;
                            }
                        }
                        //
                        $ultimo_orden_tareas++;
                        SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$id_tipo_informe,$tarea,'T','15',$ultimo_orden_tareas,'1',NULL,'1','S',Session::get('usuario')->user_id), 'select');
                    }
                }
				SQLConnection::logTrazabilidad('Se agregaron componentes al tipo informe: '.$nombre_tipo_informe,'ADD_COMPONENTE_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],$cliente,null,null,null,$familia,$id_tipo_informe);
                //
                return 1;
            } else {
                return 0;
                // throw new \Exception('No se recibio componentes para agregar al informe');
            }
        } else {
            throw new \Exception('El id del informe no fue recibido');
        }
    }

    /**
     * Funcion que activa un componente del informe
     * 
     * @access public
     *  
     * */ 
    public function activarComponentes(){
        if ( isset($_POST['id_informe']) && isset($_POST['id_inf_design']) ){
            $idInforme = $_POST['id_informe'];
            $id_informe_design = $_POST['id_inf_design'];
            $cliente = $_POST['cliente'];
            $familia = Request::input('familia');
            $nombre_informe = Request::input('nombre_informe');
            $nombre_comp = Request::input('nombre_componente');
            //
            $duracion = $_POST['duracion'] ?? NULL;
            $orden = $_POST['orden'] ?? NULL;
            // activa componente
            SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,NULL,'C',$duracion,$orden,'1',$id_informe_design,null,null,Session::get('usuario')->user_id), 'select');

            SQLConnection::logTrazabilidad('Se activó el componente '.$nombre_comp.' para el tipo de informe '.$nombre_informe,'UPD_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],empty($cliente) ? 0 : $cliente,null,null,null,$familia,$idInforme);
            // }
        } else {
            throw new \Exception('El id del componente no fue recibido');
        }
        
    }

    /**
     * Funcion que desactiva un componente del informe
     * 
     * @access public
     * */ 
    public function desactivarComponentes(){
        if ( isset($_POST['id_informe']) && isset($_POST['id_inf_design']) ){
            $idInforme = $_POST['id_informe'];
            $id_informe_design = $_POST['id_inf_design'];
            $cliente = $_POST['cliente'] ?? 0;
            $familia = Request::input('familia');
            $nombre_informe = Request::input('nombre_informe');
            $nombre_comp = Request::input('nombre_componente');
            //
            $duracion = $_POST['duracion'] ?? NULL;
            $orden = $_POST['orden'] ?? NULL;
            // activa componente
            SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$idInforme,NULL,'C',$duracion,$orden,'0',$id_informe_design,null,null,Session::get('usuario')->user_id),'select');
            SQLConnection::logTrazabilidad('Se desactivó el componente '.$nombre_comp.' para el tipo de informe '.$nombre_informe,'UPD_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],$cliente,null,null,null,$familia,$idInforme);
            //
        } else {
            throw new \Exception('El id del componente no fue recibido');
        }
        
    }

    /**
     * Funcion que reordena los componentes
     * 
     * @access public
     */
    public function reordenarComponentes(){
        if ( isset($_POST['componentes']) && isset($_POST['idTipoInforme']) ){
            //
            $id_tipo_informe = $_POST['idTipoInforme'];
            $componentes = $_POST['componentes'];
            $nuevos_comp = [];
            if (isset($_POST['comp_nuevo'])) {
                $nuevos_comp = $_POST['comp_nuevo'];
                $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITARINF',$id_tipo_informe,null,null,null,null,null,null,null,null,null),'select');
                foreach ($nuevos_comp as $k => $nuevo) {
                    foreach ($partes_informe as $part) {
                        if ( $part->idElem == $nuevo) {
                            $nuevos_comp[$k] = [$nuevo,$part->idLNInformeDesign];
                        }
                    }
                }
                array_push($componentes,$nuevos_comp);
            }
            $cantidad = count($componentes);
            // Se evalua si se cambio el orden y en caso que se cambia el orden
            for($i=0;$i < $cantidad;$i++){
                if (is_array($componentes[$i])) {
                    $orden = Request::input('orden_'.$componentes[$i][0]);
                    $orden_nuevo = Request::input('orden_nuevo_'.$componentes[$i][0]);
                } else {
                    $orden = Request::input('orden_'.$componentes[$i]);
                    $orden_nuevo = Request::input('orden_nuevo_'.$componentes[$i]);
                }
                if ( $orden != $orden_nuevo ){
                    if (is_array($componentes[$i])) {
                        $duracion = Request::input('duracion_'.$componentes[$i][0]);
                        $activo = Request::input('activo_'.$componentes[$i][0]);
                    } else {
                        $duracion = Request::input('duracion_'.$componentes[$i]);
                        $activo = Request::input('activo_'.$componentes[$i]);
                    }
                    //
                    if (is_array($componentes[$i])) {
                        SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$id_tipo_informe,NULL,'C',$duracion,$orden_nuevo,$activo,$componentes[$i][1],null,null,Session::get('usuario')->user_id),'select');
                    } else {
                        SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$id_tipo_informe,NULL,'C',$duracion,$orden_nuevo,$activo,$componentes[$i],null,null,Session::get('usuario')->user_id),'select');
                    }

                }
            }
            SQLConnection::logTrazabilidad('Se modificó el orden de los componentes del tipo informe: '.$id_tipo_informe,'ADD_TAREA_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);
        } else {
            throw new \Exception('No se pudo realizar el proceso por falta de datos');
        }
    }

    //////// TAREAS //////

    /**
     * Funcion que agregar una tarea al informe
     * @access public
     */
    public function agregarTareasInforme(){
        if ( isset($_POST['idTipoInforme']) && !empty($_POST['idTipoInforme']) ){
            // if ( isset($_POST['tareas_informe']) ){
            if ( isset($_POST['nuevas_tareas']) ){
                $id_tipo_informe = $_POST['idTipoInforme'];
                // $tareas_nuevas = $_POST['tareas_informe'];
                $tareas_nuevas = $_POST['nuevas_tareas'];
                $cliente = Request::input('cliente') ?? 0;
                $familia = Request::input('familia');
                $nombre_tipo_informe = Request::input('nombre_tipo_informe');
                $ultimo_orden_tareas = $_POST['ultimo_orden_tarea'] ?? null;
                //
                // SE TRANSFORMA EL ORDEN A UN ENTERO
                $ultimo_orden_tareas = intval($ultimo_orden_tareas);
                // SE AGREGAN LOS COMPONENTES
                foreach( $tareas_nuevas as $tarea ){
                    $duracion = $_POST['duracion_'.$tarea] ?? '15';
                    $ultimo_orden_tareas++;
                    SQLConnection::backendStoreProcedure('LN_informe_design_', array('AGREGAR',$id_tipo_informe,$tarea,'T',$duracion,$ultimo_orden_tareas,'1',NULL,'1','S',Session::get('usuario')->user_id),'select');
                }
				SQLConnection::logTrazabilidad('Se agregó tarea a tipo informe: '.$nombre_tipo_informe,'ADD_TAREA_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],$cliente,null,null,null,$familia,$id_tipo_informe);
                //
                return 1;
            } else {
                return 0;
                // throw new \Exception('No se recibio tareas para agregar al informe');
            }
        } else {
            throw new \Exception('El id del informe no fue recibido');
        }
    }

    /**
     * Funcion que activa una tarea del informe
     * @access public
     */
    public function activarTarea(){
        if ( isset($_POST['idinftarea']) ){
            $id_inf_design = $_POST['idinftarea'];
            $cliente = $_POST['cliente'] ?? 0;
            $familia = Request::input('familia');
            $nombre_informe = Request::input('nombre_informe');
            $nombre_tarea = Request::input('nombre_tarea');
            $id_informe = Request::input('id_informe');
            //
            $duracion = $_POST['duracion'] ?? '1';
            $orden = $_POST['orden'] ?? '1';
            $prioridad = $_POST['prioridad'] ?? '1';
            $dependencias = $_POST['dependencias'] ?? NULL;
            $tipo_tarea = $_POST['tipo_tarea'] ?? 'S';
            // activa Tarea
            SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',NULL,NULL,'T',$duracion,$orden,'1',$id_inf_design,$prioridad,$tipo_tarea,Session::get('usuario')->user_id,NULL,NULL,$dependencias),'select');

            SQLConnection::logTrazabilidad('Se agregó tarea a tipo informe: '.$nombre_informe,'ACTIVAR_TAREA_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],$cliente,null,null,null,$familia,$id_informe);
        } else {
            throw new \Exception('El id de la tarea no fue recibido');
        }
    }

    /**
     * Funcion que desactiva una tarea del informe
     * @access public
     */
    public function desactivarTarea(){
        if ( isset($_POST['idinftarea']) ){
            $id_inf_design = $_POST['idinftarea'];
            $cliente = $_POST['cliente'] ?? 0;
            $familia = Request::input('familia');
            $nombre_informe = Request::input('nombre_informe');
            $nombre_tarea = Request::input('nombre_tarea');
            $id_informe = Request::input('id_informe');
            //
            $duracion = $_POST['duracion'] ?? '1';
            $orden = $_POST['orden'] ?? '1';
            $prioridad = $_POST['prioridad'] ?? '1';
            $tipo_tarea = $_POST['tipo_tarea'] ?? 'S';
            // activa Tarea
            SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',NULL,NULL,'T',$duracion,$orden,'0',$id_inf_design,$prioridad,$tipo_tarea,Session::get('usuario')->user_id,NULL,NULL,NULL),'select');

            SQLConnection::logTrazabilidad('Se agregó tarea a tipo informe: '.$nombre_informe,'DESACTIVAR_TAREA_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],$cliente,null,null,null,$familia,$id_informe);
        } else {
            throw new \Exception('El id de la tarea no fue recibido');
        }
    }

    /**
     * Funcion que graba el nuevo orden de las tareas
     * @access public
     */
    public function reordenarTareas(){
        if ( isset($_POST['tareas']) && isset($_POST['id_tipo_informe']) ){
            $id_tipo_informe = $_POST['id_tipo_informe'];
            $tareas = $_POST['tareas'];
            $cantidad = count($tareas);
            // Se evalua si se cambio el orden y en ese caso se actualizan los datos
            for($i=0;$i < $cantidad;$i++){
                $orden = Request::input('orden_'.$tareas[$i]);
                $orden_nuevo = Request::input('orden_nuevo_'.$tareas[$i]);
                //
                if ( $orden != $orden_nuevo ){
                    $tipo_tarea = Request::input('tipo_tarea_'.$tareas[$i]);
                    $duracion = Request::input('duracion_'.$tareas[$i]);
                    $prioridad = Request::input('prioridad_tarea_'.$tareas[$i]);
                    $activo = Request::input('activo_'.$tareas[$i]);
                    $dependencias = Request::input('dependencias_tarea_'.$tareas[$i]);
                    //
                    SQLConnection::backendStoreProcedure('LN_informe_design_',array('ACTUALIZAR',$id_tipo_informe,NULL,'T',$duracion,$orden_nuevo,$activo,$tareas[$i],$prioridad,$tipo_tarea,Session::get('usuario')->user_id,NULL,NULL,$dependencias),'select');
                }
            }
            SQLConnection::logTrazabilidad('Se modificó el orden de las tareas del tipo informe: '.$id_tipo_informe,'ORDER_TAREA_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);
        } else {
            throw new \Exception('No se pudo realizar el proceso por falta de datos');
        }
    }

    /**
     * Funcion que actualiza los datos de la tarea
     * 
     * @access public
     */
    public function actualizarTareas(){
        if ( isset($_POST['tareas']) && isset($_POST['id_tipo_informe']) ){
            $familia = Request::input('familia');
            $nombre_informe = Request::input('nombre_tipo_informe');
            $id_tipo_informe = $_POST['id_tipo_informe'];
            $tareas = $_POST['tareas'];
            $cantidad = count($tareas);
            //
            for($i=0;$i < $cantidad;$i++){
                $orden = Request::input('orden_'.$tareas[$i]);
                $tipo_tarea = Request::input('tipo_tarea_editar_'.$tareas[$i]);
                if ( $tipo_tarea == 'S' ){
                    $duracion = Request::input('duracion_tarea_editar_'.$tareas[$i]);
                } else {
                    $duracion = Request::input('periodo_carga_editar_'.$tareas[$i]);    
                }
                $prioridad = Request::input('prioridad_tarea_editar_'.$tareas[$i]);
                $activo = Request::input('activo_'.$tareas[$i]);
                $dependencias = Request::input('tareas_dependencia_editar_'.$tareas[$i]);
                if ( !is_null($dependencias) ){
                    $dependencias = implode(',',$dependencias);
                }
                //
                SQLConnection::backendStoreProcedure('LN_informe_design_',array('ACTUALIZAR',$id_tipo_informe,NULL,'T',$duracion,$orden,$activo,$tareas[$i],$prioridad,$tipo_tarea,Session::get('usuario')->user_id,NULL,NULL,$dependencias),'select');
                //
                SQLConnection::logTrazabilidad('Se modificaron las tareas del tipo informe '.$nombre_informe,'UPD_TAREA_TIPO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado'],NULL,null,null,null,$familia,$id_tipo_informe);
            }
        } else {
            throw new \Exception('No se pudo realizar el proceso por falta de datos');
        }
    }

    public static function trazabilidadInforme(){
        $id_tipo_informe = Request::input('informe');
        $nombre_cliente = Request::input('nombre_cliente');
        $nombre_tipo_informe = Request::input('nombre_tipo_informe');
        $trazabilidad = SQLConnection::backendStoreProcedure('trazabilidad_configuracion',array('TRAZABILIDAD_BY_TIPOINFORME',Session::get('webdata')['id_menu_plataforma'],null,null,$id_tipo_informe));
        // dd($trazabilidad);
        //$trazabilidad = DB::select("SELECT TOP 50 * FROM trazabilidad WHERE id_plataforma='".Session::get('webdata')['id_menu_plataforma']."' and idTipoInforme = $id_tipo_informe ORDER BY created DESC;");
        // dd($trazabilidad);
        // $users = SQLConnection::backendStoreProcedure('LN_Blue',array('USERS_BACK',NULL,NULL,NULL));
        $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')));
        // dd($trazabilidad);
        foreach( $trazabilidad as $k => $log ){
            $trazabilidad[$k]->nombre_persona_mod = null;
            foreach ( $users as $us) {
                if ( $us->user_id == $log->user_id){
                    $trazabilidad[$k]->nombre_persona_mod = $us->usuario;
                }
            }
        }
        return view('/configuracion-informes/edicion/tabla_trazabilidad_informe')->with(compact('trazabilidad','nombre_cliente','nombre_tipo_informe'));
    }

    public function guardarCompTarInforme(){     
        if ( isset($_POST['idTipoInforme']) && !empty($_POST['idTipoInforme']) || (isset($_POST['comp_nuevo']) || isset($_POST['componentes']) || isset($_POST['comp_nuevo']) || isset($_POST['componentes']) )){
            $add_comp = self::agregarComponentesInforme();
            $add_tar = self::agregarTareasInforme();
            // 
            $id_tipo_informe = $_POST['idTipoInforme'];
            $componentes = isset($_POST['componentes'])?$_POST['componentes']:null;
            $tareas = $_POST['tareas'];
            $partes_informe = SQLConnection::backendStoreProcedure('LN_informe_design_', array('EDITARINF',$id_tipo_informe,null,null,null,null,null,null,null,null,null),'select');
            if (isset($_POST['comp_nuevo'])) {
                $nuevos_comp = $_POST['comp_nuevo'];
                foreach ($nuevos_comp as $k => $nuevo) {
                    foreach ($partes_informe as $part) {
                        if ( $part->idElem == $nuevo) {
                            array_push($componentes,[$nuevo,$part->idLNInformeDesign]);
                            break;
                        }
                    }
                }
            }

            if (isset($_POST['nuevas_tareas'])) {
                $nuevas_tar = $_POST['nuevas_tareas'];
                foreach ($nuevas_tar as $k => $nuevo) {
                    foreach ($partes_informe as $part) {
                        if ( $part->idElem == $nuevo) {
                            array_push($tareas,[$nuevo,$part->idLNInformeDesign]);
                            break;
                        }
                    }
                }
            }
            $cantidad_c = is_array($componentes)?count($componentes):$componentes;
            $cantidad_t = count($tareas);
            // Se guardan los datos de los componentes
            for( $i=0; $i < $cantidad_c; $i++ ){
                if (is_array($componentes[$i])) {
                    $orden_nuevo = Request::input('orden_nuevo_'.$componentes[$i][0]);
                    $duracion = Request::input('duracion_'.$componentes[$i][0]);
                    $activo = Request::input('activo_'.$componentes[$i][0]);
                    SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR', $id_tipo_informe, NULL, 'C', $duracion, $orden_nuevo, $activo, $componentes[$i][1], null, null, Session::get('usuario')->user_id), 'select');
                } elseif (!is_array($componentes[$i])) {
                    $orden_nuevo = Request::input('orden_nuevo_'.$componentes[$i]);
                    $duracion = Request::input('duracion_'.$componentes[$i]);
                    $activo = Request::input('activo_'.$componentes[$i]);
                    SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR',$id_tipo_informe,NULL,'C',$duracion,$orden_nuevo,$activo,$componentes[$i],null,null,Session::get('usuario')->user_id),'select');
                }
            }

            // dd($tareas);
            // Se guardan los datos de las tareas
            for( $i=0; $i < $cantidad_t; $i++ ){
                if (is_array($tareas[$i])) {                    
                    $orden_nuevo = Request::input('orden_nuevo_'.$tareas[$i][0]);
                    $tipo_tarea = Request::input('tipo_tarea_'.$tareas[$i][0]);
                    $duracion = Request::input('duracion_tarea_editar_'.$tareas[$i][0]);
                    $prioridad = Request::input('prioridad_tarea_editar_'.$tareas[$i][0]);
                    $activo = Request::input('activo_'.$tareas[$i][0]);
                    $dependencias = Request::input('dependencias_tarea_'.$tareas[$i][0]);
                    if ($tareas[$i][0] == '90372'){
                        // dd($dependencias);
                    }
                    //
                    if (!is_null($dependencias) && is_array($dependencias)) {
                        $aux = '';
                        foreach ($dependencias as $dep) {
                            $aux .= $dep.',';
                        }
                        $dependencias = $aux;
                    }
                    SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR', $id_tipo_informe, NULL, 'T', $duracion, $orden_nuevo, $activo, $tareas[$i][1], $prioridad, $tipo_tarea, Session::get('usuario')->user_id, NULL, NULL, $dependencias),'select');
                } 
                elseif (!is_array($tareas[$i])) {
                    $orden_nuevo = Request::input('orden_nuevo_'.$tareas[$i]);
                    $duracion = Request::input('duracion_tarea_editar_'.$tareas[$i]);
                    $tipo_tarea = Request::input('tipo_tarea_editar_'.$tareas[$i]);
                    $prioridad = Request::input('prioridad_tarea_editar_'.$tareas[$i]);
                    $activo = Request::input('activo_'.$tareas[$i]);
                    $dependencias = Request::input('dependencias_tarea_'.$tareas[$i]);
                    if ($tareas[$i] == '90372'){
                        // dd($dependencias);
                    }
                    // 
                    if (!is_null($dependencias) && is_array($dependencias)) {
                        $aux = '';
                        foreach ($dependencias as $dep) {
                            $aux .= $dep.',';
                        }
                        $dependencias = $aux;
                    }
                    SQLConnection::backendStoreProcedure('LN_informe_design_', array('ACTUALIZAR', $id_tipo_informe, NULL, 'T', $duracion, $orden_nuevo, $activo, $tareas[$i], $prioridad, $tipo_tarea, Session::get('usuario')->user_id, NULL, NULL, $dependencias),'select');
                }
            }
            SQLConnection::logTrazabilidad('Se modificó la configuracion de los componentes y tareas del tipo informe: '.$id_tipo_informe,'CAMBIO_CONFIG_TIPO_INF',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);

            return 1;
        } else {
            return 'error';
        }
    }
}