feat(web+api): ficha do cliente — contatos, CTR, NF-e, pedidos e produtos
- Contatos: grid de cards 3 colunas, botão "Novo Contato" no topo da página - Sync ERP↔SAR corrigido: vw_contatos aceita formato COR#<id>, trigger normaliza id_empresa (9001→1) - CTR + NF-e: layout 50/50 — lista de títulos abertos com badge vencido/a vencer e lista de notas com botão copiar chave NF-e - Histórico de pedidos: UNION SAR+ERP, top 5 + modal "Ver todos" - Produtos mais comprados: top 5 com último preço + modal "Ver todos" - Novos endpoints: ctr-list, notas, orders-history, top-produtos - AppShell: overflow-x travado, sem scroll horizontal na aplicação Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -505,14 +505,18 @@ FROM gestao.marca;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- Contatos vinculados a clientes (gestao.contato)
|
||||
-- id_entidade = id_corrent::text (CHAR 20, auto-pad)
|
||||
-- Usado para envio via WhatsApp / ChatWoot futuramente
|
||||
-- O ERP grava id_entidade como 'COR#<id_corrent>' (formato nativo).
|
||||
-- O SAR legado gravava apenas o número puro. Ambos os formatos são aceitos.
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE OR REPLACE VIEW sar.vw_contatos AS
|
||||
SELECT
|
||||
c.id_contato,
|
||||
c.id_empresa,
|
||||
TRIM(c.id_entidade)::integer AS id_corrent,
|
||||
CASE
|
||||
WHEN TRIM(c.id_entidade) ~ '^COR#\d+$'
|
||||
THEN SUBSTRING(TRIM(c.id_entidade) FROM 5)::integer
|
||||
ELSE TRIM(c.id_entidade)::integer
|
||||
END AS id_corrent,
|
||||
c.id_chatwoot,
|
||||
TRIM(c.nome) AS nome,
|
||||
TRIM(c.empresa) AS empresa,
|
||||
@@ -530,9 +534,13 @@ SELECT
|
||||
TRIM(cr.razao::text) AS razao_cliente,
|
||||
cr.cod_vendedor
|
||||
FROM gestao.contato c
|
||||
LEFT JOIN sig.corrent cr
|
||||
ON cr.id_corrent = TRIM(c.id_entidade)::integer
|
||||
WHERE TRIM(c.id_entidade) ~ '^\d+$';
|
||||
LEFT JOIN sig.corrent cr ON cr.id_corrent = CASE
|
||||
WHEN TRIM(c.id_entidade) ~ '^COR#\d+$'
|
||||
THEN SUBSTRING(TRIM(c.id_entidade) FROM 5)::integer
|
||||
ELSE TRIM(c.id_entidade)::integer
|
||||
END
|
||||
WHERE TRIM(c.id_entidade) ~ '^\d+$'
|
||||
OR TRIM(c.id_entidade) ~ '^COR#\d+$';
|
||||
|
||||
-- =============================================================================
|
||||
-- PARTE 2 — TABELAS DE ESCRITA DO SAR
|
||||
|
||||
Reference in New Issue
Block a user