Pular para o conteúdo principal

Parâmetro de Cálculo de Imposto no Pedido

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Pedidos / O.S. → Opção 1 → "Calcula Imposto Pedido" Tabela: PARMFATUR.ST_IMPOSTOPEDIDO Valor padrão: N (Não)

Controla se o cálculo de IPI e ICMS-ST (Substituição Tributária) é somado ao valor total do pedido (e documentos derivados como Ordem de Serviço e Pedido de Compra). Quando ligado, a procedure CALCULA_IMPOSTOPEDIDO é acionada para cada item e o resultado é somado ao valor líquido; quando desligado, os impostos são zerados e o campo de visualização é ocultado.

Telas impactadas​

MóduloCódigoPapel
Parâmetros de FaturamentoMFA001Tela onde o parâmetro é configurado
Pedido de CompraMPD001Consumidora - soma IPI/ST no total do pedido de compra
Pedido de VendaMPD002Consumidora - exibe VL_LIQIPI e VL_IMPOSTOST; reprocessa impostos ao trocar cliente
Ordem de Serviço (MOF001)MOF001Consumidora - soma imposto no total de itens/serviços
Ordem de Serviço (MOF002)MOF002Consumidora - soma imposto nos totais
Ordem de Serviço (MOF006)MOF006Consumidora - leitura do parâmetro
PDV / Ponto de VendaMNF017Consumidora - leitura do parâmetro no carregamento
Atendimento PedidoCPD001Consumidora - soma imposto no total atendido
Relatório OSLOR044Consumidora - leitura para totalização
Lista de PedidosLPD128Consumidora - leitura para totalização
Parcelamento de PedidojParcelamentoShared unit - totaliza parcelas somando impostos quando S

Procedures impactadas​

ProcedureArquivoDescrição
CALCULA_IMPOSTOPEDIDOchamada em Scripts/RETORNA_VALORPEDIDO.sql e vários SQLs embutidosCalcula IPI + ST por item. Invocada apenas quando o parâmetro está ligado (via CASE ST_IMPOSTOPEDIDO WHEN 'N' THEN 0 ELSE ... END)
CALCULA_IMPOSTOPEDIDOTOTALchamada em UdmMPD002.pas:929Retorna O_VL_TOTAL com soma dos impostos do pedido inteiro
RETORNA_VALORPEDIDOScripts/RETORNA_VALORPEDIDO.sqlLê ST_IMPOSTOPEDIDO da PARMFATUR e, se 'N', zera O_VL_IMPOSTO antes de somar no O_VL_TOTAL

Campos envolvidos​

CampoDescrição
ITEMPEDIDO.VL_TOTAL, VL_DESCONTO, VL_DESPESA, VL_FRETEValores base do item
CALCULA_IMPOSTOPEDIDO.V_VL_IPIValor de IPI calculado por item
CALCULA_IMPOSTOPEDIDO.V_VL_SUBSTITUICAOValor de ICMS-ST calculado por item
CALCULA_IMPOSTOPEDIDOTOTAL.O_VL_TOTALSoma dos impostos (IPI + ST) do pedido
RETORNA_VALORPEDIDO.O_VL_IMPOSTOValor de imposto retornado pela procedure (zerado se ST_IMPOSTOPEDIDO = 'N')
VL_LIQIPI (MPD002)Rótulo "Valor Líquido + IPI/ST" exibido na tela - visibilidade condicionada ao parâmetro
VL_IMPOSTOST (MPD002)Campo de valor de ICMS-ST - visibilidade condicionada ao parâmetro

Opções disponíveis​

S - Sim​

O que fazDetalhe
Calcula IPI/ST no pedido?SIM - chama CALCULA_IMPOSTOPEDIDO por item
Campo VL_LIQIPI (MPD002)Visível (mostra "Valor Líquido + IPI/ST")
Campo VL_IMPOSTOST (MPD002)Visível
RETORNA_VALORPEDIDO.O_VL_IMPOSTORetorna soma real dos impostos
Reprocessa imposto ao trocar cliente?SIM - TdmMPD002.ReprocessaImposto executa CalculaImpostoIPIST item a item
Join CALCULA_IMPOSTOPEDIDOUsa IIF(PF.ST_IMPOSTOPEDIDO = 'S', CD_EMPRESA, -1) - quando 'S' passa a empresa real, ativando o cálculo
Ordens de Serviço (MOF001/MOF002)Impostos somam em VL_IMPOSTO dos totais

Simulação passo a passo​

  1. Vá em MFA001 → Parâmetros → Ambos → Opção 1 → "Calcula Imposto Pedido" = Sim
  2. Salve os parâmetros (F6)
  3. Abra um Pedido de Venda (MPD002)
  4. Informe o cliente, movimentação e adicione um item com NCM tributado por IPI/ST
  5. Os campos VL_LIQIPI (Valor Líquido + IPI/ST) e VL_IMPOSTOST ficam visíveis na tela de totais
  6. Troque o cliente do pedido → ReprocessaImposto dispara e CalculaImpostoIPIST é executado para cada item (UdmMPD002.pas:6066)
  7. Total do pedido soma VL_TOTAL - VL_DESCONTO + VL_DESPESA + VL_FRETE + VL_IMPOSTO (vide RETORNA_VALORPEDIDO.sql:36-43)
  8. Reabra o pedido na CPD001 (Atendimento) - o total atendido soma os impostos dos itens atendidos

Resultado esperado: IPI e ICMS-ST aparecem nos totais do pedido/OS, são somados ao valor final e permanecem recalculados sempre que o cliente/empresa destinatária mudar (afeta alíquotas por UF).


N - Não​

O que fazDetalhe
Calcula IPI/ST no pedido?NÃO - expressão CASE 'N' WHEN 'N' THEN 0 ELSE ... retorna sempre 0
Campo VL_LIQIPI (MPD002)Invisível (junto com seu label)
Campo VL_IMPOSTOST (MPD002)Invisível
RETORNA_VALORPEDIDO.O_VL_IMPOSTOZerado antes de compor O_VL_TOTAL
Reprocessa imposto ao trocar cliente?Não - bloco CalculaImpostoIPIST só roda quando = 'S'
Join CALCULA_IMPOSTOPEDIDOIIF(... = 'S', CD_EMPRESA, -1) passa -1 - procedure retorna vazio; no MPD002 o join inteiro é removido via StringReplace quando o checkbox "Calcula Imposto" está desmarcado
Ordens de Serviço (MOF001/MOF002)CASE 'N' WHEN 'N' THEN 0 ELSE ... zera o VL_IMPOSTO dos totais

Simulação passo a passo​

  1. Vá em MFA001 → "Calcula Imposto Pedido" = Não
  2. Salve os parâmetros (F6)
  3. Abra um Pedido de Venda (MPD002)
  4. Os campos VL_LIQIPI e VL_IMPOSTOST ficam ocultos (UdmMPD002.pas:627-636 e :778-782)
  5. Adicione um item com NCM que teria IPI/ST - o imposto não é somado ao total
  6. Troque o cliente do pedido → o recálculo de impostos não dispara (condição = 'S' não é atendida)
  7. Abra a CPD001 no mesmo pedido - o imposto do atendimento vem zerado
  8. Abra uma OS no MOF001 - totais de serviços/itens não incluem imposto

Resultado esperado: O pedido (e documentos derivados) é totalizado apenas pelos valores comerciais, sem incluir IPI ou ICMS-ST. Os campos de imposto somem da interface e as procedures de cálculo nunca são invocadas (ganho de performance).

Este é o valor padrão ao criar um novo registro no MFA001 (UdmMFA001.pas:468 - AfterInsert).


Tabela Comparativa Resumida​

OpçãoDescriçãoIPI/ST somado ao total?VL_LIQIPI visível?VL_IMPOSTOST visível?Reprocessa ao trocar cliente?
SSimSimSimSimSim
NNão (padrão)Não (zerado)NãoNãoNão

Observação - Checkbox chkST_CALCULOIMPOSTO (MPD002)​

Na listagem de pedidos (MPD002) existe um checkbox runtime chkST_CALCULOIMPOSTO que, quando desmarcado, remove via StringReplace o LEFT JOIN CALCULA_IMPOSTOPEDIDO(...) da SQL dos itens (UMPD002.pas:4140-4144). Esse controle é independente do parâmetro - permite ao operador filtrar/listar pedidos sem custo do cálculo de imposto mesmo que ST_IMPOSTOPEDIDO = 'S'. O parâmetro continua governando a inclusão dos valores no total gravado.


Referências no Código Fonte​

MFA001 - tela de configuração​

ArquivoLinhasTrecho
source/MFA001/UMFA001.dfm7810Label Caption = 'Calcula Imposto Pedido' (Ambos → Opção 1)
source/MFA001/UMFA001.dfm8333-8359cmbST_IMPOSTOPEDIDO: TwwDBComboBox - Items: 'Sim'#9'S' / 'Não'#9'N'
source/MFA001/UMFA001.pas300Declaração do componente cmbST_IMPOSTOPEDIDO: TwwDBComboBox
source/MFA001/UdmMFA001.dfm122, 1015-1016, 2352, 2501, 2713, 3002SELECT / INSERT / UPDATE da PARMFATUR e definição do TStringField
source/MFA001/UdmMFA001.pas112Declaração tabPARMFATURST_IMPOSTOPEDIDO: TStringField
source/MFA001/UdmMFA001.pas468Valor padrão em AfterInsert: tabPARMFATURST_IMPOSTOPEDIDO.AsString := 'N';

Telas consumidoras​

ArquivoLinhasUso
source/MPD001/UdmMPD001.pas171, 253, 269, 349-351Carrega em iST_IMPOSTOPEDIDO e usa em SUM(CASE ... WHEN 'N' THEN 0 ELSE (SELECT V_VL_TOTAL FROM CALCULA_IMPOSTOPEDIDO(...)) END) VL_IMPOSTO
source/MPD002/UdmMPD002.pas627-636Controla visibilidade de edtVL_LIQIPI / lblVL_LIQIPI (visível se = 'S')
source/MPD002/UdmMPD002.pas778-782Controla visibilidade de edtVL_IMPOSTOST / lblVL_IMPOSTOST (invisível se <> 'S')
source/MPD002/UdmMPD002.pas929CASE ST_IMPOSTOPEDIDO WHEN 'N' THEN 0 ELSE (SELECT O_VL_TOTAL FROM CALCULA_IMPOSTOPEDIDOTOTAL(...)) na composição do total
source/MPD002/UdmMPD002.pas5541-5551Procedure CalculaImpostoIPIST - só executa SELECT quando = 'S'
source/MPD002/UdmMPD002.pas5741Lido no SELECT inicial dos parâmetros
source/MPD002/UdmMPD002.pas6066-6076ReprocessaImposto - dispara loop de CalculaImpostoIPIST em todos os itens quando = 'S'
source/MPD002/UdmMPD002.dfm1333-1336, 2216-2218, 2283-2286SQLs embutidas usam IIF(PF.ST_IMPOSTOPEDIDO = 'S', CD_EMPRESA, -1) no JOIN CALCULA_IMPOSTOPEDIDO
source/MPD002/UMPD002.pas4138-4145StringReplace remove o JOIN CALCULA_IMPOSTOPEDIDO quando checkbox chkST_CALCULOIMPOSTO está desmarcado
source/MOF001/UdmMOF001.pas441, 725, 748, 980, 999, 1052Carrega em iST_IMPOSTOPEDIDO; usa em CASE ... WHEN 'N' THEN 0 ELSE IMP.O_VL_IMPOSTO END VL_IMPOSTO nos totais de OS
source/MOF002/UdmMOF002.pas193, 296, 318, 420, 432Mesma lógica de MOF001 para OS "outra"
source/MOF006/UdmMOF006.pas235, 298, 318Carrega o parâmetro no SELECT inicial
source/MNF017/UMNF017.pas165Leitura no SELECT de parâmetros do PDV
source/CPD001/UdmCPD001.pas540, 809-812, 814, 829Atendimento de pedido - soma impostos do pedido/atendimento quando <> 'N'
source/CPD001/UdmCPD001.dfm1432SQL embutida CASE PARMFATUR.ST_IMPOSTOPEDIDO WHEN 'N' THEN 0 ELSE (SELECT V_VL_TOTAL FROM CALCULA_IMPOSTOPEDIDO(...)) END
source/LPD128/ULPD128.pas146Leitura no SELECT de parâmetros da lista
source/LOR044/ULOR044.pas246Leitura no SELECT de parâmetros do relatório
source/jParcelamento/UParcelaPedido.pas135-137, 146-148sqlTotalPedido e sqlTotalPneu usam CASE PF.ST_IMPOSTOPEDIDO WHEN 'N' THEN 0 ELSE (SELECT V_VL_TOTAL FROM CALCULA_IMPOSTOPEDIDO(...)) END para compor o valor a ser parcelado

Procedures SQL​

ArquivoLinhasUso
Scripts/RETORNA_VALORPEDIDO.sql14, 16-19, 36-37Declara V_ST_IMPOSTOPEDIDO, lê de PARMFATUR e zera O_VL_IMPOSTO quando COALESCE(V_ST_IMPOSTOPEDIDO,'N') = 'N'

Outros módulos que também referenciam (sem análise detalhada)​

  • source/RCA006/UdmRCA006.dfm - Recebimento
  • source/LPD072/ULPD072.dfm, source/LPD028/ULPD028.dfm, source/LPD018/ULPD018.dfm - Listagens de pedidos
  • source/LOF000/ULOF000.dfm - Listagem OS
  • source/CPD009/UdmCPD009.dfm - Configuração de pedidos