diff --git a/migrations/Version20260630080409.php b/migrations/Version20260630080409.php new file mode 100644 index 00000000..abb0d127 --- /dev/null +++ b/migrations/Version20260630080409.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE accommodation_price ADD season VARCHAR(20) NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE accommodation_price DROP season'); + } +} diff --git a/src/Controller/Admin/Accommodation/CalendarController.php b/src/Controller/Admin/Accommodation/CalendarController.php new file mode 100644 index 00000000..a21edb7c --- /dev/null +++ b/src/Controller/Admin/Accommodation/CalendarController.php @@ -0,0 +1,23 @@ +render('admin/accommodation/_calendar_section.html.twig', [ + 'accommodation' => $accommodation, + 'startMonth' => $request->query->get('month'), + ]); + } +} diff --git a/src/Controller/Admin/Accommodation/CreateController.php b/src/Controller/Admin/Accommodation/CreateController.php new file mode 100644 index 00000000..ef66bfc5 --- /dev/null +++ b/src/Controller/Admin/Accommodation/CreateController.php @@ -0,0 +1,52 @@ +createForm(AccommodationType::class, $accommodation, ['hx_post' => $request->getRequestUri()]); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $this->entityManager->persist($accommodation); + $this->entityManager->flush(); + + $this->addFlash('success', 'Das Gruppenhaus wurde angelegt'); + + $this->logger->info('Created accommodation', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + ]); + + return new HxRedirectResponse($this->generateUrl('app_admin_accommodation')); + } + + return $this->render('admin/accommodation/modal_create.html.twig', [ + 'accommodation' => $accommodation, + 'form' => $form, + ]); + } +} diff --git a/src/Controller/Admin/Accommodation/DeleteController.php b/src/Controller/Admin/Accommodation/DeleteController.php new file mode 100644 index 00000000..e30d0200 --- /dev/null +++ b/src/Controller/Admin/Accommodation/DeleteController.php @@ -0,0 +1,45 @@ +isMethod(Request::METHOD_POST)) { + $this->entityManager->remove($accommodation); + $this->entityManager->flush(); + + $this->addFlash('success', 'Das Gruppenhaus wurde gelöscht'); + + $this->logger->info('Deleted accommodation', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + ]); + + return new HxRedirectResponse($this->generateUrl('app_admin_accommodation')); + } + + return $this->render('admin/accommodation/modal_delete.html.twig', [ + 'accommodation' => $accommodation, + ]); + } +} diff --git a/src/Controller/Admin/Accommodation/EditController.php b/src/Controller/Admin/Accommodation/EditController.php new file mode 100644 index 00000000..540f6fe5 --- /dev/null +++ b/src/Controller/Admin/Accommodation/EditController.php @@ -0,0 +1,59 @@ +getCode()) { + $cmsData = $this->cmsDataProvider->getHotelDetails($accommodation->getCode()); + } + + $form = $this->createForm(AccommodationType::class, $accommodation); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $this->entityManager->persist($accommodation); + $this->entityManager->flush(); + + $this->addFlash('success', 'Das Gruppenhaus wurde aktualisiert'); + + $this->logger->info('Updated accommodation', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + ]); + + return $this->redirectToRoute('app_admin_accommodation_edit', ['id' => $accommodation->getId()]); + } + + return $this->render('admin/accommodation/edit.html.twig', [ + 'accommodation' => $accommodation, + 'form' => $form, + 'cmsData' => $cmsData, + ]); + } +} diff --git a/src/Controller/Admin/Accommodation/IndexController.php b/src/Controller/Admin/Accommodation/IndexController.php new file mode 100644 index 00000000..e89d2983 --- /dev/null +++ b/src/Controller/Admin/Accommodation/IndexController.php @@ -0,0 +1,28 @@ +accommodationRepository->findBy([], ['code' => 'ASC']); + + return $this->render('admin/accommodation/index.html.twig', [ + 'accommodations' => $accommodations, + ]); + } +} diff --git a/src/Controller/Admin/AccommodationController.php b/src/Controller/Admin/AccommodationController.php deleted file mode 100644 index 85d75dac..00000000 --- a/src/Controller/Admin/AccommodationController.php +++ /dev/null @@ -1,131 +0,0 @@ -accommodationRepository->findBy([], ['code' => 'ASC']); - - return $this->render('admin/accommodation/index.html.twig', [ - 'accommodations' => $accommodations, - ]); - } - - #[Route('/admin/accommodation/create', name: 'app_admin_accommodation_create')] - public function create(Request $request): Response - { - $accommodation = new Accommodation(); - - $form = $this->createForm(AccommodationType::class, $accommodation, ['hx_post' => $request->getRequestUri()]); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $this->entityManager->persist($accommodation); - $this->entityManager->flush(); - - $this->addFlash('success', 'Das Gruppenhaus wurde angelegt'); - - $this->logger->info('Created accommodation', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - ]); - - return new HxRedirectResponse($this->generateUrl('app_admin_accommodation')); - } - - return $this->render('admin/accommodation/modal_create.html.twig', [ - 'accommodation' => $accommodation, - 'form' => $form, - ]); - } - - #[Route('/admin/accommodation/{id}/edit', name: 'app_admin_accommodation_edit')] - public function edit(Accommodation $accommodation, Request $request): Response - { - // fetch additional data from cms if available - $cmsData = []; - - if (null !== $accommodation->getCode()) { - $cmsData = $this->cmsDataProvider->getHotelDetails($accommodation->getCode()); - } - - $form = $this->createForm(AccommodationType::class, $accommodation); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $this->entityManager->persist($accommodation); - $this->entityManager->flush(); - - $this->addFlash('success', 'Das Gruppenhaus wurde aktualisiert'); - - $this->logger->info('Updated accommodation', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - ]); - - return $this->redirectToRoute('app_admin_accommodation_edit', ['id' => $accommodation->getId()]); - } - - return $this->render('admin/accommodation/edit.html.twig', [ - 'accommodation' => $accommodation, - 'form' => $form, - 'cmsData' => $cmsData, - ]); - } - - #[Route('/admin/accommodation/{id}/calendar', name: 'app_admin_accommodation_calendar', methods: ['GET'])] - public function calendar(Accommodation $accommodation, Request $request): Response - { - return $this->render('admin/accommodation/_calendar_section.html.twig', [ - 'accommodation' => $accommodation, - 'startMonth' => $request->query->get('month'), - ]); - } - - #[Route('/admin/accommodation/{id}/delete', name: 'app_admin_accommodation_delete')] - public function delete(Accommodation $accommodation, Request $request): Response - { - if (true === $request->isMethod(Request::METHOD_POST)) { - $this->entityManager->remove($accommodation); - $this->entityManager->flush(); - - $this->addFlash('success', 'Das Gruppenhaus wurde gelöscht'); - - $this->logger->info('Deleted accommodation', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - ]); - - return new HxRedirectResponse($this->generateUrl('app_admin_accommodation')); - } - - return $this->render('admin/accommodation/modal_delete.html.twig', [ - 'accommodation' => $accommodation, - ]); - } -} diff --git a/src/Controller/Admin/AccommodationPrice/CreateController.php b/src/Controller/Admin/AccommodationPrice/CreateController.php new file mode 100644 index 00000000..7568a1ba --- /dev/null +++ b/src/Controller/Admin/AccommodationPrice/CreateController.php @@ -0,0 +1,60 @@ +createForm(AccommodationPriceType::class, $accommodationPrice, ['currency' => $accommodation->getCurrency()]); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $accommodation->addAccommodationPrice($accommodationPrice); + + $this->entityManager->persist($accommodationPrice); + $this->entityManager->flush(); + + $this->addFlash('success', 'Der Preis wurde angelegt'); + + $this->logger->info('Created accommodation price', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + 'date_range' => [ + 'from' => $accommodationPrice->getDateFrom()->format('Y-m-d'), + 'to' => $accommodationPrice->getDateTo()->format('Y-m-d'), + ] + ]); + + return $this->redirectToRoute('app_admin_accommodation_edit', [ + 'id' => $accommodation->getId(), + ]); + } + + return $this->render('admin/accommodation_price/create.html.twig', [ + 'accommodation' => $accommodation, + 'form' => $form, + ]); + } +} diff --git a/src/Controller/Admin/AccommodationPrice/DeleteController.php b/src/Controller/Admin/AccommodationPrice/DeleteController.php new file mode 100644 index 00000000..707e4d13 --- /dev/null +++ b/src/Controller/Admin/AccommodationPrice/DeleteController.php @@ -0,0 +1,55 @@ +getAccommodation(); + + if (true === $request->isMethod(Request::METHOD_POST)) { + $this->entityManager->remove($accommodationPrice); + $this->entityManager->flush(); + + $this->addFlash('success', 'Der Preis wurde gelöscht'); + + $this->logger->info('Deleted accommodation price', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + 'date_range' => [ + 'from' => $accommodationPrice->getDateFrom()->format('Y-m-d'), + 'to' => $accommodationPrice->getDateTo()->format('Y-m-d'), + ] + ]); + + $returnUrl = $this->generateUrl('app_admin_accommodation_edit', [ + 'id' => $accommodation->getId(), + ]); + + return new HxRedirectResponse($returnUrl); + } + + return $this->render('admin/accommodation_price/modal_delete.html.twig', [ + 'accommodationPrice' => $accommodationPrice, + 'accommodation' => $accommodation, + ]); + } +} diff --git a/src/Controller/Admin/AccommodationPrice/EditController.php b/src/Controller/Admin/AccommodationPrice/EditController.php new file mode 100644 index 00000000..53f305b8 --- /dev/null +++ b/src/Controller/Admin/AccommodationPrice/EditController.php @@ -0,0 +1,68 @@ + false])] + #[Route('/admin/accommodation-price/{id}/duplicate', name: 'app_admin_accommodationprice_duplicate', defaults: ['duplicate' => true])] + public function index(AccommodationPrice $accommodationPrice, bool $duplicate, Request $request): Response + { + $accommodation = $accommodationPrice->getAccommodation(); + + if (true === $duplicate) { + $accommodationPrice = clone $accommodationPrice; + } + + $form = $this->createForm(AccommodationPriceType::class, $accommodationPrice, ['currency' => $accommodation->getCurrency()]); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + if (true === $duplicate) { + $accommodation->addAccommodationPrice($accommodationPrice); + } + + $this->entityManager->persist($accommodationPrice); + $this->entityManager->flush(); + + $this->addFlash('success', 'Der Preis wurde aktualisiert'); + + $this->logger->info('Edited accommodation price', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + 'date_range' => [ + 'from' => $accommodationPrice->getDateFrom()->format('Y-m-d'), + 'to' => $accommodationPrice->getDateTo()->format('Y-m-d'), + ] + ]); + + return $this->redirectToRoute('app_admin_accommodation_edit', [ + 'id' => $accommodation->getId(), + ]); + } + + return $this->render('admin/accommodation_price/edit.html.twig', [ + 'accommodation' => $accommodation, + 'accommodationPrice' => $accommodationPrice, + 'form' => $form, + 'duplicate' => $duplicate, + ]); + } +} diff --git a/src/Controller/Admin/AccommodationPriceController.php b/src/Controller/Admin/AccommodationPriceController.php deleted file mode 100644 index 53c7f84b..00000000 --- a/src/Controller/Admin/AccommodationPriceController.php +++ /dev/null @@ -1,145 +0,0 @@ -getForm($accommodationPrice, $accommodation); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $accommodation->addAccommodationPrice($accommodationPrice); - - $this->entityManager->persist($accommodationPrice); - $this->entityManager->flush(); - - $this->addFlash('success', 'Der Preis wurde angelegt'); - - $this->logger->info('Created accommodation price', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - 'date_range' => [ - 'from' => $accommodationPrice->getDateFrom()->format('Y-m-d'), - 'to' => $accommodationPrice->getDateTo()->format('Y-m-d'), - ] - ]); - - return $this->redirectToRoute('app_admin_accommodation_edit', [ - 'id' => $accommodation->getId(), - ]); - } - - return $this->render('admin/accommodation_price/create.html.twig', [ - 'accommodation' => $accommodation, - 'form' => $form, - ]); - } - - #[Route('/admin/accommodation-price/{id}/edit', name: 'app_admin_accommodationprice_edit', defaults: ['duplicate' => false])] - #[Route('/admin/accommodation-price/{id}/duplicate', name: 'app_admin_accommodationprice_duplicate', defaults: ['duplicate' => true])] - public function edit(AccommodationPrice $accommodationPrice, bool $duplicate, Request $request): Response - { - $accommodation = $accommodationPrice->getAccommodation(); - - if (true === $duplicate) { - $accommodationPrice = clone $accommodationPrice; - } - - $form = $this->getForm($accommodationPrice, $accommodation); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - if (true === $duplicate) { - $accommodation->addAccommodationPrice($accommodationPrice); - } - - $this->entityManager->persist($accommodationPrice); - $this->entityManager->flush(); - - $this->addFlash('success', 'Der Preis wurde aktualisiert'); - - $this->logger->info('Edited accommodation price', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - 'date_range' => [ - 'from' => $accommodationPrice->getDateFrom()->format('Y-m-d'), - 'to' => $accommodationPrice->getDateTo()->format('Y-m-d'), - ] - ]); - - return $this->redirectToRoute('app_admin_accommodation_edit', [ - 'id' => $accommodation->getId(), - ]); - } - - return $this->render('admin/accommodation_price/edit.html.twig', [ - 'accommodation' => $accommodation, - 'accommodationPrice' => $accommodationPrice, - 'form' => $form, - 'duplicate' => $duplicate, - ]); - } - - #[Route('/admin/accommodation-price/{id}/delete', name: 'app_admin_accommodationprice_delete')] - public function delete(AccommodationPrice $accommodationPrice, Request $request): Response - { - $accommodation = $accommodationPrice->getAccommodation(); - - if (true === $request->isMethod(Request::METHOD_POST)) { - $this->entityManager->remove($accommodationPrice); - $this->entityManager->flush(); - - $this->addFlash('success', 'Der Preis wurde gelöscht'); - - $this->logger->info('Deleted accommodation price', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - 'date_range' => [ - 'from' => $accommodationPrice->getDateFrom()->format('Y-m-d'), - 'to' => $accommodationPrice->getDateTo()->format('Y-m-d'), - ] - ]); - - $returnUrl = $this->generateUrl('app_admin_accommodation_edit', [ - 'id' => $accommodation->getId(), - ]); - - return new HxRedirectResponse($returnUrl); - } - - return $this->render('admin/accommodation_price/modal_delete.html.twig', [ - 'accommodationPrice' => $accommodationPrice, - 'accommodation' => $accommodation, - ]); - } - - private function getForm(AccommodationPrice $accommodationPrice, Accommodation $accommodation): FormInterface - { - return $this->createForm(AccommodationPriceType::class, $accommodationPrice, ['currency' => $accommodation->getCurrency()]); - } -} diff --git a/src/Controller/Admin/AdditionalService/CreateController.php b/src/Controller/Admin/AdditionalService/CreateController.php new file mode 100644 index 00000000..37c6f9c5 --- /dev/null +++ b/src/Controller/Admin/AdditionalService/CreateController.php @@ -0,0 +1,60 @@ +createForm(AdditionalServiceType::class, $additionalService, ['currency' => $accommodation->getCurrency()]); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $accommodation->addAdditionalService($additionalService); + + $this->entityManager->persist($additionalService); + $this->entityManager->flush(); + + $this->addFlash('success', 'Die Zusatzleistung wurde angelegt'); + + $this->logger->info('Created additional service', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + 'label' => $additionalService->getLabel(), + ]); + + return $this->redirectToRoute('app_admin_accommodation_edit', [ + 'id' => $accommodation->getId(), + ]); + } + + return $this->render('admin/additional_service/create.html.twig', [ + 'accommodation' => $accommodation, + 'form' => $form, + ]); + } +} diff --git a/src/Controller/Admin/AdditionalService/DeleteController.php b/src/Controller/Admin/AdditionalService/DeleteController.php new file mode 100644 index 00000000..84689656 --- /dev/null +++ b/src/Controller/Admin/AdditionalService/DeleteController.php @@ -0,0 +1,56 @@ +getAccommodation(); + + if (true === $request->isMethod(Request::METHOD_POST)) { + $this->entityManager->remove($additionalService); + $this->entityManager->flush(); + + $this->addFlash('success', 'Die Zusatzleistung wurde gelöscht'); + + $this->logger->info('Deleted additional service', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + 'label' => $additionalService->getLabel(), + ]); + + $returnUrl = $this->generateUrl('app_admin_accommodation_edit', [ + 'id' => $accommodation->getId(), + ]); + + return new HxRedirectResponse($returnUrl); + } + + return $this->render('admin/additional_service/modal_delete.html.twig', [ + 'additionalService' => $additionalService, + 'accommodation' => $accommodation, + ]); + } +} diff --git a/src/Controller/Admin/AdditionalService/EditController.php b/src/Controller/Admin/AdditionalService/EditController.php new file mode 100644 index 00000000..9f132560 --- /dev/null +++ b/src/Controller/Admin/AdditionalService/EditController.php @@ -0,0 +1,71 @@ + false])] + #[Route('/admin/additional-service/{id}/duplicate', name: 'app_admin_additionalservice_duplicate', defaults: ['duplicate' => true])] + public function index(AdditionalService $additionalService, bool $duplicate, Request $request): Response + { + $accommodation = $additionalService->getAccommodation(); + + if (true === $duplicate) { + $additionalService = clone $additionalService; + } + + $form = $this->createForm(AdditionalServiceType::class, $additionalService, ['currency' => $accommodation->getCurrency()]); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + if (true === $duplicate) { + $accommodation->addAdditionalService($additionalService); + } + + $this->entityManager->persist($additionalService); + $this->entityManager->flush(); + + $this->addFlash('success', 'Die Zusatzleistung wurde aktualisiert'); + + $this->logger->info('Edited additional service', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + 'label' => $additionalService->getLabel(), + ]); + + return $this->redirectToRoute('app_admin_accommodation_edit', [ + 'id' => $accommodation->getId(), + ]); + } + + return $this->render('admin/additional_service/edit.html.twig', [ + 'accommodation' => $accommodation, + 'additionalService' => $additionalService, + 'form' => $form, + 'duplicate' => $duplicate, + ]); + } +} diff --git a/src/Controller/Admin/AdditionalService/SortingController.php b/src/Controller/Admin/AdditionalService/SortingController.php new file mode 100644 index 00000000..0f7ce3e9 --- /dev/null +++ b/src/Controller/Admin/AdditionalService/SortingController.php @@ -0,0 +1,32 @@ +applySorting($accommodation->getAdditionalServices(), $request->request->all('sorting')); + + $this->entityManager->flush(); + + return new Response('', Response::HTTP_NO_CONTENT); + } +} diff --git a/src/Controller/Admin/AdditionalServiceController.php b/src/Controller/Admin/AdditionalServiceController.php deleted file mode 100644 index 07df6053..00000000 --- a/src/Controller/Admin/AdditionalServiceController.php +++ /dev/null @@ -1,148 +0,0 @@ -getForm($additionalService, $accommodation); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $accommodation->addAdditionalService($additionalService); - - $this->entityManager->persist($additionalService); - $this->entityManager->flush(); - - $this->addFlash('success', 'Die Zusatzleistung wurde angelegt'); - - $this->logger->info('Created additional service', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - 'label' => $additionalService->getLabel(), - ]); - - return $this->redirectToRoute('app_admin_accommodation_edit', [ - 'id' => $accommodation->getId(), - ]); - } - - return $this->render('admin/additional_service/create.html.twig', [ - 'accommodation' => $accommodation, - 'form' => $form, - ]); - } - - #[Route('/admin/additional-service/{id}/edit', name: 'app_admin_additionalservice_edit', defaults: ['duplicate' => false])] - #[Route('/admin/additional-service/{id}/duplicate', name: 'app_admin_additionalservice_duplicate', defaults: ['duplicate' => true])] - public function edit(AdditionalService $additionalService, bool $duplicate, Request $request): Response - { - $accommodation = $additionalService->getAccommodation(); - - if (true === $duplicate) { - $additionalService = clone $additionalService; - } - - $form = $this->getForm($additionalService, $accommodation); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - if (true === $duplicate) { - $accommodation->addAdditionalService($additionalService); - } - - $this->entityManager->persist($additionalService); - $this->entityManager->flush(); - - $this->addFlash('success', 'Die Zusatzleistung wurde aktualisiert'); - - $this->logger->info('Edited additional service', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - 'label' => $additionalService->getLabel(), - ]); - - return $this->redirectToRoute('app_admin_accommodation_edit', [ - 'id' => $accommodation->getId(), - ]); - } - - return $this->render('admin/additional_service/edit.html.twig', [ - 'accommodation' => $accommodation, - 'additionalService' => $additionalService, - 'form' => $form, - 'duplicate' => $duplicate, - ]); - } - - #[Route('/admin/additional-service/{id}/delete', name: 'app_admin_additionalservice_delete')] - public function delete(AdditionalService $additionalService, Request $request): Response - { - $accommodation = $additionalService->getAccommodation(); - - if (true === $request->isMethod(Request::METHOD_POST)) { - $this->entityManager->remove($additionalService); - $this->entityManager->flush(); - - $this->addFlash('success', 'Die Zusatzleistung wurde gelöscht'); - - $this->logger->info('Deleted additional service', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - 'label' => $additionalService->getLabel(), - ]); - - $returnUrl = $this->generateUrl('app_admin_accommodation_edit', [ - 'id' => $accommodation->getId(), - ]); - - return new HxRedirectResponse($returnUrl); - } - - return $this->render('admin/additional_service/modal_delete.html.twig', [ - 'additionalService' => $additionalService, - 'accommodation' => $accommodation, - ]); - } - - #[Route('/admin/additional-service/sort/{id}', name: 'app_admin_additionalservice_sort', methods: ['POST'])] - public function sort(Accommodation $accommodation, Request $request): Response - { - $this->applySorting($accommodation->getAdditionalServices(), $request->request->all('sorting')); - - $this->entityManager->flush(); - - return new Response('', Response::HTTP_NO_CONTENT); - } - - private function getForm(AdditionalService $additionalService, ?Accommodation $accommodation): FormInterface - { - return $this->createForm(AdditionalServiceType::class, $additionalService, ['currency' => $accommodation->getCurrency()]); - } -} diff --git a/src/Controller/Admin/BoardService/CreateController.php b/src/Controller/Admin/BoardService/CreateController.php new file mode 100644 index 00000000..94f815ae --- /dev/null +++ b/src/Controller/Admin/BoardService/CreateController.php @@ -0,0 +1,59 @@ +createForm(BoardServiceType::class, $boardService, ['currency' => $accommodation->getCurrency()]); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $accommodation->addBoardService($boardService); + + $this->entityManager->persist($boardService); + $this->entityManager->flush(); + + $this->addFlash('success', 'Die Verpflegungsleistung wurde angelegt'); + + $this->logger->info('Created board service', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + 'label' => $boardService->getLabel(), + ]); + + return $this->redirectToRoute('app_admin_accommodation_edit', [ + 'id' => $accommodation->getId(), + ]); + } + + return $this->render('admin/board_service/create.html.twig', [ + 'accommodation' => $accommodation, + 'form' => $form, + ]); + } +} diff --git a/src/Controller/Admin/BoardService/DeleteController.php b/src/Controller/Admin/BoardService/DeleteController.php new file mode 100644 index 00000000..02398521 --- /dev/null +++ b/src/Controller/Admin/BoardService/DeleteController.php @@ -0,0 +1,55 @@ +getAccommodation(); + + if (true === $request->isMethod(Request::METHOD_POST)) { + $this->entityManager->remove($boardService); + $this->entityManager->flush(); + + $this->addFlash('success', 'Die Verpflegungsleistung wurde gelöscht'); + + $this->logger->info('Deleted board service', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + 'label' => $boardService->getLabel(), + ]); + + $returnUrl = $this->generateUrl('app_admin_accommodation_edit', [ + 'id' => $accommodation->getId(), + ]); + + return new HxRedirectResponse($returnUrl); + } + + return $this->render('admin/board_service/modal_delete.html.twig', [ + 'boardService' => $boardService, + 'accommodation' => $accommodation, + ]); + } +} diff --git a/src/Controller/Admin/BoardService/EditController.php b/src/Controller/Admin/BoardService/EditController.php new file mode 100644 index 00000000..aeaa9a98 --- /dev/null +++ b/src/Controller/Admin/BoardService/EditController.php @@ -0,0 +1,67 @@ + false])] + #[Route('/admin/board-service/{id}/duplicate', name: 'app_admin_boardservice_duplicate', defaults: ['duplicate' => true])] + public function index(BoardService $boardService, bool $duplicate, Request $request): Response + { + $accommodation = $boardService->getAccommodation(); + + if (true === $duplicate) { + $boardService = clone $boardService; + } + + $form = $this->createForm(BoardServiceType::class, $boardService, ['currency' => $accommodation->getCurrency()]); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + if (true === $duplicate) { + $accommodation->addBoardService($boardService); + } + + $this->entityManager->persist($boardService); + $this->entityManager->flush(); + + $this->addFlash('success', 'Die Verpflegungsleistung wurde aktualisiert'); + + $this->logger->info('Edited board service', [ + 'name' => $accommodation->getName(), + 'code' => $accommodation->getCode(), + 'label' => $boardService->getLabel(), + ]); + + return $this->redirectToRoute('app_admin_accommodation_edit', [ + 'id' => $accommodation->getId(), + ]); + } + + return $this->render('admin/board_service/edit.html.twig', [ + 'accommodation' => $accommodation, + 'boardService' => $boardService, + 'form' => $form, + 'duplicate' => $duplicate, + ]); + } +} diff --git a/src/Controller/Admin/BoardService/SortingController.php b/src/Controller/Admin/BoardService/SortingController.php new file mode 100644 index 00000000..ef5fef3e --- /dev/null +++ b/src/Controller/Admin/BoardService/SortingController.php @@ -0,0 +1,32 @@ +applySorting($accommodation->getBoardServices(), $request->request->all('sorting')); + + $this->entityManager->flush(); + + return new Response('', Response::HTTP_NO_CONTENT); + } +} diff --git a/src/Controller/Admin/BoardServiceController.php b/src/Controller/Admin/BoardServiceController.php deleted file mode 100644 index 87e790ee..00000000 --- a/src/Controller/Admin/BoardServiceController.php +++ /dev/null @@ -1,147 +0,0 @@ -getForm($boardService, $accommodation); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $accommodation->addBoardService($boardService); - - $this->entityManager->persist($boardService); - $this->entityManager->flush(); - - $this->addFlash('success', 'Die Verpflegungsleistung wurde angelegt'); - - $this->logger->info('Created board service', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - 'label' => $boardService->getLabel(), - ]); - - return $this->redirectToRoute('app_admin_accommodation_edit', [ - 'id' => $accommodation->getId(), - ]); - } - - return $this->render('admin/board_service/create.html.twig', [ - 'accommodation' => $accommodation, - 'form' => $form, - ]); - } - - #[Route('/admin/board-service/{id}/edit', name: 'app_admin_boardservice_edit', defaults: ['duplicate' => false])] - #[Route('/admin/board-service/{id}/duplicate', name: 'app_admin_boardservice_duplicate', defaults: ['duplicate' => true])] - public function edit(BoardService $boardService, bool $duplicate, Request $request): Response - { - $accommodation = $boardService->getAccommodation(); - - if (true === $duplicate) { - $boardService = clone $boardService; - } - - $form = $this->getForm($boardService, $accommodation); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - if (true === $duplicate) { - $accommodation->addBoardService($boardService); - } - - $this->entityManager->persist($boardService); - $this->entityManager->flush(); - - $this->addFlash('success', 'Die Verpflegungsleistung wurde aktualisiert'); - - $this->logger->info('Edited board service', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - 'label' => $boardService->getLabel(), - ]); - - return $this->redirectToRoute('app_admin_accommodation_edit', [ - 'id' => $accommodation->getId(), - ]); - } - - return $this->render('admin/board_service/edit.html.twig', [ - 'accommodation' => $accommodation, - 'boardService' => $boardService, - 'form' => $form, - 'duplicate' => $duplicate, - ]); - } - - #[Route('/admin/board-service/{id}/delete', name: 'app_admin_boardservice_delete')] - public function delete(BoardService $boardService, Request $request): Response - { - $accommodation = $boardService->getAccommodation(); - - if (true === $request->isMethod(Request::METHOD_POST)) { - $this->entityManager->remove($boardService); - $this->entityManager->flush(); - - $this->addFlash('success', 'Die Verpflegungsleistung wurde gelöscht'); - - $this->logger->info('Deleted board service', [ - 'name' => $accommodation->getName(), - 'code' => $accommodation->getCode(), - 'label' => $boardService->getLabel(), - ]); - - $returnUrl = $this->generateUrl('app_admin_accommodation_edit', [ - 'id' => $accommodation->getId(), - ]); - - return new HxRedirectResponse($returnUrl); - } - - return $this->render('admin/board_service/modal_delete.html.twig', [ - 'boardService' => $boardService, - 'accommodation' => $accommodation, - ]); - } - - #[Route('/admin/board-service/sort/{id}', name: 'app_admin_boardservice_sort', methods: ['POST'])] - public function sort(Accommodation $accommodation, Request $request): Response - { - $this->applySorting($accommodation->getBoardServices(), $request->request->all('sorting')); - - $this->entityManager->flush(); - - return new Response('', Response::HTTP_NO_CONTENT); - } - - private function getForm(BoardService $boardService, ?Accommodation $accommodation): FormInterface - { - return $this->createForm(BoardServiceType::class, $boardService, ['currency' => $accommodation->getCurrency()]); - } -} diff --git a/src/Controller/Admin/BookingEditDraft/DeleteController.php b/src/Controller/Admin/BookingEditDraft/DeleteController.php new file mode 100644 index 00000000..84713618 --- /dev/null +++ b/src/Controller/Admin/BookingEditDraft/DeleteController.php @@ -0,0 +1,48 @@ +isMethod(Request::METHOD_POST)) { + $this->entityManager->remove($draft); + $this->entityManager->flush(); + + $this->adminLogger->info('Delete booking edit draft', [ + 'booking_number' => $draft->getBookingNumber(), + ]); + $this->addFlash('success', 'Der Buchungsentwurf wurde gelöscht'); + + $returnUrl = $this->getReturnUrl($request, 'app_admin_bookingeditdraft'); + + return new HxRedirectResponse($returnUrl); + } + + return $this->render('admin/booking_edit_draft/modal_delete.html.twig', [ + 'draft' => $draft, + ]); + } +} diff --git a/src/Controller/Admin/BookingEditDraft/ExportController.php b/src/Controller/Admin/BookingEditDraft/ExportController.php new file mode 100644 index 00000000..1dba9c5b --- /dev/null +++ b/src/Controller/Admin/BookingEditDraft/ExportController.php @@ -0,0 +1,39 @@ +hasExportData()) { + $this->addFlash('warning', 'Der Export ist fehlgeschlagen'); + + return $this->redirectToRoute('app_admin_bookingeditdraft'); + } + + try { + return $this->bookingExporter->createExportResponse($draft); + } catch (\RuntimeException $e) { + $this->addFlash('warning', 'Der Export ist fehlgeschlagen: '.$e->getMessage()); + + return $this->redirectToRoute('app_admin_bookingeditdraft'); + } + } +} diff --git a/src/Controller/Admin/BookingEditDraft/IndexController.php b/src/Controller/Admin/BookingEditDraft/IndexController.php new file mode 100644 index 00000000..50cb371a --- /dev/null +++ b/src/Controller/Admin/BookingEditDraft/IndexController.php @@ -0,0 +1,48 @@ +bookingEditDraftRepository + ->createQueryBuilder('booking_edit_draft') + ->leftJoin('booking_edit_draft.user', 'user') + ; + + $pagination = $this->paginator->paginate( + $qb, + $request->query->getInt('page', 1), + $request->query->getInt('limit', 20), + [ + 'defaultSortFieldName' => 'booking_edit_draft.createdAt', + 'defaultSortDirection' => 'DESC', + ] + ); + + return $this->render('admin/booking_edit_draft/index.html.twig', [ + 'pagination' => $pagination, + ]); + } +} diff --git a/src/Controller/Admin/BookingEditDraft/ShowController.php b/src/Controller/Admin/BookingEditDraft/ShowController.php new file mode 100644 index 00000000..8359ce86 --- /dev/null +++ b/src/Controller/Admin/BookingEditDraft/ShowController.php @@ -0,0 +1,28 @@ +getReturnUrl($request, 'app_admin_bookingeditdraft'); + + return $this->render('admin/booking_edit_draft/show.html.twig', [ + 'draft' => $draft, + 'returnUrl' => $returnUrl, + ]); + } +} diff --git a/src/Controller/Admin/BookingEditDraftController.php b/src/Controller/Admin/BookingEditDraftController.php deleted file mode 100644 index b9e63492..00000000 --- a/src/Controller/Admin/BookingEditDraftController.php +++ /dev/null @@ -1,107 +0,0 @@ -bookingEditDraftRepository - ->createQueryBuilder('booking_edit_draft') - ->leftJoin('booking_edit_draft.user', 'user') - ; - - $pagination = $this->paginator->paginate( - $qb, - $request->query->getInt('page', 1), - $request->query->getInt('limit', 20), - [ - 'defaultSortFieldName' => 'booking_edit_draft.createdAt', - 'defaultSortDirection' => 'DESC', - ] - ); - - return $this->render('admin/booking_edit_draft/index.html.twig', [ - 'pagination' => $pagination, - ]); - } - - #[Route('/admin/booking-edit-draft/{id}/show', name: 'app_admin_bookingeditdraft_show')] - public function show(BookingEditDraft $draft, Request $request): Response - { - $returnUrl = $this->getReturnUrl($request, 'app_admin_bookingeditdraft'); - - return $this->render('admin/booking_edit_draft/show.html.twig', [ - 'draft' => $draft, - 'returnUrl' => $returnUrl, - ]); - } - - #[Route('/admin/booking-edit-draft/{id}/delete', name: 'app_admin_bookingeditdraft_delete')] - public function delete(BookingEditDraft $draft, Request $request): Response - { - if (true === $request->isMethod(Request::METHOD_POST)) { - $this->entityManager->remove($draft); - $this->entityManager->flush(); - - $this->adminLogger->info('Delete booking edit draft', [ - 'booking_number' => $draft->getBookingNumber(), - ]); - $this->addFlash('success', 'Der Buchungsentwurf wurde gelöscht'); - - $returnUrl = $this->getReturnUrl($request, 'app_admin_bookingeditdraft'); - - return new HxRedirectResponse($returnUrl); - } - - return $this->render('admin/booking_edit_draft/modal_delete.html.twig', [ - 'draft' => $draft, - ]); - } - - #[Route('/admin/booking-edit-draft/{id}/export', name: 'app_admin_bookingeditdraft_export')] - public function export(BookingEditDraft $draft): Response - { - if (false === $draft->hasExportData()) { - $this->addFlash('warning', 'Der Export ist fehlgeschlagen'); - - return $this->redirectToRoute('app_admin_bookingeditdraft'); - } - - try { - return $this->bookingExporter->createExportResponse($draft); - } catch (\RuntimeException $e) { - $this->addFlash('warning', 'Der Export ist fehlgeschlagen: '.$e->getMessage()); - - return $this->redirectToRoute('app_admin_bookingeditdraft'); - } - } -} diff --git a/src/Controller/Admin/Log/DownloadController.php b/src/Controller/Admin/Log/DownloadController.php new file mode 100644 index 00000000..7d733132 --- /dev/null +++ b/src/Controller/Admin/Log/DownloadController.php @@ -0,0 +1,44 @@ + '.+'])] + public function index(string $filename): Response + { + try { + if (false === $this->xmlDumpReader->fileExists($filename)) { + throw $this->createNotFoundException('Dump file not found. It may have been cleaned up.'); + } + + $content = $this->xmlDumpReader->getContent($filename); + } catch (FilesystemException $e) { + throw $this->createNotFoundException('Failed to read dump file: '.$e->getMessage()); + } + + $response = new Response($content); + $response->headers->set('Content-Type', 'application/xml'); + + $disposition = $response->headers->makeDisposition( + ResponseHeaderBag::DISPOSITION_ATTACHMENT, + basename($filename) + ); + $response->headers->set('Content-Disposition', $disposition); + + return $response; + } +} diff --git a/src/Controller/Admin/Log/IndexController.php b/src/Controller/Admin/Log/IndexController.php new file mode 100644 index 00000000..b9122f7d --- /dev/null +++ b/src/Controller/Admin/Log/IndexController.php @@ -0,0 +1,44 @@ +logEntryRepository + ->createQueryBuilder('log_entry') + ; + + $pagination = $this->paginator->paginate( + $qb, + $request->query->getInt('page', 1), + $request->query->getInt('limit', 50), + [ + 'defaultSortFieldName' => 'log_entry.createdAt', + 'defaultSortDirection' => 'DESC', + ] + ); + + return $this->render('admin/log/index.html.twig', [ + 'pagination' => $pagination, + ]); + } +} diff --git a/src/Controller/Admin/Log/XmlDumpController.php b/src/Controller/Admin/Log/XmlDumpController.php new file mode 100644 index 00000000..397d32f3 --- /dev/null +++ b/src/Controller/Admin/Log/XmlDumpController.php @@ -0,0 +1,34 @@ +xmlDumpReader->findDumpsForRequestId($logEntry->getRequestId()); + } catch (FilesystemException) { + } + + return $this->render('admin/log/xml_dumps.html.twig', [ + 'logEntry' => $logEntry, + 'dumps' => $dumps, + ]); + } +} diff --git a/src/Controller/Admin/LogController.php b/src/Controller/Admin/LogController.php deleted file mode 100644 index 95bfe4d9..00000000 --- a/src/Controller/Admin/LogController.php +++ /dev/null @@ -1,90 +0,0 @@ -logEntryRepository - ->createQueryBuilder('log_entry') - ; - - $pagination = $this->paginator->paginate( - $qb, - $request->query->getInt('page', 1), - $request->query->getInt('limit', 50), - [ - 'defaultSortFieldName' => 'log_entry.createdAt', - 'defaultSortDirection' => 'DESC', - ] - ); - - return $this->render('admin/log/index.html.twig', [ - 'pagination' => $pagination, - ]); - } - - #[Route('/admin/log/{id}/xml-dumps', name: 'app_admin_log_xmldumps')] - public function xmlDumps(LogEntry $logEntry): Response - { - $dumps = []; - try { - $dumps = $this->xmlDumpReader->findDumpsForRequestId($logEntry->getRequestId()); - } catch (FilesystemException) { - } - - return $this->render('admin/log/xml_dumps.html.twig', [ - 'logEntry' => $logEntry, - 'dumps' => $dumps, - ]); - } - - #[Route('/admin/log/download/{filename}', name: 'app_admin_log_xmldump_download', requirements: ['filename' => '.+'])] - public function downloadXmlDump(string $filename): Response - { - try { - if (false === $this->xmlDumpReader->fileExists($filename)) { - throw $this->createNotFoundException('Dump file not found. It may have been cleaned up.'); - } - - $content = $this->xmlDumpReader->getContent($filename); - } catch (FilesystemException $e) { - throw $this->createNotFoundException('Failed to read dump file: '.$e->getMessage()); - } - - $response = new Response($content); - $response->headers->set('Content-Type', 'application/xml'); - - $disposition = $response->headers->makeDisposition( - ResponseHeaderBag::DISPOSITION_ATTACHMENT, - basename($filename) - ); - $response->headers->set('Content-Disposition', $disposition); - - return $response; - } -} diff --git a/src/Controller/Admin/UserController.php b/src/Controller/Admin/User/IndexController.php similarity index 92% rename from src/Controller/Admin/UserController.php rename to src/Controller/Admin/User/IndexController.php index 385a387c..868adad5 100644 --- a/src/Controller/Admin/UserController.php +++ b/src/Controller/Admin/User/IndexController.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace App\Controller\Admin; +namespace App\Controller\Admin\User; use App\Repository\UserRepository; use Knp\Component\Pager\PaginatorInterface; @@ -11,7 +11,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; -class UserController extends AbstractController +class IndexController extends AbstractController { public function __construct( private readonly UserRepository $userRepository, diff --git a/src/Controller/Admin/SortingControllerTrait.php b/src/Controller/Traits/SortingControllerTrait.php similarity index 92% rename from src/Controller/Admin/SortingControllerTrait.php rename to src/Controller/Traits/SortingControllerTrait.php index fdb6253e..69bbbf00 100644 --- a/src/Controller/Admin/SortingControllerTrait.php +++ b/src/Controller/Traits/SortingControllerTrait.php @@ -1,6 +1,6 @@ season; + } + + public function setSeason(?Season $season): self + { + $this->season = $season; + + return $this; + } + public function getIncludedPax(): ?int { return $this->includedPax; diff --git a/src/Enum/Groups/Season.php b/src/Enum/Groups/Season.php new file mode 100644 index 00000000..6c8613e0 --- /dev/null +++ b/src/Enum/Groups/Season.php @@ -0,0 +1,20 @@ +value.'.label'; + } + + public function token(): string + { + return 'enum.season.'.$this->value.'.token'; + } +} diff --git a/src/Form/Admin/Groups/AccommodationPriceType.php b/src/Form/Admin/Groups/AccommodationPriceType.php index 3b789b10..d75785be 100644 --- a/src/Form/Admin/Groups/AccommodationPriceType.php +++ b/src/Form/Admin/Groups/AccommodationPriceType.php @@ -5,9 +5,11 @@ declare(strict_types=1); namespace App\Form\Admin\Groups; use App\Entity\Groups\AccommodationPrice; +use App\Enum\Groups\Season; use App\Form\DatepickerType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; +use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\Extension\Core\Type\MoneyType; use Symfony\Component\Form\FormBuilderInterface; @@ -28,6 +30,11 @@ class AccommodationPriceType extends AbstractType 'html5' => true, 'widget' => 'single_text', ]) + ->add('season', EnumType::class, [ + 'label' => 'Saison', + 'class' => Season::class, + 'choice_label' => fn($item) => $item->token(), + ]) ->add('includedPax', IntegerType::class, [ 'label' => 'Inklusiv-Personen', ]) diff --git a/src/Form/Admin/Groups/AccommodationType.php b/src/Form/Admin/Groups/AccommodationType.php index 8e8e1233..3ea5747b 100644 --- a/src/Form/Admin/Groups/AccommodationType.php +++ b/src/Form/Admin/Groups/AccommodationType.php @@ -27,7 +27,7 @@ class AccommodationType extends AbstractType 'label' => 'Mindestbelegung Sommer', ]) ->add('maxAdolescentAge', IntegerType::class, [ - 'label' => 'Altersgrenze Jugendliche (6-X Jahre)', + 'label' => 'Altersgrenze Jugendliche R', ]) ->add('currency', ChoiceType::class, [ 'label' => 'Währung', diff --git a/templates/admin/accommodation/_form.html.twig b/templates/admin/accommodation/_form.html.twig index db7a8f24..e3e0e661 100644 --- a/templates/admin/accommodation/_form.html.twig +++ b/templates/admin/accommodation/_form.html.twig @@ -1,16 +1,31 @@ {% form_theme form 'forms_admin.html.twig' %} -