getUser(); if (!($user instanceof User)) { return false; } $permission = ''; switch ($attribute) { case self::START: if (!$this->canStart($subject)) { return false; } $permission .= $attribute; break; case self::EDIT: if (!$this->canEdit($user, $subject)) { return false; } $permission .= $attribute; break; case self::DELETE: if (!$this->canDelete($user, $subject)) { return false; } $permission .= $attribute; break; case 'duplicate': $permission = self::EDIT; break; case self::VIEW_RATE: case self::EDIT_RATE: case self::STOP: case self::VIEW: case self::EXPORT: case self::EDIT_EXPORT: $permission .= $attribute; break; default: return false; } $permission .= '_'; // extend me for "team" support later on if ($subject->getUser()->getId() == $user->getId()) { $permission .= 'own'; } else { $permission .= 'other'; } $permission .= '_timesheet'; return $this->hasRolePermission($user, $permission); } protected function canStart(Timesheet $timesheet): bool { // possible improvements for the future: // we could check the amount of active entries (maybe slow) // if a teamlead starts an entry for another user, check that this user is part of his team (needs to be done for teams) if (null === $timesheet->getActivity()) { return false; } if (null === $timesheet->getProject()) { return false; } if (!$timesheet->getActivity()->isVisible() || !$timesheet->getProject()->isVisible()) { return false; } if (!$timesheet->getProject()->getCustomer()->isVisible()) { return false; } return true; } protected function canEdit(User $user, Timesheet $timesheet): bool { if ($timesheet->isExported() && !$this->hasRolePermission($user, 'edit_exported_timesheet')) { return false; } return true; } protected function canDelete(User $user, Timesheet $timesheet): bool { if ($timesheet->isExported() && !$this->hasRolePermission($user, 'edit_exported_timesheet')) { return false; } return true; } }