Commit Graph

8 Commits

Author SHA1 Message Date
Дмитрий 4b7b67cefa refactor(supplier-grouping): R-17 — unify on buildUniqueKeyAgnostic
Deleted platform-specific buildUniqueKey($project, $platform). It diverged for
SMS (B2='sender+keyword', B3='sender' alone) → orphan supplier_projects on
sharing rebalance — B2 and B3 rows for the same project couldn't be reconciled
as one group. Now ALL platforms use buildUniqueKeyAgnostic:
  site/call    → signal_identifier
  sms+keyword  → sender+keyword
  sms (no kw)  → sender

3 callers updated: SyncSupplierProjectJob (online + batch paths) and
SupplierProjectImporter. Pest +1 test on Importer SMS commit asserts uniform
unique_key=sender+keyword across B2+B3 (RED before fix, GREEN after).
Full Importer suite 15/15 GREEN, SyncSupplierProjectsJob 12/12 GREEN.
Stage 4 §4.4.1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:12:21 +03:00
Дмитрий 01bd9977b4 refactor(supplier-import): code-review response — per-project atomicity + sms name + test gaps
C1 (Critical): восстановлена per-project транзакция в commit() через гейт
DB::connection('pgsql_supplier')->getPdo()->inTransaction() — в проде BEGIN/COMMIT
на каждый item (Project+sps+pivot атомарно, no orphan-Project при сбое в группе);
под SharesSupplierPdo+DatabaseTransactions гейт detects общий PDO и пишет inline
(избегает «already active transaction»). Runbook §«Атомарность» переписан.

M3 (Minor): deriveName для sms берёт sms_senders[0] как fallback вместо литерала 'проект'
(когда тег пустой/'РФ').

N1+N2 (test gaps): +тест workdays union по двум площадкам с разными расписаниями
(B1 [1,2,3] ∪ B2 [4,5] → mask 31); +тест sms regions_reverse skip (отдельный
кодовый путь от site/call); +тест sms name из sender при пустом теге.

I1 ОТКЛОНЁН: рецензент предложил вернуть array_values() в parseGibddRegions,
но Larastan однозначно подтвердил `arrayValues.list` — preg_split с
PREG_SPLIT_NO_EMPTY + array_map даёт list, и возврат array_values был бы no-op +
триггерил бы stan-ошибку. Оставлено как было после стан-фикса.

Tests: 32/32 GREEN (29 + 3 new). Source stan-clean (38 ошибок без изменений —
все в test-files quirk #25 + ide-helper drift, не в source).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 10:17:12 +03:00
Дмитрий ded8e3758d test(supplier-import): commit реюзит существующий supplier_project, не дублирует
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 10:17:09 +03:00
Дмитрий 391607cadd feat(supplier-import): commit — Project+supplier_projects+pivot из external_id, без записи на портал 2026-05-22 10:17:09 +03:00
Дмитрий d5b3406860 feat(supplier-import): buildPlan идемпотентность — существующий Project пропускается 2026-05-22 10:17:08 +03:00
Дмитрий 9fd8f35ca4 feat(supplier-import): buildPlan — sms-группировка по sender (B2/B3) 2026-05-22 10:17:08 +03:00
Дмитрий ede7b97a4f feat(supplier-import): buildPlan — обратные регионы/union/вся РФ + skip regions_reverse 2026-05-22 10:17:07 +03:00
Дмитрий 9cabe8ded4 feat(supplier-import): buildPlan — site/call группировка B1/B2/B3, лимит=сумма 2026-05-22 10:17:06 +03:00