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:
@@ -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);
|
||||
}
|
||||
};
|
||||
@@ -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-сессий.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user