Reprocessar Tabela de Preços ao Trocar Cliente (MPD002)
Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros de Pedidos/ Ordem de Serviço → Opção 2 → "Reprocessar Tab. Preços cfe. [MFA006]" Tabela:
PARMFATUR.ST_REPROTABPRECOMPD002Valor padrão:N(Não)
ℹ️ Observação sobre o rótulo: O label na UI exibe
[MFA006], mas o consumo efetivo do parâmetro ocorre no MPD002 (vide o sufixoMPD002no próprio nome do campo). Nenhuma referência ao parâmetro foi localizada em MFA006 no code base atual.
Telas impactadas
| Módulo | Código | Descrição |
|---|---|---|
| Pedido de Venda | MPD002 | Ao trocar o cliente (CD_PESSOA) em um pedido que já tenha itens, recalcula CD_TABPRECO de cada item via procedure RETORNA_TABPRECO e reaplica o preço (gatilho no tabPEDIDOCD_PESSOAValidate) |
Única tela consumidora encontrada no grep do
source/. Nenhum uso em outros módulos, nem emScripts/(Firebird).
Campos envolvidos
| Campo | Descrição |
|---|---|
PARMFATUR.ST_REPROTABPRECOMPD002 | Flag S/N que controla se o pedido MPD002 deve reaplicar a tabela de preço a cada troca de cliente |
PEDIDO.CD_PESSOA | Cliente do pedido — sua troca é o gatilho do reprocessamento |
PEDIDO.CD_CONDPAGTO | Condição de pagamento — parte dos parâmetros passados a RETORNA_TABPRECO |
PEDIDO.CD_VENDEDOR / PEDIDO.CD_REGIAOCOMERCIAL / PEDIDO.SG_ESTADO | Integram o cálculo da tabela via RETORNA_TABPRECO |
ITEMPEDIDO.CD_TABPRECO | Código da tabela de preço reatribuído a cada item durante o reprocessamento |
ITEMPEDIDO.CD_ITEM / QT_PEDIDA / PS_PEDIDO | Entradas de RETORNA_TABPRECO para escolher a tabela mais adequada por item |
ITEMPEDIDO.ST_ITEMPEDIDO | Itens com status 'C' (cancelado) são ignorados no reprocessamento |
PARMFATUR.ST_TRANSFERENCIA | Desabilita parte do recálculo quando o pedido é marcado como transferência (iTransf = 'S' e ST_TRANSFERENCIA <> 'N') |
Opções disponíveis
S - Sim (Reprocessa ao trocar cliente)
| O que faz | Detalhe |
|---|---|
| Gatilho | Troca de cliente (CD_PESSOA) no MPD002, disparado em tabPEDIDOCD_PESSOAValidate |
| Pré-condição | O pedido já deve ter ao menos um item gravado (tabITEMPEDIDOCD_ITEM.AsString <> '') |
| Comportamento em UI | Silencioso — nenhuma pergunta ao usuário |
| Ação | Desabilita controles/eventos, percorre tabITEMPEDIDO.First..Eof e para cada item chama a procedure RETORNA_TABPRECO(cd_empresa, cd_condpagto, cd_tipopessoa, cd_vendedor, cd_regiaocomercial, sg_estado, cd_pessoa, cd_item, qt_pedida/ps_pedido) |
| Atualização | Se a nova tabela retornada diferir da atual, grava em tabITEMPEDIDOCD_TABPRECO.AsString. Em seguida reatribui o mesmo valor para disparar o validate que recalcula o preço unitário do item |
| Itens ignorados | CD_TABPRECO vazio, ST_ITEMPEDIDO = 'C' (cancelado) e casos de transferência quando iTransf = 'S' e ST_TRANSFERENCIA <> 'N' |
| Tratamento de erro | Qualquer exceção é encapsulada em JException.Create('W-0000', [e.Message]); controles reabilitados no finally |
Simulação passo a passo
- Vá em MFA001 → Parâmetros de Pedidos/ Ordem de Serviço → Opção 2 → "Reprocessar Tab. Preços cfe. [MFA006]" = Sim
- Salve os parâmetros (F6)
- Abra o MPD002 e crie um pedido para o Cliente A com 3 itens (cada um com
CD_TABPRECOdefinido) - Sem salvar, troque o campo Cliente para Cliente B (edit em
edtCD_PESSOA) - Ao sair do campo, o sistema percorre todos os itens silenciosamente, consulta
RETORNA_TABPRECOcom os dados do Cliente B e atualiza oCD_TABPRECOde cada item quando diferente - Em seguida, o validate do
CD_TABPRECOrecalcula oVL_UNITARIOdo item conforme a tabela adequada ao novo cliente
Resultado esperado: Os itens existentes passam a refletir a tabela de preço e os valores unitários apropriados ao novo cliente, sem intervenção do usuário.
N - Não (Não reprocessa)
| O que faz | Detalhe |
|---|---|
| Gatilho | — |
| Comportamento em UI | Trocar o cliente no MPD002 não altera CD_TABPRECO nem VL_UNITARIO dos itens |
| Ação | O bloco if ((ParmFatur.Values['ST_REPROTABPRECOMPD002'] = 'S') ...) é pulado por completo |
Simulação passo a passo
- Vá em MFA001 → Opção 2 → "Reprocessar Tab. Preços cfe. [MFA006]" = Não
- Salve os parâmetros (F6)
- Abra o MPD002 e crie um pedido para o Cliente A com alguns itens
- Troque o cliente para Cliente B
- Os itens permanecem com o
CD_TABPRECOe oVL_UNITARIOoriginais do Cliente A
Resultado esperado: Nenhum recálculo automático. Cabe ao usuário decidir se quer reajustar manualmente os preços dos itens após a troca de cliente.
Este é o valor padrão ao criar um novo registro no MFA001 (definido em
UdmMFA001.pas:565dentro doAfterInsertdatabPARMFATUR).
Interação com ST_REPROCESSATABPRECO / ST_REPRMOVCLIMPD020
Os três parâmetros compartilham a mesma filosofia de "reprocessar quando algo muda em pedido/nota", mas com gatilhos, módulos e granularidades diferentes:
| Parâmetro | Tela consumidora principal | Gatilho | O que recalcula | Opções | Documentação |
|---|---|---|---|---|---|
ST_REPROCESSATABPRECO | MPD002, MNF002, MNF008, MNF017, MPD020, MPD081, MRC001, MRC020, MRC040 | Troca de Condição de Pagamento | Tabela de preço + preço unitário dos itens | S, N, A | ST_REPROCESSATABPRECO |
ST_REPRMOVCLIMPD020 | MPD020, MPD002, MNF001, MNF002, MNF008, MRC020 | Troca de Cliente ou Condição de Pagamento | Movimentação (CFOP/impostos) via buscaMovimentacao | S, N, P | ST_REPRMOVCLIMPD020 |
ST_REPROTABPRECOMPD002 | MPD002 apenas | Troca de Cliente (CD_PESSOA) | Tabela de preço + preço unitário dos itens | S, N | (este documento) |
Diferenças em relação a ST_REPROCESSATABPRECO
- Escopo reduzido: atua apenas em MPD002. Os demais módulos listados em
ST_REPROCESSATABPRECOnão consultamST_REPROTABPRECOMPD002. - Gatilho diferente: dispara na troca de cliente, não na troca de condição de pagamento. A troca de condição permanece sob o domínio de
ST_REPROCESSATABPRECO. - Opções simplificadas: só há
SeN— não existe a variaçãoA(automático sem perguntar) nemP(perguntar), pois a própria opçãoSjá opera silenciosamente.
Cenário combinado no MPD002
No mesmo MPD002, um usuário pode:
- Trocar o cliente → dispara
ST_REPROTABPRECOMPD002(tabela de preço) e tambémST_REPRMOVCLIMPD020(movimentação), pois ambos escutam o evento de troca doCD_PESSOA. - Trocar a condição de pagamento → dispara
ST_REPROCESSATABPRECO(tabela de preço) e tambémST_REPRMOVCLIMPD020(movimentação).
Portanto, para um ambiente em que a troca de cliente deve recalcular tudo sem perguntar nada, a combinação recomendada é:
ST_REPROTABPRECOMPD002 = 'S'ST_REPRMOVCLIMPD020 = 'S'ST_REPROCESSATABPRECO = 'A'(para cobrir também a troca de condição)
Tabela Comparativa Resumida
| Opção | Descrição | Pergunta ao trocar cliente? | Reprocessa tabela + preço? | Escopo |
|---|---|---|---|---|
| S | Sim | Não — silencioso | Sim (via RETORNA_TABPRECO) | Apenas itens com CD_TABPRECO e não cancelados |
| N | Não | Não | Nunca | — |
Referências no Código Fonte
Tela MFA001 (definição e persistência)
source/MFA001/UMFA001.dfm:10031-10059- ComboBoxcmbST_REPROTABPRECOMPD002(TwwDBComboBox) comDataField = 'ST_REPROTABPRECOMPD002',Items.Strings = ('Sim'#9'S', 'Não'#9'N'),Style = csDropDownList,DropDownCount = 8source/MFA001/UMFA001.dfm:9352-9365- TLabellbl70comCaption = 'Reprocessar Tab. Pre'#231'os cfe. [MFA006]'(rótulo visível do combo)source/MFA001/UMFA001.dfm:9235, 9242- Tab "Opção 2" / GroupBox "Parâmetros de Pedidos/ Ordem de Serviço" (contêineres pais do combo)source/MFA001/UMFA001.pas:494- declaração do componentecmbST_REPROTABPRECOMPD002: TwwDBComboBoxsource/MFA001/UdmMFA001.pas:259- declaraçãotabPARMFATURST_REPROTABPRECOMPD002: TStringFieldsource/MFA001/UdmMFA001.pas:565- valor padrão noAfterInsertdatabPARMFATUR:tabPARMFATURST_REPROTABPRECOMPD002.AsString := 'N';source/MFA001/UdmMFA001.dfm:1836-1841- TStringField (tamanho 1,FixedChar = True,Origin = '"PARMFATUR"."ST_REPROTABPRECOMPD002"')source/MFA001/UdmMFA001.dfm:2431, 2605, 2853- coluna incluída no SELECT, INSERT e UPDATE daPARMFATUR
Módulos consumidores
source/MPD002/UdmMPD002.pas:1688-1753- bloco de reprocessamento dentro detabPEDIDOCD_PESSOAValidate. PercorretabITEMPEDIDO, chamaRETORNA_TABPRECOpara cada item elegível (comCD_TABPRECOe não cancelado) e reatribuiCD_TABPRECOpara disparar o validate que recalcula o preço unitáriosource/MPD002/UdmMPD002.pas:5750- incluído no SELECT consolidado de parâmetros (SELECT ... P.ST_REPROTABPRECOMPD002, ... FROM PARMFATUR P)
Procedures SQL (Firebird)
- Procedure chamada indiretamente:
RETORNA_TABPRECO(emScripts/RETORNA_TABPRECO.sql) - retorna oCD_TABPRECOadequado para a tupla(empresa, condpagto, tipopessoa, vendedor, regiao, estado, pessoa, item, peso/qtde). Acionada pelo Delphi quandoST_REPROTABPRECOMPD002 = 'S'. - Nenhuma referência direta ao nome
ST_REPROTABPRECOMPD002foi encontrada emScripts/- o parâmetro é lido exclusivamente pelo Delphi (MPD002).