1<?php
2
3/**
4 * OrangeHRM is a comprehensive Human Resource Management (HRM) System that captures
5 * all the essential functionalities required for any enterprise.
6 * Copyright (C) 2006 OrangeHRM Inc., http://www.orangehrm.com
7 *
8 * OrangeHRM is free software; you can redistribute it and/or modify it under the terms of
9 * the GNU General Public License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * OrangeHRM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along with this program;
17 * if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA  02110-1301, USA
19 */
20
21/**
22 * Description of UserRoleInterface
23 *
24 * @author Chameera Senarathna
25 */
26abstract class AbstractUserRole {
27
28    protected $employeeService;
29    protected $systemUserService;
30    protected $operationalCountryService;
31    protected $locationService;
32    protected $projectService;
33    protected $vacancyService;
34
35    protected $userRoleManager;
36
37    protected $employeeNumber;
38
39    protected $roleName;
40
41    public function __construct($roleName, $userRoleManager) {
42        $this->userRoleManager = $userRoleManager;
43        $this->roleName = $roleName;
44    }
45
46    public function getEmployeeNumber() {
47        if(empty($this->employeeNumber)) {
48            $this->employeeNumber = sfContext::getInstance()->getUser()->getEmployeeNumber();
49        }
50        return $this->employeeNumber;
51    }
52
53    public function setEmployeeNumber($employeeNumber) {
54        $this->employeeNumber = $employeeNumber;
55    }
56
57    public function getSystemUserService() {
58        if (empty($this->systemUserService)) {
59            $this->systemUserService = new SystemUserService();
60        }
61        return $this->systemUserService;
62    }
63
64    public function setSystemUserService($systemUserService) {
65        $this->systemUserService = $systemUserService;
66    }
67
68    public function getEmployeeService() {
69
70        if (empty($this->employeeService)) {
71            $this->employeeService = new EmployeeService();
72        }
73        return $this->employeeService;
74    }
75
76    public function setEmployeeService($employeeService) {
77        $this->employeeService = $employeeService;
78    }
79
80    public function getLocationService() {
81        if (empty($this->locationService)) {
82            $this->locationService = new LocationService();
83        }
84        return $this->locationService;
85    }
86
87    public function setLocationService($locationService) {
88        $this->locationService = $locationService;
89    }
90
91    public function getOperationalCountryService() {
92        if (empty($this->operationalCountryService)) {
93            $this->operationalCountryService = new OperationalCountryService();
94        }
95        return $this->operationalCountryService;
96    }
97
98    public function setOperationalCountryService($operationalCountryService) {
99        $this->operationalCountryService = $operationalCountryService;
100    }
101
102    /**
103     * Get the Project Data Access Object
104     * @return ProjectService
105     */
106    public function getProjectService() {
107        if (is_null($this->projectService)) {
108            $this->projectService = new ProjectService();
109        }
110        return $this->projectService;
111    }
112
113    /**
114     * Set Project Service Access Object
115     * @param ProjectService $projectService
116     * @return void
117     */
118    public function setProjectService(ProjectService $projectService) {
119        $this->projectService = $projectService;
120    }
121
122    /**
123     * Get VacancyService
124     * @return VacancyService
125     */
126    public function getVacancyService() {
127        if (is_null($this->vacancyService)) {
128            $this->vacancyService = new VacancyService();
129        }
130        return $this->vacancyService;
131    }
132
133    /**
134     * Set Vacancy Service
135     * @param VacancyService $vacancyService
136     */
137    public function setVacancyService(VacancyService $vacancyService) {
138        $this->vacancyService = $vacancyService;
139    }
140
141
142    public function getAccessibleEntities($entityType, $operation = null, $returnType = null, $requiredPermissions = array()) {
143
144        $permitted = $this->areRequiredPermissionsAvailable($requiredPermissions);
145
146        if ($permitted) {
147            switch ($entityType) {
148                case 'Employee':
149                    $entities = $this->getAccessibleEmployees($operation, $returnType, $requiredPermissions);
150                    break;
151                case 'Project':
152                    $entities = $this->getAccessibleProjects($operation, $returnType, $requiredPermissions);
153                    break;
154                case 'Vacancy':
155                    $entities = $this->getAccessibleVacancies($operation, $returnType, $requiredPermissions);
156                    break;
157
158            }
159        } else {
160            $entities = array();
161        }
162        return $entities;
163    }
164
165    public function getAccessibleEntityProperties($entityType, $properties = array(), $orderField = null, $orderBy = null, $requiredPermissions = array()) {
166
167        $permitted = $this->areRequiredPermissionsAvailable($requiredPermissions);
168        if ($permitted) {
169            switch ($entityType) {
170                case 'Employee':
171                    $propertyList = $this->getAccessibleEmployeePropertyList($properties, $orderField, $orderBy, $requiredPermissions);
172                    break;
173            }
174        } else {
175            $propertyList = array();
176        }
177        return $propertyList;
178    }
179
180    public function getAccessibleEntityIds($entityType, $operation = null, $returnType = null, $requiredPermissions = array()) {
181
182        $permitted = $this->areRequiredPermissionsAvailable($requiredPermissions);
183        if ($permitted) {
184            switch ($entityType) {
185                case 'Employee':
186                    $ids = $this->getAccessibleEmployeeIds($operation, $returnType, $requiredPermissions);
187                    break;
188                case 'SystemUser':
189                    $ids = $this->getAccessibleSystemUserIds($operation, $returnType, $requiredPermissions);
190                    break;
191                case 'OperationalCountry':
192                    $ids = $this->getAccessibleOperationalCountryIds($operation, $returnType, $requiredPermissions);
193                    break;
194                case 'UserRole':
195                    $ids = $this->getAccessibleUserRoleIds($operation, $returnType, $requiredPermissions);
196                    break;
197                case 'Location':
198                    $ids = $this->getAccessibleLocationIds($operation, $returnType, $requiredPermissions);
199                    break;
200                case 'Project':
201                    $ids = $this->getAccessibleProjectIds($operation, $returnType, $requiredPermissions);
202                    break;
203                case 'Vacancy':
204                    $ids = $this->getAccessibleVacancyIds($operation, $returnType, $requiredPermissions);
205                    break;
206            }
207        } else {
208            $ids = array();
209        }
210        return $ids;
211    }
212
213    public function getEmployeesWithRole($entities = array()) {
214        return array();
215    }
216
217    public function getAccessibleProjects($operation = null, $returnType = null, $requiredPermissions = array()) {
218        return array();
219    }
220
221    public function getAccessibleProjectIds($operation = null, $returnType = null, $requiredPermissions = array()) {
222        return array();
223    }
224
225    public function getAccessibleVacancies($operation = null, $returnType = null, $requiredPermissions = array()) {
226        return array();
227    }
228
229    public function getAccessibleVacancyIds($operation = null, $returnType = null, $requiredPermissions = array()) {
230        return array();
231    }
232
233    public abstract function getAccessibleEmployees($operation = null, $returnType = null, $requiredPermissions = array());
234
235    public abstract function getAccessibleEmployeePropertyList($properties, $orderField, $orderBy, $requiredPermissions = array());
236
237    public abstract function getAccessibleEmployeeIds($operation = null, $returnType = null, $requiredPermissions = array());
238
239    public abstract function getAccessibleSystemUserIds($operation = null, $returnType = null, $requiredPermissions = array());
240
241    public abstract function getAccessibleOperationalCountryIds($operation = null, $returnType = null, $requiredPermissions = array());
242
243    public abstract function getAccessibleUserRoleIds($operation = null, $returnType = null, $requiredPermissions = array());
244
245    public abstract function getAccessibleLocationIds($operation = null, $returnType = null, $requiredPermissions = array());
246
247    protected function areRequiredPermissionsAvailable($requiredPermissions = array()) {
248        $permitted = true;
249
250        foreach ($requiredPermissions as $permissionType => $permissions) {
251            if ($permissionType == BasicUserRoleManager::PERMISSION_TYPE_DATA_GROUP) {
252                foreach ($permissions as $dataGroupName => $requestedResourcePermission) {
253                    $dataGroupPermissions = $this->userRoleManager->getDataGroupPermissions($dataGroupName, array(), array($this->roleName));
254
255                    if ($permitted && $requestedResourcePermission->canRead()) {
256                        $permitted = $permitted && $dataGroupPermissions->canRead();
257                    }
258
259                    if ($permitted && $requestedResourcePermission->canCreate()) {
260                        $permitted = $dataGroupPermissions->canCreate();
261                    }
262
263                    if ($permitted && $requestedResourcePermission->canUpdate()) {
264                        $permitted = $dataGroupPermissions->canUpdate();
265                    }
266
267                    if ($permitted && $requestedResourcePermission->canDelete()) {
268                        $permitted = $dataGroupPermissions->canDelete();
269                    }
270                }
271            } else if ($permissionType == BasicUserRoleManager::PERMISSION_TYPE_ACTION) {
272                $permitted = true;
273            }
274        }
275
276        return $permitted;
277    }
278
279}