e31ea5354a
Заменяет static-снапшот LEAD_STATUSES в коде на live-данные из БД. Custom slug'и (добавленные после deployment'а) теперь видны UI без rebuild'а. Backend: - LeadStatus model (PK=slug string, incrementing=false, timestamps=null). - LeadStatusController::index — GET /api/lead-statuses, ORDER BY sort_order, slug. Таблица глобальная (не tenant-aware), auth не требуется на MVP. Pest +5 (LeadStatusesIndexTest): - 200 + не пустой / все 14 системных slug'ов из seed / все нужные поля / sort_order ASC / кастомный slug после INSERT появляется в endpoint'е. Frontend: - api/leadStatuses.ts::listLeadStatuses — GET helper. - stores/leadStatuses.ts::useLeadStatusesStore — Pinia setup-store: statuses default = LEAD_STATUSES snapshot (UI работает без fetch'а), load(force=false) идемпотентен, bySlug computed Map, findBySlug helper. На fail — snapshot остаётся, fetchError=true. - DealsView/KanbanView/DealDetailDrawer переехали со static-импорта LEAD_STATUSES на store. KanbanView использует safe-access dealsByStatus[slug] || [] (защита от custom slug'а из API без seeded column). load() в onMounted у обоих view'ов. Vitest +7 (leadStatusesStore.spec.ts): - initial snapshot / findBySlug existing & null / load success replace + loaded / load reject — fetchError + snapshot fallback / load идемпотентен / load(force=true) refetch. - 2 spec'а DealDetailDrawer получили setActivePinia(createPinia()) в beforeEach (без этого Pinia store-injection в jsdom падает). PHPStan baseline регенерирован. Регресс: - Lint+type-check+format passed. - Vitest 280/280 за 19.44 сек (+7 от 273). - Vite build 1.17 сек. - Pint + PHPStan passed. - Pest 210/210 за 24.59 сек (+5 от 205, 840 assertions). Реестр v1.63→v1.64 / CLAUDE.md v1.54→v1.55. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
40 lines
1.3 KiB
PHP
40 lines
1.3 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace App\Http\Controllers\Api;
|
||
|
||
use App\Http\Controllers\Controller;
|
||
use App\Models\LeadStatus;
|
||
use Illuminate\Http\JsonResponse;
|
||
|
||
/**
|
||
* Lookup статусов воронки. Используется в DealsView/KanbanView/DealDetailDrawer
|
||
* как замена статичного `composables/leadStatuses.ts` snapshot'а.
|
||
*
|
||
* Таблица глобальная (нет tenant_id), auth не требуется на MVP. На prod —
|
||
* middleware('auth:sanctum') добавится автоматически без изменений сигнатуры.
|
||
*/
|
||
class LeadStatusController extends Controller
|
||
{
|
||
/** GET /api/lead-statuses */
|
||
public function index(): JsonResponse
|
||
{
|
||
$statuses = LeadStatus::query()
|
||
->orderBy('sort_order')
|
||
->orderBy('slug')
|
||
->get();
|
||
|
||
return response()->json([
|
||
'lead_statuses' => $statuses->map(fn (LeadStatus $s) => [
|
||
'slug' => $s->slug,
|
||
'name_ru' => $s->name_ru,
|
||
'is_system' => (bool) $s->is_system,
|
||
'sort_order' => $s->sort_order,
|
||
'color_hex' => $s->color_hex,
|
||
'description' => $s->description,
|
||
]),
|
||
]);
|
||
}
|
||
}
|