From b4138bbc82f8a3d4e0fe842d9ea0d5d4a6a84020 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, 17 May 2026 18:18:00 +0300 Subject: [PATCH] =?UTF-8?q?feat(deals):=20sweep=2014->5=20funnel=20slugs?= =?UTF-8?q?=20=E2=80=94=20controllers,=20mocks,=20stories,=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/DashboardController.php | 6 ++--- .../Providers/ManagersSummaryProvider.php | 6 ++--- .../Providers/SourcesSummaryProvider.php | 6 ++--- .../components/charts/FunnelChart.story.vue | 4 +-- .../js/components/charts/FunnelChart.vue | 25 ++++++------------- .../deals/DealDetailDrawer.story.vue | 6 ++--- .../import/UnknownStatusesDialog.vue | 21 +++++----------- .../components/kanban/KanbanColumn.story.vue | 8 +++--- app/resources/js/composables/mockDeals.ts | 20 +++++++-------- app/tests/Feature/AdminTenantShowTest.php | 2 +- app/tests/Feature/DashboardSummaryTest.php | 12 ++++----- app/tests/Feature/DealIndexTest.php | 12 ++++----- app/tests/Feature/DealShowTest.php | 4 +-- app/tests/Feature/DealTransitionTest.php | 18 ++++++------- app/tests/Feature/DealUpdateTest.php | 12 ++++----- .../Import/HistoricalImportServiceTest.php | 10 ++++---- .../Feature/Import/ImportControllerTest.php | 6 ++--- app/tests/Feature/Import/ImportModelsTest.php | 2 +- app/tests/Feature/LeadStatusesIndexTest.php | 15 ++++------- .../Reports/ManagersSummaryProviderTest.php | 6 ++--- .../Reports/ReportJobControllerTest.php | 4 +-- .../Reports/SourcesSummaryProviderTest.php | 4 +-- .../Frontend/AdminTenantDetailView.spec.ts | 4 +-- app/tests/Frontend/DashboardView.spec.ts | 2 +- .../Frontend/DealDetailDrawerApi.spec.ts | 6 ++--- .../Frontend/DealsListIntegration.spec.ts | 22 ++++++++-------- app/tests/Frontend/DealsView.spec.ts | 6 ++++- app/tests/Frontend/FunnelChart.spec.ts | 16 ++++++------ app/tests/Frontend/NewDealDialog.spec.ts | 4 +-- .../Frontend/UnknownStatusesDialog.spec.ts | 8 +++--- .../Frontend/adminTenantDetailMapper.spec.ts | 4 +-- app/tests/Frontend/leadStatusesStore.spec.ts | 6 ++--- app/tests/Frontend/useStatusPill.spec.ts | 8 ++++-- 33 files changed, 140 insertions(+), 155 deletions(-) diff --git a/app/app/Http/Controllers/Api/DashboardController.php b/app/app/Http/Controllers/Api/DashboardController.php index 9025d537..9023daec 100644 --- a/app/app/Http/Controllers/Api/DashboardController.php +++ b/app/app/Http/Controllers/Api/DashboardController.php @@ -63,10 +63,10 @@ class DashboardController extends Controller $curLeads = (clone $base())->whereBetween('received_at', [$windowStart, $now])->count(); $prevLeads = (clone $base())->whereBetween('received_at', [$prevStart, $windowStart])->count(); - // --- conversion: % статуса 'paid' в окне --- - $curPaid = (clone $base())->where('status', 'paid') + // --- conversion: % статуса 'won' в окне --- + $curPaid = (clone $base())->where('status', 'won') ->whereBetween('received_at', [$windowStart, $now])->count(); - $prevPaid = (clone $base())->where('status', 'paid') + $prevPaid = (clone $base())->where('status', 'won') ->whereBetween('received_at', [$prevStart, $windowStart])->count(); $curConv = $curLeads > 0 ? round($curPaid / $curLeads * 100, 1) : 0.0; $prevConv = $prevLeads > 0 ? round($prevPaid / $prevLeads * 100, 1) : 0.0; diff --git a/app/app/Services/Reports/Providers/ManagersSummaryProvider.php b/app/app/Services/Reports/Providers/ManagersSummaryProvider.php index f71179ec..20dc3fc3 100644 --- a/app/app/Services/Reports/Providers/ManagersSummaryProvider.php +++ b/app/app/Services/Reports/Providers/ManagersSummaryProvider.php @@ -12,8 +12,8 @@ use Illuminate\Support\Facades\DB; * managers_summary — агрегат сделок по менеджерам за период (audit F1). * * Группировка по deals.manager_id; неназначенные (manager_id IS NULL) сводятся - * в строку «Не назначен». «Оплачено» = status='paid' (won-статус воронки, как - * в DashboardController). Конверсия = paid / total * 100, округление до 0.1. + * в строку «Не назначен». «Оплачено» = status='won' (won-статус воронки, как + * в DashboardController). Конверсия = won / total * 100, округление до 0.1. * * parameters: date_from, date_to (Y-m-d). Исключаются soft-deleted * (deleted_at IS NULL) и тестовые (is_test=false) сделки. RLS-обёртка @@ -48,7 +48,7 @@ class ManagersSummaryProvider implements ReportDataProvider "deals.manager_id, users.first_name, users.last_name, users.email, COUNT(*) AS total, - COUNT(*) FILTER (WHERE deals.status = 'paid') AS paid" + COUNT(*) FILTER (WHERE deals.status = 'won') AS paid" ) ->get(); diff --git a/app/app/Services/Reports/Providers/SourcesSummaryProvider.php b/app/app/Services/Reports/Providers/SourcesSummaryProvider.php index 3eab73e1..8d27a458 100644 --- a/app/app/Services/Reports/Providers/SourcesSummaryProvider.php +++ b/app/app/Services/Reports/Providers/SourcesSummaryProvider.php @@ -12,8 +12,8 @@ use Illuminate\Support\Facades\DB; * sources_summary — агрегат сделок по источнику (utm_source) за период (audit F1). * * Группировка по deals.utm_source; сделки без метки (NULL/пусто) сводятся в - * строку «Прямые / без метки». «Оплачено» = status='paid'. Конверсия = - * paid / total * 100, округление до 0.1. + * строку «Прямые / без метки». «Оплачено» = status='won'. Конверсия = + * won / total * 100, округление до 0.1. * * parameters: date_from, date_to (Y-m-d). Исключаются soft-deleted и тестовые * сделки. RLS-обёртка SET LOCAL app.current_tenant_id — паттерн DealsExportProvider. @@ -45,7 +45,7 @@ class SourcesSummaryProvider implements ReportDataProvider ->selectRaw( "utm_source, COUNT(*) AS total, - COUNT(*) FILTER (WHERE status = 'paid') AS paid" + COUNT(*) FILTER (WHERE status = 'won') AS paid" ) ->get(); diff --git a/app/resources/js/components/charts/FunnelChart.story.vue b/app/resources/js/components/charts/FunnelChart.story.vue index 7e181a2b..31ba4d21 100644 --- a/app/resources/js/components/charts/FunnelChart.story.vue +++ b/app/resources/js/components/charts/FunnelChart.story.vue @@ -24,11 +24,11 @@ import FunnelChart from './FunnelChart.vue'; - + - + diff --git a/app/resources/js/components/charts/FunnelChart.vue b/app/resources/js/components/charts/FunnelChart.vue index 6c597197..06302713 100644 --- a/app/resources/js/components/charts/FunnelChart.vue +++ b/app/resources/js/components/charts/FunnelChart.vue @@ -1,6 +1,6 @@