/** * Callback que se ejecuta antes de los métodos de todos los controladores */ protected final function initialize() { /** * Si el método de entrada es ajax, el tipo de respuesta es sólo la vista */ if (Input::isAjax()) { View::template(null); } /** * Verifico que haya iniciado sesión */ if (!MkcAuth::isLogged()) { //Verifico que no genere una redirección infinita if ($this->controller_name != 'login' && ($this->action_name != 'entrar' && $this->action_name != 'salir')) { MkcMessage::warning('No has iniciado sesión o ha caducado.'); //Verifico que no sea una ventana emergente if ($this->module_name == 'reporte') { View::error(); //TODO: crear el método error() } else { MkcRedirect::toLogin('sistema/login/entrar/'); } return false; } } else { if (MkcAuth::isLogged() && $this->controller_name != 'login') { $acl = new MkcAcl(); //Cargo los permisos y templates if (APP_UPDATE && Session::get('perfil_id') != Perfil::SUPER_USUARIO) { //Solo el super usuario puede hacer todo if ($this->module_name != 'dashboard' && $this->controller_name != 'index') { $msj = 'Estamos en labores de actualización y mantenimiento.'; $msj .= '<br />'; $msj .= 'El servicio se reanudará dentro de ' . APP_UPDATE_TIME; if (Input::isAjax()) { View::update(); } else { MkcMessage::info($msj); MkcRedirect::to("dashboard"); } return FALSE; } } if (!$acl->check(Session::get('perfil_id'))) { MkcMessage::error('Tu no posees privilegios para acceder a <b>' . Router::get('route') . '</b>'); Input::isAjax() ? View::ajax() : View::select(NULL); return false; } if (!defined('SKIN')) { define('SKIN', Session::get('tema')); } } } }
/** * Método para verificar si la llave es válida * * @param string $id * @param string $action * @param string $filter Filtro a aplicar al id devuelto * @return boolean */ public static function isValidKey($valueKey, $action = '', $filter = '', $popup = FALSE) { $key = explode('.', $valueKey); $id = $key[0]; $validKey = self::getKey($id, $action); $valid = $validKey === $valueKey ? TRUE : FALSE; if (!$valid) { MkcMessage::error('Acceso denegado. La llave de seguridad es incorrecta.'); if ($popup) { View::error(); } return FALSE; } return $filter ? Filter::get($id, $filter) : $id; }
/** * Método que muestra el reporte según el formato. Si es un formato desconocido muesra la página de error * * @param string $formato Formato a mostrar: html, pdf, xls, xml, ticket, etc * @return boolean */ public static function report($formato) { $formato = Filter::get($formato, 'string'); $template = $formato == 'html' ? 'backend/impress' : NULL; if ($formato == 'error') { self::error(); } else { if ($formato != 'html' && $formato != 'pdf' && $formato != 'xls' && $formato != 'xlsx' && $formato != 'doc' && $formato != 'docx' && $formato != 'csv' && $formato != 'xml' && $formato != 'ticket' or $formato == null) { MkcMessage::error('Error: ACCESO DENEGADO. El formato del reporte es incorrecto.'); self::error(); } else { self::response($formato, $template); } } }
/** * Callback que se ejecuta despues de insertar un usuario */ protected function after_create() { if (!EstadoUsuario::setEstadoUsuario('registrar', array('usuario_id' => $this->id, 'descripcion' => 'Activado por registro inicial'))) { MkcMessage::error('Se ha producido un error interno al activar el usuario. Pofavor intenta nuevamente.'); return 'cancel'; } }
/** * Método para paginar resultados utilizando el método find_all_by_sql de los modelos <br> * * Retorna un PageObject que tiene los siguientes atributos: <br> * next: numero de pagina siguiente, si no hay pagina siguiente entonces es false <br> * prev: numero de pagina anterior, si no hay pagina anterior entonces es false <br> * current: numero de pagina actual <br> * total: total de paginas que se pueden mostrar <br> * items: array de items de la pagina <br> * counter: Número que lleva el conteo de la página <br> * size: Total de registros <br> * per_page: cantidad de elementos por pagina <br> * * * @param string $model modelo * @param string $sql consulta sql * @return stdClass */ public static function paginate_by_sql($model, $sql) { $params = Util::getParams(func_get_args()); $page_number = isset($params['page']) ? Filter::get($params['page'], 'numeric') : 1; //Numero de la página $per_page = isset($params['per_page']) ? Filter::get($params['per_page'], 'numeric') : DATAGRID; //Datos por página $counter = $page_number > 1 ? $page_number * $per_page - ($per_page - 1) : 1; //Determino el contador para utilizarlo en la vista $start = $per_page * ($page_number - 1); //Determino el offset $page = new stdClass(); //Instancia del objeto contenedor de pagina $total_items = $model->count_by_sql("SELECT COUNT(*) FROM ({$sql}) AS t"); //Se cuentan los registros $page->items = $model->find_all_by_sql($model->limit($sql, "offset: {$start}", "limit: {$per_page}")); //Se efectua la búsqueda //Se efectuan los cálculos para las paginas $page->next = $start + $per_page < $total_items ? $page_number + 1 : false; $page->prev = $page_number > 1 ? $page_number - 1 : false; $page->current = $page_number; $page->total_page = ceil($total_items / $per_page); if ($page->total_page < $page_number && $total_items > 0) { $page->prev = false; $url = Router::get('route'); $url = explode('pag', $url); $url = trim($url[0], '/'); MkcMessage::error('La página solicitada no se encuentra en el paginador. <br />' . MkcHtml::link($url, 'Regresar a la página 1')); } $page->counter = $total_items >= $counter ? $counter : 1; $page->size = $total_items; $page->per_page = $per_page; return $page; }
/** * Método que verifica la conexión con la base de datos * @param type $data * @param type $source * @return boolean */ public static function testConnection($data, $source, $db = false) { //Filtro el array con los parámetros $data = Filter::data($data, array('host', 'username', 'password', 'name', 'type'), 'trim'); //Se utiliza por defecto el driver mysqli por ser orientado a objetos $data['type'] = 'mysqli'; $data['charset'] = 'UTF-8'; try { //Seteo las variables del core Config::set("databases.{$source}", $data); //Reviso la conexión, sino, genera la excepción @Db::factory($source, true); MkcMessage::valid("Conexión establecida en modo <b>{$source}!</b>"); } catch (KumbiaException $e) { MkcMessage::error("Error en modo '{$source}': <br /> " . $e->getMessage()); return false; } }
/** * Método para resetear las configuraciones del sistema * @return type */ public function reset() { try { if (Sistema::reset()) { MkcMessage::valid('El sistema se ha reseteado correctamente!'); } } catch (KumbiaException $e) { MkcMessage::error('Se ha producido un error al resetear la configuración del sistema.'); } return MkcRedirect::toAction('index'); }
/** * Método para restaurar el sistema * @param type $id */ public static function restoreBackup($id, $path = '') { $id = Filter::get($id, 'int'); if (empty($id)) { return FALSE; } $obj = new Backup(); if (!$obj->find_first($id)) { MkcMessage::get('id_no_found'); return FALSE; } if (empty($path)) { $path = APP_PATH . 'temp/backup/'; } $file = $path . $obj->archivo; if (!is_file($file)) { MkcMessage::error('Error: BKP-RES001. Se ha producido un error en la restauración del sistema. <br />No se pudo localizar el archivo de restaruación.'); return FALSE; } //Almaceno las copias de seguridad anteriores $old_backup = $obj->find('order: registrado_at ASC'); $system = $obj->_getSystem(TRUE); //Verifico el sistema operativo para la restauración $database = Config::get('config.application.database'); //tomo el entorno actual $config = $obj->_getConfig($database); //Tomo la configuración de conexión $exec = "gunzip < {$file} | {$system} -h " . $config['host'] . " -u " . $config['username'] . " --password="******" " . $config['name']; system($exec, $result); if (!$result) { //Inserto los backups anteriores foreach ($old_backup as $backup) { if ($backup->id >= $obj->id) { $obj->sql("REPLACE INTO `backup` (`id`,`usuario_id`,`denominacion`,`tamano`,`archivo`,`registrado_at`) VALUES ('{$backup->id}', '{$backup->usuario_id}', '{$backup->denominacion}', '{$backup->tamano}', '{$backup->archivo}', '{$backup->registrado_at}')"); } } if ($obj) { MkcAudit::debug("Se ha restaurado el sistema con la copia de seguridad: {$obj->denominacion}"); } return $obj ? $obj : FALSE; } return FALSE; }
/** * Método para eliminar */ public function eliminar($key) { if (!($id = MkcSecurity::isValidKey($key, 'eliminar_recurso', 'int'))) { return MkcRedirect::toAction('listar'); } $recurso = new Recurso(); if (!$recurso->find_first($id)) { MkcMessage::get('id_no_found'); return MkcRedirect::toAction('listar'); } try { if ($recurso->delete()) { MkcMessage::valid('El recurso se ha eliminado correctamente!'); } else { MkcMessage::warning('Lo sentimos, pero este recurso no se puede eliminar.'); } } catch (KumbiaException $e) { MkcMessage::error('Este recurso no se puede eliminar porque se encuentra relacionado con otro registro.'); } return MkcRedirect::toAction('listar'); }
/** * Método para optimizar tablas */ public function optimizar($key) { if (!($tabla = MkcSecurity::isValidKey($key, 'optimizar'))) { return MkcRedirect::toAction('index'); } try { $sistema = new Sistema(); if ($sistema->getOptimizacion($tabla)) { MkcMessage::valid("Se ha optimizado la tabla '{$tabla}' correctamente!"); } else { MkcMessage::error('Se ha presentado un error interno al optimizar la tabla. <br />Por favor intenta más tarde.'); } } catch (KumbiaException $e) { MkcMessage::error('Oops! hemos realizado algo mal. <br />Por favor intenta más tarde.'); } return MkcRedirect::toAction('index'); }
/** * Método que se ejecuta antes de guardar y/o modificar */ public function before_save() { $this->sucursal = Filter::get($this->sucursal, 'string'); $this->slug = MkcUtils::getSlug($this->sucursal); $this->direccion = Filter::get($this->direccion, 'string'); $this->telefono = Filter::get($this->telefono, 'numeric'); $this->celular = Filter::get($this->celular, 'numeric'); $this->fax = Filter::get($this->fax, 'numeric'); $conditions = "sucursal = '{$this->sucursal}' AND ciudad_id = {$this->ciudad_id} AND empresa_id = {$this->empresa_id}"; $conditions .= isset($this->id) ? " AND id != {$this->id}" : ''; if ($this->count("conditions: {$conditions}")) { MkcMessage::error('Lo sentimos, pero ya existe una sucursal registrada con el mismo nombre y ciudad.'); return 'cancel'; } }
/** * Método para restaurar */ public function restaurar($key = '') { if (!Input::isAjax()) { MkcMessage::error('Método incorrecto para restaurar el sistema.'); return MkcRedirect::toAction('listar'); } if (!($id = MkcSecurity::isValidKey($key, 'restaurar_backup', 'int'))) { return View::ajax(); } $pass = Input::post('password'); $usuario = Usuario::getUsuarioLogueado(); if ($usuario->password != md5(sha1($pass))) { MkcMessage::error('Acceso incorrecto al sistema. Tu no tienes los permisos necesarios para realizar esta acción.'); return View::ajax(); } if ($backup = Backup::restoreBackup($id)) { MkcMessage::valid('El sistema se ha restaurado satisfactoriamente con la copia de seguridad <b>' . $backup->archivo . '</b>'); } else { MkcMessage::error('Se ha producido un error interno al restaurar el sistema. Por favor contacta al administrador.'); } return View::ajax(); }
/** * Método para eliminar */ public function eliminar($key) { if (!($id = MkcSecurity::isValidKey($key, 'del_sucursal', 'int'))) { return MkcRedirect::toAction('listar'); } $sucursal = new Sucursal(); if (!$sucursal->getInformacionSucursal($id)) { MkcMessage::get('id_no_found'); return MkcRedirect::toAction('listar'); } try { if (Sucursal::setSucursal('delete', array('id' => $sucursal->id))) { MkcMessage::valid('La sucursal se ha eliminado correctamente!'); } } catch (KumbiaException $e) { MkcMessage::error('Esta sucursal no se puede eliminar porque se encuentra relacionada con otro registro.'); } return MkcRedirect::toAction('listar'); }