Pular para o conteúdo principal

Valida Tabela de Preço do Vendedor

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Aba "Vendedor" → Label "Valida Tabela Vendedor" Tabela: PARMFATUR.ST_VALIDATABVENDEDOR (DOM_CHAR1, NOT NULL) Valor padrão: N (Não valida)

Controla se, nos documentos de Pedido e Nota Fiscal, a Tabela de Preço informada nos itens precisa estar vinculada ao Vendedor do cabeçalho do documento via tabela TABPRECOVENDEDOR. Quando ativo (S), altera o comportamento da tecla F9 no campo CD_TABPRECO do item e habilita validações que bloqueiam o salvamento caso a tabela não pertença ao vendedor. Quando inativo (N), o lookup/validação da tabela de preço é aberto e não considera o vendedor.

Telas impactadas​

MóduloCódigoPapelDescrição
Pedido de VendaMPD002ConsumidorF9 em CD_TABPRECO filtra por vendedor; valida tabela x vendedor no salvamento
Pedido RápidoMPD020ConsumidorValida se a tabela de preço do item pertence ao vendedor do pedido
Liberação de PedidosMPD081ConsumidorCarrega ST_VALIDATABVENDEDOR no dataset do pedido e valida na alteração da tabela
Lançamento por Projeto (MPD052)MPD052ConsumidorF9 em tabela de preço só abre lookup genérico quando ST_VALIDATABVENDEDOR='N'
NF SaídaMNF002ConsumidorF9 em CD_TABPRECO filtra por vendedor; valida consistência no salvamento
NF Troca/Garantia (MNF026)MNF026ConsumidorLógica equivalente à MNF002 (bloco comentado no código atual)
NF Cupom/ContingênciaMNF008LeitorInclui o parâmetro no SELECT de PARMFATUR
NF por Ordem de RecebimentoMRC020ConsumidorValida se CD_TABPRECO do item pertence ao vendedor da nota
Contas a Receber / OficinaMCO006LeitorInclui ST_VALIDATABVENDEDOR no carregamento de PARMFATUR

Campos envolvidos​

CampoTabelaDescrição
CD_VENDEDORPEDIDO / NOTAVendedor do cabeçalho do documento; condição obrigatória para aplicar a validação
CD_TABPRECOITEMPEDIDO / ITEMNOTATabela de preço do item a ser validada
CD_VENDEDOR + CD_TABPRECOTABPRECOVENDEDORVínculo entre vendedor e tabela(s) de preço permitidas
DS_TABPRECOTABPRECOUsado na mensagem de erro / listagem de tabelas inválidas

Procedures e tabelas relacionadas​

  • TABPRECOVENDEDOR - tabela de associação (vendedor, tabela de preço). Quando ST_VALIDATABVENDEDOR='S', toda validação/filtro consulta esta tabela.
  • Pesquisa TABPRECOVENDEDOR (framework jPesquisa) - invocada via Busca(transaction, 'TABPRECOVENDEDOR', parm) com o CD_VENDEDOR como parâmetro para filtrar o lookup F9.
  • Nenhuma stored procedure em Scripts/ referencia este parâmetro diretamente (confirmado por grep em Scripts/).

Opções disponíveis​

S - Sim​

O que fazDetalhe
Na tecla F9 em CD_TABPRECOSe o pedido/nota tem CD_VENDEDOR preenchido, abre a pesquisa TABPRECOVENDEDOR já filtrada por esse vendedor (não a lista geral de TABPRECO)
Ao salvar/alterar o itemValida se o par (CD_VENDEDOR, CD_TABPRECO) existe em TABPRECOVENDEDOR; se não existir, gera erro W-0000
Ao trocar o vendedor no pedido/NFPercorre itens já lançados e avisa quais tabelas não pertencem ao novo vendedor
Mensagens típicas"A Tabela de Preço: X não Está Cadastrada Para Este Vendedor. Verifique! [TFA027]" (MPD002/MPD081) e "A Tabela de Preço: X Não pertence a esse Vendedor! Verifique [TFA027]" (MNF002/MRC020)
Lógica Delphiif (CD_VENDEDOR preenchido) and (ParmFatur.Values['ST_VALIDATABVENDEDOR']='S') then SELECT FROM TABPRECOVENDEDOR WHERE CD_VENDEDOR=... AND CD_TABPRECO=...

Simulação passo a passo​

  1. Vá em MFA001 → aba Vendedor → "Valida Tabela Vendedor" = Sim
  2. Salve os parâmetros (F6)
  3. Em [TFA027] cadastre o vínculo: Vendedor 100 autorizado nas tabelas 1 e 2 apenas
  4. Abra um Pedido de Venda (MPD002) e informe o Vendedor = 100
  5. No grid de itens, posicione em CD_TABPRECO e pressione F9 → abre a pesquisa filtrada mostrando só 1 e 2
  6. Digite manualmente 3 em CD_TABPRECO e tente salvar → erro: "A Tabela de Preço: 3 não Está Cadastrada Para Este Vendedor. Verifique! [TFA027]"
  7. Volte e escolha 1 → item salva normalmente
  8. Agora troque o Vendedor no cabeçalho para 200 (que só possui tabela 3) → o sistema percorre os itens e avisa que a tabela 1 não pertence ao novo vendedor
  9. Repita o teste em uma NF de Saída (MNF002) - o comportamento é o mesmo; em MRC020 (geração de NF por Ordem de Recebimento) a validação ocorre no momento da confirmação

Resultado esperado: O usuário é obrigado a escolher uma tabela de preço que esteja explicitamente vinculada ao vendedor do documento em TABPRECOVENDEDOR, garantindo consistência entre política comercial do vendedor e a tabela aplicada.


N - Não​

O que fazDetalhe
Na tecla F9 em CD_TABPRECOAbre a lista genérica de tabelas de preço (função Lista_TabPreco) sem considerar o vendedor
Ao salvar/alterar o itemNão executa a validação em TABPRECOVENDEDOR; qualquer tabela de TABPRECO ativa é aceita
Ao trocar o vendedor no pedido/NFNão há verificação dos itens já lançados contra o novo vendedor
Lógica DelphiBloco if ParmFatur.Values['ST_VALIDATABVENDEDOR']='N' then Lista_TabPreco; (MPD002, MNF002, MPD052)
Restrição extraEm MNF002/MPD052 a regra N só dispara Lista_TabPreco quando ST_TABPRECO não é 'B' nem 'L' (há outras políticas de tabela que sobrescrevem o lookup)

Simulação passo a passo​

  1. MFA001 → "Valida Tabela Vendedor" = Não
  2. Salve os parâmetros (F6)
  3. Abra um Pedido (MPD002) com Vendedor 100 (vinculado apenas à tabela 1 em TFA027)
  4. No grid de itens, pressione F9 em CD_TABPRECO → abre todas as tabelas de preço ativas (lista geral)
  5. Escolha a tabela 3 (não vinculada ao vendedor) → item salva sem erro
  6. Troque o vendedor → nenhuma mensagem sobre tabelas incompatíveis
  7. Faça o mesmo em uma NF (MNF002) ou em uma NF por Ordem de Recebimento (MRC020) → comportamento idêntico, sem validação de vínculo

Resultado esperado: Qualquer tabela de preço cadastrada pode ser usada em qualquer documento, independente do vendedor. É o valor padrão ao inserir um novo registro em PARMFATUR.


Observações de Interação​

  • Condição obrigatória: A validação só dispara quando CD_VENDEDOR está preenchido no cabeçalho do documento. Se o documento não tem vendedor, o comportamento é equivalente a N (lista genérica / sem validação).
  • Mensagens amigáveis referenciam [TFA027]: Tela de manutenção do vínculo TABPRECOVENDEDOR. O operador final deve ser direcionado a ela para corrigir cadastros.
  • Pesquisa vs. digitação direta: Mesmo com S, se o usuário digitar manualmente um código de tabela no grid (sem usar F9), a validação ocorre no evento Validate do campo CD_TABPRECO (vide tabITEMNOTACD_TABPRECOValidate em UdmMNF002.pas e tabITEMPEDIDOCD_TABPRECOValidate em UdmMPD081.pas) - o erro W-0000 continua sendo levantado.
  • Interação com ST_TABPRECO: Em telas como MNF002 e MPD052, o bloco if ST_VALIDATABVENDEDOR='N' then Lista_TabPreco só é executado quando ST_TABPRECO NOT IN ('B','L'). Políticas B (por cliente) ou L (por lote) têm fluxo próprio que não passa por este parâmetro.
  • MNF026 (Troca/Garantia): O código de validação existe mas está comentado no fonte atual (UdmMNF026.pas linhas 4296-4307). A validação efetiva ocorre apenas no fluxo principal de NF.
  • MPD081 (Liberação de Pedidos): O parâmetro é lido via SELECT da tabela PEDIDO JOIN PARMFATUR (coluna PF.ST_VALIDATABVENDEDOR) e armazenado no dataset (tabPEDIDOST_VALIDATABVENDEDOR), não via ParmFatur.Values[...]. A validação usa o valor do registro corrente.
  • Não confundir com:
    • ST_VENDEDOR (veja) - bloqueia a alteração do vendedor e do grid de comissões, não valida tabelas de preço.
    • ST_VARIOSVENDEDORES (veja) - habilita rateio de comissão entre vários vendedores.
    • ST_TABPRECO (veja) - define a política principal de escolha de tabela de preço (por cliente, por produto, por grade etc.).

Tabela Comparativa Resumida​

ValorDescriçãoF9 em CD_TABPRECO (com vendedor)Valida par (Vendedor, TabPreco) ao salvar?Erros ao trocar vendedor?
SSimPesquisa TABPRECOVENDEDOR filtrada pelo vendedorSim (via SELECT FROM TABPRECOVENDEDOR)Sim - lista tabelas incompatíveis
NNãoLista genérica de tabelas (Lista_TabPreco)NãoNão

Independente do valor, sem CD_VENDEDOR preenchido no documento não há validação.


Referências no Código Fonte​

Definição do parâmetro (MFA001)​

  • source/MFA001/UMFA001.dfm linha 5267-5293 - ComboBox wwDBValidaTabelaVendedor (TwwDBComboBox) com DataField='ST_VALIDATABVENDEDOR' e Items.Strings = ('Sim'#9'S', 'Não'#9'N')
  • source/MFA001/UMFA001.dfm linha 5068-5080 - Label lbl1 com Caption = 'Valida Tabela Vendedor'
  • source/MFA001/UdmMFA001.pas linha 158 - tabPARMFATURST_VALIDATABVENDEDOR: TStringField
  • source/MFA001/UdmMFA001.pas linha 494 - AfterInsert: tabPARMFATURST_VALIDATABVENDEDOR.AsString := 'N'; (valor padrão)
  • source/MFA001/UdmMFA001.dfm linha 164, 1250-1255, 2389, 2552, 2770, 3044 - tabPARMFATUR inclui ST_VALIDATABVENDEDOR no SELECT / INSERT / UPDATE

Consumidores do parâmetro​

MPD002 - Pedido de Venda

  • source/MPD002/UMPD002.pas linha 3949 - if (CD_TABPRECO) and (ParmFatur.Values['ST_VALIDATABVENDEDOR']='N') then Lista_TabPreco;
  • source/MPD002/UMPD002.pas linha 3955 - ELSE IF (... ST_VALIDATABVENDEDOR='S' AND CD_VENDEDOR<>'' ) then Busca(TABPRECOVENDEDOR,...) (F9 filtra por vendedor)
  • source/MPD002/UdmMPD002.pas linha 2001 - if (CD_TABPRECO<>'' AND ST_VALIDATABVENDEDOR='S') then SELECT NM_PESSOA FROM VENDEDOR ... e percorre itens ao trocar vendedor
  • source/MPD002/UdmMPD002.pas linha 3262 - if (CD_VENDEDOR<>'' and ST_VALIDATABVENDEDOR='S') then SELECT CD_TABPRECO FROM TABPRECOVENDEDOR ... → gera JException W-0000 quando não existe
  • source/MPD002/UdmMPD002.pas linha 5755 - SELECT de PARMFATUR incluindo P.ST_VALIDATABVENDEDOR

MPD020 - Pedido Rápido

  • source/MPD020/UdmMPD020.pas linha 1704 - if (CD_VENDEDOR<>'' and ST_VALIDATABVENDEDOR='S') then SELECT FROM TABPRECOVENDEDOR ... → JException W-0000 quando não associada

MPD052 - Lançamento por Projeto

  • source/MPD052/ULancProjeto.pas linha 437 - F9 sobre item: só executa Lista_TabPreco quando ST_VALIDATABVENDEDOR='N' AND ST_TABPRECO NOT IN ('B','L')

MPD081 - Liberação de Pedidos

  • source/MPD081/UdmMPD081.pas linha 96 - tabPEDIDOST_VALIDATABVENDEDOR: TStringField
  • source/MPD081/UdmMPD081.pas linha 649 - if (CD_VENDEDOR<>'' and tabPEDIDOST_VALIDATABVENDEDOR.AsString='S') then SELECT FROM TABPRECOVENDEDOR ... → JException W-0000
  • source/MPD081/UdmMPD081.dfm linhas 91, 155, 403-410 - SELECT de PEDIDO com JOIN em PARMFATUR (PF.ST_VALIDATABVENDEDOR) e declaração do TField
  • source/MPD081/UMPD081.pas linhas 554, 595, 620, 658 - Construção dinâmica do SQL de consulta incluindo PF.ST_VALIDATABVENDEDOR e GROUP BY

MNF002 - Nota Fiscal Saída

  • source/MNF002/UMNF002.pas linha 5392 - F9 em CD_TABPRECO da NF: if (ST_VALIDATABVENDEDOR='N' AND ST_TABPRECO<>'B' AND <>'L') then Lista_TabPreco;
  • source/MNF002/UdmMNF002.pas linha 5747 - tabITEMNOTACD_TABPRECOValidate: if (CD_VENDEDOR<>'' and ST_VALIDATABVENDEDOR='S') then SELECT FROM TABPRECOVENDEDOR ... → erro "Não pertence a esse Vendedor"
  • source/MNF002/UdmMNF002.pas linha 6821 - Ao trocar vendedor: percorre ITEMNOTA acumulando tabelas sem vínculo para alertar o usuário
  • source/MNF002/UdmMNF002.pas linha 10502 - SELECT de PARMFATUR incluindo P.ST_VALIDATABVENDEDOR

MNF008 - NF Cupom/Contingência

  • source/MNF008/UdmMNF008.pas linha 767 - SELECT de PARMFATUR incluindo P.ST_VALIDATABVENDEDOR (carga do parâmetro)

MNF026 - Troca/Garantia

  • source/MNF026/UdmMNF026.pas linhas 4297-4307 - Bloco de validação ST_VALIDATABVENDEDOR='S' existe mas está comentado; apenas o cálculo de preço via RETORNA_PRECOITEM roda no fluxo atual

MRC020 - NF por Ordem de Recebimento

  • source/MRC020/UdmMRC020NFORDEM.pas linha 4360 - if (CD_VENDEDOR<>'' and ST_VALIDATABVENDEDOR='S') then SELECT CD_TABPRECO FROM TABPRECOVENDEDOR ... → JException W-0000 ("Não Pertence a Esse Vendedor")

MCO006 - Oficina/Contas

  • source/MCO006/UdmMCO006.pas linha 2111 - SELECT de PARMFATUR incluindo P.ST_VALIDATABVENDEDOR

Java (APIs REST)​

  • source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/JunsoftBuilder.java - referência ao campo no mapeamento de PARMFATUR
  • source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.java - SQL de leitura de PARMFATUR inclui ST_VALIDATABVENDEDOR

SQL​

  • Nenhuma stored procedure, view ou gatilho em Scripts/ referencia ST_VALIDATABVENDEDOR (confirmado por grep). A validação é 100% feita no cliente Delphi via consultas ad-hoc a TABPRECOVENDEDOR.

DDL​

  • docs/schema/tables/PARMFATUR.sql linha 119 - ST_VALIDATABVENDEDOR DOM_CHAR1 DEFAULT 'N' NOT NULL