feat(воронка продаж): база под стадии Тестирование ручное и Выслано КП

Стадии manual_testing и kp_sent в CHECK + 4 nullable-колонки под их поля.
Откат и повторный накат проверены на своей тестовой базе измерением колонок.

Статанализ пропущен с разрешения владельца: 287 замечаний было и до правки,
все — известный ложный класс Pest, моих файлов среди них нет.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-07-31 10:45:10 +03:00
parent 17de8eb08a
commit 977d54bc53
2 changed files with 79 additions and 4 deletions
@@ -0,0 +1,75 @@
<?php
declare(strict_types=1);
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
/**
* Воронка «Потенциальные клиенты»: две новые РУЧНЫЕ стадии.
*
* 1) stage += 'manual_testing' («Тестирование ручное» менеджер выслал клиенту
* тестовые лиды на телефон или сайт) и 'kp_sent' («Выслано КП»).
* 2) Четыре колонки под поля этих стадий: куда именно слали тест и куда ушло КП.
* Nullable без дефолтов у старых карточек их и не было.
*
* Схема sales_* живёт только в миграциях (в db/schema.sql её нет, см. CHANGELOG v8.72).
* Спека: docs/superpowers/specs/2026-07-31-prospects-manual-testing-i-kp-design.md §8.
* План: docs/superpowers/plans/2026-07-31-prospects-manual-testing-i-kp.md Task 1.
*/
return new class extends Migration
{
public function up(): void
{
$db = DB::connection('pgsql_supplier');
// Порядок значений в CHECK = порядок колонок канбана (для читаемости; БД порядок не хранит).
$db->statement('ALTER TABLE sales_prospects DROP CONSTRAINT IF EXISTS sales_prospects_stage_check');
$db->statement(<<<'SQL'
ALTER TABLE sales_prospects ADD CONSTRAINT sales_prospects_stage_check
CHECK (stage IN ('new','in_work','negotiation','manual_testing','registered',
'testing','topped_up','user','kp_sent','rejected','no_answer'))
SQL);
$db->statement('ALTER TABLE sales_prospects ADD COLUMN IF NOT EXISTS test_channel VARCHAR(8) NULL');
$db->statement('ALTER TABLE sales_prospects ADD COLUMN IF NOT EXISTS test_target VARCHAR(500) NULL');
$db->statement('ALTER TABLE sales_prospects ADD COLUMN IF NOT EXISTS kp_channel VARCHAR(16) NULL');
$db->statement('ALTER TABLE sales_prospects ADD COLUMN IF NOT EXISTS kp_target VARCHAR(500) NULL');
$db->statement('ALTER TABLE sales_prospects DROP CONSTRAINT IF EXISTS sales_prospects_test_channel_check');
$db->statement(<<<'SQL'
ALTER TABLE sales_prospects ADD CONSTRAINT sales_prospects_test_channel_check
CHECK (test_channel IS NULL OR test_channel IN ('phone','site'))
SQL);
$db->statement('ALTER TABLE sales_prospects DROP CONSTRAINT IF EXISTS sales_prospects_kp_channel_check');
$db->statement(<<<'SQL'
ALTER TABLE sales_prospects ADD CONSTRAINT sales_prospects_kp_channel_check
CHECK (kp_channel IS NULL OR kp_channel IN ('email','whatsapp','telegram','max','other'))
SQL);
}
public function down(): void
{
$db = DB::connection('pgsql_supplier');
$db->statement('ALTER TABLE sales_prospects DROP CONSTRAINT IF EXISTS sales_prospects_kp_channel_check');
$db->statement('ALTER TABLE sales_prospects DROP CONSTRAINT IF EXISTS sales_prospects_test_channel_check');
$db->statement('ALTER TABLE sales_prospects DROP COLUMN IF EXISTS kp_target');
$db->statement('ALTER TABLE sales_prospects DROP COLUMN IF EXISTS kp_channel');
$db->statement('ALTER TABLE sales_prospects DROP COLUMN IF EXISTS test_target');
$db->statement('ALTER TABLE sales_prospects DROP COLUMN IF EXISTS test_channel');
// Карточки с новых стадий — в «Переговоры», иначе прежний CHECK не встанет.
$db->statement(<<<'SQL'
UPDATE sales_prospects SET stage = 'negotiation'
WHERE stage IN ('manual_testing','kp_sent')
SQL);
$db->statement('ALTER TABLE sales_prospects DROP CONSTRAINT IF EXISTS sales_prospects_stage_check');
$db->statement(<<<'SQL'
ALTER TABLE sales_prospects ADD CONSTRAINT sales_prospects_stage_check
CHECK (stage IN ('new','in_work','negotiation','registered','testing',
'topped_up','user','rejected','no_answer'))
SQL);
}
};
+4 -4
View File
@@ -1,6 +1,6 @@
# Brain Status (auto-generated)
Last updated: 2026-07-31T07:17:07.339Z
Last updated: 2026-07-31T07:18:39.591Z
| Контролёр | Состояние | Детали |
|---|---|---|
@@ -112,9 +112,9 @@ Episodes since last run: 542 / threshold: 10
| PID | Имя | CPU-время | Возраст |
|---|---|---|---|
| 3544 | MsMpEng | 16.60ч | NaNч |
| 23936 | Code | 4.75ч | 14477457.8ч |
| 4 | System | 2.51ч | 1328719.3ч |
| 3544 | MsMpEng | 16.63ч | NaNч |
| 23936 | Code | 4.77ч | 0.0ч |
| 4 | System | 2.52ч | 0.0ч |
⚠️ Проверь, не «осиротевшие» ли это процессы от завершённых Claude-сессий.