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 NULLValor 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ódulo | Código | Papel |
|---|---|---|
| Parâmetros de Faturamento | MFA001 | Tela onde o parâmetro é configurado (ComboBox Sim/Não) |
| Faturamento por Ordem de Carregamento | MPD011 | Consumidor 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) | MRC020 | Mesma 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) | MRC049 | Passa 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 Mobile | MNF033 | Repassa o parâmetro para a procedure GERA_NOTAFISCALPEDIDO (segundo caminho de geração) |
| Emissão/Faturamento de Nota | MNF004 | Executa Atende_Pedido ao faturar quando ST_ATENDECARREG = 'N' (atualiza ITEMPEDIDO do embarque) |
Procedures impactadas
| Procedure | Papel |
|---|---|
GERA_NOTAFISCALORDEMCARREG | Procedure 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_NFORDEMCARREGMRC049 | Variação da anterior para recapadora (MRC049). Mesmo comportamento: 'S' grava em PEDIDONOTA e atualiza ITEMPEDIDO dentro da procedure |
GERA_NOTAFISCALPEDIDO | Geraçã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_NOTAFISCALPEDIDO | Engine interna de gravação da NF com referência a pedido. Aceita I_ST_ATENDECARREG como parâmetro (assinatura, linha 13) |
ATUALIZA_PEDIDONOTA | Procedure 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_SALDOPEDIDO | Lê 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
| Campo | Descrição |
|---|---|
PARMFATUR.ST_ATENDECARREG | O parâmetro em si — DOM_CHAR1, default 'N', NOT NULL. Valores aceitos: 'S' ou 'N' |
ITEMPEDIDO.PS_ATENDIDO / ITEMPEDIDO.QT_ATENDIDA | Campos de saldo do pedido que são incrementados pelo Atende_Pedido (Delphi) ou pela procedure ATUALIZA_PEDIDONOTA |
ORDEMCARREG.PS_ORDEMCARREG / ORDEMCARREG.QT_ORDEMCARREG | Valores de peso/quantidade comprometidos no embarque — base de cálculo do atendimento do pedido |
ORDEMCARREG.ST_ORDEMCARREG | Status da linha da ordem (N = pendente). Só linhas 'N' são consideradas no atendimento |
PEDIDONOTA | Tabela 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 faz | Detalhe |
|---|---|
| Momento do atendimento | A 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 engineAtende_Pedido(emUdmMPD011.pas, análoga aUdmMRC049.pas:652) tem um guardif 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
- MFA001 → aba "Pedidos / O.S." → sub-aba "Opção 2" → "Atender Pedido ao Faturar Nota em Ordem De Carregamento" = Sim
- Salve (F6)
- Crie um pedido de venda
P1com 10 unidades do produto X (peso 100kg).ITEMPEDIDO.QT_PEDIDA = 10,PS_PEDIDO = 100,QT_ATENDIDA = 0,PS_ATENDIDO = 0 - Cadastre uma ordem de carregamento vinculada ao pedido
P1(ORDEMCARREG.PS_ORDEMCARREG = 100,QT_ORDEMCARREG = 10,ST_ORDEMCARREG = 'N') - Abra o MPD011 e selecione o embarque. Emita a NF
- 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
- Execute
- Abra o RETORNA_SALDOPEDIDO do pedido
P1— o saldo disponível retorna 0 (completamente atendido), sem descontar doORDEMCARREG, porque oITEMPEDIDO.PS_ATENDIDOjá 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 faz | Detalhe |
|---|---|
| Momento do atendimento | Durante 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
- MFA001 → "Atender Pedido ao Faturar Nota em Ordem De Carregamento" = Não (padrão)
- Salve (F6)
- Mesma configuração do exemplo anterior: pedido
P1com 10 unidades (peso 100),ITEMPEDIDO.QT_ATENDIDA = 0,PS_ATENDIDO = 0 - Amarre o pedido a uma ordem de carregamento (
ORDEMCARREG.PS_ORDEMCARREG = 100,QT_ORDEMCARREG = 10,ST_ORDEMCARREG = 'N') - Abra o MPD011 e selecione o embarque. Emita a NF
- 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)
- Chame
RETORNA_SALDOPEDIDOdo pedidoP1: o saldo disponível retorna 0 (bloqueia reprogramação) — mas através do desconto feito pelo próprioRETORNA_SALDOPEDIDOlendo oORDEMCARREG, não peloITEMPEDIDO.PS_ATENDIDO - Agora clique em "Finalizar" na ordem:
- O sistema executa
Atende_Pedido(CD_EMPRESA, NR_EMBARQUE)(laço Delphi) ITEMPEDIDO.QT_ATENDIDApassa a 10,PS_ATENDIDOpassa a 100ORDEMCARREG.ST_ORDEMCARREGmuda para'A'(ordem atendida)
- O sistema executa
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âmetro | Dimensão de atuação |
|---|---|
| ST_ORDEMCARREG | Granularidade 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_FECHAORDEMCARREGNOTAS | Encerramento 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 emITEMPEDIDO, mas ao emitir a última NF o sistema dispara o encerramento automático e é aí que o saldo cai (viaAtende_Pedido).ST_ATENDECARREG = 'S'+ST_ORDEMCARREG = 'R'(recapadora): o atendimento do saldo acontece na NF, mas oGera_Estoque/Gera_Financeironão é chamado noMRC049(delegado ao fluxo da recapadora).
Tabela Comparativa Resumida
| Valor | Nome | PEDIDONOTA gravado na NF? | ITEMPEDIDO.PS_/QT_ATENDIDA atualizado na NF? | Atende_Pedido executa ao confirmar a ordem? | RETORNA_SALDOPEDIDO desconta ORDEMCARREG? |
|---|---|---|---|---|---|
| S | Sim (atende na NF) | Sim (via procedure) | Sim, imediatamente | Não (guard if = 'N' barra) | Não |
| N | Não (atende na confirmação — padrão) | Não (procedure sai sem gravar) | Não | Sim, nesse momento baixa o saldo | Sim (por isso bloqueia reprogramação) |
Referências no Código Fonte
Tela MFA001 (definição do parâmetro)
source/MFA001/UMFA001.dfm:9260— LabellblST_PEDIDOMPD011: TLabelcomCaption = 'Atender Pedido ao Faturar Nota em Ordem De Carregamento'source/MFA001/UMFA001.dfm:9817-9843— ComboBoxcmbST_FATURANOTAPD011: TwwDBComboBoxcomDataField = 'ST_ATENDECARREG', itens:Sim→SNão→N
source/MFA001/UdmMFA001.dfm:243— SELECT que lêPARMFATUR.ST_ATENDECARREGsource/MFA001/UdmMFA001.dfm:1670-1673— Declaração do TFieldtabPARMFATURST_ATENDECARREGsource/MFA001/UdmMFA001.dfm:2416— INSERT emPARMFATUR(lista de colunas)source/MFA001/UdmMFA001.dfm:2585— INSERT emPARMFATUR(valor via parâmetro:ST_ATENDECARREG)source/MFA001/UdmMFA001.dfm:2824— UPDATE emPARMFATUR(ST_ATENDECARREG = :ST_ATENDECARREG)source/MFA001/UdmMFA001.dfm:3123— SELECT de leitura secundáriosource/MFA001/UdmMFA001.pas:229— TField publicado no TDataModule:tabPARMFATURST_ATENDECARREG: TStringFieldsource/MFA001/UdmMFA001.pas:534—tabPARMFATURST_ATENDECARREG.AsString := 'N';(valor default aplicado noAfterInsert)
Consumo do parâmetro
source/MPD011/UdmMPD011.pas:348— Assinatura deGera_NotaFiscalAutomaticoincluindo parâmetroI_ST_ATENDECARREGsource/MPD011/UdmMPD011.pas:1578— SQL deBuscaParametros_MPD011que lêPF.ST_ATENDECARREGdaPARMFATURsource/MPD011/UdmMPD011.pas:1605,1630— Implementação deGera_NotaFiscalAutomaticoque repassaI_ST_ATENDECARREGparaGERA_NOTAFISCALORDEMCARREGsource/MPD011/UMPD011.pas:893-901— NobtnFinalizarClick: se'N'chamaAtende_Pedido(atende pedido do embarque); se'S'também chama (mas a engine tem guard e não executa)source/MPD011/UMPD011.pas:1468— Passaparmfatur.values['ST_ATENDECARREG']paraGera_NotaFiscalAutomaticono fluxo de geração em lotesource/MPD011/UNFORDEM.pas:1168-1174— Após gravar NF, se'S'chamaAtendePedido_Nota(CD_EMPRESA, NR_ORDEM, CD_PESSOA, NR_PEDIDO)source/MRC020/UMRC020NFORDEM.pas:1329-1335— Equivalente do anterior para MRC020source/MRC020/UdmMRC020.pas:724—Atende_Pedidocom guardif ST_ATENDECARREG = 'N'(só executa no modo'N')source/MRC049/UdmMRC049.pas:318— Assinatura deGera_NotaFiscalAutomaticocomI_ST_ATENDECARREGsource/MRC049/UdmMRC049.pas:652—Atende_Pedidocom guardif = 'N'source/MRC049/UdmMRC049.pas:732,751— Implementação repassandoI_ST_ATENDECARREGparaGERA_NFORDEMCARREGMRC049source/MRC049/UMRC049.pas:1130,1143— LêdmMRC049.parmfatur.values['ST_ATENDECARREG']e passa paraGera_NotaFiscalAutomaticosource/MNF004/UMNF004.pas:956-989—Atende_Pedido(CdEmpEmbarque, NrEmbarque)executaUPDATE ITEMPEDIDOsomente quandodmMNF004.ParmFatur.Values['ST_ATENDECARREG'] = 'N'source/MNF033/UdmMNF033.pas:241,576— Assinatura deGera_NotaFiscalAutomaticocomI_ST_ATENDECARREGsource/MNF033/UdmMNF033.pas:608,667— PassaI_ST_ATENDECARREGparaGERA_NOTAFISCALPEDIDO(e para uma variação internaGN)source/MNF033/UMNF033.pas:1035— LêParmFatur.Values['ST_ATENDECARREG']e repassa
Stored Procedures (SQL)
Scripts/GERA_NOTAFISCALORDEMCARREG.sql:14— parâmetroI_ST_ATENDECARREG char(1)Scripts/GERA_NOTAFISCALORDEMCARREG.sql:313—if (I_ST_ATENDECARREG = 'S') thenmonta cursor e gravaPEDIDONOTA+ chamaATUALIZA_PEDIDONOTAScripts/GERA_NFORDEMCARREGMRC049.sql:14,111,420— mesma lógica para recapadora (MRC049)Scripts/GERA_NOTAFISCALPEDIDO.sql:9,49—I_ST_ATENDECARREG DOM_CHAR1e bloco análogo para NF geradas a partir de pedido mobileScripts/GRAVA_NOTAFISCALPEDIDO.sql:13— parâmetroI_ST_ATENDECARREG char(1)na engine interna de gravaçãoScripts/GERA_NOTAFISCAL.sql:183,261,268,554— declaraV_ST_ATENDECARREG, lê dePARMFATUR, repassa paraATUALIZA_PEDIDONOTAScripts/ATUALIZA_PEDIDONOTA.sql:8,59— assinaturaV_ST_ATENDECARREG CHAR(1) = 'N'; no blocoif (V_ST_GERA_NF = 'S')com módulosMPD011/MRC020eV_ST_ATENDECARREG = 'N', sai sem fazer nada (atendimento diferido)Scripts/RETORNA_SALDOPEDIDO.sql:36,41,44,47— declaraST_ATENDECARREG, lê daPARMFATURe, quando'N', desconta do saldo disponível oSUM(ORDEMCARREG.PS_/QT_ORDEMCARREG)pendente
DDL
docs/schema/tables/PARMFATUR.sql:176—ST_ATENDECARREG DOM_CHAR1 DEFAULT 'N' NOT NULL