From 3aaa597baf2b8546debdb4b2b3977bf2aa2e4851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 25 May 2026 17:31:13 +0300 Subject: [PATCH] feat(supplier-webhook): accept non-B-prefix projects as platform=DIRECT Drops regex /^B[123]_.+$/ from project field validation; parsePlatform() returns 'DIRECT' for projects without B-prefix (instead of silent fallback to 'B1'). SupplierProjectResolver ALLOWED_PLATFORMS extended to include DIRECT. Closes ~67 of 82 lost leads/day for tenant client1 (observed 2026-05-25): mostly client.carmoney.ru (55), B2_Caranga (7), cabinet.caranga.ru (3), cashmotor.ru (2), numeric callback IDs (~10). Co-Authored-By: Claude Opus 4.7 --- .../Http/Controllers/Api/SupplierWebhookController.php | 10 +++++++--- .../SupplierProjects/SupplierProjectResolver.php | 2 +- docs/observer/STATUS.md | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/app/Http/Controllers/Api/SupplierWebhookController.php b/app/app/Http/Controllers/Api/SupplierWebhookController.php index cad18a39..2f090ad2 100644 --- a/app/app/Http/Controllers/Api/SupplierWebhookController.php +++ b/app/app/Http/Controllers/Api/SupplierWebhookController.php @@ -83,7 +83,7 @@ class SupplierWebhookController extends Controller $validated = $request->validate([ 'vid' => 'required|integer|min:1', - 'project' => ['required', 'string', 'max:255', 'regex:/^B[123]_.+$/'], + 'project' => ['required', 'string', 'max:255'], // Phase 3: regex /^B[123]_.+$/ снят — non-B → platform=DIRECT 'phone' => ['required', 'string', 'regex:/^7\d{10}$/'], 'time' => ['required', 'integer', "min:{$minTime}", "max:{$maxTime}"], 'tag' => 'nullable|string|max:255', @@ -182,8 +182,12 @@ class SupplierWebhookController extends Controller private function parsePlatform(string $project): string { - preg_match('/^(B[123])_/', $project, $m); + // Phase 3: проекты без B-префикса → DIRECT (раньше silent fallback на 'B1' + // приводил к неверной маршрутизации). + if (preg_match('/^(B[123])_/', $project, $m) === 1) { + return $m[1]; + } - return $m[1] ?? 'B1'; + return 'DIRECT'; } } diff --git a/app/app/Services/SupplierProjects/SupplierProjectResolver.php b/app/app/Services/SupplierProjects/SupplierProjectResolver.php index 0cedbe1b..83b7fe81 100644 --- a/app/app/Services/SupplierProjects/SupplierProjectResolver.php +++ b/app/app/Services/SupplierProjects/SupplierProjectResolver.php @@ -21,7 +21,7 @@ use InvalidArgumentException; */ class SupplierProjectResolver { - private const ALLOWED_PLATFORMS = ['B1', 'B2', 'B3']; + private const ALLOWED_PLATFORMS = ['B1', 'B2', 'B3', 'DIRECT']; private const ALLOWED_SIGNAL_TYPES = ['site', 'call', 'sms']; diff --git a/docs/observer/STATUS.md b/docs/observer/STATUS.md index aa351a06..f4a8d3e5 100644 --- a/docs/observer/STATUS.md +++ b/docs/observer/STATUS.md @@ -1,6 +1,6 @@ # Brain Status (auto-generated) -Last updated: 2026-05-25T14:59:02.312Z +Last updated: 2026-05-25T14:59:04.311Z | Контролёр | Состояние | Детали | |---|---|---|