Files
sar/sarweb_views.sql
julian 1647871a39 feat(web+api): redesign ClientsPage/OrdersPage e corrige dados empresa 9001
Web — ClientsPage:
- Redesign completo: métricas reais via usePortfolioStats (4 queries count),
  donut Chart.js com totais reais, tabela sem ellipsis, coluna Cliente com
  nome fantasia/razão/CNPJ completos, drawer de detalhes e análise comercial,
  cards mobile, filtros de status/busca em tempo real.
- Dados reais: substitui mock por useClientList/useClientDetail/useClientOrders;
  remove tipos fictícios (prospect/lead, cidade, totalComprado).

Web — OrdersPage:
- Métricas reais via useOrderStats (contagens por situa, não da página atual).
- Coluna Cliente sem truncamento (minWidth: 240).
- Cabeçalho, filtros e layout alinhados ao padrão da ClientsPage.

API — orders.service.ts:
- Normalização situa SIG→SAR: SIG usa 5=Cancelado; SAR usa 3=Cancelado.
  sigToSar(5→3) no mapper; sarToSig(3→5) no filtro SQL.

API — clients.service.ts:
- dt_ultima_compra corrigida: JOIN duplo (vw_pedidos_erp + sar.pedidos) com
  GREATEST() — clientes com histórico ERP mas sem pedido SAR deixam de
  aparecer todos como Inativo.
- Filtro de activityStatus movido para SQL — total e paginação corretos.
- findOne() atualizado com o mesmo JOIN duplo.

Infra — .env:
- DEV_EMPRESA_ID: 1 → 9001 — API aponta para dados reais da empresa SIG.
  Ex: pedido nº 141022 passa de R$1.765,48 para R$2.454,90.

Docs — sarweb_views.sql:
- Documenta as views reais em schema sar; remove schema sarweb inexistente.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-30 14:08:56 +00:00

115 lines
5.2 KiB
SQL

-- =============================================================================
-- sar_views.sql
-- Views PostgreSQL do projeto SAR — schema `sar` no banco ERP (libreplast)
--
-- Executar como: psql -U postgres -d libreplast -f sar_views.sql
--
-- DECISÃO DE ARQUITETURA: todas as views residem no schema `sar` (mesmo schema
-- das tabelas Prisma). O search_path da conexão runtime é `sar`, portanto as
-- queries do backend usam os nomes curtos (vw_clientes, vw_pedidos_erp).
--
-- ERP base: SIG (schema sig.*)
-- Empresa gerencial: id_empresa = 1 (gestao.empresa)
-- Empresa fiscal: id_empresa = 9001 (sig.corrent / sig.pedidos)
-- Cancelados SIG: situa = 5 (≠ SAR que usa situa = 3)
-- Faturados SIG: situa = 4 (coincide com SAR)
-- =============================================================================
-- ---------------------------------------------------------------------------
-- 1. CLIENTES
-- Fonte: sig.corrent
-- Obs: COALESCE(id_empresa, 1) cobre registros antigos sem id_empresa.
-- cod_vendedor determina a carteira do representante.
-- ---------------------------------------------------------------------------
CREATE OR REPLACE VIEW sar.vw_clientes AS
SELECT
COALESCE(c.id_empresa, 1) AS id_empresa,
c.id_corrent AS id_cliente,
c.ativo,
COALESCE(NULLIF(TRIM(c.nome), ''), TRIM(c.razao)) AS nome,
TRIM(c.razao) AS razao,
c.pesso AS pessoa,
c.consfinal,
c.cgcpf,
c.suf_cgcpf,
c.inscr AS inscricao_estadual,
c.endereco,
COALESCE(c.num_endereco, '') AS num_endereco,
c.bairr AS bairro,
c.id_municipio,
c.cep,
c.ddd,
c.telef AS telefone,
c.e_mail AS email,
c.data AS dt_cadastro,
c.obs,
c.cod_formapag,
(
SELECT fp.id_formapag
FROM gestao.formapag fp
LEFT JOIN gestao.empresa e ON e.id_empresa = COALESCE(c.id_empresa, 1)
WHERE fp.id_empresa = COALESCE(e.id_matriz, COALESCE(c.id_empresa, 1))
AND fp.codigo = c.cod_formapag
LIMIT 1
) AS id_formapag,
c.indicador_ie,
c.cod_pauta,
c.st_especifica,
COALESCE(c.limcred, 0) AS limite_credito,
c.cod_vendedor,
c.dt_atual
FROM sig.corrent c;
-- ---------------------------------------------------------------------------
-- 2. PEDIDOS ERP
-- Fonte: sig.pedidos
-- Situa SIG → SAR: 5=Cancelado(SIG) vs 3=Cancelado(SAR). O backend
-- normaliza em runtime (sigToSar / sarToSig em orders.service.ts).
-- ---------------------------------------------------------------------------
CREATE OR REPLACE VIEW sar.vw_pedidos_erp AS
SELECT
p.id_empresa,
p.id_pedido,
p.num_ped_sar,
p.numero,
p.tipo,
p.situa,
CASE p.situa
WHEN 1 THEN 'Pendente'
WHEN 2 THEN 'Liberado'
WHEN 4 THEN 'Faturado'
WHEN 5 THEN 'Cancelado'
ELSE 'Enviado'
END AS status_descr,
p.data AS dt_pedido,
p.data_emissao AS dt_emissao,
p.clien AS id_cliente,
p.cod_vendedor,
p.cod_formapag,
fp.id_formapag,
fp.descr AS forma_pagamento,
pau.id_pauta,
COALESCE(p.obs, '') AS obs,
p.totpr AS total_produtos,
COALESCE(p.ipi, 0) AS total_ipi,
0 AS total_icmsst,
COALESCE(p.total, 0) AS total,
COALESCE(p.descp, 0) AS desconto_perc,
COALESCE(p.descv, 0) AS desconto_valor,
COALESCE(p.tx_acrescimo, 0) AS acrescimo,
COALESCE(p.com_fat, 0) AS comissao,
COALESCE(p.ped_flex::integer, 0) AS ped_flex,
p.cod_vend2 AS cod_supervisor,
p.tx_com_vend2 AS taxa_com_super
FROM sig.pedidos p
LEFT JOIN gestao.formapag fp
ON fp.codigo = p.cod_formapag
AND fp.id_empresa = CASE WHEN p.id_empresa > 9000
THEN p.id_empresa - 9000
ELSE p.id_empresa END
LEFT JOIN gestao.pauta pau
ON pau.codigo = p.cod_pauta
AND pau.id_empresa = CASE WHEN p.id_empresa > 9000
THEN p.id_empresa - 9000
ELSE p.id_empresa END;