security = $security; $this->lockdownService = $lockdownService; } /** * @param TimesheetEntity $timesheet * @param Constraint $constraint */ public function validate($timesheet, Constraint $constraint) { if (!($constraint instanceof TimesheetLockdown)) { throw new UnexpectedTypeException($constraint, TimesheetLockdown::class); } if (!\is_object($timesheet) || !($timesheet instanceof TimesheetEntity)) { throw new UnexpectedTypeException($timesheet, TimesheetEntity::class); } if (!$this->lockdownService->isLockdownActive()) { return; } if (null === ($timesheetStart = $timesheet->getBegin())) { return; } // lockdown never takes effect for users with special permission if (null !== $this->security->getUser() && $this->security->isGranted('lockdown_override_timesheet')) { return; } $now = new \DateTime('now', $timesheetStart->getTimezone()); if (!empty($constraint->now)) { if ($constraint->now instanceof \DateTime) { $now = $constraint->now; } elseif (\is_string($constraint->now)) { try { $now = new \DateTime($constraint->now, $timesheetStart->getTimezone()); } catch (\Exception $ex) { } } } $allowEditInGracePeriod = false; if (null !== $this->security->getUser() && $this->security->isGranted('lockdown_grace_timesheet')) { $allowEditInGracePeriod = true; } if ($this->lockdownService->isEditable($timesheet, $now, $allowEditInGracePeriod)) { return; } // raise a violation for all entries before the start of lockdown period $this->context->buildViolation('This period is locked, please choose a later date.') ->atPath('begin') ->setTranslationDomain('validators') ->setCode(TimesheetLockdown::PERIOD_LOCKED) ->addViolation(); } }