From dffefe7fc085cecb8f9ee3fb8f34396ebed1e0b0 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: Sun, 24 May 2026 16:51:20 +0300 Subject: [PATCH] =?UTF-8?q?docs(billing):=20Phase=203=20cleanup=20?= =?UTF-8?q?=E2=80=94=20refresh=20orphan=20comments=20to=20live=20classes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After ProcessWebhookJob/WebhookReceiveController removal — обновлены 8 docblock/inline комментариев, ссылавшихся на удалённый код: - DealController: ProcessWebhookJob → SupplierWebhookController/RouteSupplierLeadJob - SupplierWebhookController: убрана legacy backward-compat note - ImportLeadsJob: паритет с RouteSupplierLeadJob - RouteSupplierLeadJob: убрана ссылка на ProcessWebhookJob-pattern - NewLeadNotification mailable: триггер в RouteSupplierLeadJob - FailedWebhookJob model: ссылка на RouteSupplierLeadJob::failed() - SupplierLeadCost model: создаётся в LedgerService::chargeForDelivery - CsvLeadsParser: паритет с RouteSupplierLeadJob парсером Code-функциональность не затронута, только doc-rot fix. --- app/app/Http/Controllers/Api/DealController.php | 6 +++--- app/app/Http/Controllers/Api/SupplierWebhookController.php | 4 ++-- app/app/Jobs/ImportLeadsJob.php | 2 +- app/app/Jobs/RouteSupplierLeadJob.php | 4 ++-- app/app/Mail/NewLeadNotification.php | 2 +- app/app/Models/FailedWebhookJob.php | 2 +- app/app/Models/SupplierLeadCost.php | 4 ++-- app/app/Services/Import/CsvLeadsParser.php | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/app/Http/Controllers/Api/DealController.php b/app/app/Http/Controllers/Api/DealController.php index 36f8e6bf..0a29bfae 100644 --- a/app/app/Http/Controllers/Api/DealController.php +++ b/app/app/Http/Controllers/Api/DealController.php @@ -24,9 +24,9 @@ use Illuminate\Support\Facades\DB; * вынесены в `DealBulkActionController`, `export()` — в `DealExportController`. * Этот класс остаётся только для CRUD по одной записи. * - * NB: webhook-flow (автосоздание из crm.bp-gr.ru) — отдельный endpoint - * `WebhookReceiveController` + `ProcessWebhookJob` (асинхронно через очередь - * с advisory lock + dedup). Этот controller — для ручных action'ов из UI. + * NB: webhook-flow (приём из crm.bp-gr.ru) — отдельный endpoint + * `SupplierWebhookController` + `RouteSupplierLeadJob` (шеринг-канал). + * Этот controller — для ручных action'ов из UI. * * J1 (Sprint 3F): auth:sanctum+tenant, tenant_id из auth()->user(). * diff --git a/app/app/Http/Controllers/Api/SupplierWebhookController.php b/app/app/Http/Controllers/Api/SupplierWebhookController.php index 93df1129..cad18a39 100644 --- a/app/app/Http/Controllers/Api/SupplierWebhookController.php +++ b/app/app/Http/Controllers/Api/SupplierWebhookController.php @@ -29,8 +29,8 @@ use Symfony\Component\HttpFoundation\IpUtils; * Идемпотентность: UNIQUE INDEX на supplier_leads.vid. При дубле возвращаем * 200 OK без re-dispatch (поставщик может ретранслировать одни и те же лиды). * - * Backward-compat: legacy /api/webhook/{token} (per-tenant) живёт параллельно - * на WebhookReceiveController — не пересекается. + * Единственный приёмник входящих лидов от crm.bp-gr.ru (legacy per-tenant + * webhook был удалён вместе с ProcessWebhookJob). * * Plan 2.6 fix #ii (10.05.2026): пустой `supplier_ip_allowlist = '[]'` на * production env теперь fail-closed (`verifyIpAllowlist` возвращает false если diff --git a/app/app/Jobs/ImportLeadsJob.php b/app/app/Jobs/ImportLeadsJob.php index f3fba026..193ecedb 100644 --- a/app/app/Jobs/ImportLeadsJob.php +++ b/app/app/Jobs/ImportLeadsJob.php @@ -26,7 +26,7 @@ use Throwable; * * Жизненный цикл import_log: pending → processing → done | failed. * RLS: каждый доступ к БД задаёт SET LOCAL app.current_tenant_id (воркер - * вне middleware-контекста — паритет с ProcessWebhookJob). + * вне middleware-контекста — паритет с RouteSupplierLeadJob). */ class ImportLeadsJob implements ShouldQueue { diff --git a/app/app/Jobs/RouteSupplierLeadJob.php b/app/app/Jobs/RouteSupplierLeadJob.php index 2f7a275d..4b0b1f57 100644 --- a/app/app/Jobs/RouteSupplierLeadJob.php +++ b/app/app/Jobs/RouteSupplierLeadJob.php @@ -312,8 +312,8 @@ class RouteSupplierLeadJob implements ShouldQueue actorTenantUserId: null, actorAdminUserId: null, ip: null, ); - // ProcessWebhookJob-pattern: setRelation чтобы NotificationService - // мог подтянуть deal->project без N+1 lookup'а под RLS. + // setRelation чтобы NotificationService мог подтянуть + // deal->project без N+1 lookup'а под RLS. $deal->setRelation('project', $project); $notifier->notifyNewLead($tenant, $deal); diff --git a/app/app/Mail/NewLeadNotification.php b/app/app/Mail/NewLeadNotification.php index a203d855..153a350d 100644 --- a/app/app/Mail/NewLeadNotification.php +++ b/app/app/Mail/NewLeadNotification.php @@ -18,7 +18,7 @@ use Illuminate\Queue\SerializesModels; * * Отправляется получателям тенанта, у которых в notification_preferences * включён канал email для события new_lead. Триггер — успешное создание - * сделки в ProcessWebhookJob::chargeNewLead. + * сделки в RouteSupplierLeadJob. */ class NewLeadNotification extends Mailable { diff --git a/app/app/Models/FailedWebhookJob.php b/app/app/Models/FailedWebhookJob.php index 7c4a530b..bbfab9d4 100644 --- a/app/app/Models/FailedWebhookJob.php +++ b/app/app/Models/FailedWebhookJob.php @@ -8,7 +8,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; /** - * Webhook-job упавший после 3 ретраев (см. ProcessWebhookJob::failed()). + * Webhook-job упавший после 3 ретраев (см. RouteSupplierLeadJob::failed()). * * Tenant-aware с RLS. Хранит raw payload + текст исключения для ручного * retry из админки SaaS (`retried_at`/`retried_by` заполняются админом). diff --git a/app/app/Models/SupplierLeadCost.php b/app/app/Models/SupplierLeadCost.php index 23e09210..f6e489bf 100644 --- a/app/app/Models/SupplierLeadCost.php +++ b/app/app/Models/SupplierLeadCost.php @@ -11,8 +11,8 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * Себестоимость каждого лида (Ю-2: реселлерская модель). * * Партиционирована по `received_at` синхронно с `deals` — composite PK - * (id, received_at). В `ProcessWebhookJob` создаётся в той же транзакции, - * что и Deal + BalanceTransaction. + * (id, received_at). Создаётся в `LedgerService::chargeForDelivery` в той же + * транзакции, что и Deal + BalanceTransaction. * * cost_rub — snapshot suppliers.cost_rub на момент приёма (исторические * записи не пересчитываются при изменении закупочной цены, см. §20.12.5). diff --git a/app/app/Services/Import/CsvLeadsParser.php b/app/app/Services/Import/CsvLeadsParser.php index 6c297865..7bbdac8b 100644 --- a/app/app/Services/Import/CsvLeadsParser.php +++ b/app/app/Services/Import/CsvLeadsParser.php @@ -95,7 +95,7 @@ final class CsvLeadsParser return null; } - // Префикс B[123]_ из названия проекта срезается (паритет с ProcessWebhookJob). + // Префикс B[123]_ из названия проекта срезается (паритет с RouteSupplierLeadJob парсером). $projectName = (string) preg_replace('/^B[123]_/', '', trim($project)); if ($projectName === '') { $errors[] = ['line' => $dataLine, 'message' => 'Пустое название проекта'];