Pular para o conteúdo principal

ST_ATENDECARREG - Atende Pedido ao Faturar Nota em Ordem de Carregamento

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: aba Pedidos / O.S. → sub-aba Opção 2 → GroupBox "Parâmetros de Pedidos/ Ordem de Serviço" → campo "Atender Pedido ao Faturar Nota em Ordem De Carregamento" Tabela: PARMFATUR.ST_ATENDECARREG — DOM_CHAR1 DEFAULT 'N' NOT NULL Valor padrão: N (atende o pedido apenas na confirmação/encerramento da ordem)

Este parâmetro controla quando e como os pedidos amarrados a uma Ordem de Carregamento têm seu saldo (PS_ATENDIDO / QT_ATENDIDA) atualizado durante o faturamento por embarque.

Ele determina se o acerto do atendido acontece no mesmo instante em que cada nota do embarque é gerada (modo 'S'), ou apenas no encerramento/confirmação da ordem, quando o operador finaliza o embarque (modo 'N', padrão).

O parâmetro é consumido tanto em código Delphi quanto em stored procedures que geram notas fiscais a partir da ordem de carregamento.

Telas impactadas​

MóduloCódigoPapel
Parâmetros de FaturamentoMFA001Tela onde o parâmetro é configurado (ComboBox Sim/Não)
Faturamento por Ordem de CarregamentoMPD011Consumidor principal — lê o parâmetro em BuscaParametros_MPD011, passa para Gera_NotaFiscalAutomatico, dispara Atende_Pedido em btnFinalizarClick quando 'N', e aciona AtendePedido_Nota (atualiza saldo item-a-item) a cada gravação de NF quando 'S'
NF Fatura de Embarque (Recap)MRC020Mesma lógica do MPD011 — Atende_Pedido na confirmação (modo 'N') ou AtendePedido_Nota a cada emissão (modo 'S')
Emissão de NF de Embarque (variação MRC049)MRC049Passa ST_ATENDECARREG como parâmetro para a procedure GERA_NFORDEMCARREGMRC049; na confirmação da ordem chama Atende_Pedido quando o parâmetro é 'N'
Emissão de NF de Pedido MobileMNF033Repassa o parâmetro para a procedure GERA_NOTAFISCALPEDIDO (segundo caminho de geração)
Emissão/Faturamento de NotaMNF004Executa Atende_Pedido ao faturar quando ST_ATENDECARREG = 'N' (atualiza ITEMPEDIDO do embarque)

Procedures impactadas​

ProcedurePapel
GERA_NOTAFISCALORDEMCARREGProcedure principal de geração de NF por ordem de carregamento. Recebe I_ST_ATENDECARREG; quando 'S', insere em PEDIDONOTA e atualiza ITEMPEDIDO.PS_ATENDIDO/QT_ATENDIDA item-a-item dentro da própria procedure
GERA_NFORDEMCARREGMRC049Variação da anterior para recapadora (MRC049). Mesmo comportamento: 'S' grava em PEDIDONOTA e atualiza ITEMPEDIDO dentro da procedure
GERA_NOTAFISCALPEDIDOGeração de NF a partir de pedido (MNF033). Também recebe I_ST_ATENDECARREG e quando 'S' monta o cursor de ORDEMCARREG + ITEMPEDIDO + PEDIDO para gravar PEDIDONOTA
GRAVA_NOTAFISCALPEDIDOEngine interna de gravação da NF com referência a pedido. Aceita I_ST_ATENDECARREG como parâmetro (assinatura, linha 13)
ATUALIZA_PEDIDONOTAProcedure central que sincroniza ITEMPEDIDO.PS_ATENDIDO/QT_ATENDIDA a partir de PEDIDONOTA. Recebe V_ST_ATENDECARREG (default 'N'). Quando chamada com V_ST_GERA_NF = 'S' e o módulo corrente é MPD011/MRC020 e V_ST_ATENDECARREG = 'N', a procedure sai sem fazer nada — delegando o atendimento ao fluxo pós-confirmação
RETORNA_SALDOPEDIDOLê PARMFATUR.ST_ATENDECARREG da empresa corrente. Quando 'N', desconta da disponibilidade do pedido o que já está comprometido em ORDEMCARREG (peso e quantidade com ST_ORDEMCARREG = 'N') — para que o operador não reprograme itens já amarrados em outro embarque pendente

Campos envolvidos​

CampoDescrição
PARMFATUR.ST_ATENDECARREGO parâmetro em si — DOM_CHAR1, default 'N', NOT NULL. Valores aceitos: 'S' ou 'N'
ITEMPEDIDO.PS_ATENDIDO / ITEMPEDIDO.QT_ATENDIDACampos de saldo do pedido que são incrementados pelo Atende_Pedido (Delphi) ou pela procedure ATUALIZA_PEDIDONOTA
ORDEMCARREG.PS_ORDEMCARREG / ORDEMCARREG.QT_ORDEMCARREGValores de peso/quantidade comprometidos no embarque — base de cálculo do atendimento do pedido
ORDEMCARREG.ST_ORDEMCARREGStatus da linha da ordem (N = pendente). Só linhas 'N' são consideradas no atendimento
PEDIDONOTATabela que amarra cada item de pedido à nota fiscal que o atendeu. É populada no modo 'S' já na geração da NF
ITEMPEDIDO.ST_ITEMPEDIDO'N' = item ativo, 'A' = já atendido. O Atende_Pedido ignora itens com ST_ITEMPEDIDO = 'A' (MPD011 / MRC049) ou aceita 'N'/'P' (MNF004)

Opções disponíveis​

S - Sim (atende o pedido no instante do faturamento da nota)​

O que fazDetalhe
Momento do atendimentoA cada NF gerada do embarque, o sistema já grava o vínculo PEDIDONOTA e atualiza ITEMPEDIDO.PS_ATENDIDO/QT_ATENDIDA via ATUALIZA_PEDIDONOTA. O saldo do pedido cai imediatamente
Em MPD011 (UMPD011.pas:898-901)No btnFinalizarClick, quando parmfatur.values['ST_ATENDECARREG'] = 'S' chama Atende_Pedido após a emissão (mesma chamada do modo 'N', mas neste caminho o atendimento já foi feito pela procedure — ver nota abaixo)
Em MPD011 / UNFORDEM (UNFORDEM.pas:1168-1174)Após gravar a NF, se ST_ATENDECARREG = 'S' dispara AtendePedido_Nota(CD_EMPRESA, NR_ORDEM, CD_PESSOA, NR_PEDIDO) que varre ORDEMCARREG + ITEMPEDIDO + PEDIDO do embarque/pessoa, insere linhas em PEDIDONOTA e chama ATUALIZA_PEDIDONOTA para cada linha
Em MRC020 (UMRC020NFORDEM.pas:1329-1335)Mesma lógica de AtendePedido_Nota após gravação da NF
Em GERA_NOTAFISCALORDEMCARREG (linha 313) / GERA_NFORDEMCARREGMRC049 (linha 420) / GERA_NOTAFISCALPEDIDO (linha 49)Dentro da procedure, quando I_ST_ATENDECARREG = 'S', monta cursor em ORDEMCARREG O INNER JOIN ITEMPEDIDO I INNER JOIN PEDIDO P filtrando O.ST_ORDEMCARREG = 'N' e I.ST_ITEMPEDIDO = 'N', insere em PEDIDONOTA e chama ATUALIZA_PEDIDONOTA — tudo na mesma transação da NF
Em ATUALIZA_PEDIDONOTA (linhas 51-61)Quando V_ST_GERA_NF = 'S' e o módulo é MPD011/MRC020 e V_ST_ATENDECARREG = 'N', sai imediatamente. Ou seja, a procedure só executa o ajuste de saldo dentro do pipeline de NF quando ST_ATENDECARREG = 'S' (para MPD011/MRC020)
Em RETORNA_SALDOPEDIDO (linhas 36-55)Quando ST_ATENDECARREG = 'S' não desconta o comprometido em ORDEMCARREG do saldo disponível do pedido — porque o próprio ITEMPEDIDO.PS_ATENDIDO/QT_ATENDIDA já foi atualizado no ato do faturamento
Em MRC049 / MNF033 (UMRC049.pas:1130,1143, UMNF033.pas:1035)O valor do parâmetro é lido de ParmFatur.Values['ST_ATENDECARREG'] e passado tal qual para Gera_NotaFiscalAutomatico (que repassa à procedure de geração)

Observação sobre a chamada dupla no MPD011 modo 'S': no fluxo do botão Finalizar (UMPD011.pas:898-901), Atende_Pedido é chamado também no modo 'S', mas como a engine Atende_Pedido (em UdmMPD011.pas, análoga a UdmMRC049.pas:652) tem um guard if ParmFatur.Values['ST_ATENDECARREG'] = 'N', essa segunda chamada não executa nada quando o parâmetro é 'S' — evitando dupla contagem do atendido.

Simulação passo a passo​

  1. MFA001 → aba "Pedidos / O.S." → sub-aba "Opção 2" → "Atender Pedido ao Faturar Nota em Ordem De Carregamento" = Sim
  2. Salve (F6)
  3. Crie um pedido de venda P1 com 10 unidades do produto X (peso 100kg). ITEMPEDIDO.QT_PEDIDA = 10, PS_PEDIDO = 100, QT_ATENDIDA = 0, PS_ATENDIDO = 0
  4. Cadastre uma ordem de carregamento vinculada ao pedido P1 (ORDEMCARREG.PS_ORDEMCARREG = 100, QT_ORDEMCARREG = 10, ST_ORDEMCARREG = 'N')
  5. Abra o MPD011 e selecione o embarque. Emita a NF
  6. Imediatamente após a gravação da NF, antes mesmo de clicar em "Finalizar":
    • Execute SELECT QT_ATENDIDA, PS_ATENDIDO FROM ITEMPEDIDO WHERE NR_PEDIDO = P1
    • Resultado: QT_ATENDIDA = 10, PS_ATENDIDO = 100 (o saldo já caiu)
    • Execute SELECT * FROM PEDIDONOTA WHERE NR_PEDIDO = P1 — linhas já gravadas
  7. Abra o RETORNA_SALDOPEDIDO do pedido P1 — o saldo disponível retorna 0 (completamente atendido), sem descontar do ORDEMCARREG, porque o ITEMPEDIDO.PS_ATENDIDO já reflete o atendimento

Resultado esperado: o saldo do pedido é atualizado em tempo real a cada NF emitida, mesmo sem encerrar a ordem. Permite emitir notas parciais sem precisar confirmar/encerrar o embarque antes de gerar novas notas sobre os mesmos pedidos.


N - Não (atende o pedido apenas na confirmação da ordem — padrão)​

O que fazDetalhe
Momento do atendimentoDurante a emissão da NF, o PEDIDONOTA não é populado automaticamente pela procedure (ATUALIZA_PEDIDONOTA sai sem agir no pipeline de NF). O saldo de ITEMPEDIDO.PS_ATENDIDO/QT_ATENDIDA só é atualizado quando o operador confirma/encerra a ordem de carregamento
Em MPD011 (UMPD011.pas:893-895)No btnFinalizarClick (após emissão das notas), se ST_ATENDECARREG = 'N' chama Atende_Pedido(CD_EMPRESA, NR_EMBARQUE) que varre Pedido (query com os pedidos do embarque) e aplica UPDATE ITEMPEDIDO SET PS_ATENDIDO += PS_ORDEMCARREG, QT_ATENDIDA += QT_ORDEMCARREG linha-a-linha
Em MNF004 (UMNF004.pas:956-988)A rotina Atende_Pedido(CdEmpEmbarque, NrEmbarque) só executa quando ST_ATENDECARREG = 'N' — atualiza ITEMPEDIDO do embarque filtrando ST_ITEMPEDIDO IN ('N','P')
Em MRC049 (UdmMRC049.pas:652)Idem: Atende_Pedido roda somente no modo 'N'
Em ATUALIZA_PEDIDONOTA (linha 59)Com V_ST_GERA_NF = 'S' (chamada de dentro do pipeline de NF), se o módulo é MPD011/MRC020 e V_ST_ATENDECARREG = 'N', a procedure encerra sem executar o cursor de pedidos. O atendimento fica diferido para o momento da confirmação da ordem
Em RETORNA_SALDOPEDIDO (linhas 47-63)Como o PS_ATENDIDO/QT_ATENDIDA ainda não reflete o comprometido no embarque, a função desconta explicitamente do saldo disponível o somatório de ORDEMCARREG.PS_ORDEMCARREG/QT_ORDEMCARREG com ST_ORDEMCARREG = 'N'. Isso evita que o operador reprograme o mesmo item em outro pedido enquanto a ordem não foi confirmada
Consulta de itens da NF (MPD011)No fluxo de AtendePedido_Nota (UdmNFORDEM.pas:1045) quando ST_ORDEMCARREG = 'S' monta o SQL mesmo assim (a decisão de popular PEDIDONOTA independe de ST_ATENDECARREG neste caminho), mas a procedure ATUALIZA_PEDIDONOTA interna sai sem atualizar ITEMPEDIDO

Simulação passo a passo​

  1. MFA001 → "Atender Pedido ao Faturar Nota em Ordem De Carregamento" = Não (padrão)
  2. Salve (F6)
  3. Mesma configuração do exemplo anterior: pedido P1 com 10 unidades (peso 100), ITEMPEDIDO.QT_ATENDIDA = 0, PS_ATENDIDO = 0
  4. Amarre o pedido a uma ordem de carregamento (ORDEMCARREG.PS_ORDEMCARREG = 100, QT_ORDEMCARREG = 10, ST_ORDEMCARREG = 'N')
  5. Abra o MPD011 e selecione o embarque. Emita a NF
  6. Após a gravação da NF, antes de clicar em "Finalizar":
    • SELECT QT_ATENDIDA, PS_ATENDIDO FROM ITEMPEDIDO WHERE NR_PEDIDO = P1 → ainda 0 e 0 (saldo NÃO caiu)
    • SELECT * FROM PEDIDONOTA WHERE NR_PEDIDO = P1 → vazio (não houve gravação no pipeline da NF)
  7. Chame RETORNA_SALDOPEDIDO do pedido P1: o saldo disponível retorna 0 (bloqueia reprogramação) — mas através do desconto feito pelo próprio RETORNA_SALDOPEDIDO lendo o ORDEMCARREG, não pelo ITEMPEDIDO.PS_ATENDIDO
  8. Agora clique em "Finalizar" na ordem:
    • O sistema executa Atende_Pedido(CD_EMPRESA, NR_EMBARQUE) (laço Delphi)
    • ITEMPEDIDO.QT_ATENDIDA passa a 10, PS_ATENDIDO passa a 100
    • ORDEMCARREG.ST_ORDEMCARREG muda para 'A' (ordem atendida)

Resultado esperado: o saldo do pedido só é realmente baixado quando a ordem é encerrada. Durante a emissão das notas do embarque, o bloqueio de reprogramação do item é garantido pela própria ORDEMCARREG (consultada por RETORNA_SALDOPEDIDO). É o comportamento clássico: "fatura todas as notas do embarque, confirma a ordem no final, só aí baixa os saldos dos pedidos".


Interação com ST_ORDEMCARREG / ST_FECHAORDEMCARREGNOTAS​

O ST_ATENDECARREG atua em dimensão diferente dos outros dois parâmetros da família "Ordem de Carregamento":

ParâmetroDimensão de atuação
ST_ORDEMCARREGGranularidade da NF (por pedido, por pessoa, com similar, recapadora) e consolidação de impostos
ST_ATENDECARREG (este)Momento do atendimento do saldo do pedido (na emissão da NF × na confirmação da ordem)
ST_FECHAORDEMCARREGNOTASEncerramento automático da ordem após todas as notas planejadas serem emitidas

Combinação típica:

  • ST_ATENDECARREG = 'S' + ST_FECHAORDEMCARREGNOTAS = 'S': máxima automação — cada NF já baixa saldo e, ao emitir a última, a ordem se encerra sozinha. Bom quando o fluxo é linear e não há revisão pós-emissão.
  • ST_ATENDECARREG = 'N' + ST_FECHAORDEMCARREGNOTAS = 'N': máximo controle manual — emite notas sem afetar saldo, encerra a ordem manualmente (e só aí baixa saldo). Bom para empresas com etapa de conferência/liberação entre emitir NF e encerrar embarque.
  • ST_ATENDECARREG = 'N' + ST_FECHAORDEMCARREGNOTAS = 'S': modo intermediário — durante a emissão não mexe em ITEMPEDIDO, mas ao emitir a última NF o sistema dispara o encerramento automático e é aí que o saldo cai (via Atende_Pedido).
  • ST_ATENDECARREG = 'S' + ST_ORDEMCARREG = 'R' (recapadora): o atendimento do saldo acontece na NF, mas o Gera_Estoque/Gera_Financeiro não é chamado no MRC049 (delegado ao fluxo da recapadora).

Tabela Comparativa Resumida​

ValorNomePEDIDONOTA gravado na NF?ITEMPEDIDO.PS_/QT_ATENDIDA atualizado na NF?Atende_Pedido executa ao confirmar a ordem?RETORNA_SALDOPEDIDO desconta ORDEMCARREG?
SSim (atende na NF)Sim (via procedure)Sim, imediatamenteNão (guard if = 'N' barra)Não
NNão (atende na confirmação — padrão)Não (procedure sai sem gravar)NãoSim, nesse momento baixa o saldoSim (por isso bloqueia reprogramação)

Referências no Código Fonte​

Tela MFA001 (definição do parâmetro)​

  • source/MFA001/UMFA001.dfm:9260 — Label lblST_PEDIDOMPD011: TLabel com Caption = 'Atender Pedido ao Faturar Nota em Ordem De Carregamento'
  • source/MFA001/UMFA001.dfm:9817-9843 — ComboBox cmbST_FATURANOTAPD011: TwwDBComboBox com DataField = 'ST_ATENDECARREG', itens:
    • Sim → S
    • Não → N
  • source/MFA001/UdmMFA001.dfm:243 — SELECT que lê PARMFATUR.ST_ATENDECARREG
  • source/MFA001/UdmMFA001.dfm:1670-1673 — Declaração do TField tabPARMFATURST_ATENDECARREG
  • source/MFA001/UdmMFA001.dfm:2416 — INSERT em PARMFATUR (lista de colunas)
  • source/MFA001/UdmMFA001.dfm:2585 — INSERT em PARMFATUR (valor via parâmetro :ST_ATENDECARREG)
  • source/MFA001/UdmMFA001.dfm:2824 — UPDATE em PARMFATUR (ST_ATENDECARREG = :ST_ATENDECARREG)
  • source/MFA001/UdmMFA001.dfm:3123 — SELECT de leitura secundário
  • source/MFA001/UdmMFA001.pas:229 — TField publicado no TDataModule: tabPARMFATURST_ATENDECARREG: TStringField
  • source/MFA001/UdmMFA001.pas:534 — tabPARMFATURST_ATENDECARREG.AsString := 'N'; (valor default aplicado no AfterInsert)

Consumo do parâmetro​

  • source/MPD011/UdmMPD011.pas:348 — Assinatura de Gera_NotaFiscalAutomatico incluindo parâmetro I_ST_ATENDECARREG
  • source/MPD011/UdmMPD011.pas:1578 — SQL de BuscaParametros_MPD011 que lê PF.ST_ATENDECARREG da PARMFATUR
  • source/MPD011/UdmMPD011.pas:1605,1630 — Implementação de Gera_NotaFiscalAutomatico que repassa I_ST_ATENDECARREG para GERA_NOTAFISCALORDEMCARREG
  • source/MPD011/UMPD011.pas:893-901 — No btnFinalizarClick: se 'N' chama Atende_Pedido (atende pedido do embarque); se 'S' também chama (mas a engine tem guard e não executa)
  • source/MPD011/UMPD011.pas:1468 — Passa parmfatur.values['ST_ATENDECARREG'] para Gera_NotaFiscalAutomatico no fluxo de geração em lote
  • source/MPD011/UNFORDEM.pas:1168-1174 — Após gravar NF, se 'S' chama AtendePedido_Nota(CD_EMPRESA, NR_ORDEM, CD_PESSOA, NR_PEDIDO)
  • source/MRC020/UMRC020NFORDEM.pas:1329-1335 — Equivalente do anterior para MRC020
  • source/MRC020/UdmMRC020.pas:724 — Atende_Pedido com guard if ST_ATENDECARREG = 'N' (só executa no modo 'N')
  • source/MRC049/UdmMRC049.pas:318 — Assinatura de Gera_NotaFiscalAutomatico com I_ST_ATENDECARREG
  • source/MRC049/UdmMRC049.pas:652 — Atende_Pedido com guard if = 'N'
  • source/MRC049/UdmMRC049.pas:732,751 — Implementação repassando I_ST_ATENDECARREG para GERA_NFORDEMCARREGMRC049
  • source/MRC049/UMRC049.pas:1130,1143 — Lê dmMRC049.parmfatur.values['ST_ATENDECARREG'] e passa para Gera_NotaFiscalAutomatico
  • source/MNF004/UMNF004.pas:956-989 — Atende_Pedido(CdEmpEmbarque, NrEmbarque) executa UPDATE ITEMPEDIDO somente quando dmMNF004.ParmFatur.Values['ST_ATENDECARREG'] = 'N'
  • source/MNF033/UdmMNF033.pas:241,576 — Assinatura de Gera_NotaFiscalAutomatico com I_ST_ATENDECARREG
  • source/MNF033/UdmMNF033.pas:608,667 — Passa I_ST_ATENDECARREG para GERA_NOTAFISCALPEDIDO (e para uma variação interna GN)
  • source/MNF033/UMNF033.pas:1035 — Lê ParmFatur.Values['ST_ATENDECARREG'] e repassa

Stored Procedures (SQL)​

  • Scripts/GERA_NOTAFISCALORDEMCARREG.sql:14 — parâmetro I_ST_ATENDECARREG char(1)
  • Scripts/GERA_NOTAFISCALORDEMCARREG.sql:313 — if (I_ST_ATENDECARREG = 'S') then monta cursor e grava PEDIDONOTA + chama ATUALIZA_PEDIDONOTA
  • Scripts/GERA_NFORDEMCARREGMRC049.sql:14,111,420 — mesma lógica para recapadora (MRC049)
  • Scripts/GERA_NOTAFISCALPEDIDO.sql:9,49 — I_ST_ATENDECARREG DOM_CHAR1 e bloco análogo para NF geradas a partir de pedido mobile
  • Scripts/GRAVA_NOTAFISCALPEDIDO.sql:13 — parâmetro I_ST_ATENDECARREG char(1) na engine interna de gravação
  • Scripts/GERA_NOTAFISCAL.sql:183,261,268,554 — declara V_ST_ATENDECARREG, lê de PARMFATUR, repassa para ATUALIZA_PEDIDONOTA
  • Scripts/ATUALIZA_PEDIDONOTA.sql:8,59 — assinatura V_ST_ATENDECARREG CHAR(1) = 'N'; no bloco if (V_ST_GERA_NF = 'S') com módulos MPD011/MRC020 e V_ST_ATENDECARREG = 'N', sai sem fazer nada (atendimento diferido)
  • Scripts/RETORNA_SALDOPEDIDO.sql:36,41,44,47 — declara ST_ATENDECARREG, lê da PARMFATUR e, quando 'N', desconta do saldo disponível o SUM(ORDEMCARREG.PS_/QT_ORDEMCARREG) pendente

DDL​

  • docs/schema/tables/PARMFATUR.sql:176 — ST_ATENDECARREG DOM_CHAR1 DEFAULT 'N' NOT NULL