Files
sar/sarweb_views.sql
julian a2bab75bad feat(web+api): catálogo com detalhe do produto, preços por pauta e consulta de pedidos ERP
- Catálogo: modal de detalhe centralizado (1100px) com identificação, estoque,
  preços base e lista de preços por pauta do representante (DISTINCT para evitar duplicatas)
- Contrato: loteMulVenda promovido para ProdutoSummarySchema; PautaPrecoSchema adicionado
- Pedido novo: valida lote múltiplo de venda — qtd inicial = lote, step = lote,
  InputNumber em erro quando inválido, alerta e bloqueio do submit
- Consulta ERP: tela OrdersErpPage com listagem de pedidos do ERP (P/E), contrato
  PedidoErpConsulta, endpoint no orders.controller, rota e sidebar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 20:27:19 +00:00

125 lines
5.5 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;
-- ---------------------------------------------------------------------------
-- 3. STATUS DE PEDIDO ERP
-- Fonte: sig.sitpedido
-- ---------------------------------------------------------------------------
CREATE OR REPLACE VIEW sar.vw_sitpedido AS
SELECT
s.id_sitpedido,
TRIM(s.descricao) AS descricao
FROM sig.sitpedido s;