Pular para o conteúdo principal

QT_DIASVALIDADEPEDORC - Quantidade de dias de validade padrão de Pedidos e Orçamentos

Tela: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Pedidos / Ordem de Serviço → campo Validade Ped./Orc. (label Label42 em UMFA001.dfm:7999-8011, posicionado em Left=38, Top=211; ao lado, label auxiliar Dias — e o edit edtQT_DIASVALIDADEPEDORC em UMFA001.dfm:8773-8789, Left=133, Top=207). Tabela: PARMFATUR.QT_DIASVALIDADEPEDORC Tipo: Numérico inteiro (quantidade de dias). DOM_INTEGER no DDL (docs/schema/tables/PARMFATUR.sql:127); TIntegerField no client (UdmMFA001.pas:168). O TDBEdit não possui máscara/formatação adicional. Valor padrão: NULL — o tabPARMFATURAfterInsert em UdmMFA001.pas:434-513 não atribui valor inicial a este campo. A empresa começa sem validade configurada. Validação (MFA001): Não há OnValidate no tabPARMFATURQT_DIASVALIDADEPEDORC. Qualquer inteiro (positivo, zero ou negativo) é aceito na tela de parâmetros.

O que o parâmetro faz​

QT_DIASVALIDADEPEDORC é a quantidade padrão de dias de validade que será sugerida automaticamente ao incluir um novo Pedido de Venda (MPD002), Pedido de Compra (MPD020) ou Orçamento de Oficina (MOF005).

Em cada um desses módulos, ao clicar em Novo, o sistema lê o parâmetro em PARMFATUR e copia o valor para o campo QT_DIASVALIDADE do pedido recém-criado (ou soma ao DT_ORCAMENTO para calcular a DT_VALIDADEORC no orçamento de oficina). O operador pode alterar manualmente o valor no pedido; o parâmetro apenas semeia o default.

A validação OnValidate do campo QT_DIASVALIDADE no pedido (UdmMPD002.pas:4212-4219 e UdmMPD020.pas:2414-2421) preenche o campo descritivo DS_VALIDADE com "Este Pedido / Orçamento é Válido por <N> Dias." sempre que QT_DIASVALIDADE é alterado.

Telas impactadas​

MóduloCódigoPapel
Parâmetros de FaturamentoMFA001Produtora — cadastra/edita o valor no campo edtQT_DIASVALIDADEPEDORC (aba Pedidos / Ordem de Serviço, UMFA001.dfm:8773).
Pedido de VendaMPD002Consumidora. Na inclusão de pedido, se o campo estiver vazio, copia o parâmetro para PEDIDO.QT_DIASVALIDADE (UMPD002.pas:3518-3523). Traz o campo no SELECT consolidado de PARMFATUR (UdmMPD002.pas:5754).
Pedido de CompraMPD020Consumidora. Na inclusão de pedido (Append), copia sempre o parâmetro para PEDIDO.QT_DIASVALIDADE (UMPD020.pas:1008).
Orçamento de OficinaMOF005Consumidora. Lê o parâmetro em iQT_VALIDADEORC (UdmMOF005.pas:225, 239) e, na inclusão, calcula ORCAMENTO.DT_VALIDADEORC := DT_ORCAMENTO + iQT_VALIDADEORC (UMOF005.pas:967-968).

Procedures impactadas​

Nenhuma stored procedure em Scripts/ referencia QT_DIASVALIDADEPEDORC. Toda a lógica é executada no cliente Delphi, nos módulos consumidores acima.

Campos envolvidos​

CampoTabelaPapel
QT_DIASVALIDADEPEDORCPARMFATURValor padrão em dias (este parâmetro)
QT_DIASVALIDADEPEDIDOValidade em dias gravada no pedido — recebe cópia do parâmetro na inclusão
DS_VALIDADEPEDIDOTexto descritivo gerado pelo OnValidate do QT_DIASVALIDADE ("Este Pedido / Orçamento é Válido por N Dias.")
DT_ORCAMENTOORCAMENTO (MOF005)Data base do orçamento de oficina
DT_VALIDADEORCORCAMENTO (MOF005)Data de validade calculada como DT_ORCAMENTO + QT_DIASVALIDADEPEDORC

Comportamento / Regra​

Valor = NULL ou vazio (padrão)​

AspectoComportamento
Preenchimento em MFA001Campo nasce vazio no AfterInsert; o usuário pode deixar em branco.
Efeito em MPD002Linha UMPD002.pas:3518: if (ParmFatur.Values['QT_DIASVALIDADEPEDORC'] <> '') then ... — o bloco é pulado. PEDIDO.QT_DIASVALIDADE permanece vazio; DS_VALIDADE fica em branco.
Efeito em MPD020Linha UMPD020.pas:1008: atribuição direta sem checagem — tabPEDIDOQT_DIASVALIDADE.AsString := ''. O campo fica vazio no pedido de compra recém-criado.
Efeito em MOF005Em UdmMOF005.pas:238-239, só atualiza iQT_VALIDADEORC se Resultado[5] <> ''; e em UMOF005.pas:967, só calcula a data de validade se iQT_VALIDADEORC <> ''. ORCAMENTO.DT_VALIDADEORC fica NULL.

Resultado esperado: nenhuma sugestão de validade é feita; o pedido/orçamento é criado sem prazo de validade preenchido. O operador precisa informar manualmente no campo QT_DIASVALIDADE se desejar.

Valor = 0​

AspectoComportamento
Validação em MFA001Aceito (não há OnValidate).
Efeito em MPD002ParmFatur.Values['QT_DIASVALIDADEPEDORC'] = '0', que é <> '', então o bloco executa: PEDIDO.QT_DIASVALIDADE := '0'. O OnValidate do pedido (UdmMPD002.pas:4214) também aceita e gera DS_VALIDADE = "Este Pedido / Orçamento é Válido por 0 Dias.".
Efeito em MPD020PEDIDO.QT_DIASVALIDADE := 0. DS_VALIDADE = "Este Pedido / Orçamento é Válido por 0 Dias."
Efeito em MOF005StrToInt('0') = 0 → DT_VALIDADEORC := DT_ORCAMENTO + 0, ou seja, a validade é o próprio dia da emissão.

Resultado esperado: pedidos/orçamentos nascem com validade igual a "zero dias" — na prática, vencem no mesmo dia. Normalmente este valor é usado apenas quando a empresa quer forçar visibilidade do campo de validade, mas não há um caso real de negócio que o justifique.

Valor > 0 (ex.: 30)​

Simulação passo a passo​

Pré-requisitos do cenário:

  • PARMFATUR.QT_DIASVALIDADEPEDORC = 30 (definido em MFA001).
  • Hoje = 2026-04-21.
  • Operador cria um novo pedido/orçamento.
  1. Em MFA001 → aba Pedidos / Ordem de Serviço → informe Validade Ped./Orc. = 30. Salve (F6).

  2. Pedido de Venda (MPD002):

    • Operador clica em Novo → tabPEDIDO.Append executa.
    • Trecho UMPD002.pas:3518-3523:
      if (ParmFatur.Values['QT_DIASVALIDADEPEDORC'] <> '') then
      begin
      dmMPD002.tabPEDIDO.Edit;
      if (trim(dmMPD002.tabPEDIDOQT_DIASVALIDADE.AsString) = '') then
      dmMPD002.tabPEDIDOQT_DIASVALIDADE.AsString := ParmFatur.Values['QT_DIASVALIDADEPEDORC'];
      end;
    • PEDIDO.QT_DIASVALIDADE := 30.
    • O OnValidate (tabPEDIDOQT_DIASVALIDADEValidate em UdmMPD002.pas:4212-4219) dispara e grava: DS_VALIDADE = "Este Pedido / Orçamento é Válido por 30 Dias.".
    • Se o operador informar outro valor (ex.: 15), o DS_VALIDADE é recalculado para "...15 Dias.".
    • Observação: o if interno só copia o parâmetro se o pedido ainda estiver vazio — assim, duplicações de pedido ou navegações que já trouxeram um valor preservam o que estava.
  3. Pedido de Compra (MPD020):

    • Operador clica em Novo → tabPEDIDO.Append executa em UMPD020.pas:1007.
    • Trecho UMPD020.pas:1008:
      dmMPD020.tabPEDIDOQT_DIASVALIDADE.AsString := ParmFatur.Values['QT_DIASVALIDADEPEDORC'];
    • Atribuição incondicional — PEDIDO.QT_DIASVALIDADE := 30 sempre, mesmo que haja valor anterior (diferente de MPD002).
    • DS_VALIDADE = "Este Pedido / Orçamento é Válido por 30 Dias.".
  4. Orçamento de Oficina (MOF005):

    • No carregamento de parâmetros (UdmMOF005.pas:222-239) a empresa obtém iQT_VALIDADEORC := '30'.
    • Ao clicar em Novo orçamento (UMOF005.pas:963-968):
      if(dmMOF005.iQT_VALIDADEORC <> '') then
      dmMOF005.tabORCAMENTODT_VALIDADEORC.AsDateTime :=
      dmMOF005.tabORCAMENTODT_ORCAMENTO.AsDateTime + StrToInt(dmMOF005.iQT_VALIDADEORC);
    • Com DT_ORCAMENTO = 2026-04-21: DT_VALIDADEORC := 2026-04-21 + 30 dias = 2026-05-21.

Resultado esperado: novos pedidos e orçamentos nascem com validade padrão de N dias (contados a partir da data de emissão), reduzindo digitação e padronizando o prazo comercial da empresa. O usuário sempre pode editar o valor no documento.

:::info Diferença entre MPD002 e MPD020

  • MPD002 (venda) respeita um valor prévio em QT_DIASVALIDADE — só preenche se estiver vazio.
  • MPD020 (compra) sobrescreve qualquer valor prévio com o parâmetro. :::

:::warning Sem validação de valor negativo em MFA001 Diferente de NR_ACESSOLIMITE, NR_DIASATRASO e outros numéricos, este campo não tem OnValidate em UdmMFA001.pas. Valores negativos são aceitos e, em MOF005, produziriam DT_VALIDADEORC < DT_ORCAMENTO (validade já vencida). Trate operacionalmente com cuidado. :::


Interações com outros parâmetros​

Este parâmetro não possui dependência cruzada com outros parâmetros de PARMFATUR. Ele é lido de forma isolada no momento da inclusão do pedido/orçamento.

O campo PEDIDO.QT_DIASVALIDADE (que recebe o valor) é usado apenas como informação descritiva (DS_VALIDADE) — o ERP não automatiza cancelamentos nem bloqueios de pedidos vencidos com base nele.


Referências no Código Fonte​

Delphi — MFA001 (cadastro do parâmetro)​

ArquivoLinhasPapel
source/MFA001/UMFA001.dfm7999-8011TLabel Label42 com Caption = 'Validade Ped./Orc.'
source/MFA001/UMFA001.dfm8773-8789TDBEdit edtQT_DIASVALIDADEPEDORC com DataField = 'QT_DIASVALIDADEPEDORC', DataSource = dmMFA001.dsPARMFATUR, dentro da aba Pedidos / Ordem de Serviço
source/MFA001/UMFA001.pas318Declaração edtQT_DIASVALIDADEPEDORC: TDBEdit
source/MFA001/UdmMFA001.pas168Declaração tabPARMFATURQT_DIASVALIDADEPEDORC: TIntegerField
source/MFA001/UdmMFA001.pas434-513tabPARMFATURAfterInsert não atribui default (campo nasce NULL)
source/MFA001/UdmMFA001.dfm176, 1308-1311, 2393, 2557, 2778, 3056SELECT/INSERT/UPDATE de PARMFATUR incluindo o campo e definição do TIntegerField

Delphi — Consumidores​

ArquivoLinhasPapel
source/MPD002/UdmMPD002.pas5754Inclui P.QT_DIASVALIDADEPEDORC no SELECT consolidado de PARMFATUR para o ParmFatur.Values
source/MPD002/UMPD002.pas3518-3523Na inclusão de pedido, copia o parâmetro para PEDIDO.QT_DIASVALIDADE somente se estiver vazio
source/MPD002/UdmMPD002.pas4212-4219tabPEDIDOQT_DIASVALIDADEValidate — atualiza DS_VALIDADE = "Este Pedido / Orçamento é Válido por N Dias."
source/MPD020/UMPD020.pas1008Na inclusão de pedido de compra, atribui PEDIDO.QT_DIASVALIDADE := ParmFatur.Values['QT_DIASVALIDADEPEDORC'] (incondicional)
source/MPD020/UdmMPD020.pas2414-2421OnValidate análogo ao MPD002, atualiza DS_VALIDADE
source/MOF005/UdmMOF005.pas225, 238-239SELECT em PARMFATUR → popula iQT_VALIDADEORC quando não vazio
source/MOF005/UMOF005.pas967-968Calcula ORCAMENTO.DT_VALIDADEORC := DT_ORCAMENTO + StrToInt(iQT_VALIDADEORC)

DDL​

  • docs/schema/tables/PARMFATUR.sql:127 — QT_DIASVALIDADEPEDORC DOM_INTEGER, (sem NOT NULL, sem default → permite NULL).
  • docs/schema/tables/PEDIDO.sql:77 — QT_DIASVALIDADE DOM_INTEGER, (campo destino nos pedidos).

SQL — Procedures​

Nenhuma stored procedure em Scripts/ referencia QT_DIASVALIDADEPEDORC (grep em Scripts/ retornou zero matches). A regra inteira é executada no lado cliente, nos módulos consumidores Delphi.