From 152fe315f2a0b823feea3c4ba4c9f9081790f006 Mon Sep 17 00:00:00 2001 From: JpMaxMan Date: Thu, 2 Jul 2026 18:20:11 -0500 Subject: [PATCH 1/2] fix(registration): create badge from type on ticket data import The null check on badge_type was inverted, so badge creation for badge-less tickets bailed out exactly when a badge type was provided, and would fatal on buildBadgeFromType(null) otherwise. Co-Authored-By: Claude Fable 5 --- app/Services/Model/Imp/SummitOrderService.php | 2 +- tests/SummitOrderServiceTest.php | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/Services/Model/Imp/SummitOrderService.php b/app/Services/Model/Imp/SummitOrderService.php index 6b29c4b8c..b2776e8ec 100644 --- a/app/Services/Model/Imp/SummitOrderService.php +++ b/app/Services/Model/Imp/SummitOrderService.php @@ -4614,7 +4614,7 @@ public function processTicketData(int $summit_id, string $filename) if (!$ticket->hasBadge()) { // create it - if (!is_null($badge_type)) { + if (is_null($badge_type)) { Log::warning("SummitOrderService::processTicketData badge type is null stop current row processing."); return; } diff --git a/tests/SummitOrderServiceTest.php b/tests/SummitOrderServiceTest.php index 402c8a5fb..d51f085dc 100644 --- a/tests/SummitOrderServiceTest.php +++ b/tests/SummitOrderServiceTest.php @@ -678,4 +678,23 @@ public function testImportTicketDataBadgeFeaturesStillClearedAndReSet() $this->assertNotNull($answer); $this->assertEquals('Vegan', $answer->getValue()); } + + public function testImportTicketDataCreatesBadgeWhenTicketHasNone() + { + Queue::fake(); + + $ticket = $this->getUnassignedTicket(); + $this->assertFalse($ticket->hasBadge()); + + $csv_content = <<getNumber()},new.attendee@nowhere.com,New,Attendee,BADGE TYPE1 +CSV; + + $service = $this->buildTicketDataImportService($csv_content); + $service->processTicketData(self::$summit->getId(), 'tickets.csv'); + + $this->assertTrue($ticket->hasBadge()); + $this->assertEquals('BADGE TYPE1', $ticket->getBadge()->getType()->getName()); + } } From c1a769b8c7849b4d2046f9a3e12e67acbc29a06a Mon Sep 17 00:00:00 2001 From: JpMaxMan Date: Thu, 2 Jul 2026 21:11:01 -0500 Subject: [PATCH 2/2] test(registration): build a badge-less ticket for the badge-creation test Every fixture ticket type carries a badge type, so SummitTicketType::applyTo auto-creates a badge for every ticket at setTicketType time. Use a ticket type without a badge type to produce a genuinely badge-less ticket. Co-Authored-By: Claude Fable 5 --- tests/SummitOrderServiceTest.php | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/tests/SummitOrderServiceTest.php b/tests/SummitOrderServiceTest.php index d51f085dc..0aae939f5 100644 --- a/tests/SummitOrderServiceTest.php +++ b/tests/SummitOrderServiceTest.php @@ -683,7 +683,34 @@ public function testImportTicketDataCreatesBadgeWhenTicketHasNone() { Queue::fake(); - $ticket = $this->getUnassignedTicket(); + // every fixture ticket type carries a badge type, so SummitTicketType::applyTo + // auto-creates a badge at setTicketType time — build a ticket from a type with + // no badge type to get a genuinely badge-less ticket + $ticket_type = new SummitTicketType(); + $ticket_type->setName('NO BADGE TICKET TYPE'); + $ticket_type->setCost(100); + $ticket_type->setCurrency('USD'); + $ticket_type->setQuantity2Sell(10); + $ticket_type->setAudience(SummitTicketType::Audience_All); + self::$summit->addTicketType($ticket_type); + + $order = new SummitOrder(); + $order->setOwner(self::$defaultMember); + $order->setSummit(self::$summit); + self::$summit->addOrder($order); + + $ticket = new SummitAttendeeTicket(); + $ticket->setTicketType($ticket_type); + $ticket->activate(); + $order->addTicket($ticket); + $order->setPaid(); + $order->generateNumber(); + $ticket->generateNumber(); + $ticket->generateQRCode(); + + self::$em->persist(self::$summit); + self::$em->flush(); + $this->assertFalse($ticket->hasBadge()); $csv_content = <<