Pular para o conteúdo principal

Obriga ter Vendedor no documento (Pedido/Orçamento/Nota)

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Aba "Vendedor" → GroupBox "Parâmetros de Vendedor" → Label "Obriga ter Vendedor" Tabela: PARMFATUR.ST_BLOQUEIOVENDEDOR Valor padrão: N (Não obriga)

Apesar do nome começar com "BLOQUEIO", este parâmetro não bloqueia um vendedor existente: ele torna obrigatório informar o vendedor (CD_VENDEDOR) em documentos de Pedido, Orçamento, Nota Fiscal e Ordem de Serviço antes de gravar. Funciona como uma validação de campo obrigatório. É complementar ao parâmetro ST_VENDEDOR (que trava alteração de vendedor já preenchido) e ao ST_VARIOSVENDEDORES (rateio múltiplo).

Telas impactadas​

MóduloCódigoComportamento
Pedido de VendaMPD002Antes de gravar, exige CD_VENDEDOR no cabeçalho (quando ST_VARIOSVENDEDORES = 'N') e, no rateio múltiplo, exige ao menos um vendedor no array Vendedores[]
Pedido RápidoMPD020Exige CD_VENDEDOR antes de gravar o pedido
OrçamentoMPD004Exige vendedor quando o valor é 'S' OU 'I' (único consumidor que aceita 'I' como gatilho)
O.S. de VendaMPD005Exige CD_VENDEDOR no grid de itens e no rateio agrupado
Origem Pedido MatrizMPD093Lê o parâmetro junto com ST_VARIOSVENDEDORES
Retorno NF RecebidaMPD011Seleciona o parâmetro para validação de devolução
NF de SaídaMNF002Exige CD_VENDEDOR na nota ao gravar; na geração a partir de pedido o parâmetro é temporariamente desligado para permitir o trânsito MNF015 → MNF002
NF Cupom/ContingênciaMNF008Lê o parâmetro junto com os demais
NF Terceiros (sem pedido)MNF017Lê o parâmetro via SELECT da PARMFATUR
NF Saída SimplificadaMNF026Exige CD_VENDEDOR em duas validações distintas
NF Complementar/ReemissãoMNF030Ao alterar pedido origem, exige que o pedido tenha vendedor informado
NF-e Modelo 65 (NFC-e)MNF032Exige CD_VENDEDOR ao gravar a nota (com ST_VARIOSVENDEDORES = 'N'); idem no rateio múltiplo
Importação NF via XMLMRC020Exige vendedor no rateio ao importar XML gerando NF
Ordem de Serviço OficinaMOF002Exige CD_VENDEDOR no item e puxa o vendedor do cabeçalho da OS para o item quando vazio
Parâmetros OficinaMOF001SELECT do parâmetro (ramo herdado; uso efetivo está comentado em UMOF001.pas linha 1953)
Pedido Oficina (legado)MOF006SELECT da PARMFATUR inclui o parâmetro
Cópia entre empresasCPD009INSERT/UPDATE/SELECT de PARMFATUR copiam ST_BLOQUEIOVENDEDOR
Parâmetros RecapadoraRCA006UPDATE/SELECT replica o valor
Rateio Agrupado VendedoresjVendedor/UVendedorAgrupadoConsome o valor e armazena em Param.St_BloqueioVendedor

Campos envolvidos​

CampoTabelaDescrição
CD_VENDEDORPEDIDO / NOTA / ORDEMSERVICO / SERVICOITEM / ITEMNOTAVENDEDOR / ITEMPEDIDOVENDEDORVendedor principal/item cuja ausência dispara a exceção quando o parâmetro = 'S' (ou 'I' em MPD004)
ST_VARIOSVENDEDORESPARMFATURQuando 'N', exige o vendedor no cabeçalho. Quando 'S', a obrigatoriedade migra para o array Vendedores[] do rateio

Opções disponíveis​

S - Sim (Faturamento/Orçamento)​

O que fazDetalhe
Obriga vendedor no Pedido?SIM (cabeçalho em MPD002/MPD020 se ST_VARIOSVENDEDORES='N'; rateio se ='S')
Obriga vendedor na Nota Fiscal?SIM (MNF002, MNF026, MNF030, MNF032, MRC020)
Obriga vendedor no Orçamento (MPD004)?SIM
Obriga vendedor na O.S. de Venda (MPD005)?SIM (por item e no rateio)
Obriga vendedor na O.S. Oficina (MOF002)?SIM (por item)
Destaca label CD_VENDEDOR em negrito?SIM em MPD002 e MNF032 (frmXXX.lblCD_VENDEDOR.Font.Style := [fsBold])
Lógica Delphiif (parmfatur.values['ST_BLOQUEIOVENDEDOR'] = 'S') → valida CD_VENDEDOR antes do Post/gravação

Simulação passo a passo​

  1. Vá em MFA001 → aba Vendedor → "Obriga ter Vendedor" = Sim(Faturamento/Orçamento)
  2. Salve os parâmetros (F6)
  3. Confirme que ST_VARIOSVENDEDORES = 'N' (ou deixe-o assim)
  4. Abra um Pedido (MPD002), preencha cliente/itens, deixe CD_VENDEDOR vazio
  5. Aperte F6/Gravar → erro W-0000: É Obrigatório informar um Vendedor! e o foco vai para edtCD_VENDEDOR
  6. Repita em uma NF (MNF002) sem vendedor → erro W-0000: É Obrigatório informar o Vendedor!
  7. Repita em um Orçamento (MPD004) → erro E-0000: É Obrigatório informar o Vendedor
  8. Repita em uma O.S. (MPD005) com item sem vendedor → erro W-2005: O item ... não possui Vendedor
  9. Em MFA001, habilite também ST_VARIOSVENDEDORES='S'. Agora abra um pedido, não informe nenhum vendedor no grid de rateio → ao tentar gravar aparece W-0000: Operação Cancelada! É Obrigado Informar os Vendedores

Resultado esperado: Nenhum documento de saída é gravado sem vendedor. A exceção é tratada localmente em cada módulo (com o código de mensagem específico do módulo). Em MNF002, quando a nota é gerada a partir de um pedido (origem MNF015), o próprio módulo desliga temporariamente o parâmetro em memória (parmfatur.values['ST_BLOQUEIOVENDEDOR'] := 'N') e religa depois — ver UMNF002.pas linhas 745-763.


N - Não​

O que fazDetalhe
Obriga vendedor em qualquer documento?Não (em nenhum módulo)
Label CD_VENDEDOR em negrito?Não
Validação pré-PostTodos os if ST_BLOQUEIOVENDEDOR = 'S' caem no else e deixam passar

Simulação passo a passo​

  1. MFA001 → "Obriga ter Vendedor" = Não
  2. Salve os parâmetros (F6)
  3. Abra um Pedido (MPD002), preencha cliente/itens, não informe CD_VENDEDOR
  4. Aperte F6 → pedido é gravado normalmente, sem erro
  5. Abra uma NF (MNF002)/Orçamento/O.S. sem vendedor → gravação livre
  6. Esta é a configuração padrão ao criar um novo registro no MFA001 (ver AfterInsert em UdmMFA001.pas linha 478: tabPARMFATURST_BLOQUEIOVENDEDOR.AsString := 'N';)

Resultado esperado: Documentos podem ser gravados sem vendedor. Útil para empresas que não trabalham com comissionamento ou onde o vendedor é opcional.


I - Sim (Orçamento-MPD004)​

O que fazDetalhe
Obriga vendedor no Orçamento (MPD004)?SIM
Obriga vendedor em Pedido/NF/O.S. de Venda?Não (os demais módulos testam estritamente = 'S')
Consumidor que reconhece este valorApenas MPD004 — código testa iST_BLOQUEIOVENDEDOR = 'I' OR 'S'
Lógica Delphiif (iST_BLOQUEIOVENDEDOR = 'I') or (iST_BLOQUEIOVENDEDOR = 'S') then valida vendedor no orçamento

Simulação passo a passo​

  1. MFA001 → "Obriga ter Vendedor" = Sim(Orçamento-MPD004)
  2. Salve os parâmetros (F6)
  3. Abra um Orçamento (MPD004), preencha cliente/itens, deixe CD_VENDEDOR vazio
  4. Aperte F6 → erro E-0000: É Obrigatório informar o Vendedor! (validado em UdmMPD004.pas linha 1210)
  5. No rateio múltiplo do orçamento sem vendedores → erro E-0000: Operação Cancelada! É Obrigado Informar os Vendedores (UMPD004.pas linha 787-789)
  6. Abra um Pedido (MPD002) sem vendedor → grava normalmente (o MPD002 não reconhece 'I', só 'S')
  7. Abra uma NF (MNF002) sem vendedor → grava normalmente

Resultado esperado: Obrigatoriedade de vendedor restrita ao Orçamento, sem impactar a rotina de Pedido e Nota. Útil quando o cliente precisa segregar a geração de orçamento (onde vendedor é mandatório) da emissão de pedido/nota (onde é opcional).


Observações de Interação​

  • Nome do parâmetro é enganoso: "BLOQUEIOVENDEDOR" sugere travar alteração, mas na prática a semântica é "obrigar informar vendedor". O comentário em UMNF002.pas linha 743 confirma a intenção: // Verifica se o Parametro Obriga Vendedor está ativo. Para travar um vendedor já preenchido use ST_VENDEDOR.
  • Valor 'I' é proprietário do MPD004: Apenas o Orçamento testa o valor 'I'. Em todos os demais módulos o valor 'I' é tratado igual a 'N' (não valida), porque o teste é sempre = 'S' estrito. Use esta opção quando quiser obrigar vendedor somente no orçamento.
  • Interação com ST_VARIOSVENDEDORES: Quando o rateio múltiplo está ativo, a validação muda de lugar:
    • ST_VARIOSVENDEDORES = 'N' → testa Trim(tab...CD_VENDEDOR.AsString) = '' antes de Post
    • ST_VARIOSVENDEDORES = 'S' → testa Vendedores[0].Cd_Vendedor = '-1' (array de rateio vazio)
  • MNF002 desliga temporariamente o parâmetro: Quando uma NF é gerada a partir de pedido (origem MNF015), o módulo salva o estado, zera parmfatur.values['ST_BLOQUEIOVENDEDOR'] := 'N', executa o trânsito e restaura 'S' no final. Veja UMNF002.pas linhas 745-763. É uma exceção controlada para permitir que o pedido passe pelo módulo antes da validação final.
  • MNF030 valida o pedido origem: Em devolução/reemissão, se o parâmetro estiver 'S', o módulo exige que o pedido origem tenha vendedor (não o documento sendo alterado). Ver UMNF030.pas linhas 802-804.
  • MOF002 propaga vendedor do cabeçalho: Se o parâmetro = 'S' e o item não tem vendedor, ele é herdado automaticamente de tabORDEMSERVICOCD_VENDEDOR antes da validação (UdmMOF002.pas linhas 1126-1129).
  • Comentário em MOF001: No UMOF001.pas linha 1953 há um bloco comentado //(ParmFatur.Values['ST_BLOQUEIOVENDEDOR'] = 'S')) — o módulo migrou a regra para PARMOFICINA.ST_OBRIGAVENDEDOR (valores 'P'/'S'), mas a coluna ainda é lida via SELECT por herança.
  • Não há stored procedures: O grep em Scripts/ não retornou ocorrências. A regra de obrigatoriedade é 100% feita em código Delphi (camada de aplicação), não há trigger nem procedure validando isso no banco.
  • Usado também pelo Java (JunsoftWebAPI): Consultado em source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.java e JunsoftBuilder.java — a API REST também respeita o parâmetro ao aceitar pedidos/notas do portal web.

Tabela Comparativa Resumida​

ValorDescriçãoMPD002 PedidoMPD020 Pedido RápidoMPD004 OrçamentoMPD005 O.S. VendaMOF002 O.S. OficinaMNF002/026/030/032 NFMRC020 Import NF
SSim (Faturamento/Orçamento)ObrigaObrigaObrigaObrigaObrigaObrigaObriga
NNãoLivreLivreLivreLivreLivreLivreLivre
ISim (Orçamento-MPD004)LivreLivreObrigaLivreLivreLivreLivre

Em todos os módulos a validação dispara apenas no momento do Post/Gravar. Deixar o campo vazio enquanto edita não gera erro; o bloqueio é em BeforePost/botão Gravar.


Referências no Código Fonte​

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

  • source/MFA001/UMFA001.dfm linha 5239-5266 - ComboBox cmbST_BLOQUEIO (TwwDBComboBox) com DataField = 'ST_BLOQUEIOVENDEDOR' e Items.Strings = ('Sim(Faturamento/Orçamento)'#9'S', 'Não'#9'N', 'Sim(Orçamento-MPD004)'#9'I')
  • source/MFA001/UMFA001.dfm linha 5054-5066 - Label lbl54 (Caption = 'Obriga ter Vendedor', Top=22) vinculado ao combo
  • source/MFA001/UMFA001.dfm linha 5024-5025 - TabSheet Vendedor / Caption 'Vendedor'
  • source/MFA001/UMFA001.dfm linha 5027-5039 - GroupBox9 com Caption 'Parâmetros de Vendedor'
  • source/MFA001/UdmMFA001.pas linha 126 - Declaração tabPARMFATURST_BLOQUEIOVENDEDOR: TStringField
  • source/MFA001/UdmMFA001.pas linha 478 - AfterInsert: tabPARMFATURST_BLOQUEIOVENDEDOR.Asstring := 'N'; (valor padrão)
  • source/MFA001/UdmMFA001.dfm linhas 131, 1076-1079, 2372, 2528, 2741, 3011 - tabPARMFATUR SELECT/INSERT/UPDATE incluem ST_BLOQUEIOVENDEDOR

Consumidores do parâmetro​

MPD002 - Pedido de Venda

  • source/MPD002/UdmMPD002.pas linha 799 - if (parmfatur.values['ST_BLOQUEIOVENDEDOR'] = 'S') and (ST_VARIOSVENDEDORES <> 'S') then lblCD_VENDEDOR.Font.Style := [fsBold]
  • source/MPD002/UdmMPD002.pas linha 1443-1448 - BeforePost: exige CD_VENDEDOR quando parâmetro = 'S' e ST_VARIOSVENDEDORES <> 'S' → W-0000: É Obrigatório informar um Vendedor!
  • source/MPD002/UdmMPD002.pas linha 5742 - SELECT de PARMFATUR incluindo P.ST_BLOQUEIOVENDEDOR
  • source/MPD002/UMPD002.pas linha 2625-2627 - Valida Vendedores[0].Cd_Vendedor = '-1' no rateio múltiplo → W-0000: Operação Cancelada! É Obrigado Informar os Vendedores

MPD020 - Pedido Rápido

  • source/MPD020/UdmMPD020.pas linha 240 - Declaração local IST_BLOQUEIOVENDEDOR: string
  • source/MPD020/UdmMPD020.pas linha 322 - SELECT incluindo ST_BLOQUEIOVENDEDOR
  • source/MPD020/UdmMPD020.pas linha 362 - Atribuição dmMPD020.IST_BLOQUEIOVENDEDOR := Resultado[25]
  • source/MPD020/UdmMPD020.pas linha 852-855 - if (iST_BLOQUEIOVENDEDOR = 'S') and CD_VENDEDOR vazio → exceção obrigatória

MPD004 - Orçamento (único que aceita 'I')

  • source/MPD004/UdmMPD004.pas linha 316 - Declaração iST_BLOQUEIOVENDEDOR: String
  • source/MPD004/UdmMPD004.pas linha 373 - SELECT incluindo ST_BLOQUEIOVENDEDOR
  • source/MPD004/UdmMPD004.pas linha 392 - Atribuição dmMPD004.iST_BLOQUEIOVENDEDOR := Resultado[15]
  • source/MPD004/UdmMPD004.pas linha 1210-1214 - if ((iST_BLOQUEIOVENDEDOR = 'I') or (iST_BLOQUEIOVENDEDOR = 'S')) and (iST_VARIOSVENDEDORES = 'N') valida CD_VENDEDOR → E-0000: É Obrigatório informar o Vendedor
  • source/MPD004/UMPD004.pas linha 786-789 - Rateio múltiplo: if Vendedores[0].Cd_Vendedor = '-1' and (iST_BLOQUEIOVENDEDOR in ['I','S']) → E-0000: Operação Cancelada! É Obrigado Informar os Vendedores

MPD005 - O.S. de Venda

  • source/MPD005/UdmMPD005.pas linha 246 - Declaração iST_BLOQUEIOVENDEDOR: string
  • source/MPD005/UdmMPD005.pas linha 376 - SELECT incluindo ST_BLOQUEIOVENDEDOR
  • source/MPD005/UdmMPD005.pas linha 400 - Atribuição dmMPD005.iST_BLOQUEIOVENDEDOR := Resultado[16]
  • source/MPD005/UdmMPD005.pas linha 1439-1443 - Valida CD_VENDEDOR do item antes do Post → W-2051
  • source/MPD005/UMPD005.pas linha 672-675 - Iteração nos itens: CD_VENDEDOR vazio + iST_BLOQUEIOVENDEDOR = 'S' → W-2005: item ... não possui Vendedor
  • source/MPD005/UMPD005.pas linhas 780-782, 899-901 - Rateio agrupado por item → W-2024: É Obrigado Informar os Vendedores

MPD011 - Retorno NF Recebida

  • source/MPD011/UdmMPD011.pas linha 1583 - SELECT de PARMFATUR incluindo PF.ST_BLOQUEIOVENDEDOR (consulta para validações de devolução)

MPD093 - Origem Pedido Matriz

  • source/MPD093/UdmMPD093.pas linha 236 - SELECT SELECT CD_CONDPAGTO, CD_FORMAPAGTO, ST_VARIOSVENDEDORES, ST_BLOQUEIOVENDEDOR, CD_MOVSAIDA, ST_SOLICITALOCALPED FROM PARMFATUR

MNF002 - Nota Fiscal Saída

  • source/MNF002/UMNF002.pas linha 745-749 - Ao entrar vindo de MNF015 (pedido), desliga parmfatur.values['ST_BLOQUEIOVENDEDOR'] := 'N' e marca BloqueiaVendedor := True para religar depois
  • source/MNF002/UMNF002.pas linha 760-763 - Restaura parmfatur.values['ST_BLOQUEIOVENDEDOR'] := 'S' após o trânsito
  • source/MNF002/UMNF002.pas linha 3456-3462 - Antes do Post: CD_VENDEDOR vazio + ST_BLOQUEIOVENDEDOR = 'S' + ST_VARIOSVENDEDORES = 'N' → W-0000: É Obrigatório informar o Vendedor!
  • source/MNF002/UdmMNF002.pas linha 2786-2788 - Rateio múltiplo: Vendedores[0].Cd_Vendedor = '-1' + ST_BLOQUEIOVENDEDOR = 'S' → W-0000: Operação Cancelada! É Obrigado Informar os Vendedores

MNF008 - NF Cupom/Contingência

  • source/MNF008/UdmMNF008.pas linha 761 - SELECT de PARMFATUR incluindo P.ST_BLOQUEIOVENDEDOR

MNF017 - NF Terceiros

  • source/MNF017/UMNF017.pas linha 163 - SELECT P.ST_BLOQUEIOVENDEDOR para uso futuro na validação

MNF026 - NF Saída Simplificada

  • source/MNF026/UMNF026.pas linha 624-630 - Antes do Post: CD_VENDEDOR vazio + ST_BLOQUEIOVENDEDOR = 'S' → W-1983
  • source/MNF026/UMNF026.pas linha 674-682 - Validação duplicada antes de nova nota → W-0127

MNF030 - NF Complementar/Reemissão

  • source/MNF030/UMNF030.pas linha 802-804 - Validação de alteração: ST_BLOQUEIOVENDEDOR = 'S' + vendedor do pedido vazio → exceção "[Pedido X] não possui Vendedor Informado no Pedido"

MNF032 - NFC-e (Modelo 65)

  • source/MNF032/UdmMNF032.pas linha 1180-1183 - Se 'S' + ST_VARIOSVENDEDORES='N', coloca lblCD_VENDEDOR em negrito
  • source/MNF032/UdmMNF032.pas linha 1494-1497 - Antes do Post: valida CD_VENDEDOR da nota
  • source/MNF032/UMNF032.pas linha 1323-1326 - Rateio múltiplo: Vendedores[0].Cd_Vendedor = '-1' + ST_BLOQUEIOVENDEDOR = 'S' → W-0000
  • source/MNF032/UMNF032.pas linha 1471-1474 - Validação no salvamento direto → W-0000: É Obrigatório informar o Vendedor !

MRC020 - Import NF via XML

  • source/MRC020/UdmMRC020NFORDEM.pas linha 2555-2557 - Rateio na geração: Vendedores[0].Cd_Vendedor = '-1' + ST_BLOQUEIOVENDEDOR = 'S' → W-0000: Operação Cancelada! É Obrigado Informar os Vendedores

MOF002 - O.S. Oficina

  • source/MOF002/UdmMOF002.pas linha 193 - Declaração iST_BLOQUEIOVENDEDOR: String
  • source/MOF002/UdmMOF002.pas linha 297 - SELECT incluindo ST_BLOQUEIOVENDEDOR
  • source/MOF002/UdmMOF002.pas linha 320 - Atribuição dmMOF002.iST_BLOQUEIOVENDEDOR := Resultado[16]
  • source/MOF002/UdmMOF002.pas linha 1093-1096 - Antes do Post: valida CD_VENDEDOR do item → W-0000: É Obrigatório Informar um Vendedor!
  • source/MOF002/UdmMOF002.pas linha 1126-1130 - Herda CD_VENDEDOR do cabeçalho quando item vazio

MOF001 - Parâmetros Oficina

  • source/MOF001/UdmMOF001.pas linha 725 - SELECT incluindo ST_BLOQUEIOVENDEDOR (herdado)
  • source/MOF001/UMOF001.pas linha 1953 - Referência comentada //(ParmFatur.Values['ST_BLOQUEIOVENDEDOR'] = 'S')) — a validação migrou para PARMOFICINA.ST_OBRIGAVENDEDOR

MOF006 - Pedido Oficina (legado)

  • source/MOF006/UdmMOF006.pas linha 298 - SELECT incluindo ST_BLOQUEIOVENDEDOR

jVendedor - Rateio Agrupado de Vendedores

  • source/jVendedor/UVendedorAgrupado.pas linha 1199 - SELECT incluindo ST_BLOQUEIOVENDEDOR no record de parâmetros
  • source/jVendedor/UVendedorAgrupado.pas linha 1211 - Atribuição Param.St_BloqueioVendedor := Resultado[4]

MCO006 - Cotação

  • source/MCO006/UdmMCO006.pas linha 2105 - SELECT de PARMFATUR incluindo P.ST_BLOQUEIOVENDEDOR

SQL​

  • Não há stored procedures em Scripts/ referenciando PARMFATUR.ST_BLOQUEIOVENDEDOR. A validação de obrigatoriedade é inteiramente feita na camada de aplicação Delphi.

Cópia entre empresas e integrações​

  • source/CPD009/UdmCPD009.dfm linhas 485, 589 - Utilitário de cópia de PARMFATUR entre empresas; UPDATE/SELECT incluem ST_BLOQUEIOVENDEDOR
  • source/RCA006/UdmRCA006.dfm linhas 3234, 3338 - Parâmetros Recapadora: UPDATE/SELECT replicam ST_BLOQUEIOVENDEDOR
  • source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.java - API REST espelha ST_BLOQUEIOVENDEDOR em DTO de parâmetros
  • source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/JunsoftBuilder.java - Construtor Java lê o parâmetro ao montar regras do portal