getUser(); if (!($user instanceof User)) { return false; } if (!($subject instanceof Timesheet)) { return false; } $permission = ''; switch ($attribute) { case self::START: if (!$this->canStart($subject, $user, $token)) { return false; } $permission .= $attribute; break; case self::VIEW_RATE: case self::EDIT_RATE: case self::STOP: case self::EDIT: case self::DELETE: $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); } /** * @param Timesheet $timesheet * @param User $user * @param TokenInterface $token * @return bool */ protected function canStart(Timesheet $timesheet, User $user, TokenInterface $token) { // we could check the amount of active entries // if a teamlead starts an entry for another user, check that this user is part of his team if (!$timesheet->getActivity()->getVisible() || !$timesheet->getProject()->getVisible()) { return false; } if (!$timesheet->getProject()->getCustomer()->getVisible()) { return false; } return true; } }