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ódulo | Código | Papel | Descrição |
|---|---|---|---|
| Pedido de Venda | MPD002 | Consumidor | F9 em CD_TABPRECO filtra por vendedor; valida tabela x vendedor no salvamento |
| Pedido Rápido | MPD020 | Consumidor | Valida se a tabela de preço do item pertence ao vendedor do pedido |
| Liberação de Pedidos | MPD081 | Consumidor | Carrega ST_VALIDATABVENDEDOR no dataset do pedido e valida na alteração da tabela |
| Lançamento por Projeto (MPD052) | MPD052 | Consumidor | F9 em tabela de preço só abre lookup genérico quando ST_VALIDATABVENDEDOR='N' |
| NF Saída | MNF002 | Consumidor | F9 em CD_TABPRECO filtra por vendedor; valida consistência no salvamento |
| NF Troca/Garantia (MNF026) | MNF026 | Consumidor | Lógica equivalente à MNF002 (bloco comentado no código atual) |
| NF Cupom/Contingência | MNF008 | Leitor | Inclui o parâmetro no SELECT de PARMFATUR |
| NF por Ordem de Recebimento | MRC020 | Consumidor | Valida se CD_TABPRECO do item pertence ao vendedor da nota |
| Contas a Receber / Oficina | MCO006 | Leitor | Inclui ST_VALIDATABVENDEDOR no carregamento de PARMFATUR |
Campos envolvidos
| Campo | Tabela | Descrição |
|---|---|---|
CD_VENDEDOR | PEDIDO / NOTA | Vendedor do cabeçalho do documento; condição obrigatória para aplicar a validação |
CD_TABPRECO | ITEMPEDIDO / ITEMNOTA | Tabela de preço do item a ser validada |
CD_VENDEDOR + CD_TABPRECO | TABPRECOVENDEDOR | Vínculo entre vendedor e tabela(s) de preço permitidas |
DS_TABPRECO | TABPRECO | Usado na mensagem de erro / listagem de tabelas inválidas |
Procedures e tabelas relacionadas
TABPRECOVENDEDOR- tabela de associação (vendedor, tabela de preço). QuandoST_VALIDATABVENDEDOR='S', toda validação/filtro consulta esta tabela.- Pesquisa
TABPRECOVENDEDOR(framework jPesquisa) - invocada viaBusca(transaction, 'TABPRECOVENDEDOR', parm)com oCD_VENDEDORcomo parâmetro para filtrar o lookup F9. - Nenhuma stored procedure em
Scripts/referencia este parâmetro diretamente (confirmado por grep emScripts/).
Opções disponíveis
S - Sim
| O que faz | Detalhe |
|---|---|
Na tecla F9 em CD_TABPRECO | Se 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 item | Valida se o par (CD_VENDEDOR, CD_TABPRECO) existe em TABPRECOVENDEDOR; se não existir, gera erro W-0000 |
| Ao trocar o vendedor no pedido/NF | Percorre 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 Delphi | if (CD_VENDEDOR preenchido) and (ParmFatur.Values['ST_VALIDATABVENDEDOR']='S') then SELECT FROM TABPRECOVENDEDOR WHERE CD_VENDEDOR=... AND CD_TABPRECO=... |
Simulação passo a passo
- Vá em MFA001 → aba Vendedor → "Valida Tabela Vendedor" = Sim
- Salve os parâmetros (F6)
- Em [TFA027] cadastre o vínculo: Vendedor
100autorizado nas tabelas1e2apenas - Abra um Pedido de Venda (MPD002) e informe o Vendedor = 100
- No grid de itens, posicione em
CD_TABPRECOe pressione F9 → abre a pesquisa filtrada mostrando só1e2 - Digite manualmente
3emCD_TABPRECOe tente salvar → erro: "A Tabela de Preço: 3 não Está Cadastrada Para Este Vendedor. Verifique! [TFA027]" - Volte e escolha
1→ item salva normalmente - Agora troque o Vendedor no cabeçalho para
200(que só possui tabela3) → o sistema percorre os itens e avisa que a tabela1não pertence ao novo vendedor - 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 faz | Detalhe |
|---|---|
Na tecla F9 em CD_TABPRECO | Abre a lista genérica de tabelas de preço (função Lista_TabPreco) sem considerar o vendedor |
| Ao salvar/alterar o item | Não executa a validação em TABPRECOVENDEDOR; qualquer tabela de TABPRECO ativa é aceita |
| Ao trocar o vendedor no pedido/NF | Não há verificação dos itens já lançados contra o novo vendedor |
| Lógica Delphi | Bloco if ParmFatur.Values['ST_VALIDATABVENDEDOR']='N' then Lista_TabPreco; (MPD002, MNF002, MPD052) |
| Restrição extra | Em 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
- MFA001 → "Valida Tabela Vendedor" = Não
- Salve os parâmetros (F6)
- Abra um Pedido (MPD002) com Vendedor
100(vinculado apenas à tabela1em TFA027) - No grid de itens, pressione F9 em
CD_TABPRECO→ abre todas as tabelas de preço ativas (lista geral) - Escolha a tabela
3(não vinculada ao vendedor) → item salva sem erro - Troque o vendedor → nenhuma mensagem sobre tabelas incompatíveis
- 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_VENDEDORestá preenchido no cabeçalho do documento. Se o documento não tem vendedor, o comportamento é equivalente aN(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 eventoValidatedo campoCD_TABPRECO(videtabITEMNOTACD_TABPRECOValidateemUdmMNF002.pasetabITEMPEDIDOCD_TABPRECOValidateemUdmMPD081.pas) - o erroW-0000continua sendo levantado. - Interação com
ST_TABPRECO: Em telas como MNF002 e MPD052, o blocoif ST_VALIDATABVENDEDOR='N' then Lista_TabPrecosó é executado quandoST_TABPRECO NOT IN ('B','L'). PolíticasB(por cliente) ouL(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.paslinhas 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
PEDIDOJOINPARMFATUR(colunaPF.ST_VALIDATABVENDEDOR) e armazenado no dataset (tabPEDIDOST_VALIDATABVENDEDOR), não viaParmFatur.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
| Valor | Descrição | F9 em CD_TABPRECO (com vendedor) | Valida par (Vendedor, TabPreco) ao salvar? | Erros ao trocar vendedor? |
|---|---|---|---|---|
| S | Sim | Pesquisa TABPRECOVENDEDOR filtrada pelo vendedor | Sim (via SELECT FROM TABPRECOVENDEDOR) | Sim - lista tabelas incompatíveis |
| N | Não | Lista genérica de tabelas (Lista_TabPreco) | Não | Não |
Independente do valor, sem
CD_VENDEDORpreenchido no documento não há validação.
Referências no Código Fonte
Definição do parâmetro (MFA001)
source/MFA001/UMFA001.dfmlinha 5267-5293 - ComboBoxwwDBValidaTabelaVendedor(TwwDBComboBox) comDataField='ST_VALIDATABVENDEDOR'eItems.Strings = ('Sim'#9'S', 'Não'#9'N')source/MFA001/UMFA001.dfmlinha 5068-5080 - Labellbl1comCaption = 'Valida Tabela Vendedor'source/MFA001/UdmMFA001.paslinha 158 -tabPARMFATURST_VALIDATABVENDEDOR: TStringFieldsource/MFA001/UdmMFA001.paslinha 494 -AfterInsert:tabPARMFATURST_VALIDATABVENDEDOR.AsString := 'N';(valor padrão)source/MFA001/UdmMFA001.dfmlinha 164, 1250-1255, 2389, 2552, 2770, 3044 -tabPARMFATURincluiST_VALIDATABVENDEDORno SELECT / INSERT / UPDATE
Consumidores do parâmetro
MPD002 - Pedido de Venda
source/MPD002/UMPD002.paslinha 3949 -if (CD_TABPRECO) and (ParmFatur.Values['ST_VALIDATABVENDEDOR']='N') then Lista_TabPreco;source/MPD002/UMPD002.paslinha 3955 -ELSE IF (... ST_VALIDATABVENDEDOR='S' AND CD_VENDEDOR<>'' ) then Busca(TABPRECOVENDEDOR,...)(F9 filtra por vendedor)source/MPD002/UdmMPD002.paslinha 2001 -if (CD_TABPRECO<>'' AND ST_VALIDATABVENDEDOR='S') then SELECT NM_PESSOA FROM VENDEDOR ... e percorre itens ao trocar vendedorsource/MPD002/UdmMPD002.paslinha 3262 -if (CD_VENDEDOR<>'' and ST_VALIDATABVENDEDOR='S') then SELECT CD_TABPRECO FROM TABPRECOVENDEDOR ...→ geraJException W-0000quando não existesource/MPD002/UdmMPD002.paslinha 5755 - SELECT de PARMFATUR incluindoP.ST_VALIDATABVENDEDOR
MPD020 - Pedido Rápido
source/MPD020/UdmMPD020.paslinha 1704 -if (CD_VENDEDOR<>'' and ST_VALIDATABVENDEDOR='S') then SELECT FROM TABPRECOVENDEDOR ...→JException W-0000quando não associada
MPD052 - Lançamento por Projeto
source/MPD052/ULancProjeto.paslinha 437 - F9 sobre item: só executaLista_TabPrecoquandoST_VALIDATABVENDEDOR='N' AND ST_TABPRECO NOT IN ('B','L')
MPD081 - Liberação de Pedidos
source/MPD081/UdmMPD081.paslinha 96 -tabPEDIDOST_VALIDATABVENDEDOR: TStringFieldsource/MPD081/UdmMPD081.paslinha 649 -if (CD_VENDEDOR<>'' and tabPEDIDOST_VALIDATABVENDEDOR.AsString='S') then SELECT FROM TABPRECOVENDEDOR ...→JException W-0000source/MPD081/UdmMPD081.dfmlinhas 91, 155, 403-410 - SELECT de PEDIDO com JOIN em PARMFATUR (PF.ST_VALIDATABVENDEDOR) e declaração do TFieldsource/MPD081/UMPD081.paslinhas 554, 595, 620, 658 - Construção dinâmica do SQL de consulta incluindoPF.ST_VALIDATABVENDEDORe GROUP BY
MNF002 - Nota Fiscal Saída
source/MNF002/UMNF002.paslinha 5392 - F9 emCD_TABPRECOda NF:if (ST_VALIDATABVENDEDOR='N' AND ST_TABPRECO<>'B' AND <>'L') then Lista_TabPreco;source/MNF002/UdmMNF002.paslinha 5747 -tabITEMNOTACD_TABPRECOValidate:if (CD_VENDEDOR<>'' and ST_VALIDATABVENDEDOR='S') then SELECT FROM TABPRECOVENDEDOR ...→ erro "Não pertence a esse Vendedor"source/MNF002/UdmMNF002.paslinha 6821 - Ao trocar vendedor: percorreITEMNOTAacumulando tabelas sem vínculo para alertar o usuáriosource/MNF002/UdmMNF002.paslinha 10502 - SELECT de PARMFATUR incluindoP.ST_VALIDATABVENDEDOR
MNF008 - NF Cupom/Contingência
source/MNF008/UdmMNF008.paslinha 767 - SELECT de PARMFATUR incluindoP.ST_VALIDATABVENDEDOR(carga do parâmetro)
MNF026 - Troca/Garantia
source/MNF026/UdmMNF026.paslinhas 4297-4307 - Bloco de validaçãoST_VALIDATABVENDEDOR='S'existe mas está comentado; apenas o cálculo de preço viaRETORNA_PRECOITEMroda no fluxo atual
MRC020 - NF por Ordem de Recebimento
source/MRC020/UdmMRC020NFORDEM.paslinha 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.paslinha 2111 - SELECT de PARMFATUR incluindoP.ST_VALIDATABVENDEDOR
Java (APIs REST)
source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/JunsoftBuilder.java- referência ao campo no mapeamento de PARMFATURsource/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.java- SQL de leitura de PARMFATUR incluiST_VALIDATABVENDEDOR
SQL
- Nenhuma stored procedure, view ou gatilho em
Scripts/referenciaST_VALIDATABVENDEDOR(confirmado por grep). A validação é 100% feita no cliente Delphi via consultas ad-hoc aTABPRECOVENDEDOR.
DDL
docs/schema/tables/PARMFATUR.sqllinha 119 -ST_VALIDATABVENDEDOR DOM_CHAR1 DEFAULT 'N' NOT NULL