<?php

/**
 * Descripción del Controlador Roles
 *
 * Rol
 *
 * Licenciado bajo la Licencia Apache, Versión 2.0;
 * Usted no puede usar este archivo excepto en conformidad con la Licencia.
 * Usted puede obtener una copia de la Licencia en:
 *      http://www.php.net/license/3_01.txt. 
 * A menos que sea requerido por la ley aplicable o acordado por escrito, el software
 * Distribuido bajo la licencia se distribuye en una "AS IS" o  "COMO ESTA" BASE,
 * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, expresas o implícitas.
 * Consulte la Licencia para los permisos y Limitaciones bajo la Licencia.
 *
 * @package    Usuarios\Controladores
 * @author     LUIS ANTONIO MONTOYA CONTRERAS <lmontoya@ccsm.org.co>
 * @author     SICAM 20171025 <sicam32@ccsm.org.co>
 * @copyright  2017 Cámara de Comercio de Santa Marta para el Magdalena
 * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
 * @version    201712040605
 * @link       http://sicam.ccsm.org.co/docs/usuarios/Roles
 */
 
class RolesControlador extends Controladores { 
    /**
     * Vista que se encarga de mostrar todos los detalles/datos asociados a 
     * los registros de Roles.
     * @return HTML Datos e información de Roles.
     */
    function verDetalles() {
        $Rol = Roles::datos($this->rolID);
        Vistas::mostrar('usuarios', 'roles/ver-detalles', array('Rol' => $Rol));
    }
    /**
     * Vista que se encarga de organizar la forma de presentar 
     * los registros de Roles al usuario.
     * @return HTML Listado de Roles.
     */
    function mostrarTodos() {
        Vistas::mostrar('usuarios', 'roles/lst-todos');
    }
    /**
     * Permite mostrar en forma de tabla los registros de Roles.  
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function tablaListado() {
        $Roles = Roles::todos();
        Vistas::mostrar('usuarios', 'roles/tbl-todos', 
            array( 'Roles' => $Roles)
        );
    }
    /**
     * Permite mostrar en forma de tabla los registros de Roles.  
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function tablaPermisos() {
        $ControlOperaciones = null;
        if(!empty($this->rolID)){
            $ControlOperaciones = Roles::permisos($this->rolID);
        }
        Vistas::mostrar('administrador', 'controloperaciones/tbl-todos', 
            array( 'ControlOperaciones' => $ControlOperaciones)
        );
    }
    /**
     * Responde con el formulario de Roles vacio, solo datos necesarios.
     * LLama a la función que devuleve el formulario pero 
     * sin enviarle los datos de Roles.  
     * Esta función se crea para poder gestionar el permiso de NUEVO Roles
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function mostrarFormularioNuevo() {
        $this->mostrarFormulario();
    }
    /**
     * Función que toma los datos enviados y crea un nuevo registro
     * @return RespuestasSistema 
     */
    private function guardarNuevo() {
        $creadoID = Roles::guardar($this->rolCODIGO, $this->rolTITULO, 
                $this->rolDESCRIPCION);
        if ($creadoID) {
            if($this->asignarPermiso($creadoID)){
                return RespuestasSistema::exito("", Roles::datos($creadoID));    
            }else{
                return RespuestasSistema::fallo("Se creo el rol pero hubo error al momento de asignar permiso, contacte con el Centro TICS.");
            }
        } else {
            return RespuestasSistema::fallo("No se pudo CREAR el nuevo Rol. Si vuelve a suceder, contacte con el Centro TICS.");
        }
    }
    /**
     * Recibe el ID del Roles y obtiene sus datos para ser enviados 
     * al formulario, y asi cargar los datos en los inputs.
     * Esta función se crea para poder gestionar el permiso de EDITAR Roles
     * @return HTML Formulario con los datos del Roles a editar.
     */
    function mostrarFormularioEditar() {
        $Roles = Roles::datos($this->rolID);
        $this->mostrarFormulario($Roles);
    }
    /**
     * Función que toma los datos enviados y actualiza el registro
     * @return RespuestasSistema 
     */
    private function guardarCambios() {
        $Roles = Roles::datosCompletos($this->rolID);
        
        $actualizado = Roles::actualizar( 
                $this->rolID,
                $this->rolCODIGO, $this->rolTITULO, 
                $this->rolDESCRIPCION
            ); 
        if ($actualizado) {
            $this->asignarPermiso($this->rolID);
            if(!empty($this->operacionesID)):
                $this->eliminarPermiso($Roles, $this->operacionesID);
            else:
                $this->eliminarPermiso($Roles);
            endif;
            return RespuestasSistema::exito("", Roles::datos($this->rolID));
        }    else {
            return RespuestasSistema::fallo("No se actualizó el Roles. Verifique los datos, o contacte al Centro TICS.");
        }
    }
    
    private function asignarPermiso($rolID){
        $operacionTotal = 0;
        if(!empty($this->operacionID)){
            foreach($this->operacionID as $operacion):
                $permiso = Roles::asignarPermiso($operacion, $rolID);
                if(!empty($permiso) and $permiso){
                    $operacionTotal++;
                }
            endforeach;   
            if($operacionTotal!=count($this->operacionID)){
                return false;
            }
        }
        return true;
    }
    
    private function eliminarPermiso($Roles, $operaciones = array()){
        if(isset($Roles->permisos) and !empty($Roles->permisos)){
            foreach($Roles->permisos as $permiso):
                if(!in_array($permiso->operacionID, $operaciones)):
                    Roles::eliminarPermiso($permiso->operacionRolID);
                endif;
            endforeach;    
        }
    }
    
    /**
     * Muestra el Formulario procesado para ser mostrado al usuario.
     * Se le envian unos datos inciales para la carga de la vista, y
     * se envia los datos del Roles cuando se esta editando.
     * @return HTML Vista del Formulario de Roles
     */
    private function mostrarFormulario($Roles = null) {
        $operaciones = ControlOperaciones::todos();
        Vistas::mostrar('usuarios', 'roles/form-Roles', array(
          'operaciones' => $operaciones,
          'Roles' => $Roles
        ));
    }
    /**
     * Guardar Datos Recibidos, bien sea como un registro nuevo, o como una actualización.
     * Despues imprime las Respuesta del Sistema a la ejecución de la operacion
     */
    function guardarDatos() {
        if (empty($this->rolID)) {
            echo $this->guardarNuevo();
        } else {
            echo $this->guardarCambios();
        }
    }
    /**
     * Eliminar un registro de la base de datos.
     * Esta operación es irreversible.
     * Si se tiene la referencia integral activada, la base de datos no va 
     * dejar eliminar si tiene otros registros asociados.
     * @return RespuestasSistema Resultado de la Operacion que se envia al cliente
     */
    function eliminar() {
        $RolesParaEliminar = $this->checkRoles;
        if (count($RolesParaEliminar)) {
            $n = 0;
            foreach ($RolesParaEliminar as $rolELIMINAR):
                $Roles = Roles::datosCompletos($rolELIMINAR);
                $this->eliminarPermiso($Roles);
                if (Roles::eliminar($rolELIMINAR)) {
                    $n++;
                }
            endforeach;
            if ($n == 0) {
                echo RespuestasSistema::error('No fue posible ELIMINAR. Contacte al centro TICS.');
            } else if ($n == count($RolesParaEliminar)) {
                echo RespuestasSistema::exito('Se realizó la OPERACION [ELIMINAR] exitosamente!');
            } else {
                echo RespuestasSistema::error('Hubo un error al  [ELIMINAR] alguno de los registros. Verifica los datos, o contacta al centro TICS.');
            }
        } else {
            echo RespuestasSistema::error('No llegarón los datos para  [ELIMINAR]. Contacta al centro TICS');
        }
    }
    /**
     * Cambiar el estado de un registro de la base de datos.
     * Esta operacion cambia a estado ACTIVO el registro.     
     * @return RespuestasSistema Resultado de la Operacion
     */
    function reactivar() {
       $RolesParaActivar  = $this->rolSELECCIONADOS;
        if (count($RolesParaActivar)) {
            $n = 0;
            foreach ($RolesParaActivar as $rolACTIVAR):
                if (Roles::activar($rolACTIVAR)) {
                    $n++;
                }
            endforeach;
            if ($n == 0) {
                echo RespuestasSistema::error('No fue posible REACTIVAR. Contacte al centro TICS.');
            } else if ($n == count($RolesParaActivar)) {
                echo RespuestasSistema::exito('Se realizó la OPERACION [REACTIVAR] exitosamente!');
            } else {
                echo RespuestasSistema::error('Hubo un error al  [REACTIVAR] alguno de los registros. Verifica los datos, o contacta al centro TICS.');
            }
        } else {
            echo RespuestasSistema::error('No llegarón los datos para  [REACTIVAR]. Contacta al centro TICS');
        }
    }
    /**
     * Cambiar el estado de un registro de la base de datos.
     * Esta operacion cambia a estado DESACTIVO / SUSPENDIDO / CANCELADO el registro.     
     * @return RespuestasSistema Resultado de la Operacion
     */
    function desactivar() {
        $RolesParaDesactivar = $this->rolSELECCIONADOS;
        if (count($RolesParaDesactivar)) {
            $n = 0;
            foreach ($RolesParaDesactivar as $rolDESACTIVAR):
                if (Roles::desactivar($rolDESACTIVAR)) {
                    $n++;
                }
            endforeach;
            if ($n == 0) {
                echo RespuestasSistema::error('No fue posible DESACTIVAR. Contacte al centro TICS.');
            } else if ($n == count($RolesParaDesactivar)) {
                echo RespuestasSistema::exito('Se realizó la OPERACION [DESACTIVAR] exitosamente!');
            } else {
                echo RespuestasSistema::error('Hubo un error al  [DESACTIVAR] alguno de los registros. Verifica los datos, o contacta al centro TICS.');
            }
        } else {
            echo RespuestasSistema::error('No llegarón los datos para  [DESACTIVAR]. Contacta al centro TICS');
        }
    }
    
    
    function obtenerDatos(){
        $rol = Roles::datos($this->rolID);
        if(!empty($rol)):
            echo RespuestasSistema::exito('', $rol);
        else:
            echo RespuestasSistema::fallo('EL ROL NO EXITE EN EL SISTEMA');
        endif;
    }
}
// Generado el 2017-12-04 06:05:56:000000

