From f484167b5162c6fb8ec77a01127ea2b80db0dc95 Mon Sep 17 00:00:00 2001 From: Vasyka Date: Sun, 26 Jul 2026 11:39:34 +0000 Subject: [PATCH] fix(migration): case-insensitive dedupe on units backfill + use insertOrIgnore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MariaDB default collation is case-insensitive on VARCHAR unique indexes, so 'L' and 'l' clash on units_company_id_code_unique. When a tenant had 'L' in parts.unit (uppercase) and the migration seeds 'l' (lowercase), the extras loop tried to re-insert 'L' and errored out — blocking all subsequent migrations (including the new injector_protocols tables). Fix: lowercase the comparison + switch the extras insert to insertOrIgnore so a residual race is a no-op. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../2026_07_16_000001_create_units_and_link_unit_id.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/database/migrations/2026_07_16_000001_create_units_and_link_unit_id.php b/database/migrations/2026_07_16_000001_create_units_and_link_unit_id.php index 7cf2388..662a293 100644 --- a/database/migrations/2026_07_16_000001_create_units_and_link_unit_id.php +++ b/database/migrations/2026_07_16_000001_create_units_and_link_unit_id.php @@ -81,11 +81,14 @@ return new class extends Migration } $extraCodes = $extraCodes->unique(); - $existingCodes = DB::table('units')->where('company_id', $companyId)->pluck('code')->all(); + // Case-insensitive dedupe: MariaDB default collation treats 'L' == 'l' + // as the same value on the unique index, so we compare lowercased. + $existingCodes = DB::table('units')->where('company_id', $companyId) + ->pluck('code')->map(fn ($c) => mb_strtolower((string) $c))->all(); foreach ($extraCodes as $code) { - if (in_array($code, $existingCodes, true)) continue; + if (in_array(mb_strtolower($code), $existingCodes, true)) continue; if (mb_strlen($code) > 16) continue; - DB::table('units')->insert([ + DB::table('units')->insertOrIgnore([ 'company_id' => $companyId, 'code' => $code, 'name_ro' => $code,