migrations_v4_sale.sql 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. -- Histórico de vendas vindas do CRM.
  2. --
  3. -- Cada venda é uma LINHA com a data em que ocorreu (sale_occurred_at). É essa
  4. -- dimensão de tempo que permite responder "faturado hoje / na semana / no mês",
  5. -- algo impossível com o contador agregado sku.sku_sold.
  6. --
  7. -- O sku.sku_sold continua existindo como total acumulado (cache de leitura
  8. -- rápida), incrementado pela aplicação a cada nova venda registrada aqui.
  9. --
  10. -- Isolamento: company_id é resolvido pela URL/HMAC do webhook, nunca pelo corpo.
  11. -- sku_id / client_id / operator_id são INT DEFAULT 0 (sem FK), seguindo o mesmo
  12. -- padrão adotado em integration.user_id/operator_id (migrations_v2): 0 = não
  13. -- vinculado, pois o CRM pode mandar uma venda sem produto/cliente/operador
  14. -- cadastrado na plataforma.
  15. CREATE TABLE IF NOT EXISTS sale (
  16. sale_id SERIAL PRIMARY KEY,
  17. company_id INT NOT NULL,
  18. sku_id INT NOT NULL DEFAULT 0,
  19. client_id INT NOT NULL DEFAULT 0,
  20. operator_id INT NOT NULL DEFAULT 0,
  21. sale_external_id TEXT NOT NULL,
  22. sale_amount DECIMAL(12,2) NOT NULL,
  23. sale_quantity INT NOT NULL DEFAULT 1,
  24. sale_occurred_at TIMESTAMP NOT NULL,
  25. sale_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  26. sale_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  27. CONSTRAINT fk_sale_company FOREIGN KEY (company_id) REFERENCES company(company_id)
  28. );
  29. -- Idempotência: o CRM pode reenviar a mesma venda. A chave (company_id,
  30. -- sale_external_id) impede duplicar o faturamento. Parcial em registros ativos
  31. -- para conviver com a exclusão lógica.
  32. CREATE UNIQUE INDEX IF NOT EXISTS uq_sale_company_external_active
  33. ON sale (company_id, sale_external_id)
  34. WHERE sale_deleted_at = 'infinity';
  35. -- Acelera as consultas de faturamento por período (dia/semana/mês).
  36. CREATE INDEX IF NOT EXISTS idx_sale_company_occurred
  37. ON sale (company_id, sale_occurred_at)
  38. WHERE sale_deleted_at = 'infinity';