Files
icehrm/core/src/Model/BaseModel.php

366 lines
8.6 KiB
PHP

<?php
namespace Model;
use Classes\BaseService;
use Classes\IceResponse;
use Classes\ModuleAccess;
use Classes\ModuleAccessService;
use Modules\Common\Model\Module;
use Users\Common\Model\UserRole;
use Utils\LogManager;
class BaseModel extends \ADOdb_Active_Record
{
public $objectName = null;
protected $allowCustomFields = false;
public $keysToIgnore = array(
"_table",
"_dbat",
"_tableat",
"_where",
"_saved",
"_lasterr",
"_original",
"foreignName",
"a",
"t"
);
public function getAdminAccess()
{
return array("get","element","save","delete");
}
public function getMatchingUserRoles($userRoles)
{
if (empty($userRoles)) {
return false;
}
$userRoles = json_decode($userRoles, true);
if (empty($userRoles)) {
return false;
}
$moduleAccessData = $this->getModuleAccess();
if (empty($moduleAccessData)) {
return false;
}
$modules = [];
/** @var ModuleAccess $moduleAccess */
foreach ($moduleAccessData as $moduleAccess) {
$modules[] = ModuleAccessService::getInstance()->getModule(
$moduleAccess->getName(),
$moduleAccess->getGroup()
);
}
if (empty($modules)) {
return false;
}
foreach ($modules as $module) {
if (empty($module->user_roles) || $module->user_roles == '[]') {
continue;
}
$matchingUserRoles = array_intersect($userRoles, json_decode($module->user_roles, true));
if (count($matchingUserRoles) > 0) {
return $matchingUserRoles;
}
}
return false;
}
public function getRoleBasedAccess($userLevel, $userRoles)
{
$permissionMethod = "get".str_replace(' ', '', $userLevel)."Access";
$allowedAccessMatrix = $this->$permissionMethod();
$userRoles = $this->getMatchingUserRoles($userRoles);
if ($userRoles === false) {
return $allowedAccessMatrix === null ? $this->getDefaultAccessLevel() : $allowedAccessMatrix;
}
$permissions = $allowedAccessMatrix === null ? $this->getDefaultAccessLevel() : $allowedAccessMatrix;
;
foreach ($userRoles as $role) {
$userRole = new UserRole();
$userRole->Load('id = ?', [$role]);
try {
$userRolePermissions = json_decode($userRole->additional_permissions);
foreach ($userRolePermissions as $tablePermissions) {
if ($tablePermissions->table === $this->table) {
$permissions = array_unique(
array_merge(
$permissions,
json_decode($tablePermissions->permissions, true)
)
);
}
}
} catch (\Exception $e) {
}
}
return $permissions;
}
public function getRestrictedAdminAccess()
{
return $this->getAdminAccess();
}
public function getRestrictedManagerAccess()
{
return $this->getManagerAccess();
}
public function getRestrictedEmployeeAccess()
{
return $this->getEmployeeAccess();
}
public function getManagerAccess()
{
return array("get","element");
}
public function getUserAccess()
{
return array("get","element");
}
public function getEmployeeAccess()
{
return $this->getUserAccess();
}
public function getAnonymousAccess()
{
return array();
}
public function getUserOnlyMeAccess()
{
return array("get","element");
}
public function getUserOnlyMeSwitchedAccess()
{
return $this->getUserOnlyMeAccess();
}
public function getUserOnlyMeAccessField()
{
return "employee";
}
public function getUserOnlyMeAccessRequestField()
{
return "employee";
}
public function getModuleAccess()
{
return [];
}
public function validateSave($obj)
{
return new IceResponse(IceResponse::SUCCESS, "");
}
public function executePreSaveActions($obj)
{
return new IceResponse(IceResponse::SUCCESS, $obj);
}
public function executePreUpdateActions($obj)
{
return new IceResponse(IceResponse::SUCCESS, $obj);
}
public function executePreDeleteActions($obj)
{
return new IceResponse(IceResponse::SUCCESS, null);
}
public function executePostSaveActions($obj)
{
}
public function executePostUpdateActions($obj)
{
}
public function executePostDeleteActions($obj)
{
}
/**
* If null is returned the object wont be included in the response
*
* @param $obj
* @return mixed
*/
public function postProcessGetData($obj)
{
return $obj;
}
public function postProcessGetElement($obj)
{
return $obj;
}
public function getDefaultAccessLevel()
{
return $this->getAnonymousAccess();
}
public function getVirtualFields()
{
return array(
);
}
public function allowIndirectMapping()
{
return false;
}
public function getDisplayName()
{
return $this->getEntity();
}
public function fieldValueMethods()
{
return [];
}
public function validateCSRF()
{
return false;
}
public function getObjectKeys()
{
$keys = array();
foreach ($this as $k => $v) {
if (in_array($k, $this->keysToIgnore)) {
continue;
}
if (is_array($v) || is_object($v)) {
continue;
}
$keys[$k] = $k;
}
return $keys;
}
public function getCustomFields($obj)
{
$keys = array();
$objKeys = $this->getObjectKeys();
foreach ($obj as $k => $v) {
if (isset($objKeys[$k])) {
continue;
}
if (is_array($v) || is_object($v)) {
continue;
}
if (in_array($k, $this->keysToIgnore)) {
continue;
}
$keys[$k] = $v;
}
return $keys;
}
// @codingStandardsIgnoreStart
public function Find($whereOrderBy, $bindarr = false, $cache = false, $pkeysArr = false, $extra = array())
{
if ($cache && BaseService::getInstance()->queryCacheEnabled()) {
$data = BaseService::getInstance()->getCacheService()->getDBQuery($this->getEntity(),$whereOrderBy, $bindarr);
if ($data !== null) {
return $data;
}
}
$data = parent::Find($whereOrderBy, $bindarr, $pkeysArr, $extra);
if (empty($data)) {
return $data;
}
if ($cache && BaseService::getInstance()->queryCacheEnabled()) {
BaseService::getInstance()->getCacheService()->setDBQuery($this->getEntity(),$whereOrderBy, $bindarr, $data);
}
return $data;
}
protected function getEntity()
{
$data = explode('\\', get_called_class());
return end($data);
}
public function Save()
{
$ok = parent::Save();
if (!$ok) {
$message = sprintf('%s: (%s) %s', 'Error saving :', $this->ErrorMsg(), json_encode($this));
LogManager::getInstance()->error($message);
LogManager::getInstance()->notifyException(new \Exception($message));
}
if (BaseService::getInstance()->queryCacheEnabled()) {
BaseService::getInstance()->getCacheService()->deleteByEntity($this->getEntity());
}
return $ok;
}
public function Delete()
{
$ok = parent::Delete();
if (!$ok) {
$message = sprintf('%s: (%s) %s', 'Error deleting', $this->ErrorMsg(), json_encode($this));
LogManager::getInstance()->error($message);
LogManager::getInstance()->notifyException(new \Exception($message));
}
if (BaseService::getInstance()->queryCacheEnabled()) {
BaseService::getInstance()->getCacheService()->deleteByEntity($this->getEntity());
}
return $ok;
}
// @codingStandardsIgnoreEnd
public function getObjectName()
{
return null;
}
public function isCustomFieldsEnabled()
{
return false;
}
}