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_IMPOSTOPEDIDOValor 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ódulo | Código | Papel |
|---|---|---|
| Parâmetros de Faturamento | MFA001 | Tela onde o parâmetro é configurado |
| Pedido de Compra | MPD001 | Consumidora - soma IPI/ST no total do pedido de compra |
| Pedido de Venda | MPD002 | Consumidora - exibe VL_LIQIPI e VL_IMPOSTOST; reprocessa impostos ao trocar cliente |
| Ordem de Serviço (MOF001) | MOF001 | Consumidora - soma imposto no total de itens/serviços |
| Ordem de Serviço (MOF002) | MOF002 | Consumidora - soma imposto nos totais |
| Ordem de Serviço (MOF006) | MOF006 | Consumidora - leitura do parâmetro |
| PDV / Ponto de Venda | MNF017 | Consumidora - leitura do parâmetro no carregamento |
| Atendimento Pedido | CPD001 | Consumidora - soma imposto no total atendido |
| Relatório OS | LOR044 | Consumidora - leitura para totalização |
| Lista de Pedidos | LPD128 | Consumidora - leitura para totalização |
| Parcelamento de Pedido | jParcelamento | Shared unit - totaliza parcelas somando impostos quando S |
Procedures impactadas
| Procedure | Arquivo | Descrição |
|---|---|---|
CALCULA_IMPOSTOPEDIDO | chamada em Scripts/RETORNA_VALORPEDIDO.sql e vários SQLs embutidos | Calcula IPI + ST por item. Invocada apenas quando o parâmetro está ligado (via CASE ST_IMPOSTOPEDIDO WHEN 'N' THEN 0 ELSE ... END) |
CALCULA_IMPOSTOPEDIDOTOTAL | chamada em UdmMPD002.pas:929 | Retorna O_VL_TOTAL com soma dos impostos do pedido inteiro |
RETORNA_VALORPEDIDO | Scripts/RETORNA_VALORPEDIDO.sql | Lê ST_IMPOSTOPEDIDO da PARMFATUR e, se 'N', zera O_VL_IMPOSTO antes de somar no O_VL_TOTAL |
Campos envolvidos
| Campo | Descrição |
|---|---|
ITEMPEDIDO.VL_TOTAL, VL_DESCONTO, VL_DESPESA, VL_FRETE | Valores base do item |
CALCULA_IMPOSTOPEDIDO.V_VL_IPI | Valor de IPI calculado por item |
CALCULA_IMPOSTOPEDIDO.V_VL_SUBSTITUICAO | Valor de ICMS-ST calculado por item |
CALCULA_IMPOSTOPEDIDOTOTAL.O_VL_TOTAL | Soma dos impostos (IPI + ST) do pedido |
RETORNA_VALORPEDIDO.O_VL_IMPOSTO | Valor 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 faz | Detalhe |
|---|---|
| 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_IMPOSTO | Retorna soma real dos impostos |
| Reprocessa imposto ao trocar cliente? | SIM - TdmMPD002.ReprocessaImposto executa CalculaImpostoIPIST item a item |
Join CALCULA_IMPOSTOPEDIDO | Usa 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
- Vá em MFA001 → Parâmetros → Ambos → Opção 1 → "Calcula Imposto Pedido" = Sim
- Salve os parâmetros (F6)
- Abra um Pedido de Venda (MPD002)
- Informe o cliente, movimentação e adicione um item com NCM tributado por IPI/ST
- Os campos
VL_LIQIPI(Valor Líquido + IPI/ST) eVL_IMPOSTOSTficam visíveis na tela de totais - Troque o cliente do pedido →
ReprocessaImpostodispara eCalculaImpostoIPISTé executado para cada item (UdmMPD002.pas:6066) - Total do pedido soma
VL_TOTAL - VL_DESCONTO + VL_DESPESA + VL_FRETE + VL_IMPOSTO(videRETORNA_VALORPEDIDO.sql:36-43) - 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 faz | Detalhe |
|---|---|
| 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_IMPOSTO | Zerado antes de compor O_VL_TOTAL |
| Reprocessa imposto ao trocar cliente? | Não - bloco CalculaImpostoIPIST só roda quando = 'S' |
Join CALCULA_IMPOSTOPEDIDO | IIF(... = '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
- Vá em MFA001 → "Calcula Imposto Pedido" = Não
- Salve os parâmetros (F6)
- Abra um Pedido de Venda (MPD002)
- Os campos
VL_LIQIPIeVL_IMPOSTOSTficam ocultos (UdmMPD002.pas:627-636e:778-782) - Adicione um item com NCM que teria IPI/ST - o imposto não é somado ao total
- Troque o cliente do pedido → o recálculo de impostos não dispara (condição
= 'S'não é atendida) - Abra a CPD001 no mesmo pedido - o imposto do atendimento vem zerado
- 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ção | Descrição | IPI/ST somado ao total? | VL_LIQIPI visível? | VL_IMPOSTOST visível? | Reprocessa ao trocar cliente? |
|---|---|---|---|---|---|
| S | Sim | Sim | Sim | Sim | Sim |
| N | Não (padrão) | Não (zerado) | Não | Não | Nã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
| Arquivo | Linhas | Trecho |
|---|---|---|
source/MFA001/UMFA001.dfm | 7810 | Label Caption = 'Calcula Imposto Pedido' (Ambos → Opção 1) |
source/MFA001/UMFA001.dfm | 8333-8359 | cmbST_IMPOSTOPEDIDO: TwwDBComboBox - Items: 'Sim'#9'S' / 'Não'#9'N' |
source/MFA001/UMFA001.pas | 300 | Declaração do componente cmbST_IMPOSTOPEDIDO: TwwDBComboBox |
source/MFA001/UdmMFA001.dfm | 122, 1015-1016, 2352, 2501, 2713, 3002 | SELECT / INSERT / UPDATE da PARMFATUR e definição do TStringField |
source/MFA001/UdmMFA001.pas | 112 | Declaração tabPARMFATURST_IMPOSTOPEDIDO: TStringField |
source/MFA001/UdmMFA001.pas | 468 | Valor padrão em AfterInsert: tabPARMFATURST_IMPOSTOPEDIDO.AsString := 'N'; |
Telas consumidoras
| Arquivo | Linhas | Uso |
|---|---|---|
source/MPD001/UdmMPD001.pas | 171, 253, 269, 349-351 | Carrega 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.pas | 627-636 | Controla visibilidade de edtVL_LIQIPI / lblVL_LIQIPI (visível se = 'S') |
source/MPD002/UdmMPD002.pas | 778-782 | Controla visibilidade de edtVL_IMPOSTOST / lblVL_IMPOSTOST (invisível se <> 'S') |
source/MPD002/UdmMPD002.pas | 929 | CASE ST_IMPOSTOPEDIDO WHEN 'N' THEN 0 ELSE (SELECT O_VL_TOTAL FROM CALCULA_IMPOSTOPEDIDOTOTAL(...)) na composição do total |
source/MPD002/UdmMPD002.pas | 5541-5551 | Procedure CalculaImpostoIPIST - só executa SELECT quando = 'S' |
source/MPD002/UdmMPD002.pas | 5741 | Lido no SELECT inicial dos parâmetros |
source/MPD002/UdmMPD002.pas | 6066-6076 | ReprocessaImposto - dispara loop de CalculaImpostoIPIST em todos os itens quando = 'S' |
source/MPD002/UdmMPD002.dfm | 1333-1336, 2216-2218, 2283-2286 | SQLs embutidas usam IIF(PF.ST_IMPOSTOPEDIDO = 'S', CD_EMPRESA, -1) no JOIN CALCULA_IMPOSTOPEDIDO |
source/MPD002/UMPD002.pas | 4138-4145 | StringReplace remove o JOIN CALCULA_IMPOSTOPEDIDO quando checkbox chkST_CALCULOIMPOSTO está desmarcado |
source/MOF001/UdmMOF001.pas | 441, 725, 748, 980, 999, 1052 | Carrega 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.pas | 193, 296, 318, 420, 432 | Mesma lógica de MOF001 para OS "outra" |
source/MOF006/UdmMOF006.pas | 235, 298, 318 | Carrega o parâmetro no SELECT inicial |
source/MNF017/UMNF017.pas | 165 | Leitura no SELECT de parâmetros do PDV |
source/CPD001/UdmCPD001.pas | 540, 809-812, 814, 829 | Atendimento de pedido - soma impostos do pedido/atendimento quando <> 'N' |
source/CPD001/UdmCPD001.dfm | 1432 | SQL embutida CASE PARMFATUR.ST_IMPOSTOPEDIDO WHEN 'N' THEN 0 ELSE (SELECT V_VL_TOTAL FROM CALCULA_IMPOSTOPEDIDO(...)) END |
source/LPD128/ULPD128.pas | 146 | Leitura no SELECT de parâmetros da lista |
source/LOR044/ULOR044.pas | 246 | Leitura no SELECT de parâmetros do relatório |
source/jParcelamento/UParcelaPedido.pas | 135-137, 146-148 | sqlTotalPedido 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
| Arquivo | Linhas | Uso |
|---|---|---|
Scripts/RETORNA_VALORPEDIDO.sql | 14, 16-19, 36-37 | Declara 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- Recebimentosource/LPD072/ULPD072.dfm,source/LPD028/ULPD028.dfm,source/LPD018/ULPD018.dfm- Listagens de pedidossource/LOF000/ULOF000.dfm- Listagem OSsource/CPD009/UdmCPD009.dfm- Configuração de pedidos