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_VALIDASALDOPEDIDOOBRAValor padrão:N(Não valida)
Telas impactadas
| Módulo | Código | Descrição |
|---|---|---|
| Contrato de Obra / Romaneio | MPD026 | Fechamento do contrato/romaneio de obra - único consumidor do parâmetro |
Campos envolvidos
| Campo | Tabela | Descrição |
|---|---|---|
ST_ROMANEIO | ROMANEIO | Status do romaneio/contrato (V=Vigente, F=Fechado, A/C=cancelado/anulado) |
TP_PEDIDO | PEDIDO | Tipo do pedido (filtro usa S = Saída/Venda) |
ST_PEDIDO | PEDIDO | Status do pedido (bloqueia fechamento se ≠ A e ≠ C, ou seja, com saldo) |
NR_ROMANEIO / CD_EMPRESA | ROMANEIOPEDIDO | Vinculação Romaneio ↔ Pedidos |
Opções disponíveis
N - Não valida (padrão)
| O que faz | Detalhe |
|---|---|
| Bloqueia fechamento? | Não - permite fechar o contrato mesmo com pedidos com saldo aberto |
| Consulta executada | Nenhuma validação adicional |
| Recomendado para | Empresas que usam o MPD026 apenas como fluxo de logística/romaneio |
Simulação passo a passo
- Vá em MFA001 → Parâmetros → Ambos → Opção 1 → "Valida saldo do Pedido ao fechar Contrato de Obra" = Não
- Salve os parâmetros (F6)
- Abra MPD026 (Contrato / Romaneio de Obra)
- Carregue um contrato que possua pedidos de venda com saldo (status ≠
A/C) - Clique em Fechar Contrato
- Confirme na mensagem
C-0000"Deseja Fechar o Contrato / Romaneio?" - O sistema muda
ST_ROMANEIOparaFe faz commit
Resultado esperado: Contrato é fechado normalmente, independente de existirem pedidos com saldo a faturar.
S - Sim, valida saldo
| O que faz | Detalhe |
|---|---|
| Bloqueia fechamento? | Sim - impede fechar o contrato se existir algum pedido de venda vinculado com saldo |
| Consulta executada | SELECT 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 bloqueio | W-0000 "Existem pedidos com saldo a faturar para este contrato, não é possível efetuar o fechamento!" |
| Recomendado para | Construção civil / obras que exigem faturamento completo antes do encerramento |
Simulação passo a passo
- Vá em MFA001 → Parâmetros → Ambos → Opção 1 → "Valida saldo do Pedido ao fechar Contrato de Obra" = Sim
- Salve os parâmetros (F6)
- Abra MPD026 (Contrato / Romaneio de Obra)
- Carregue um contrato que possua pedido de venda (
TP_PEDIDO = 'S') com saldo aberto (ST_PEDIDOdiferente deAeC) - Clique em Fechar Contrato
- Confirme na mensagem
C-0000"Deseja Fechar o Contrato / Romaneio?" - O sistema executa a consulta em
ROMANEIOPEDIDO × PEDIDO - Como há pedido com saldo → Erro
W-0000: "Existem pedidos com saldo a faturar para este contrato, não é possível efetuar o fechamento!" - 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ção | Descrição | Valida saldo? | Executa consulta PEDIDO? | Pode fechar com pedido em aberto? |
|---|---|---|---|---|
| N | Não valida (padrão) | Não | Não | Sim |
| S | Sim, valida saldo | Sim | Sim | Nã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_ParametrosemUdmMPD026.paslê o valor da coluna paradmMPD026.iST_SALDOPEDIDOOBRA, mas a decisão efetiva acontece embtnFecharClick(UMPD026.pas), que consulta diretamente o dicionárioparmFatur. - 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) eC(Cancelado) são considerados como sem saldo. Qualquer outro status conta como pedido em aberto.
Referências no Código Fonte
Delphi
| Arquivo | Papel |
|---|---|
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.dfm | Definiçã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;