From e23a5097ef6589b23411d21fd51ab1dae9876a20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Tue, 30 Sep 2025 18:36:08 +0200 Subject: [PATCH] feat: additional attribute for synced with bpn status including filtering by closes #869anf53g --- assets/images/icons.svg | 3 ++ migrations/Version20250930161953.php | 31 +++++++++++++ .../BusProNetSyncToggleController.php | 43 +++++++++++++++++++ src/Entity/Disposition.php | 15 +++++++ src/Form/AssignmentFilterType.php | 4 ++ src/Model/AssignmentFilterDto.php | 13 ++++++ src/Repository/AssignmentRepository.php | 7 +++ .../Common/AssignmentFilterHandler.php | 4 ++ .../assignment/detail.html.twig | 3 ++ .../common/modal_assignment_filter.html.twig | 5 ++- 10 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 migrations/Version20250930161953.php create mode 100644 src/Controller/Administrative/Disposition/BusProNetSyncToggleController.php diff --git a/assets/images/icons.svg b/assets/images/icons.svg index 876253f..ea10bb7 100644 --- a/assets/images/icons.svg +++ b/assets/images/icons.svg @@ -141,6 +141,9 @@ + + + diff --git a/migrations/Version20250930161953.php b/migrations/Version20250930161953.php new file mode 100644 index 0000000..5609bf1 --- /dev/null +++ b/migrations/Version20250930161953.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE disposition ADD synced_with_bus_pro_net TINYINT(1) NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE disposition DROP synced_with_bus_pro_net'); + } +} diff --git a/src/Controller/Administrative/Disposition/BusProNetSyncToggleController.php b/src/Controller/Administrative/Disposition/BusProNetSyncToggleController.php new file mode 100644 index 0000000..f7e20cd --- /dev/null +++ b/src/Controller/Administrative/Disposition/BusProNetSyncToggleController.php @@ -0,0 +1,43 @@ +isSyncedWithBusProNet(); + $disposition->setSyncedWithBusProNet(!$isSynced); + + $this->entityManager->flush(); + + $this->addFlash('success', 'BusProNet Status aktualisiert'); + + $this->logger->info('Edit toggle BusProNet sync', [ + 'disposition' => $disposition->getUuid(), + 'synced' => $disposition->isSyncedWithBusProNet(), + ]); + + return new HxRedirectResponse($this->generateUrl('app_administrative_assignment_detail', [ + 'uuid' => $disposition->getAssignment()->getUuid(), + ])); + } +} diff --git a/src/Entity/Disposition.php b/src/Entity/Disposition.php index 389b505..0d30622 100644 --- a/src/Entity/Disposition.php +++ b/src/Entity/Disposition.php @@ -69,6 +69,9 @@ class Disposition implements BlameableEntityInterface, TimestampableEntityInterf #[ORM\Column(type: Types::TEXT, nullable: true)] private ?string $calledOffReason = null; + #[ORM\Column(type: Types::BOOLEAN)] + private bool $syncedWithBusProNet = false; + public function __construct(Application $application) { $this->uuid = Uuid::v4(); @@ -277,4 +280,16 @@ class Disposition implements BlameableEntityInterface, TimestampableEntityInterf return $this; } + + public function isSyncedWithBusProNet(): bool + { + return $this->syncedWithBusProNet; + } + + public function setSyncedWithBusProNet(bool $syncedWithBusProNet): static + { + $this->syncedWithBusProNet = $syncedWithBusProNet; + + return $this; + } } diff --git a/src/Form/AssignmentFilterType.php b/src/Form/AssignmentFilterType.php index a432340..945711f 100644 --- a/src/Form/AssignmentFilterType.php +++ b/src/Form/AssignmentFilterType.php @@ -63,6 +63,10 @@ class AssignmentFilterType extends AbstractType 'label' => 'vergangene Einsätze anzeigen', 'required' => false, ]) + ->add('syncedWithBusProNet', CheckboxType::class, [ + 'label' => 'in BusProNet hinterlegt', + 'required' => false, + ]) ->add('country', ChoiceType::class, [ 'label' => 'Land', 'required' => false, diff --git a/src/Model/AssignmentFilterDto.php b/src/Model/AssignmentFilterDto.php index 6bcc451..113e681 100644 --- a/src/Model/AssignmentFilterDto.php +++ b/src/Model/AssignmentFilterDto.php @@ -18,6 +18,7 @@ class AssignmentFilterDto extends AbstractFilterDto protected array $status = []; protected bool $includePast = false; protected ?string $country = null; + protected bool $syncedWithBusProNet = false; public function getId(): ?int { @@ -126,4 +127,16 @@ class AssignmentFilterDto extends AbstractFilterDto return $this; } + + public function isSyncedWithBusProNet(): bool + { + return $this->syncedWithBusProNet; + } + + public function setSyncedWithBusProNet(bool $syncedWithBusProNet): static + { + $this->syncedWithBusProNet = $syncedWithBusProNet; + + return $this; + } } diff --git a/src/Repository/AssignmentRepository.php b/src/Repository/AssignmentRepository.php index 09f914c..3047866 100644 --- a/src/Repository/AssignmentRepository.php +++ b/src/Repository/AssignmentRepository.php @@ -185,6 +185,13 @@ class AssignmentRepository extends ServiceEntityRepository ->setParameter('country', $country) ; } + + if (true === $filterDto->isSyncedWithBusProNet()) { + $qb + ->andWhere($qb->expr()->eq('disposition.syncedWithBusProNet', ':syncedWithBusProNet')) + ->setParameter('syncedWithBusProNet', true) + ; + } } public function getBookmarkQueryForTeamer(Teamer $teamer): Query diff --git a/src/Service/Common/AssignmentFilterHandler.php b/src/Service/Common/AssignmentFilterHandler.php index dfed6aa..5ae61f7 100644 --- a/src/Service/Common/AssignmentFilterHandler.php +++ b/src/Service/Common/AssignmentFilterHandler.php @@ -51,6 +51,9 @@ class AssignmentFilterHandler extends AbstractFilterHandler if (isset($data['country'])) { $filterDto->setCountry($data['country']); } + if (isset($data['synced_with_bus_pro_net'])) { + $filterDto->setSyncedWithBusProNet((bool) $data['synced_with_bus_pro_net']); + } return $filterDto; } @@ -70,6 +73,7 @@ class AssignmentFilterHandler extends AbstractFilterHandler 'status' => $filterDto->getStatus(), 'include_past' => $filterDto->isIncludePast(), 'country' => $filterDto->getCountry(), + 'synced_with_bus_pro_net' => $filterDto->isSyncedWithBusProNet(), ]); } } diff --git a/templates/administrative/assignment/detail.html.twig b/templates/administrative/assignment/detail.html.twig index 4723ca9..e98c835 100644 --- a/templates/administrative/assignment/detail.html.twig +++ b/templates/administrative/assignment/detail.html.twig @@ -192,6 +192,9 @@
+ {% if is_granted('CONTRACT_SUPPLEMENTARY', disposition) %}
{{ form_widget(filterForm.apply, { 'attr': { 'class': 'btn' } }) }}