From 9cc2e59b4517c50cfb9484096eeba0a15c50a23e Mon Sep 17 00:00:00 2001 From: central-worker-8 Date: Mon, 19 Oct 2026 05:16:23 -0700 Subject: [PATCH] #4781: the bulk merged-repair is on the record too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MergedTicketRepair::repairAll() re-marks tickets as merged (permanently read-only) per model instead of with one builder update, so each frozen ticket gets its own Changes-log entry — the same as the per-ticket button. Co-Authored-By: Claude Opus 5.5 --- src/Support/MergedTicketRepair.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Support/MergedTicketRepair.php b/src/Support/MergedTicketRepair.php index 8621f33..d669fee 100644 --- a/src/Support/MergedTicketRepair.php +++ b/src/Support/MergedTicketRepair.php @@ -84,17 +84,22 @@ class MergedTicketRepair */ public static function repairAll(string $by): int { - $numbers = Ticket::query()->inconsistentlyMerged()->pluck('number')->all(); + $tickets = Ticket::query()->inconsistentlyMerged()->orderBy('id')->get(); - if ($numbers === []) { + if ($tickets->isEmpty()) { Log::info("[ticketing] #938 merged-ticket repair ({$by}): nothing to repair."); return 0; } - $changed = Ticket::query()->inconsistentlyMerged()->update([ - 'status' => Ticket::STATUS_MERGED, - ]); + // Per model, not one builder update (#4781/#4807): `merged` makes a ticket + // permanently read-only, and a bulk statement would freeze it with nothing + // on the Changes log — while repair() below, the same change one ticket at + // a time, is recorded. + $tickets->each(fn (Ticket $ticket) => $ticket->forceFill(['status' => Ticket::STATUS_MERGED])->save()); + + $numbers = $tickets->pluck('number')->all(); + $changed = $tickets->count(); // The numbers, not just the count. These rows are being made read-only, // and "which ones" is the question the office will ask afterwards.