From 709b0ff61e684b4dfecc7368701b149152f9f51f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Thu, 19 Feb 2026 17:54:08 +0100 Subject: [PATCH] fix: ensure drop-offs are submitted when same as pickups --- .../ParticipantDropOffFieldHandler.php | 11 ++-- .../ParticipantDropOffFieldHandlerTest.php | 61 +++++++++++++++++-- 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/src/Form/Service/ParticipantDropOffFieldHandler.php b/src/Form/Service/ParticipantDropOffFieldHandler.php index 8251cdf..6e9e818 100644 --- a/src/Form/Service/ParticipantDropOffFieldHandler.php +++ b/src/Form/Service/ParticipantDropOffFieldHandler.php @@ -13,7 +13,7 @@ use App\Form\Service\Abstract\AbstractParticipantFieldHandler; * * Drop-off behavior depends on the transportation combination: * - BUS+BUS: drop-off is gated behind a "differentDropOff" checkbox. - * When unchecked, BusProNet defaults to the same location as the pickup. + * When unchecked, the system assigns the same location as the pickup. * - PKW+BUS: drop-off is shown directly (no pickup field, no checkbox needed). * - BUS+PKW / PKW+PKW: no drop-off applicable, fields are cleared. */ @@ -54,14 +54,15 @@ class ParticipantDropOffFieldHandler extends AbstractParticipantFieldHandler return; } - if ($hasOutboundBus) { + if (true === $hasOutboundBus) { // BUS+BUS: gated by differentDropOff checkbox - $checkboxValue = $this->getFieldValue($submittedData, 'differentDropOff'); - $isChecked = true === $checkboxValue || '1' === $checkboxValue || 1 === $checkboxValue; + $isChecked = $this->normalizeCheckboxValue($this->getFieldValue($submittedData, 'differentDropOff')); if (false === $isChecked) { - $participant->dropOff = null; $participant->differentDropOff = false; + $participant->dropOff = null !== $participant->pickup + ? ($bookingDto->travel->dropOffs[$participant->pickup->id] ?? null) + : null; return; } diff --git a/tests/Form/Service/ParticipantDropOffFieldHandlerTest.php b/tests/Form/Service/ParticipantDropOffFieldHandlerTest.php index a944932..b36f483 100644 --- a/tests/Form/Service/ParticipantDropOffFieldHandlerTest.php +++ b/tests/Form/Service/ParticipantDropOffFieldHandlerTest.php @@ -74,7 +74,36 @@ class ParticipantDropOffFieldHandlerTest extends TestCase $this->assertTrue($participant->differentDropOff); } - public function testBusBusCheckboxUncheckedClearsDropOff(): void + public function testBusBusCheckboxUncheckedAssignsMatchingDropOff(): void + { + $dropOff = $this->createDropOff(10, 'Berlin Hbf'); + $pickup = new Pickup(); + $pickup->id = 10; + $pickup->city = 'Berlin Hbf'; + + $bookingDto = $this->createBookingDto( + DirectionMapper::SUBTYPE_BUS_API, + DirectionMapper::SUBTYPE_BUS_API, + [$dropOff] + ); + + $participant = $bookingDto->getParticipant(0); + $participant->pickup = $pickup; + $participant->differentDropOff = true; + + $submittedData = [ + 'differentDropOff' => false, + 'dropOff' => '10', + ]; + + $this->handler->processField($submittedData, $bookingDto, 0); + + $this->assertNotNull($participant->dropOff); + $this->assertSame(10, $participant->dropOff->id); + $this->assertFalse($participant->differentDropOff); + } + + public function testBusBusCheckboxUncheckedNoPickupKeepsDropOffNull(): void { $dropOff = $this->createDropOff(10, 'Berlin Hbf'); $bookingDto = $this->createBookingDto( @@ -84,12 +113,36 @@ class ParticipantDropOffFieldHandlerTest extends TestCase ); $participant = $bookingDto->getParticipant(0); - $participant->dropOff = $dropOff; - $participant->differentDropOff = true; + $participant->pickup = null; + + $submittedData = [ + 'differentDropOff' => false, + ]; + + $this->handler->processField($submittedData, $bookingDto, 0); + + $this->assertNull($participant->dropOff); + $this->assertFalse($participant->differentDropOff); + } + + public function testBusBusCheckboxUncheckedPickupWithNoMatchingDropOff(): void + { + $dropOff = $this->createDropOff(10, 'Berlin Hbf'); + $pickup = new Pickup(); + $pickup->id = 99; + $pickup->city = 'Unknown'; + + $bookingDto = $this->createBookingDto( + DirectionMapper::SUBTYPE_BUS_API, + DirectionMapper::SUBTYPE_BUS_API, + [$dropOff] + ); + + $participant = $bookingDto->getParticipant(0); + $participant->pickup = $pickup; $submittedData = [ 'differentDropOff' => false, - 'dropOff' => '10', ]; $this->handler->processField($submittedData, $bookingDto, 0);