Skip to content

Commit 8cdce73

Browse files
JpMaxManclaude
andcommitted
fix(registration): normalize list answer ordering + guard import row on answer persistence
Per CodeRabbit review: sort list-question value ids so the same selection in a different order is not treated as a changed answer, and catch ValidationException from the extra-question persistence path so one bad payload cannot strand the remaining import rows. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 2b4196d commit 8cdce73

2 files changed

Lines changed: 30 additions & 6 deletions

File tree

app/Services/Model/Imp/SummitOrderService.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4677,7 +4677,6 @@ public function processTicketData(int $summit_id, string $filename)
46774677
* @param Summit $summit
46784678
* @param SummitAttendee $attendee
46794679
* @param array $row
4680-
* @throws ValidationException
46814680
*/
46824681
private function upsertAttendeeExtraQuestionAnswers(Summit $summit, SummitAttendee $attendee, array $row): void
46834682
{
@@ -4782,11 +4781,20 @@ private function upsertAttendeeExtraQuestionAnswers(Summit $summit, SummitAttend
47824781
);
47834782
continue;
47844783
}
4784+
sort($value_ids);
47854785
$value = implode(ExtraQuestionType::QuestionChoicesCharSeparator, $value_ids);
47864786
}
47874787

47884788
$former_answer = $attendee->getExtraQuestionAnswerByQuestion($question);
47894789
$former_value = is_null($former_answer) ? '' : $former_answer->getValue();
4790+
4791+
// list answers compare as sets: the same selection in a different order is not a change
4792+
if ($question->allowsValues() && !empty($former_value)) {
4793+
$former_value_ids = array_map('intval', explode(ExtraQuestionType::QuestionChoicesCharSeparator, $former_value));
4794+
sort($former_value_ids);
4795+
if ($former_value_ids === $value_ids) $value = $former_value;
4796+
}
4797+
47904798
if (!empty($former_value) && $former_value != $value && !$attendee->canChangeAnswerValue($question)) {
47914799
Log::warning
47924800
(
@@ -4838,7 +4846,21 @@ private function upsertAttendeeExtraQuestionAnswers(Summit $summit, SummitAttend
48384846
)
48394847
);
48404848

4841-
$attendee->hadCompletedExtraQuestions($extra_questions);
4849+
try {
4850+
$attendee->hadCompletedExtraQuestions($extra_questions);
4851+
} catch (ValidationException $ex) {
4852+
// never abort the import on a bad extra-question payload: the remaining
4853+
// rows must still be processed ( the queue job does not retry the file )
4854+
Log::warning
4855+
(
4856+
sprintf
4857+
(
4858+
"SummitOrderService::upsertAttendeeExtraQuestionAnswers attendee %s could not persist answers: %s",
4859+
$attendee->getEmail(),
4860+
$ex->getMessage()
4861+
)
4862+
);
4863+
}
48424864
}
48434865

48444866
/**

tests/SummitOrderServiceTest.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -609,9 +609,10 @@ public function testImportTicketDataListQuestionStoresValueIds()
609609

610610
$ticket = $this->getUnassignedTicket();
611611

612+
// reversed token order on purpose: stored value ids are normalized ( sorted )
612613
$csv_content = <<<CSV
613614
number,attendee_email,attendee_first_name,attendee_last_name,extra_question:T-Shirt Size
614-
{$ticket->getNumber()},new.attendee@nowhere.com,New,Attendee,Small|Large
615+
{$ticket->getNumber()},new.attendee@nowhere.com,New,Attendee,Large|Small
615616
CSV;
616617

617618
$service = $this->buildTicketDataImportService($csv_content);
@@ -624,11 +625,12 @@ public function testImportTicketDataListQuestionStoresValueIds()
624625
$answer = $attendee->getExtraQuestionAnswerByQuestion($question);
625626
$this->assertNotNull($answer);
626627

627-
$expected_value = implode(',', [
628+
$expected_value_ids = [
628629
$question->getValueByName('Small')->getId(),
629630
$question->getValueByName('Large')->getId(),
630-
]);
631-
$this->assertEquals($expected_value, $answer->getValue());
631+
];
632+
sort($expected_value_ids);
633+
$this->assertEquals(implode(',', $expected_value_ids), $answer->getValue());
632634
}
633635

634636
public function testImportTicketDataBadgeFeaturesStillClearedAndReSet()

0 commit comments

Comments
 (0)