Pular para o conteúdo principal

Valida Saldo de Pedido ao Fechar Contrato de Obra

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Faturamento → Opção 2 (label "Valida saldo do Pedido ao fechar Contrato de Obra") Tabela: PARMFATUR.ST_VALIDASALDOPEDIDOOBRA Valor padrão: N (Não valida)

Telas impactadas​

MóduloCódigoDescrição
Contrato de Obra / RomaneioMPD026Fechamento do contrato/romaneio de obra - único consumidor do parâmetro

Campos envolvidos​

CampoTabelaDescrição
ST_ROMANEIOROMANEIOStatus do romaneio/contrato (V=Vigente, F=Fechado, A/C=cancelado/anulado)
TP_PEDIDOPEDIDOTipo do pedido (filtro usa S = Saída/Venda)
ST_PEDIDOPEDIDOStatus do pedido (bloqueia fechamento se ≠ A e ≠ C, ou seja, com saldo)
NR_ROMANEIO / CD_EMPRESAROMANEIOPEDIDOVinculação Romaneio ↔ Pedidos

Opções disponíveis​

N - Não valida (padrão)​

O que fazDetalhe
Bloqueia fechamento?Não - permite fechar o contrato mesmo com pedidos com saldo aberto
Consulta executadaNenhuma validação adicional
Recomendado paraEmpresas que usam o MPD026 apenas como fluxo de logística/romaneio

Simulação passo a passo​

  1. Vá em MFA001 → Parâmetros → Ambos → Opção 1 → "Valida saldo do Pedido ao fechar Contrato de Obra" = Não
  2. Salve os parâmetros (F6)
  3. Abra MPD026 (Contrato / Romaneio de Obra)
  4. Carregue um contrato que possua pedidos de venda com saldo (status ≠ A/C)
  5. Clique em Fechar Contrato
  6. Confirme na mensagem C-0000 "Deseja Fechar o Contrato / Romaneio?"
  7. O sistema muda ST_ROMANEIO para F e faz commit

Resultado esperado: Contrato é fechado normalmente, independente de existirem pedidos com saldo a faturar.


S - Sim, valida saldo​

O que fazDetalhe
Bloqueia fechamento?Sim - impede fechar o contrato se existir algum pedido de venda vinculado com saldo
Consulta executadaSELECT P.ST_PEDIDO FROM ROMANEIOPEDIDO R INNER JOIN PEDIDO P ... WHERE R.NR_ROMANEIO = ? AND P.TP_PEDIDO = 'S' AND P.ST_PEDIDO NOT IN ('A','C')
Mensagem de bloqueioW-0000 "Existem pedidos com saldo a faturar para este contrato, não é possível efetuar o fechamento!"
Recomendado paraConstrução civil / obras que exigem faturamento completo antes do encerramento

Simulação passo a passo​

  1. Vá em MFA001 → Parâmetros → Ambos → Opção 1 → "Valida saldo do Pedido ao fechar Contrato de Obra" = Sim
  2. Salve os parâmetros (F6)
  3. Abra MPD026 (Contrato / Romaneio de Obra)
  4. Carregue um contrato que possua pedido de venda (TP_PEDIDO = 'S') com saldo aberto (ST_PEDIDO diferente de A e C)
  5. Clique em Fechar Contrato
  6. Confirme na mensagem C-0000 "Deseja Fechar o Contrato / Romaneio?"
  7. O sistema executa a consulta em ROMANEIOPEDIDO × PEDIDO
  8. Como há pedido com saldo → Erro W-0000: "Existem pedidos com saldo a faturar para este contrato, não é possível efetuar o fechamento!"
  9. Fature/cancele os pedidos pendentes e tente fechar novamente → Contrato fecha (ST_ROMANEIO = 'F')

Resultado esperado: O contrato de obra só pode ser fechado após todos os pedidos de venda vinculados estarem faturados (status A) ou cancelados (C).


Tabela Comparativa Resumida​

OpçãoDescriçãoValida saldo?Executa consulta PEDIDO?Pode fechar com pedido em aberto?
NNão valida (padrão)NãoNãoSim
SSim, valida saldoSimSimNão - bloqueia com W-0000

Observações técnicas​

  • O parâmetro é lido em tempo de fechamento via dmMPD026.parmFatur.Values['ST_VALIDASALDOPEDIDOOBRA'] (cache de parâmetros carregado junto do form).
  • A rotina Busca_Parametros em UdmMPD026.pas lê o valor da coluna para dmMPD026.iST_SALDOPEDIDOOBRA, mas a decisão efetiva acontece em btnFecharClick (UMPD026.pas), que consulta diretamente o dicionário parmFatur.
  • Apenas pedidos de venda (TP_PEDIDO = 'S') são considerados na validação; ordens/pedidos de outros tipos vinculados ao romaneio não bloqueiam o fechamento.
  • Status A (Atendido/Faturado) e C (Cancelado) são considerados como sem saldo. Qualquer outro status conta como pedido em aberto.

Referências no Código Fonte​

Delphi​

ArquivoPapel
source/MFA001/UMFA001.dfm (linhas 3848-3862, 4423-4450)Label "Valida saldo do Pedido ao fechar Contrato de Obra" + TwwDBComboBox cmbST_VALIDASALDOPEDIDOOBRA com Items.Strings = ('Não'#9'N', 'Sim'#9'S')
source/MFA001/UMFA001.pas (linha 488)Declaração do componente cmbST_VALIDASALDOPEDIDOOBRA
source/MFA001/UdmMFA001.pas (linha 255)Declaração do TStringField tabPARMFATURST_VALIDASALDOPEDIDOOBRA
source/MFA001/UdmMFA001.pas (linha 551)AfterInsert: valor padrão 'N' ao criar novo registro
source/MFA001/UdmMFA001.dfmDefinição do field no dataset tabPARMFATUR
source/MPD026/UdmMPD026.pas (linhas 535-559, procedure Busca_Parametros)Lê o parâmetro para dmMPD026.iST_SALDOPEDIDOOBRA junto com CD_LAYORDCARREG e ST_ORDEMCARREG
source/MPD026/UMPD026.pas (linhas 1297-1336, btnFecharClick)Valida a regra: quando = 'S', executa SELECT P.ST_PEDIDO FROM ROMANEIOPEDIDO ... PEDIDO WHERE TP_PEDIDO='S' AND ST_PEDIDO NOT IN ('A','C'); bloqueia fechamento se houver resultado

SQL / Stored Procedures​

Nenhuma stored procedure em Scripts/ referencia ST_VALIDASALDOPEDIDOOBRA. A regra é aplicada exclusivamente no cliente Delphi (MPD026), por consulta ad-hoc em tempo de execução.

Trecho-chave (UMPD026.pas, btnFecharClick)​

if (dmMPD026.parmFatur.Values['ST_VALIDASALDOPEDIDOOBRA'] = 'S') then
begin
consulta :=
'SELECT P.ST_PEDIDO '+#10+
'FROM ROMANEIOPEDIDO R '+#10+
'INNER JOIN PEDIDO P ON (R.CD_EMPRPEDIDO = P.CD_EMPRESA '+#10+
' AND R.NR_PEDIDO = P.NR_PEDIDO '+#10+
' AND R.TP_PEDIDO = P.TP_PEDIDO) '+#10+
'WHERE R.CD_EMPRESA = '+Nulo(dmMPD026.tabROMANEIOCD_EMPRESA.AsString,'I')+#10+
' AND R.NR_ROMANEIO = '+Nulo(dmMPD026.tabROMANEIONR_ROMANEIO.AsString,'I')+#10+
' AND P.TP_PEDIDO = ''S'' '+#10+
' AND P.ST_PEDIDO NOT IN (''A'',''C'') ';

if (Trim(ExecutaConsulta(dmMPD026.transaction, consulta)[0]) <> '') then
raise JException.Create('W-0000', ['Existem pedidos com saldo a faturar para este contrato, não é possível efetuar o fechamento!']);
end;