feat(sales): Этап 2 — сервис-канал поиск→портал (managers + ingest)

Портал публикует /api/sales/integration/{managers,prospects} под сервис-токеном
(X-Sales-Token, config sales.integration_token). ingest создаёт карточки stage=new
с полным payload, дедуп по (sales_user_id, inn|phone), assigned_by=начальник.
Гейты: 8/8 Pest, Larastan 0. Финдер-сторона — следующим коммитом.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-07-15 18:13:59 +03:00
parent 2f6e88e784
commit 16aa00a0e4
9 changed files with 455 additions and 4 deletions
+8
View File
@@ -5,6 +5,7 @@ use App\Http\Controllers\Api\Sales\SalesAuthController;
use App\Http\Controllers\Api\Sales\SalesClientsController;
use App\Http\Controllers\Api\Sales\SalesDashboardController;
use App\Http\Controllers\Api\Sales\SalesIncomeController;
use App\Http\Controllers\Api\Sales\SalesIntegrationController;
use App\Http\Controllers\Api\Sales\SalesInvoiceController;
use App\Http\Controllers\Api\Sales\SalesManagersController;
use App\Http\Controllers\Api\Sales\SalesPayoutController;
@@ -294,6 +295,13 @@ Route::middleware(['admin-db', 'auth:sales', 'sales-portal'])->prefix('api/sales
// managers, dashboard
});
// Сервис-канал «Поиск → Портал» (Этап 2). Токен вместо пользователя (sales-integration),
// admin-db — чтобы писать в sales_prospects под crm_admin_user. Дизайн §7.
Route::middleware(['admin-db', 'sales-integration'])->prefix('api/sales/integration')->group(function () {
Route::get('/managers', [SalesIntegrationController::class, 'managers']);
Route::post('/prospects', [SalesIntegrationController::class, 'ingest']);
});
// Plan 4 Task 11: tenant charges ledger (read-only + CSV export).
// RLS изоляция через SetTenantContext (auth:sanctum + tenant) — текущий tenant
// видит только свои lead_charges. Pagination 20/page, фильтры period/source.