<?php

/**
 * Descripción del Controlador UsuariosColaborador
 *
 * UsuariosColaborador
 *
 * 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    201712191136
 * @link       http://sicam.ccsm.org.co/docs/usuarios/UsuariosColaborador
 */
 
class UsuariosColaboradorControlador extends Controladores { 
    /**
     * Vista que se encarga de mostrar todos los detalles/datos asociados a 
     * los registros de UsuariosColaborador.
     * @return HTML Datos e información de UsuariosColaborador.
     */
    function verDetalles() {
        $usuario = Usuarios::colaborador($this->usuarioID);
        Vistas::mostrar('usuarios', 'usuarioscolaborador/ver-detalles', array('usuario' => $usuario));
    }
    /**
     * Vista que se encarga de organizar la forma de presentar 
     * los registros de UsuariosColaborador al usuario.
     * @return HTML Listado de UsuariosColaborador.
     */
    function mostrarTodos() {
        Vistas::mostrar('usuarios', 'usuarioscolaborador/lst-todos');
    }
    /**
     * Permite mostrar en forma de tabla los registros de UsuariosColaborador.  
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function tablaListado() {
        $UsuariosColaboradores = UsuariosColaborador::todos();
        Vistas::mostrar('usuarios', 'usuarioscolaborador/tbl-todos', 
            array( 'UsuariosColaboradores' => $UsuariosColaboradores)
        );
    }
    /**
     * Responde con el formulario de UsuariosColaborador vacio, solo datos necesarios.
     * LLama a la función que devuleve el formulario pero 
     * sin enviarle los datos de UsuariosColaborador.  
     * Esta función se crea para poder gestionar el permiso de NUEVO UsuariosColaborador
     * @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() {
        $usuarioNOMBRE = empty($this->usuarioNOMBRE) ? null : $this->usuarioNOMBRE;
        if(empty(Usuarios::datoPorNombre($usuarioNOMBRE))){
            $personaID = $this->datosGeneralesPersonas();
            if($personaID>0){
                $actualizar = $this->datosContactoPersonas();
                
                $personaIDENTIFICACION = empty($this->personaIDENTIFICACION) ? null : $this->personaIDENTIFICACION;
                $cargoID = empty($this->cargoID) ? null : $this->cargoID;
                $puestoTrabajoID = empty($this->puestoTrabajoID) ? null : $this->puestoTrabajoID;
                $tiposColaboradoresID = empty($this->tiposColaboradoresID) ? null : $this->tiposColaboradoresID;
                $colaboradorESTADO = empty($this->colaboradorESTADO) ? null : $this->colaboradorESTADO;
                
                $colaborador = Colaboradores::porCedula($personaIDENTIFICACION);
                $cargo = Cargos::datos($cargoID);
                if(!empty($colaborador)):
                    $colaboradorID = Colaboradores::porCedula($personaIDENTIFICACION)->colaboradorID;
                else:
                    $colaboradorID = Colaboradores::guardar($cargoID, $personaID,
                            $puestoTrabajoID, $tiposColaboradoresID,
                            $usuarioNOMBRE, $colaboradorESTADO, $cargo->cargoPERMISOS);
                endif;
                
                $this->cargarFoto($personaIDENTIFICACION ,$colaboradorID);
                
                $usuarioCLAVE = empty($this->usuarioCLAVE) ? null : $this->usuarioCLAVE;
                $usuariosESTADO = empty($this->usuariosESTADO) ? null : $this->usuariosESTADO;
                $usuarioADMINISTRADOR = empty($this->usuarioADMINISTRADOR) ? null : $this->usuarioADMINISTRADOR;
                $creadoID = UsuariosColaborador::guardar($colaboradorID, $usuarioNOMBRE, $usuarioCLAVE, $usuariosESTADO, $usuarioADMINISTRADOR);
                if ($creadoID) {
                    $operaciones = isset($this->operacionID) ? $this->operacionID : array();
                    $roles = isset( $this->rolID) ?  $this->rolID : array();
                    if($this->asignarPermiso($creadoID,  $operaciones)){
                        if($this->asignarRoles($creadoID,  $roles)){
                            return RespuestasSistema::exito("", UsuariosColaborador::datos($creadoID));    
                        }else{
                            return RespuestasSistema::fallo("Se creo el usuario pero hubo error al momento de asignar permiso, contacte con el Centro TICS.");
                        }
                    }else{
                        return RespuestasSistema::fallo("Se creo el usuario pero hubo error al momento de asignar permiso, contacte con el Centro TICS.");
                    }
                } else {
                    return RespuestasSistema::fallo("No se pudo CREAR el nuevo UsuariosColaborador. Si vuelve a suceder, contacte con el Centro TICS.");
                }    
            }else{
                return RespuestasSistema::error("No se pudo CREAR La Persona. Si vuelve a suceder, contacte con el Centro TICS.");
            }
        }
        else{
            return RespuestasSistema::error("El nombre de usuario ya se encuentra registrado");
        }
    }
    
    private function cargarFoto($personaIDENTIFICACION ,$colaboradorID){
        $urlMin = null;
        $carpetaFOTO = 'colaboradores/fotos/';
                
        if( !empty($this->colaboradorFOTO) ){
            $nombreArchivo = $personaIDENTIFICACION;
            $archivoMovido = Archivos::moverArchivoRecibido(
            $this->colaboradorFOTO, DIR_ARCHIVOS.$carpetaFOTO, $nombreArchivo );
            $urlMin = URL_ARCHIVOS.$carpetaFOTO.$nombreArchivo;
                        
            if(is_null($urlMin)) $urlMin = 'archivo/colaboradores/fotos/sin-foto.png';
            Colaboradores::actualizarFOTO($urlMin, $colaboradorID);

        }
                
    }
    
    private function datosGeneralesPersonas(){
        $tipoIdentificacionID = empty($this->tipoIdentificacionID) ? null : $this->tipoIdentificacionID;
        $personaIDENTIFICACION = empty($this->personaIDENTIFICACION) ? null : $this->personaIDENTIFICACION;

        $personaNOMBRES = empty($this->personaNOMBRES) ? null : $this->personaNOMBRES;
        $personaAPELLIDOS = empty($this->personaAPELLIDOS) ? null : $this->personaAPELLIDOS;
        $personaFCHNACIMIENTO = empty($this->personaFCHNACIMIENTO) ? null : $this->personaFCHNACIMIENTO;
        $personaSEXO = empty($this->personaSEXO) ? null : $this->personaSEXO;
        $personaNOMBRECOMPLETO = $personaNOMBRES . " " . $personaAPELLIDOS;
        return GestionPersonas::datosGenerales('1', $tipoIdentificacionID, $personaIDENTIFICACION, $personaNOMBRECOMPLETO, $personaNOMBRES, $personaAPELLIDOS, $personaFCHNACIMIENTO, $personaSEXO);
    }
    
    
    private function datosContactoPersonas(){
        $personaIDENTIFICACION = empty($this->personaIDENTIFICACION) ? null : $this->personaIDENTIFICACION;
        $telefonoNUMEROFIJO = empty($this->telefonoNUMEROFIJO) ? null : $this->telefonoNUMEROFIJO;
        $telefonoNUMEROCELULAR = empty($this->telefonoNUMEROCELULAR) ? null : $this->telefonoNUMEROCELULAR;
        $direccionNOMENCLATURA = empty($this->direccionNOMENCLATURA) ? null : $this->direccionNOMENCLATURA;
        $correoDIRECCION = empty($this->correoDIRECCION) ? null : $this->correoDIRECCION;
        $actualizacion = GestionPersonas::datosContacto($personaIDENTIFICACION, $telefonoNUMEROFIJO, $correoDIRECCION, null, $telefonoNUMEROCELULAR, $direccionNOMENCLATURA);
    }
    
    private function asignarPermiso($usuarioID, $operaciones){
        $operacionTotal = 0;
        if(!empty($operaciones)){
            foreach($operaciones as $operacion):
                $permiso = Usuarios::asignarPermiso($operacion, $usuarioID);
                if(!empty($permiso) and $permiso){
                    $operacionTotal++;
                }
            endforeach;   
            if($operacionTotal!=count($operaciones)){
                return false;
            }
        }
        return true;
    }
    
    private function asignarRoles($usuarioID, $roles){
        $operacionTotal = 0;
        if(!empty($roles)){
            foreach($roles as $rol):
                $permiso = Usuarios::asignarRol($rol, $usuarioID);
                if(!empty($permiso) and $permiso){
                    $operacionTotal++;
                }
            endforeach;   
            if($operacionTotal!=count($roles)){
                return false;
            }
        }
        return true;
    }
    /**
     * Recibe el ID del UsuariosColaborador 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 UsuariosColaborador
     * @return HTML Formulario con los datos del UsuariosColaborador a editar.
     */
    function mostrarFormularioEditar() {
        $UsuariosColaboradores = UsuariosColaborador::datos($this->UsuariosColaboradorID);
        $this->mostrarFormulario($UsuariosColaboradores);
    }
    /**
     * Función que toma los datos enviados y actualiza el registro
     * @return RespuestasSistema 
     */
    private function guardarCambios() {
        $UsuariosColaborador = UsuariosColaborador::datos($this->usuarioID);
        $usuarioNOMBRE = empty($this->usuarioNOMBRE) ? null : $this->usuarioNOMBRE;

        if(!empty(Usuarios::datoPorNombre($usuarioNOMBRE))){
            $actualizado = UsuariosColaborador::actualizar(
                    $this->usuarioID, $this->usuarioNOMBRE, 
                    $this->usuarioADMINISTRADOR
            );
        }
        
        $personaID = $this->datosGeneralesPersonas();
        $actualizar = $this->datosContactoPersonas();
        
        $cargoID = empty($this->cargoID) ? null : $this->cargoID;
        $puestoTrabajoID = empty($this->puestoTrabajoID) ? null : $this->puestoTrabajoID;
        $tiposColaboradoresID = empty($this->tiposColaboradoresID) ? null : $this->tiposColaboradoresID;
        $colaboradorESTADO = empty($this->colaboradorESTADO) ? null : $this->colaboradorESTADO;
        
        $personaIDENTIFICACION = empty($this->personaIDENTIFICACION) ? null : $this->personaIDENTIFICACION;
        $colaboradorID = Colaboradores::porCedula($personaIDENTIFICACION)->colaboradorID;

        Colaboradores::actualizar($colaboradorID, $cargoID, $puestoTrabajoID, $tiposColaboradoresID, $colaboradorESTADO);
        
        $this->cargarFoto($personaIDENTIFICACION ,$colaboradorID);
        
        if($this->usuarioCLAVE != $UsuariosColaborador->usuarioCLAVE):
            Usuarios::actualizarClave($this->usuarioCLAVE,$this->usuarioID);
        endif;

        if($this->usuariosESTADO == 'ACTIVO' and $UsuariosColaborador->usuarioESTADO != 'ACTIVO' ):
            Usuarios::activar($this->usuarioID);
        endif;

        if($this->usuariosESTADO == 'DESACTIVO' and $UsuariosColaborador->usuarioESTADO != 'DESACTIVO' ):
            Usuarios::desactivar($this->usuarioID);
        endif;
        
        $roles = isset( $this->rolID) ?  $this->rolID : array();
        $operaciones = isset($this->operacionID) ? $this->operacionID : array();
        
        $this->asignarPermiso($this->usuarioID,  $operaciones );
        $this->asignarRoles($this->usuarioID,  $roles );
        
        if(!empty($this->operacionesID)):
            $this->eliminarPermiso($UsuariosColaborador, $this->operacionesID);
        else:
            $this->eliminarPermiso($UsuariosColaborador);
        endif;
            
        if(!empty($this->rolesID)):
            $this->eliminarRol($UsuariosColaborador, $this->rolesID);
        else:
            $this->eliminarRol($UsuariosColaborador);
        endif;

        return RespuestasSistema::exito("", UsuariosColaborador::datos($this->usuarioID));
        
    }
    
    private function eliminarPermiso($UsuariosColaborador, $operaciones = array()){
        if(isset($UsuariosColaborador->permisos) and !empty($UsuariosColaborador->permisos)){
            foreach($UsuariosColaborador->permisos as $permiso):
                if(!in_array($permiso->operacionID, $operaciones)):
                    Usuarios::eliminarPermiso($permiso->operacionID, $UsuariosColaborador->usuarioID);
                endif;
            endforeach;    
        }
    }
    
    private function eliminarRol($UsuariosApi, $roles = array()){
        if(isset($UsuariosApi->roles) and !empty($UsuariosApi->roles)){
            foreach($UsuariosApi->roles as $rol):
                if(!in_array($rol->rolID, $roles)):
                    Usuarios::eliminarRol($rol->rolID, $UsuariosApi->usuarioID);
                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 UsuariosColaborador cuando se esta editando.
     * @return HTML Vista del Formulario de UsuariosColaborador
     */
    private function mostrarFormulario($UsuariosColaborador = null) {
        Vistas::mostrar('usuarios', 'usuarioscolaborador/form-UsuariosColaborador', array(
          'Operaciones'  => ControlOperaciones::todos(),
          'Roles'   => Roles::todos(),
          'Usuario' => $UsuariosColaborador
        ));
    }
    /**
     * 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->usuarioID)) {
            echo $this->guardarNuevo();
        } else {
            echo $this->guardarCambios();
        }
    }
    
}
// Generado el 2017-12-19 11:36:01:000000

