$this->assertAdministrativeAccess() || $this->assertTeamerAccess($disposition), static::DELETE => $this->assertAdminAccess(), static::FEEDBACK => $this->assertHouseManagerAccess($token, $disposition), default => false, }; } private function assertAdminAccess(): bool { return $this->security->isGranted('ROLE_ADMIN'); } private function assertAdministrativeAccess(): bool { return $this->security->isGranted('ROLE_ADMINISTRATIVE'); } private function assertHouseManagerAccess(TokenInterface $token, Disposition $disposition): bool { if (false === $this->security->isGranted('ROLE_HOUSE_MANAGER')) { return false; } $userHotelCode = $token->getUser()->getHotelCode(); $destination = $disposition ->getAssignment() ->getDestination() ; $isMatchingHotel = str_starts_with($destination->getHotelCode(), $userHotelCode) || str_ends_with($destination->getHotelCode(), $userHotelCode); $isPast = $destination->getDateTo() < new \DateTimeImmutable(); return $isMatchingHotel && $isPast; } private function assertTeamerAccess(Disposition $disposition): bool { if (false === $this->security->isGranted('ROLE_TEAMER')) { return false; } return $this->security->getUser()->getTeamer() === $disposition->getTeamer(); } }