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_BLOQUEIOVENDEDORValor 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ódulo | Código | Comportamento |
|---|---|---|
| Pedido de Venda | MPD002 | Antes 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ápido | MPD020 | Exige CD_VENDEDOR antes de gravar o pedido |
| Orçamento | MPD004 | Exige vendedor quando o valor é 'S' OU 'I' (único consumidor que aceita 'I' como gatilho) |
| O.S. de Venda | MPD005 | Exige CD_VENDEDOR no grid de itens e no rateio agrupado |
| Origem Pedido Matriz | MPD093 | Lê o parâmetro junto com ST_VARIOSVENDEDORES |
| Retorno NF Recebida | MPD011 | Seleciona o parâmetro para validação de devolução |
| NF de Saída | MNF002 | Exige 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ência | MNF008 | Lê o parâmetro junto com os demais |
| NF Terceiros (sem pedido) | MNF017 | Lê o parâmetro via SELECT da PARMFATUR |
| NF Saída Simplificada | MNF026 | Exige CD_VENDEDOR em duas validações distintas |
| NF Complementar/Reemissão | MNF030 | Ao alterar pedido origem, exige que o pedido tenha vendedor informado |
| NF-e Modelo 65 (NFC-e) | MNF032 | Exige CD_VENDEDOR ao gravar a nota (com ST_VARIOSVENDEDORES = 'N'); idem no rateio múltiplo |
| Importação NF via XML | MRC020 | Exige vendedor no rateio ao importar XML gerando NF |
| Ordem de Serviço Oficina | MOF002 | Exige CD_VENDEDOR no item e puxa o vendedor do cabeçalho da OS para o item quando vazio |
| Parâmetros Oficina | MOF001 | SELECT do parâmetro (ramo herdado; uso efetivo está comentado em UMOF001.pas linha 1953) |
| Pedido Oficina (legado) | MOF006 | SELECT da PARMFATUR inclui o parâmetro |
| Cópia entre empresas | CPD009 | INSERT/UPDATE/SELECT de PARMFATUR copiam ST_BLOQUEIOVENDEDOR |
| Parâmetros Recapadora | RCA006 | UPDATE/SELECT replica o valor |
| Rateio Agrupado Vendedores | jVendedor/UVendedorAgrupado | Consome o valor e armazena em Param.St_BloqueioVendedor |
Campos envolvidos
| Campo | Tabela | Descrição |
|---|---|---|
CD_VENDEDOR | PEDIDO / NOTA / ORDEMSERVICO / SERVICOITEM / ITEMNOTAVENDEDOR / ITEMPEDIDOVENDEDOR | Vendedor principal/item cuja ausência dispara a exceção quando o parâmetro = 'S' (ou 'I' em MPD004) |
ST_VARIOSVENDEDORES | PARMFATUR | Quando '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 faz | Detalhe |
|---|---|
| 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 Delphi | if (parmfatur.values['ST_BLOQUEIOVENDEDOR'] = 'S') → valida CD_VENDEDOR antes do Post/gravação |
Simulação passo a passo
- Vá em MFA001 → aba Vendedor → "Obriga ter Vendedor" = Sim(Faturamento/Orçamento)
- Salve os parâmetros (F6)
- Confirme que
ST_VARIOSVENDEDORES = 'N'(ou deixe-o assim) - Abra um Pedido (MPD002), preencha cliente/itens, deixe
CD_VENDEDORvazio - Aperte F6/Gravar → erro
W-0000: É Obrigatório informar um Vendedor!e o foco vai paraedtCD_VENDEDOR - Repita em uma NF (MNF002) sem vendedor → erro
W-0000: É Obrigatório informar o Vendedor! - Repita em um Orçamento (MPD004) → erro
E-0000: É Obrigatório informar o Vendedor - Repita em uma O.S. (MPD005) com item sem vendedor → erro
W-2005: O item ... não possui Vendedor - Em MFA001, habilite também
ST_VARIOSVENDEDORES='S'. Agora abra um pedido, não informe nenhum vendedor no grid de rateio → ao tentar gravar apareceW-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 faz | Detalhe |
|---|---|
| Obriga vendedor em qualquer documento? | Não (em nenhum módulo) |
Label CD_VENDEDOR em negrito? | Não |
| Validação pré-Post | Todos os if ST_BLOQUEIOVENDEDOR = 'S' caem no else e deixam passar |
Simulação passo a passo
- MFA001 → "Obriga ter Vendedor" = Não
- Salve os parâmetros (F6)
- Abra um Pedido (MPD002), preencha cliente/itens, não informe
CD_VENDEDOR - Aperte F6 → pedido é gravado normalmente, sem erro
- Abra uma NF (MNF002)/Orçamento/O.S. sem vendedor → gravação livre
- Esta é a configuração padrão ao criar um novo registro no MFA001 (ver
AfterInsertemUdmMFA001.paslinha 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 faz | Detalhe |
|---|---|
| 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 valor | Apenas MPD004 — código testa iST_BLOQUEIOVENDEDOR = 'I' OR 'S' |
| Lógica Delphi | if (iST_BLOQUEIOVENDEDOR = 'I') or (iST_BLOQUEIOVENDEDOR = 'S') then valida vendedor no orçamento |
Simulação passo a passo
- MFA001 → "Obriga ter Vendedor" = Sim(Orçamento-MPD004)
- Salve os parâmetros (F6)
- Abra um Orçamento (MPD004), preencha cliente/itens, deixe
CD_VENDEDORvazio - Aperte F6 → erro
E-0000: É Obrigatório informar o Vendedor!(validado emUdmMPD004.paslinha 1210) - No rateio múltiplo do orçamento sem vendedores → erro
E-0000: Operação Cancelada! É Obrigado Informar os Vendedores(UMPD004.paslinha 787-789) - Abra um Pedido (MPD002) sem vendedor → grava normalmente (o MPD002 não reconhece
'I', só'S') - 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.paslinha 743 confirma a intenção:// Verifica se o Parametro Obriga Vendedor está ativo. Para travar um vendedor já preenchido useST_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'→ testaTrim(tab...CD_VENDEDOR.AsString) = ''antes de PostST_VARIOSVENDEDORES = 'S'→ testaVendedores[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. VejaUMNF002.paslinhas 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). VerUMNF030.paslinhas 802-804. - MOF002 propaga vendedor do cabeçalho: Se o parâmetro =
'S'e o item não tem vendedor, ele é herdado automaticamente detabORDEMSERVICOCD_VENDEDORantes da validação (UdmMOF002.paslinhas 1126-1129). - Comentário em MOF001: No
UMOF001.paslinha 1953 há um bloco comentado//(ParmFatur.Values['ST_BLOQUEIOVENDEDOR'] = 'S'))— o módulo migrou a regra paraPARMOFICINA.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.javaeJunsoftBuilder.java— a API REST também respeita o parâmetro ao aceitar pedidos/notas do portal web.
Tabela Comparativa Resumida
| Valor | Descrição | MPD002 Pedido | MPD020 Pedido Rápido | MPD004 Orçamento | MPD005 O.S. Venda | MOF002 O.S. Oficina | MNF002/026/030/032 NF | MRC020 Import NF |
|---|---|---|---|---|---|---|---|---|
| S | Sim (Faturamento/Orçamento) | Obriga | Obriga | Obriga | Obriga | Obriga | Obriga | Obriga |
| N | Não | Livre | Livre | Livre | Livre | Livre | Livre | Livre |
| I | Sim (Orçamento-MPD004) | Livre | Livre | Obriga | Livre | Livre | Livre | Livre |
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.dfmlinha 5239-5266 - ComboBoxcmbST_BLOQUEIO(TwwDBComboBox) comDataField = 'ST_BLOQUEIOVENDEDOR'eItems.Strings = ('Sim(Faturamento/Orçamento)'#9'S', 'Não'#9'N', 'Sim(Orçamento-MPD004)'#9'I')source/MFA001/UMFA001.dfmlinha 5054-5066 - Labellbl54(Caption = 'Obriga ter Vendedor', Top=22) vinculado ao combosource/MFA001/UMFA001.dfmlinha 5024-5025 -TabSheet Vendedor/ Caption'Vendedor'source/MFA001/UMFA001.dfmlinha 5027-5039 -GroupBox9com Caption'Parâmetros de Vendedor'source/MFA001/UdmMFA001.paslinha 126 - DeclaraçãotabPARMFATURST_BLOQUEIOVENDEDOR: TStringFieldsource/MFA001/UdmMFA001.paslinha 478 -AfterInsert:tabPARMFATURST_BLOQUEIOVENDEDOR.Asstring := 'N';(valor padrão)source/MFA001/UdmMFA001.dfmlinhas 131, 1076-1079, 2372, 2528, 2741, 3011 -tabPARMFATURSELECT/INSERT/UPDATE incluemST_BLOQUEIOVENDEDOR
Consumidores do parâmetro
MPD002 - Pedido de Venda
source/MPD002/UdmMPD002.paslinha 799 -if (parmfatur.values['ST_BLOQUEIOVENDEDOR'] = 'S') and (ST_VARIOSVENDEDORES <> 'S') then lblCD_VENDEDOR.Font.Style := [fsBold]source/MPD002/UdmMPD002.paslinha 1443-1448 -BeforePost: exigeCD_VENDEDORquando parâmetro ='S'eST_VARIOSVENDEDORES <> 'S'→W-0000: É Obrigatório informar um Vendedor!source/MPD002/UdmMPD002.paslinha 5742 - SELECT de PARMFATUR incluindoP.ST_BLOQUEIOVENDEDORsource/MPD002/UMPD002.paslinha 2625-2627 - ValidaVendedores[0].Cd_Vendedor = '-1'no rateio múltiplo →W-0000: Operação Cancelada! É Obrigado Informar os Vendedores
MPD020 - Pedido Rápido
source/MPD020/UdmMPD020.paslinha 240 - Declaração localIST_BLOQUEIOVENDEDOR: stringsource/MPD020/UdmMPD020.paslinha 322 - SELECT incluindoST_BLOQUEIOVENDEDORsource/MPD020/UdmMPD020.paslinha 362 - AtribuiçãodmMPD020.IST_BLOQUEIOVENDEDOR := Resultado[25]source/MPD020/UdmMPD020.paslinha 852-855 -if (iST_BLOQUEIOVENDEDOR = 'S') and CD_VENDEDOR vazio→ exceção obrigatória
MPD004 - Orçamento (único que aceita 'I')
source/MPD004/UdmMPD004.paslinha 316 - DeclaraçãoiST_BLOQUEIOVENDEDOR: Stringsource/MPD004/UdmMPD004.paslinha 373 - SELECT incluindoST_BLOQUEIOVENDEDORsource/MPD004/UdmMPD004.paslinha 392 - AtribuiçãodmMPD004.iST_BLOQUEIOVENDEDOR := Resultado[15]source/MPD004/UdmMPD004.paslinha 1210-1214 -if ((iST_BLOQUEIOVENDEDOR = 'I') or (iST_BLOQUEIOVENDEDOR = 'S')) and (iST_VARIOSVENDEDORES = 'N')validaCD_VENDEDOR→E-0000: É Obrigatório informar o Vendedorsource/MPD004/UMPD004.paslinha 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.paslinha 246 - DeclaraçãoiST_BLOQUEIOVENDEDOR: stringsource/MPD005/UdmMPD005.paslinha 376 - SELECT incluindoST_BLOQUEIOVENDEDORsource/MPD005/UdmMPD005.paslinha 400 - AtribuiçãodmMPD005.iST_BLOQUEIOVENDEDOR := Resultado[16]source/MPD005/UdmMPD005.paslinha 1439-1443 - ValidaCD_VENDEDORdo item antes do Post →W-2051source/MPD005/UMPD005.paslinha 672-675 - Iteração nos itens:CD_VENDEDOR vazio + iST_BLOQUEIOVENDEDOR = 'S'→W-2005: item ... não possui Vendedorsource/MPD005/UMPD005.paslinhas 780-782, 899-901 - Rateio agrupado por item →W-2024: É Obrigado Informar os Vendedores
MPD011 - Retorno NF Recebida
source/MPD011/UdmMPD011.paslinha 1583 - SELECT de PARMFATUR incluindoPF.ST_BLOQUEIOVENDEDOR(consulta para validações de devolução)
MPD093 - Origem Pedido Matriz
source/MPD093/UdmMPD093.paslinha 236 - SELECTSELECT CD_CONDPAGTO, CD_FORMAPAGTO, ST_VARIOSVENDEDORES, ST_BLOQUEIOVENDEDOR, CD_MOVSAIDA, ST_SOLICITALOCALPED FROM PARMFATUR
MNF002 - Nota Fiscal Saída
source/MNF002/UMNF002.paslinha 745-749 - Ao entrar vindo de MNF015 (pedido), desligaparmfatur.values['ST_BLOQUEIOVENDEDOR'] := 'N'e marcaBloqueiaVendedor := Truepara religar depoissource/MNF002/UMNF002.paslinha 760-763 - Restauraparmfatur.values['ST_BLOQUEIOVENDEDOR'] := 'S'após o trânsitosource/MNF002/UMNF002.paslinha 3456-3462 - Antes do Post:CD_VENDEDOR vazio + ST_BLOQUEIOVENDEDOR = 'S' + ST_VARIOSVENDEDORES = 'N'→W-0000: É Obrigatório informar o Vendedor!source/MNF002/UdmMNF002.paslinha 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.paslinha 761 - SELECT de PARMFATUR incluindoP.ST_BLOQUEIOVENDEDOR
MNF017 - NF Terceiros
source/MNF017/UMNF017.paslinha 163 - SELECTP.ST_BLOQUEIOVENDEDORpara uso futuro na validação
MNF026 - NF Saída Simplificada
source/MNF026/UMNF026.paslinha 624-630 - Antes do Post:CD_VENDEDOR vazio + ST_BLOQUEIOVENDEDOR = 'S'→W-1983source/MNF026/UMNF026.paslinha 674-682 - Validação duplicada antes de nova nota →W-0127
MNF030 - NF Complementar/Reemissão
source/MNF030/UMNF030.paslinha 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.paslinha 1180-1183 - Se'S' + ST_VARIOSVENDEDORES='N', colocalblCD_VENDEDORem negritosource/MNF032/UdmMNF032.paslinha 1494-1497 - Antes do Post: validaCD_VENDEDORda notasource/MNF032/UMNF032.paslinha 1323-1326 - Rateio múltiplo:Vendedores[0].Cd_Vendedor = '-1' + ST_BLOQUEIOVENDEDOR = 'S'→W-0000source/MNF032/UMNF032.paslinha 1471-1474 - Validação no salvamento direto →W-0000: É Obrigatório informar o Vendedor !
MRC020 - Import NF via XML
source/MRC020/UdmMRC020NFORDEM.paslinha 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.paslinha 193 - DeclaraçãoiST_BLOQUEIOVENDEDOR: Stringsource/MOF002/UdmMOF002.paslinha 297 - SELECT incluindoST_BLOQUEIOVENDEDORsource/MOF002/UdmMOF002.paslinha 320 - AtribuiçãodmMOF002.iST_BLOQUEIOVENDEDOR := Resultado[16]source/MOF002/UdmMOF002.paslinha 1093-1096 - Antes do Post: validaCD_VENDEDORdo item →W-0000: É Obrigatório Informar um Vendedor!source/MOF002/UdmMOF002.paslinha 1126-1130 - HerdaCD_VENDEDORdo cabeçalho quando item vazio
MOF001 - Parâmetros Oficina
source/MOF001/UdmMOF001.paslinha 725 - SELECT incluindoST_BLOQUEIOVENDEDOR(herdado)source/MOF001/UMOF001.paslinha 1953 - Referência comentada//(ParmFatur.Values['ST_BLOQUEIOVENDEDOR'] = 'S'))— a validação migrou paraPARMOFICINA.ST_OBRIGAVENDEDOR
MOF006 - Pedido Oficina (legado)
source/MOF006/UdmMOF006.paslinha 298 - SELECT incluindoST_BLOQUEIOVENDEDOR
jVendedor - Rateio Agrupado de Vendedores
source/jVendedor/UVendedorAgrupado.paslinha 1199 - SELECT incluindoST_BLOQUEIOVENDEDORno record de parâmetrossource/jVendedor/UVendedorAgrupado.paslinha 1211 - AtribuiçãoParam.St_BloqueioVendedor := Resultado[4]
MCO006 - Cotação
source/MCO006/UdmMCO006.paslinha 2105 - SELECT de PARMFATUR incluindoP.ST_BLOQUEIOVENDEDOR
SQL
- Não há stored procedures em
Scripts/referenciandoPARMFATUR.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.dfmlinhas 485, 589 - Utilitário de cópia de PARMFATUR entre empresas; UPDATE/SELECT incluemST_BLOQUEIOVENDEDORsource/RCA006/UdmRCA006.dfmlinhas 3234, 3338 - Parâmetros Recapadora: UPDATE/SELECT replicamST_BLOQUEIOVENDEDORsource/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.java- API REST espelhaST_BLOQUEIOVENDEDORem DTO de parâmetrossource/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/JunsoftBuilder.java- Construtor Java lê o parâmetro ao montar regras do portal