← story.propek
STORY 8.1
Database Migrations
Epic: CRM Propek v2
IN PROGRESS
Criar as 3 novas tabelas do CRM v2 (`deals`, `deal_stage_log`, `follow_ups_crm`) e adicionar o campo `note_type` na tabela existente `attendant_notes`, tudo no PostgreSQL 16 da Hostinger (`propek_bot` database).
ACCEPTANCE CRITERIA (1/14)
AC1: Migration 023 executada — tabela `deals` criada com todas as colunas definidas na arquitetura (id, customer_id, conversation_id, order_id, pipeline_type, current_stage, assigned_to, estimated_value, actual_value, source, metadata, closed_at, close_reason, created_at, updated_at)
AC2: Migration 023 — tabela `deal_stage_log` criada com colunas (id, deal_id, from_stage, to_stage, changed_by, notes, changed_at)
AC3: Migration 023 — constraint `chk_deals_stage` aplicada validando todos os stages validos para B2B e B2C
AC4: Migration 023 — trigger `trigger_deals_updated_at` ativo, atualizando `updated_at` automaticamente em UPDATE na tabela `deals`
AC5: Migration 023 — todos os indices criados: idx_deals_customer_id, idx_deals_pipeline_type, idx_deals_current_stage, idx_deals_assigned_to, idx_deals_created_at, idx_deals_updated_at, idx_deals_order_id, idx_deals_pipeline_stage (composto), idx_deals_open_updated (parcial), idx_deal_stage_log_deal_id, idx_deal_stage_log_changed_at, idx_deal_stage_log_deal_time
AC6: Migration 024 executada — tabela `follow_ups_crm` criada com todas as colunas (id, deal_id, customer_id, assigned_to, follow_up_type, due_at, status, notes, completed_at, completed_by, created_at, updated_at)
AC7: Migration 024 — CHECK constraint em `follow_up_type` validando os 9 tipos permitidos (lead_contact, spiced, proposal, nps, recompra, ezra_d3, ezra_d7, ezra_d14, custom)
AC8: Migration 024 — CHECK constraint em `status` validando (pending, done, overdue, cancelled)
AC9: Migration 024 — trigger `trigger_follow_ups_crm_updated_at` ativo, reutilizando a funcao `trg_deals_updated_at`
AC10: Migration 024 — todos os indices criados: idx_follow_ups_crm_customer, idx_follow_ups_crm_deal, idx_follow_ups_crm_assigned, idx_follow_ups_crm_status, idx_follow_ups_crm_due_at, idx_follow_ups_crm_pending_assigned (composto parcial), idx_follow_ups_crm_pending_due (parcial), idx_follow_ups_crm_type_status
AC11: Migration 025 executada — coluna `note_type VARCHAR(20) DEFAULT 'general'` adicionada na tabela `attendant_notes` existente com CHECK constraint (general, decision, alert)
AC12: Migration 025 — indice `idx_attendant_notes_type` criado usando `CREATE INDEX IF NOT EXISTS`
AC13: Todas as FKs referenciais funcionando: deals.customer_id → customers(id), deals.conversation_id → conversations(id), deals.order_id → orders(id), deal_stage_log.deal_id → deals(id), follow_ups_crm.deal_id → deals(id), follow_ups_crm.customer_id → customers(id)
AC14: Scripts de migration salvos em `apps/crm/migrations/` ou `squads/crm/migrations/` como arquivos SQL numerados (023_deals.sql, 024_follow_ups_crm.sql, 025_attendant_notes_note_type.sql)