<?php
namespace App\Http\Controllers;

use Request;
use Session;
use App\Custom\SQLConnection;
use App\Custom\Misc;
use DB;
use stdClass;
use DateTime;
use Route;

class FaconController extends Controller
{

    // ---------Funcion que renderiza la vista del nuevo formulario inteligente ----------//
	public static function GenerateNewSet(){
        $documentos_disponibles = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('available',NULL,NULL,NULL), 'select');
		//$cliente = '3920694';
		// $contraparte = '156783';
		//$contraparte = '156783';
		//$gestion = '153776';
		// DOCUMENTOS DEL FACON
		//$docs_unificados = DB::select('EXEC dbo.LN_contrapartes_ ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?', array('DOCUMENTOS_GESTION_ACTIVA', $contraparte, null, null, null, null, null, null, null, null, null, null, null, null, null));
		//
        //$array_aux = [];
        //foreach ( $docs_unificados as $key => $docs) {
        //    foreach($array_aux as $repeated) {
        //        if( $repeated == $docs->tipo_doc ) {
        //            unset($docs_unificados[$key]);
        //        }
        //    }
        //    array_push($array_aux, $docs->tipo_doc);
        //}
        $titulo_navbar = 'Nuevo Set de Documentos';
        $ruta = '/configuracion-facones-informes/sets-documentos-existentes';
        //
		return view('/configuracion-facones-informes/formulario-inteligente')->with(compact('titulo_navbar','documentos_disponibles','ruta'));
	}

    // ---------Funcion que renderiza la vista del nuevo formulario inteligente ----------//
	public static function generateNewInforme(){
        $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_V2', array('available',NULL,NULL,NULL), 'select');
        $tareas = SQLConnection::backendStoreProcedure('LN_Tareas_', array('LISTAR',NULL,NULL), 'select'); // Tareas Disponibles
        $componentes = SQLConnection::backendStoreProcedure('LN_componente_', array('LISTAR',NULL,NULL,NULL), 'select'); // Tareas Disponibles
        //
        $clientes = json_encode($clientes);
        //
		return view('/configuracion-informes/nuevo-informe')->with(compact('documentos_disponibles','tareas','componentes','clientes'));
	}

    // FUNCION QUE DEVUELVE EL FORMULARIO PARA CREAR EL NUEVO SET
    // PARAMETRO DE REQUEST : recibe como parametros los tipos docs elegidos
    public static function modalNewSet(){
        $tipos_doc_elegidos = Request::input('docs_elegidos');
        //
        //$documentos_elegidos = [];
        // SE OBTIENEN LOS DATOS DE LOS DOCUMENTOS ELEGIDOS
        /*if ( is_array($tipos_doc_elegidos) ){
            foreach( $tipos_doc_elegidos as $tipo_doc ){
                $data_tipo_doc = SQLConnection::backendStoreProcedure('LN_tipos_doc_', array('select', $tipo_doc, null, null, null, null, null, null, null, null, null), 'selectOne');
                array_push($documentos_elegidos,$data_tipo_doc);
            }
        }*/
        // 
        $documentos_elegidos = json_encode($tipos_doc_elegidos);
        //
        $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',NULL,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select');
        $clientes = json_encode($clientes);
        //
        $documentos_disponibles = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('available',NULL,NULL,NULL), 'select');
        //
        return view('/configuracion-facones-informes/form_crear_set_doc')->with(compact('documentos_elegidos','documentos_disponibles','clientes'));
    }

    // FUNCION QUE HACE LA BUSQUEDA DEL CLIENTE Y DEVUELVE EL RESULTADO
    // PARAMETROS DE REQUEST : recibe la cadena lo cual contiene nombre o cuit del cliente
    public static function buscarClienteLED(){
        if ( isset($_POST['cliente']) && !Misc::tieneCaracterRaroBase($_POST['cliente']) ){
            $search_input = $_POST['cliente'];
            if ( !empty(Misc::parsearBusquedaPadron($search_input)) ){
                if ( Misc::validacionesGenerica($search_input,'numero') ){
                    $busqueda = SQLConnection::backendStoreProcedure('LED_Clientes', array('search',NULL,NULL,$search_input,NULL), 'select');
                } else {
                    $busqueda = SQLConnection::backendStoreProcedure('LED_Clientes', array('search',NULL,$search_input,NULL,NULL), 'select');
                }
            } else {
                return 0;
            }
            //
            if ( empty($busqueda) ){
                return 0;
            } else {
                return json_encode($busqueda);
            }
        } else {
            return 0;
        }
    }
    
    // FUNCION QUE DEVUELVE LOS SETS GENERICOS O PARA CIERTO CLIENTE
    // PARAMETRO DE REQUEST : el numero de cliente o letra 'G' si es para sets genericos
    public static function obtenerSets(){
        if ( Misc::validacionesGenerica(Request::input('cliente'),'numero') || Request::input('cliente') == 'G' ){
            $cliente = (Request::input('cliente') == 'G') ? null : Request::input('cliente');
            $setdoc = SQLConnection::backendStoreProcedure('LN_set_docs_', array('cliente',null,null,null,$cliente,null,null), 'select');
            //return json_encode($setdoc);
            return view('/configuracion-facones-informes/seccion-tablas-set-cliente',compact('setdoc'));
        } else {
            return 1;
        }
    }

    // FUNCION QUE DEVUELVE LAS NUEVAS FILAS AGERGADOS AL SET NUEVO
    // PARAMETROS DE REQUEST :1. documentos nuevos agregados del set  
    public static function agregarFilasDocumentosSet(){
        if (isset($_POST['tipos_doc'])){
            $tipos_doc = Request::input('tipos_doc');
            $documentos_elegidos = [];
            if (is_array($tipos_doc)){
                // SI ES ARRAY DE DOCUMENTOS
                foreach ($tipos_doc as $tipo_doc){
                    if (is_numeric($tipo_doc)){
                        $data_tipo_doc = SQLConnection::backendStoreProcedure('LN_tipos_doc_', array('select', $tipo_doc, null, null, null, null, null, null, null, null, null), 'selectOne');
                        array_push($documentos_elegidos,$data_tipo_doc);
                    }
                }
            } else {
                // SI ES UN DOCUMENTO
                if (is_numeric($tipos_doc)){
                    $data_tipo_doc = SQLConnection::backendStoreProcedure('LN_tipos_doc_', array('select', $tipos_doc, null, null, null, null, null, null, null, null, null), 'selectOne');
                    array_push($documentos_elegidos,$data_tipo_doc);
                }
            }
            return view('/configuracion-facones-informes/filas-config-documentos-set-nuevo')->with(compact('documentos_elegidos'));
        } else {
            return 1;
        }
    }

    // FUNCION QUE DA DE ALTA EL SET DE DOCUMENTOS NUEVO
    // PARAMETROS DE REQUEST :1.nombre del set  2.cliente la cual pertenece el set 3.descripcion del set 4.tiene habilitado contratistas 5.tiene habilitado subcontratistas 6.documentos del set
    public static function crearSetDocumentos(){
        if ( isset($_POST['docs_elegidos']) && is_array($_POST['docs_elegidos']) && count($_POST['docs_elegidos']) > 0 && isset($_POST['nombre_set']) && ( (isset($_POST['cliente']) && Misc::validacionesGenerica(Request::input('cliente'),'numero') ) || isset($_POST['set_generico']) ) ){
            $nombre_set = Request::input('nombre_set');
            $descripcion = Request::input('descripcion_set');
            $cliente = Request::input('cliente') ?? null;
            $hab_contratistas = (is_null(Request::input('hab_contratistas'))) ? 0 : 1;
            $hab_subcontratistas = (is_null(Request::input('hab_subcontratistas'))) ? 0 : 1;
            $userid = Session::get('usuario')->user_id;
            $docs_elegidos = $_POST['docs_elegidos'];
            $id_plataforma = Session::get('webdata')['servicio_contratado'] ?? env('PLATAFORMA');
            // Se valida que el set de documentos no tenga un nombre que otro tiene
            if ( self::existeNombreSet(trim($nombre_set)) ){
                return 2;
            }
            // SE DA DE ALTA EL SET
            $set_id = SQLConnection::backendStoreProcedure('LN_set_docs_',array('insert',NULL,$nombre_set,$descripcion,$cliente,$hab_contratistas,$hab_subcontratistas,$userid,$id_plataforma),'selectOne');
            // SE DAN DE ALTA LOS TIPOS DOCS DEL SET
            if ( isset($set_id->idSet) ){
                self::addTipoDocsToSet($set_id->idSet,$docs_elegidos);
                /*foreach( $docs_elegidos as $doc ){
                    $tolerancia = Request::input('tolerancia_carga_'.$doc);
                    $carga = Request::input('carga_'.$doc);
                    $verifica = Request::input('verifica_'.$doc);
                    $vb = ( $verifica == 'F' ) ? 1 : 0;
		            $vc = ( $verifica == 'C' ) ? 1 : 0;
                    $peso_score = (  empty(Request::input('peso_score_'.$doc)) ) ? NULL : Request::input('peso_score_'.$doc) ;
                    $activo = ( Request::input('activo_'.$doc) !== NULL ) ? 1 : 0;
                    $killer = ( Request::input('killer_'.$doc) !== NULL ) ? 1 : 0;
                    //
                    $temp = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_', array('insert', $set_id->idSet, $doc, $tolerancia, $vb, $vc, $peso_score, $activo, $userid, $killer,$carga,$verifica), 'selectOne');
                }*/
            }
            // se inserta en la trazabilidad
            SQLConnection::logTrazabilidad('Se creo el set de documentos '.$nombre_set,'SET_DOC','IV_BACK',$userid,$id_plataforma);
            // $id = '126';
            // return self::crearTablaDocs($id);
            return self::crearTablaDocs($set_id->idSet,0,0,1);
            // $nombre_set = Request::input('nombre_set');
            // $descripcion = Request::input('descripcion_set');
            // $cliente = Request::input('cliente') ?? null;
            // $hab_contratistas = (is_null(Request::input('hab_contratistas'))) ? 0 : 1;
            // $hab_subcontratistas = (is_null(Request::input('hab_subcontratistas'))) ? 0 : 1;
            // $userid = Session::get('usuario')->user_id;
            // $docs_elegidos = $_POST['docs_elegidos'];
            // // SE DA DE ALTA EL SET
            // $set_id = SQLConnection::backendStoreProcedure('LN_set_docs_',array('insert',NULL,$nombre_set,$descripcion,$cliente,$hab_contratistas,$hab_subcontratistas,$userid),'selectOne');
            // // SE DAN DE ALTA LOS TIPOS DOCS DEL SET
            // if ( isset($set_id->idSet) ){
            //     foreach( $docs_elegidos as $doc ){
            //         $tolerancia = Request::input('tolerancia_carga_'.$doc);
            //         $carga = Request::input('carga_'.$doc);
            //         $verifica = Request::input('verifica_'.$doc);
            //         $vb = ( $verifica == 'F' ) ? 1 : 0;
		    //         $vc = ( $verifica == 'C' ) ? 1 : 0;
            //         $peso_score = (  empty(Request::input('peso_score_'.$doc)) ) ? NULL : Request::input('peso_score_'.$doc) ;
            //         $activo = ( Request::input('activo_'.$doc) !== NULL ) ? 1 : 0;
            //         $killer = ( Request::input('killer_'.$doc) !== NULL ) ? 1 : 0;
            //         //
            //         $temp = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_', array('insert', $set_id->idSet, $doc, $tolerancia, $vb, $vc, $peso_score, $activo, $userid, $killer,$carga,$verifica), 'selectOne');
            //     }
            // }
            // return 0;
            //
        } else {
            return 1;
        }
    }

    // FUNCION QUE DEVUELVE LAS FAMILIAS DEL CLIENTE
    // PARAMETROS DE REQUEST : 1.cliente
    public static function familiasCliente(){
        if ( !is_null($_POST['cliente']) ){
            $cliente = Request::input('cliente');
            //
            $familias = SQLConnection::backendStoreProcedure('LN_familias_', array('search',NULL,NULL,$cliente,NULL,NULL,NULL), 'select');
            if ( empty($familias) ){
                return null;
            }
            return json_encode($familias);
        } else { 
            return null;
        }
        
    }

    //////////////////////////////////////////////////
    //// ASIGNAR SET DOCUMENTOS A CLIENTE FAMILIA ////
    //////////////////////////////////////////////////

    // FUNCION QUE DEVUELVE LA VISTA QUE ASIGNA EL DOCUMENTO PARA ALGUNA FAMILIA
    // PARMETROS DE REQUEST : 1.set-doc
    public static function asignarSetDocsFamilia(){
        if ( isset($_POST['set-id']) ){
            $set_id = Request::input('set-id');
            $cliente = Request::input('cliente') ?? 0;
            //
            $set_data = SQLConnection::backendStoreProcedure('LN_set_docs_', array('select', $set_id), 'selectOne');
            $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',NULL,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select');
            $clientes = json_encode($clientes);
            return view('/configuracion-facones-informes/asignar-set-docs-familia',compact('set_data','clientes','cliente'));
        } else {
            return 0;
        }
    }

    // FUNCION QUE DEVUELVE LA SECCION DE FAMILIAS Y SUBFAMILIAS DEL CLIENTE
    // PARMETROS DE REQUEST : 1.cliente  2.set-doc
    public static function clienteFamiliasSubfamilias(){
        if ( isset($_POST['cliente']) && Misc::validacionesGenerica(Request::input('cliente'),'numero') && isset($_POST['set-doc']) && Misc::validacionesGenerica(Request::input('set-doc'),'numero') ){
            $cliente = Request::input('cliente');
            $set_doc = Request::input('set-doc');
            $nombre_set_doc = Request::input('nombre_set_doc');
            $contratista = (empty(Request::input('hab_contratista'))) ? 0 : 1 ;
            $subcontratista = (empty(Request::input('hab_subcontratista'))) ? 0 : 1 ;
            //
            return self::vistaAsignacionSet($cliente,$set_doc,$contratista,$subcontratista,$nombre_set_doc);
        } else {
            return 0;
        }
    }

    /**
     * FUNCION QUE DEVUELVE LA VISTA PARA ASIGNAR SET A FAMILIA O SUBFAMILIA
     * 
     * @param int cliente el id del cliente
     * @param int set_doc el id del set de documentos
     * @param int|null hab_contratista tiene habilitado contratista
     * @param int|null hab_subcontratista tiene habilitado subcontratista
     * 
     * @return \Illuminate\View\View la vista de familias y subfamilias del cliente
     */
    protected static function vistaAsignacionSet($cliente,$set_doc,$hab_contratista=NULL,$hab_subcontratista=NULL,$nombre_set_doc=null){
        $tiene_hab_contratista = is_null($hab_contratista);
        $tiene_hab_subcontratista = is_null($hab_subcontratista);
        // SI NO RECIBE QUE EL VALOR DE HAB_CONTRATISTAS O HAB_SUBCONTRATISTAS , LO BUSCA
        if ( $tiene_hab_contratista || $tiene_hab_subcontratista ){
            if ( $tiene_hab_contratista && $tiene_hab_subcontratista ){
                $set_data = SQLConnection::backendStoreProcedure('LN_set_docs_', array('select', $set_doc), 'selectOne');
                $hab_contratistas = $set_data->hab_contratista;
                $hab_subcontratistas = $set_data->hab_subcontratista;
            } elseif ( $tiene_hab_contratista ){
                $set_data = SQLConnection::backendStoreProcedure('LN_set_docs_', array('select', $set_doc), 'selectOne');
                $hab_contratistas = $set_data->hab_contratista;
            } elseif ( $tiene_hab_subcontratista ){
                $set_data = SQLConnection::backendStoreProcedure('LN_set_docs_', array('select', $set_doc), 'selectOne');
                $hab_subcontratistas = $set_data->hab_subcontratista;
            }
        }
        //
        $familias = NULL;
        $subfamilias = NULL;
        // SI TIENE HABILITADO CONTRATISTAS SE PUEDE ASIGNAR A FAMILIAS
        if ( $hab_contratista ){
            $familias = SQLConnection::backendStoreProcedure('LN_familias_', array('search',NULL,NULL,$cliente,NULL,NULL,NULL), 'select');
            $hab_contratista = 1;
        } else {
            $hab_contratista = 0;
        }
        // SI TIENE HABILITADO SUBCONTRATISTAS , SE PUEDE ASIGNAR A SUBFAMILIAS
        if ( $hab_subcontratista ){
            $subf = SQLConnection::backendStoreProcedure('LN_subfamilias_', array('cliente',NULL,NULL,$cliente), 'select');
            //
            $subfamilias = [];
            foreach ($subf as $k => $data) {
                $subfamilias[$data->familia]['familia'] = $data->familia;
                $subfamilias[$data->familia]['familia_padre'] = $data->familia_padre;
                $subfamilias[$data->familia]['nombre_familia'] = $data->nombre_familia;
                $subfamilias[$data->familia]['visible'] = $data->visible;
                $subfamilias[$data->familia]['country_code'] = $data->country_code;
                $subfamilias[$data->familia]['country_name'] = $data->country_name;
                $subfamilias[$data->familia]['total_contrapartes'] = $data->total_contrapartes;
                $subfamilias[$data->familia]['set_doc'] = $data->set_doc;
                $subfamilias[$data->familia]['nombre_set'] = $data->nombre_set;
                $subfamilias[$data->familia]['nombre_cliente'] = $data->nombre_cliente;
                if (null != $data->familia_padre){
                    $subfamilias[$data->familia]['familias_asociadas'][$data->familia_padre] = $data->nombre_familia_padre;
                }
            }
            $hab_subcontratista = 1;
        } else {
            $hab_subcontratista = 0;
        }
        //
        return view('/configuracion-facones-informes/familias-subfamilias-cliente',compact('cliente','set_doc','familias','subfamilias','hab_contratista','hab_subcontratista','nombre_set_doc'));
    }

    // FUNCION QUE ASIGNA EL SET A UNA FAMILIA
    public static function asignarSetFamilia(){
        if ( isset($_POST['familia']) && isset($_POST['set-doc']) ){
            $familia = Request::input('familia');
            $set_doc = Request::input('set-doc');
            $cliente = Request::input('cliente');
            $nombre_familia = Request::input('nombre_familia');
            $nombre_set = Request::input('nombre_set');
            $userid = Session::get('usuario')->user_id;
            $id_plataforma = Session::get('webdata')['servicio_contratado'] ?? env('PLATAFORMA');
            //
            $hab_contratista = (empty(Request::input('hab_contratista')) || is_null(Request::input('hab_contratista')) ) ? 0 : 1 ;
            $hab_subcontratista = (empty(Request::input('hab_subcontratista')) || is_null(Request::input('hab_subcontratista')) ) ? 0 : 1 ;
            // SE EJECUTA EL STORE PARA DEVOLVER LOS DATOS DE LA FAMILIA
            $fdata = SQLConnection::backendStoreProcedure('LN_familias_sc', array('select',$familia,null,null,null,null,$userid), 'selectOne');
            // SE CAMBIA EL DOCUMENTO DE LA FAMILIA
            $temp = SQLConnection::backendStoreProcedure('LN_familias_sc', array('update',$familia,$fdata->nombre_familia,$fdata->cliente,$fdata->country_code,$fdata->visible,$userid, $set_doc, 0, $fdata->modalidad_login, $fdata->uso_familia, $fdata->servicio_contratado, $fdata->id_imperium), 'selectOne');
            //
            SQLConnection::logTrazabilidad('Se asignó la familia '.$nombre_familia.' al set de documentos '.$nombre_set,'UPD_SET_DOC',Session::get('webdata')['id_menu_plataforma'],$userid,$id_plataforma,empty($cliente) ? 0 : $cliente,null,null,$set_doc,$familia);
            // 
            return self::vistaAsignacionSet($fdata->cliente,$set_doc,$hab_contratista,$hab_subcontratista);
        } else {
            return 0;
        }
    }

    // FUNCION QUE ASIGNA EL SET A UNA SUBFAMILIA
    public static function asignarSetSubfamilia(){
        if ( isset($_POST['subfamilia']) && isset($_POST['set-doc']) ){
            $subfamilia = Request::input('subfamilia');
            $set_doc = Request::input('set-doc');
            $userid = Session::get('usuario')->user_id;
            $cliente = Request::input('cliente');
            $nombre_subfamilia = Request::input('nombre_subfamilia');
            $nombre_set = Request::input('nombre_set');
            $id_plataforma = Session::get('webdata')['servicio_contratado'] ?? env('PLATAFORMA');
            //
            $hab_contratista = (empty(Request::input('hab_contratista')) || is_null(Request::input('hab_contratista')) ) ? 0 : 1 ;
            $hab_subcontratista = (empty(Request::input('hab_subcontratista')) || is_null(Request::input('hab_subcontratista')) ) ? 0 : 1 ;
            // SE EJECUTA EL STORE PARA DEVOLVER LOS DATOS DE LA SUBFAMILIA
            $fdata = SQLConnection::backendStoreProcedure('LN_familias_', array('select',$subfamilia,NULL,NULL,NULL,NULL,NULL), 'selectOne');
            // GRABA LOS CAMBIOS
            $temp = SQLConnection::backendStoreProcedure('LN_familias_', array('update',$subfamilia,$fdata->nombre_familia,$fdata->cliente,$fdata->country_code,$fdata->visible,$userid, $set_doc, 1), 'selectOne');
            //
            SQLConnection::logTrazabilidad('Se asignó la subfamilia '.$nombre_subfamilia.' al set de documentos '.$nombre_set,'UPD_SET_DOC',Session::get('webdata')['id_menu_plataforma'],$userid,$id_plataforma,empty($cliente) ? 0 : $cliente,null,null,$set_doc,$subfamilia);
            // 
            return self::vistaAsignacionSet($fdata->cliente,$set_doc,$hab_contratista,$hab_subcontratista);
        } else {
            return 0;
        }
    }

    /////////////////////////////////////////////////
    ///////// SETS DE DOCUMENTOS EXISTENTES /////////
    /////////////////////////////////////////////////

    // FUNCION QUE DEVUELVE LA VISTA DE LOS SETS DE DOCUMENTOS EXISTENTES
    public static function setsDocumentos(){
        $sets = SQLConnection::backendStoreProcedure('LN_set_docs_', array('search',NULL,NULL,NULL,NULL,NULL,NULL,NULL,env('PLATAFORMA')));
        $titulo_navbar = 'Sets de documentos Existentes';
        //
        return view('/configuracion-facones-informes/set-doc-acciones/sets-documentos',compact('sets','titulo_navbar'));
    }

    //////////////////////////////////////
    ///// EDICION SET DE DOCUMENTOS //////
    //////////////////////////////////////

    // FUNCION QUE DEVUELVE EL COTENIDO DE EDICION DEL SET
    public static function editarSetDocumentos(){
        if ( isset($_POST['set-doc']) && Misc::validacionesGenerica(Request::input('set-doc'),'numero') ){
            $set_doc = Request::input('set-doc');
            $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',NULL,NULL,NULL,NULL,0,env('PLATAFORMA')), 'select');
            $clientes = json_encode($clientes);
		    $set = SQLConnection::backendStoreProcedure('LN_set_docs_', array('select', $set_doc), 'selectOne');
            //
            $familias = null;
            if ( !is_null($set->cliente) ){
                $familias = SQLConnection::backendStoreProcedure('LN_familias_', array('search',NULL,NULL,$set->cliente,NULL,NULL,NULL), 'select');
            }
            //
            return view('/configuracion-facones-informes/set-doc-acciones/editar-set-documentos',compact('clientes','set','familias'));
        } else {
            return 0;
        }
    }

    // FUNCION QUE ACTUALIZA EL SET DE DOCUMENTOS DEL CLIENTE
    public static function actualizarSetDocumentos(){
        if ( isset($_POST['set-doc']) && isset($_POST['nombre_set']) && ( (isset($_POST['cliente']) && Misc::validacionesGenerica(Request::input('cliente'),'numero') ) || isset($_POST['set_generico']) ) ){
            //
            $set_doc = Request::input('set-doc');
            $nombre_set = Request::input('nombre_set');
            $descripcion = Request::input('descripcion_set');
            $cliente = Request::input('cliente');
            $hab_contratista = (is_null(Request::input('hab_contratistas'))) ? 0 : 1;
            $hab_subcontratista = (is_null(Request::input('hab_subcontratistas'))) ? 0 : 1;
            $userid = Session::get('usuario')->user_id;
            $id_plataforma = Session::get('webdata')['servicio_contratado'] ?? env('PLATAFORMA');
            //
            //
            $temp = SQLConnection::backendStoreProcedure('LN_set_docs_', array('update',$set_doc,$nombre_set,$descripcion,$cliente,$hab_contratista,$hab_subcontratista,$userid),'selectOne');
            //
            SQLConnection::logTrazabilidad('Se actualizo el set de documentos '.$nombre_set,'SET_DOC',Session::get('webdata')['id_menu_plataforma'],$userid,$id_plataforma,empty($cliente) ? 0 : $cliente,null,null,$set_doc);
            //
            return redirect('/configuracion-facones-informes/sets-documentos-existentes');
        } else {
            return 0;
        }
    }

    /**
     * Funcion que verifica que el nombre
     * del set es valido (no esta repetido)
     * @access public
     * @return string
     */
    public static function verifNombreSet(){
        if ( isset($_POST['set']) && Misc::validacionesGenerica(Request::input('set'),'numero') && isset($_POST['nombre_set']) ){
            $set = Request::input('set');
            $nombre_set = trim(Request::input('nombre_set'));
            //
            $set_data = SQLConnection::backendStoreProcedure('LN_set_docs_',array('select', $set),'selectOne');
            // se verifica que el nombre no sea repetido ( en caso de que este cambiado )
            if ( $set_data->nombre_set == $nombre_set || (!self::existeNombreSet($nombre_set)) ){
                return json_encode(['response' => 1]);
            } else {
                return json_encode(['response' => 0]);
            }
            //
        } else {
            return json_encode(['response' => 0]);
        }
    }

    /////////////////////////////////////
    ///// BORRAR SET DE DOCUMENTOS //////
    /////////////////////////////////////

    // FUNCION QUE DEVUELVE EL MODAL DE CONFIRMACION DE LA ELIMINACION DEL SET DE DOCUMENTOS
    public static function confirmarBorrarSetDocumentos(){
        if ( isset($_POST['set-doc']) && Misc::validacionesGenerica(Request::input('set-doc'),'numero') ){
            $set_doc = Request::input('set-doc');
            $cliente = Request::input('cliente');
            $nombre_set = Request::input('nombre-set-doc');
            // se obtienen las familias que tienen el set asignado
            $familias_set = SQLConnection::backendStoreProcedure('LN_set_docs_', array('SEARCH_FAM_SET', $set_doc));
            //
            return view('/configuracion-facones-informes/set-doc-acciones/confirmar-borrar-set-documentos',compact('set_doc','nombre_set','familias_set','cliente'));
        } else {
            return 0;
        }
    }

    // FUNCION QUE BORRAR EL SET DE DOCUMENTOS
    public static function borrarSetDocumentos(){
        if ( isset($_POST['set-doc']) && Misc::validacionesGenerica(Request::input('set-doc'),'numero') ){
            $set_doc = Request::input('set-doc');
            $nombre_set_doc = Request::input('nombre-set-doc');
            $userid = Session::get('usuario')->user_id;
            $id_plataforma = Session::get('webdata')['servicio_contratado'] ?? env('PLATAFORMA');
            $cliente = Request::input('cliente');
            //
            $temp = SQLConnection::backendStoreProcedure('LN_set_docs_', array('delete', $set_doc), 'selectOne');
            //
            SQLConnection::logTrazabilidad('Se elimino el set de documentos '.$nombre_set_doc,'DELETE_SET_DOC',Session::get('webdata')['id_menu_plataforma'],$userid,$id_plataforma,$cliente,null,null,$set_doc);
            //
            return redirect('/configuracion-facones-informes/sets-documentos-existentes');
        } else {
            return redirect('/configuracion-facones-informes/sets-documentos-existentes');
        }
    }

    /////////////////////////////////////
    // TIPOS DOC DEL SET DE DOCUMENTOS //
    /////////////////////////////////////

    // FUNCION QUE DEVUELVE LA VISTA DE CONFIGURACION DE LOS TIPOS DE DOCUMENTOS DEL SET
    public static function setTipoDocumentos(){
        if ( isset($_POST['set-doc']) && Misc::validacionesGenerica(Request::input('set-doc'),'numero') ){
            $set_doc = Request::input('set-doc');
            $tabla_tipos_doc = self::crearTablaDocs($set_doc); // VISTA DEL TIPO DE DOCUMENTO
            $ruta = '/configuracion-facones-informes/sets-documentos-existentes';
            $titulo_navbar = 'Tipos de documentos del DAGA';
            return view('/configuracion-facones-informes/set-tipo-doc-acciones/set-tipo-docs',compact('set_doc','tabla_tipos_doc','ruta','titulo_navbar'));
        } else {
            return redirect('/configuracion-facones-informes/sets-documentos-existentes');
        }
    }

    // FUNCION QUE DEVUELVE LA TABLA DE TIPO DE DOCUMENTOS PERO SIN DARLE LA POSIBILIDAD AL USUARIO DE EDITARLA
    public static function setTipoDocumentosVisualizar(){
        if ( isset($_POST['set-doc']) && Misc::validacionesGenerica(Request::input('set-doc'),'numero') ){
            $set_doc = Request::input('set-doc');
            return self::crearTablaDocs($set_doc,0,0,0);
        }
    }

    /**
     * FUNCION QUE DEVUELVE LA VISTA DE LOS TIPOS DOCS DE UN SET DE DOCUMENTOS
     * 
     * @param string|int cliente el id del cliente
     * @param int permite que se editen tipo docs del set
     * @param int permite que se borren tipo docs del set
     * @param int permite que se ordenen tipo docs del set
     * 
     * @return \Illuminate\View\View la vista con los documentos del set y sus acciones
     */
    protected static function crearTablaDocs($id,$edicion=1,$borrar=1,$ordenar=1){
        $set = SQLConnection::backendStoreProcedure('LN_set_docs_', array('select', $id), 'selectOne');
        $tipos = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('SEARCH', $id,NULL,Session::get('usuario')->user_id), 'select');
        return view('/configuracion-facones-informes/set-tipo-doc-acciones/ordenamiento-docs')->with(compact(['set', 'tipos','edicion','borrar','ordenar']));
    }

    // FUNCION QUE DEVUELVE EL CONTENIDO DEL MODAL DE EDICION DE TIPO DOC
    // PARMETROS DE REQUEST : 1.set-doc 2.tipo-doc
    public static function setTipoDocumentosEditar(){
        if ( isset($_POST['set-doc']) && isset($_POST['tipo-doc']) ){
            $id = Request::input('set-doc');
            $td = Request::input('tipo-doc');
            $nombre_set = Request::input('nombre-set-doc');
            $data = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('SELECT', $id, $td, Session::get('usuario')->user_id),'selectOne');
            return view('/configuracion-facones-informes/set-tipo-doc-acciones/editar-set-tipo-doc')->with(compact(['data','nombre_set']));
        } else {
            return 0;
        }
    }

    // FUNCION QUE GUARDA LA CONFIGURACION DEL TIPO DOC DEL SET DE DOCUMENTOS
    public static function setTipoDocumentoGuardar(){
        $set_doc = Request::input('set-doc');
        $td = Request::input('tipo-doc');
        $toler = Request::input('tolerancia-carga');
        $carga = Request::input('carga');
        $verifica = Request::input('verifica');
        $vb = ($verifica=='F') ? 1 : 0;
        $vc = ($verifica=='C') ? 1 : 0;
        $peso = ('' != Request::input('peso-score')) ? Request::input('peso-score') : NULL;
        $killer = (null != Request::input('killer')) ? 1 : 0;
        $act = (null != Request::input('activo')) ? 1 : 0;
        $userid = Session::get('usuario')->user_id;
        $id_plataforma = Session::get('webdata')['servicio_contratado'] ?? env('PLATAFORMA');
        $publicable = Request::input('publicable') ? 1 : 0;
        //
        $nombre_set = Request::input('nombre-set-doc');
        $nombre_tipo = Request::input('nombre-tipo-doc');
        //
        $temp = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('UPDATE', $set_doc, $td, $userid, $toler, $act, $peso, $killer, $vb, $vc, $publicable), 'selectOne');
        //
        SQLConnection::logTrazabilidad('Se actualizo la configuracion del documento '.$nombre_tipo.' del set de documentos '.$nombre_set,'SET_DOC','IV_BACK',$userid,$id_plataforma);
        //
        return json_encode( array('result' => '0') );
    }

    // FUNCION QUE DEVUELVE EL MODAL DE PARA CONFIRMAR LA ELIMINACION DE TIPO DOCS DEL SET
    // PARMETROS DE REQUEST : 1.set-doc 2.tipo-doc
    public static function setTipoDocumentoConfirm(){
        if ( isset($_POST['set-doc']) && isset($_POST['tipo-doc']) ){
            $id = Request::input('set-doc');
            $td = Request::input('tipo-doc');
            $nombre_set = Request::input('nombre-set-doc');
            $data = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('SELECT', $id, $td, Session::get('usuario')->user_id), 'selectOne');
            // se obtienen las familias que tienen el set asignado
            $familias_set = SQLConnection::backendStoreProcedure('LN_set_docs_', array('SEARCH_FAM_SET', $id));
            //
            return view('/configuracion-facones-informes/set-tipo-doc-acciones/delete-set-tipo-doc-confirm')->with(compact(['data','nombre_set','familias_set']));
        } else{
            return 0;
        }
	}

    // FUNCION QUE ELIMINA UN TIPO DOCS DEL SET
    public static function setTipoDocumentoDelete(){
        if ( isset($_POST['set-doc']) && isset($_POST['tipo-doc']) ){
            $id = Request::input('set-doc');
            $td = Request::input('tipo-doc');
            $nombre_set = Request::input('nombre-set-doc');
            $nombre_tipo = Request::input('nombre-tipo-doc');
            $id_plataforma = Session::get('webdata')['servicio_contratado'] ?? env('PLATAFORMA');
            //
            if ( is_numeric($id) && is_numeric($td) ){
                $temp = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('DELETE', $id, $td, Session::get('usuario')->user_id), 'selectOne');
                //
                SQLConnection::logTrazabilidad('Se elimino el documento '.$nombre_tipo.' del set de documentos '.$nombre_set,'SET_DOC','IV_BACK',Session::get('usuario')->user_id,$id_plataforma);
                return json_encode( array('result' => '0') );
            }
            return 0;
        } else{
            return 0;
        }
	}

    // FUNCION QUE DEVUELVE EL CONTENIDO DEL MODAL DE ALTA TIPO DOC DE SET DE DOCUMENTOS
    public static function setTipoDocumentosSearch(){
		$id = Request::input('set-doc');
		$set = SQLConnection::backendStoreProcedure('LN_set_docs_', array('select', $id), 'selectOne');
		$avail = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('available', $id,NULL,Session::get('usuario')->user_id), 'select');
		return view('/configuracion-facones-informes/set-tipo-doc-acciones/set-tipo-doc-search')->with(compact(['set', 'avail']));
	}

    // FUNCION QUE DEVUELVE EL CONTENIDO DEL MODAL DE ALTA TIPO DOC DE SET DE DOCUMENTOS
    public static function setTipoDocumentosAdd(){
        if ( isset($_POST['set-doc']) && isset($_POST['docs_elegidos']) && is_array($_POST['docs_elegidos']) && count($_POST['docs_elegidos']) > 0 ){
            $set_doc = Request::input('set-doc');
            $docs_elegidos = $_POST['docs_elegidos'];
            //
            return self::addTipoDocsToSet($set_doc,$docs_elegidos);
        } else {
            return 0;
        }
	}
    
    /**
     * FUNCION QUE DA DE ALTA TIPO DOCS EN ARRAY
     * 
     * @param string id del set
     * @param array lista de tipo docs a dar de alta
     * 
     * @return int
     */
    private static function addTipoDocsToSet($set_doc,$tipo_docs){
        foreach( $tipo_docs as $doc ){
            $tolerancia = Request::input('tolerancia_carga_'.$doc);
            $carga = Request::input('carga_'.$doc);
            $verifica = Request::input('verifica_'.$doc);
            $vb = ( $verifica == 'F' ) ? 1 : 0;
            $vc = ( $verifica == 'C' ) ? 1 : 0;
            $peso_score = (  empty(Request::input('peso_score_'.$doc)) ) ? NULL : Request::input('peso_score_'.$doc) ;
            $activo = ( Request::input('activo_'.$doc) !== NULL ) ? 1 : 0;
            $killer = ( Request::input('killer_'.$doc) !== NULL ) ? 1 : 0;
            $publicable = ( Request::input('publicable_'.$doc) !== NULL ? 1 : 0);
            $userid = Session::get('usuario')->user_id;
            //
            $temp = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('INSERT', $set_doc, $doc, $userid, $tolerancia, $activo, $peso_score, $killer, $vb, $vc, $publicable), 'selectOne');
        }
        return 1;
    }
    
    // FUNCION QUE MUEVE EL TIPO_DOC UN ORDEN ADELANTE EN EL SET DE DOCUMENTOS
    // PARAMETROS DE REQUEST : 1.set-doc 2.tipo-doc
    public static function setTipoDocumentoMoveUp() {
		$id = Request::input('set-doc');
		$td = Request::input('tipo-doc');
        $temp = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('up', $id, $td, Session::get('usuario')->user_id), 'selectOne');
        return self::crearTablaDocs($id,0,0,1);		
	}

    // FUNCION QUE MUEVE EL TIPO_DOC UN ORDEN ATRAS EN EL SET DE DOCUMENTOS
    // PARAMETROS DE REQUEST : 1.set-doc 2.tipo-doc
	public static function setTipoDocumentoMoveDown() {
		$id = Request::input('set-doc');
		$td = Request::input('tipo-doc');        
        $temp = SQLConnection::backendStoreProcedure('LN_set_tipo_doc_V2', array('down', $id, $td, Session::get('usuario')->user_id), 'selectOne');
        return self::crearTablaDocs($id,0,0,1);			
	}

    /**
     * Funcion que busca si existen set de documentos
     * por nombre
     * @access private
     * @param string el nombre del set de documentos
     * @return bool
     */
    private static function existeNombreSet($nombre_set){
        $valor = SQLConnection::backendStoreProcedure('LN_set_docs_',array('SEARCH_SET_NAME',NULL,$nombre_set),'selectOne');
        if ( intval($valor->computed) > 0 ){
            return true;
        } else {
            return false;
        }
    }

    public static function modalTrazabilidad(){
        $nombre_set_doc = Request::input('nombre-set-doc');
        $set_doc = Request::input('set-doc');
        // 
        $trazabilidad = SQLConnection::backendStoreProcedure('trazabilidad_configuracion',array('TRAZABILIDAD_BY_SETDOC',Session::get('webdata')['id_menu_plataforma'],$set_doc,null,null));               
        //
        //$trazabilidad = DB::select("SELECT TOP 50 * FROM trazabilidad WHERE id_plataforma='".Session::get('webdata')['id_menu_plataforma']."' and set_doc = $set_doc ORDER BY created DESC;");
        // 
        
        return view('/configuracion-facones-informes/set-doc-acciones/trazabilidad-set-documento')->with(compact('nombre_set_doc','trazabilidad'));
    }
   
}