CALCULA_IMPOSTOS — CALCULA_IMPOSTOS (enriquecimento)
Objetivo
A procedure CALCULA_IMPOSTOS é o motor central de cálculo de impostos do ERP: para cada item de um documento fiscal (nota de venda, compra, NFS-e) e cada imposto configurado nele (ICMS, ICMS-ST, IPI, PIS, COFINS, ISS, IR, CSLL, IBS, CBS), ela recebe os dados da operação (empresa, data, estados, pessoa, item, movimentação e valores) e devolve o percentual, a base, o valor do imposto, os códigos fiscais (CST/CSOSN/CFOP) e, quando aplicável, os campos específicos de substituição tributária, DIFAL, crédito presumido e da Reforma Tributária (IBS/CBS). Quando falta algum cadastro necessário para o cálculo (alíquota, faixa de progressão, regra de CST), a procedure interrompe e devolve uma mensagem de erro em vez do valor calculado, para impedir que o documento seja emitido com imposto incorreto ou ausente.
Fluxo principal
- O documento fiscal (nota/item) é gravado ou recalculado e o sistema chama a procedure CALCULA_IMPOSTOS uma vez para cada imposto configurado no item (ICMS, IPI, PIS, COFINS, ISS, IR, IBS, CBS etc.), passando empresa, data, operação, estados, pessoa, item, movimentação e valores do item. (Não identificado neste módulo (a tela/rotina Delphi chamadora não foi lida nesta sessão)) —
Scripts/CALCULA_IMPOSTOS.sql:3-45 (CALCULA_IMPOSTOS) - Para ICMS, o sistema localiza a Alíquota aplicável pela hierarquia (Movimentação > Condição Fiscal Pessoa+Item > Pessoa > Item > Estado) e interrompe com mensagem MFI002 se nada for encontrado. (Cadastro de Alíquotas) —
Scripts/CALCULA_IMPOSTOS.sql:206-303 (CALCULA_IMPOSTOS) - Se a operação for interestadual para consumidor final, calcula o ICMS Partilha/DIFAL (base dupla ou única) e o crédito presumido, se cadastrado. (Cadastro de Alíquotas (Partilha/DIFAL)) —
Scripts/CALCULA_IMPOSTOS.sql:847-950 (CALCULA_IMPOSTOS) - Para IPI, verifica pauta fiscal do item e calcula o imposto sobre a base (com despesas/ST agregadas conforme parâmetro do Imposto), jogando o saldo em Outras ou Isento. (Cadastro de Impostos) —
Scripts/CALCULA_IMPOSTOS.sql:956-1054 (CALCULA_IMPOSTOS) - Se o imposto for IBS ou CBS, busca a regra de cálculo de CST/Classificação Tributária pelo NCM/Movimentação/Condição Fiscal e calcula o imposto considerando alíquota zero, redução e diferimento (que podem coexistir). (Regra de Cálculo CST IBS/CBS / Classificação Tributária) —
Scripts/CALCULA_IMPOSTOS.sql:1541-1652 (CALCULA_IMPOSTOS) - A procedure devolve (suspend) o percentual, a base, o valor do imposto, os campos fiscais (CST/CSOSN/CFOP/Origem) e, se algo impediu o cálculo, uma mensagem de erro em vez do valor calculado. (Não identificado (retorno consumido pela tela/rotina chamadora)) —
Scripts/CALCULA_IMPOSTOS.sql:1654-1655 (CALCULA_IMPOSTOS)
Campos obrigatórios
| Campo | Condição | Mensagem | Fonte |
|---|---|---|---|
| Alíquota cadastrada (tabela ALIQUOTA) para o par Estado Origem/Destino | Sempre que o imposto calculado é do tipo ICMS (V_TP_IMPOSTO = 'I') e o tipo de cálculo não é progressivo; o sistema busca em cascata por Movimentação, depois Condição Fiscal Pessoa+Item, Pessoa, Item e por fim só Estado Origem/Destino | CALCULA_IMPOSTOS.: Não há Parâmetros Cadastros para Efetuar o Cálculo de Imposto do Tipo ICMS [MFI002]. | Scripts/CALCULA_IMPOSTOS.sql:224-303 (CALCULA_IMPOSTOS) |
| Faixa de progressão do imposto (tabela IMPOSTOPROG) cobrindo a data de emissão e o valor de receita | Quando o imposto tem Tipo de Cálculo = Progressivo ('P'), usado tipicamente para PIS/COFINS/IR/CSLL por faixa de receita bruta | CALCULA_IMPOSTOS.: Não foi Encontrado um Percentual de Alíquota na Faixa de Progressão do Imposto ... Verifique [TFI005]! | Scripts/RETORNA_IMPOSTOPROGRESSIVO.sql:162-179 (RETORNA_IMPOSTOPROGRESSIVO) |
| % de IBS Municipal e % de IBS Estadual (cadastro de Município/Estado ou, na falta, da Empresa) | Quando o imposto calculado é IBS (V_TP_IMPOSTO = 'B') | CALCULA_IMPOSTOS.: Não há Aliquotas Cadastradas para Efetuar o Cálculo de Imposto do Tipo IBS [MFI020]. | Scripts/CALCULA_IMPOSTOS.sql:1291-1303 (CALCULA_IMPOSTOS) |
| % de CBS União (cadastro da Empresa) | Quando o imposto calculado é CBS (V_TP_IMPOSTO = 'Y') | CALCULA_IMPOSTOS.: Não há Aliquotas Cadastradas para Efetuar o Cálculo de Imposto do Tipo CBS [MFI020]. | Scripts/CALCULA_IMPOSTOS.sql:1304-1317 (CALCULA_IMPOSTOS) |
| Regra de cálculo de CST IBS/CBS (tabela REGRACALCULOCST) por Movimentação, NCM+Condição Fiscal, Condição Fiscal, NCM ou Geral | Sempre que o imposto calculado é IBS ou CBS (V_TP_IMPOSTO in ('B','Y')) | RETORNA_REGRACALCULOCST.: Não foi encontrada uma regra para efetuar o Calculo dos impostos IBS e/ou CBS | Scripts/RETORNA_REGRACALCULOCST.sql:38-92 (RETORNA_REGRACALCULOCST) |
Mensagens: causa e ação
MFI002 - CALCULA_IMPOSTOS.: Não há Parâmetros Cadastros para Efetuar o Cálculo de Imposto do Tipo ICMS.
Causa: Não existe nenhum registro na tabela de Alíquotas que case com o Estado de Origem/Destino, a Movimentação e/ou a Condição Fiscal de Pessoa/Item do item lançado na nota.
Ação: Cadastrar a Alíquota de ICMS para essa combinação de Estado Origem/Destino + Movimentação (ou Condição Fiscal) na tela de Alíquotas antes de gravar a nota novamente.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:291-299 (CALCULA_IMPOSTOS)
TFI005 - CALCULA_IMPOSTOS.: Não foi Encontrado um Percentual de Alíquota na Faixa de Progressão do Imposto ... Verifique [TFI005]!
Causa: O imposto está configurado como progressivo (por faixa de receita), mas não existe faixa cadastrada em IMPOSTOPROG que cubra o valor de faturamento apurado (mensal, anual ou 12 meses) na data de emissão do documento.
Ação: Cadastrar/ajustar a faixa de valores (Valor Inicial/Final, datas de vigência e alíquota) na tela de Imposto Progressivo (TFI005) para cobrir o valor de faturamento apurado.
Fonte: Scripts/RETORNA_IMPOSTOPROGRESSIVO.sql:162-179 (RETORNA_IMPOSTOPROGRESSIVO)
MFI020 - CALCULA_IMPOSTOS.: Não há Aliquotas Cadastradas para Efetuar o Cálculo de Imposto do Tipo IBS.
Causa: Não há percentual de IBS Municipal e/ou Estadual cadastrado nem no Município/Estado do destino ou origem, nem como padrão na Empresa.
Ação: Cadastrar o % de IBS Municipal no cadastro do Município e o % de IBS Estadual no cadastro do Estado (ou os percentuais padrão na Empresa) antes de recalcular.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:1291-1299 (CALCULA_IMPOSTOS)
MFI020 - CALCULA_IMPOSTOS.: Não há Aliquotas Cadastradas para Efetuar o Cálculo de Imposto do Tipo CBS.
Causa: Não há percentual de CBS União cadastrado na Empresa.
Ação: Cadastrar o % de CBS União no cadastro da Empresa antes de recalcular o documento.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:1304-1312 (CALCULA_IMPOSTOS)
RETORNA_REGRACALCULOCST.: Não foi encontrada uma regra para efetuar o Calculo dos impostos IBS e/ou CBS
Causa: Não existe nenhuma regra cadastrada em REGRACALCULOCST que sirva de fallback: nem por Movimentação, nem por NCM+Condição Fiscal, nem só Condição Fiscal, nem só NCM, e nem sequer a regra do tipo Geral ('G').
Ação: Cadastrar ao menos uma Regra de Cálculo de CST do tipo 'Geral' em REGRACALCULOCST, ou uma regra específica para a Movimentação/NCM/Condição Fiscal usados no documento.
Fonte: Scripts/RETORNA_REGRACALCULOCST.sql:87-92 (RETORNA_REGRACALCULOCST)
Regras de negócio
CALCULA_IMPOSTOS.R001(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R001.md)CALCULA_IMPOSTOS.R002(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R002.md)CALCULA_IMPOSTOS.R003(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R003.md)CALCULA_IMPOSTOS.R004(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R004.md)CALCULA_IMPOSTOS.R005(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R005.md)CALCULA_IMPOSTOS.R006(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R006.md)CALCULA_IMPOSTOS.R007(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R007.md)CALCULA_IMPOSTOS.R008(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R008.md)CALCULA_IMPOSTOS.R009(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R009.md)CALCULA_IMPOSTOS.R010(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R010.md)CALCULA_IMPOSTOS.R011(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R011.md)CALCULA_IMPOSTOS.R012(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R012.md)CALCULA_IMPOSTOS.R013(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R013.md)CALCULA_IMPOSTOS.R014(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R014.md)CALCULA_IMPOSTOS.R015(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R015.md)CALCULA_IMPOSTOS.R016(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R016.md)CALCULA_IMPOSTOS.R017(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R017.md)CALCULA_IMPOSTOS.R018(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R018.md)CALCULA_IMPOSTOS.R019(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R019.md)CALCULA_IMPOSTOS.R020(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R020.md)CALCULA_IMPOSTOS.R021(verregras/CALCULA_IMPOSTOS/CALCULA_IMPOSTOS.R021.md)
Perguntas frequentes
P: Por que a nota trava com a mensagem 'Não há Parâmetros Cadastros para Efetuar o Cálculo de Imposto do Tipo ICMS [MFI002]'?
R: Porque não existe nenhuma Alíquota cadastrada que combine com o Estado Origem/Destino, a Movimentação ou a Condição Fiscal do item. Cadastre a Alíquota faltante na tela de Alíquotas.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:291-299 (CALCULA_IMPOSTOS)
P: Deu a mensagem 'Não foi Encontrado um Percentual de Alíquota na Faixa de Progressão do Imposto ... [TFI005]', o que fazer?
R: O imposto está configurado como progressivo por faixa de receita e não existe faixa cadastrada em Imposto Progressivo (TFI005) que cubra o valor de faturamento apurado. Cadastre a faixa faltante.
Fonte: Scripts/RETORNA_IMPOSTOPROGRESSIVO.sql:162-179 (RETORNA_IMPOSTOPROGRESSIVO)
P: Por que o ICMS-ST está calculando com um valor de base diferente do valor do produto na nota?
R: A Alíquota pode estar parametrizada para usar o custo da última nota de Entrada válida do produto como base do ICMS-ST (Modo de Base 'Custo'), em vez do valor da nota atual. Verifique o Modo de Base de Cálculo na Alíquota.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:592-634 (CALCULA_IMPOSTOS)
P: Deu erro 'Não há Aliquotas Cadastradas para Efetuar o Cálculo de Imposto do Tipo IBS/CBS [MFI020]', o que verificar?
R: Falta cadastrar o percentual de IBS (Municipal/Estadual, no Município/Estado ou na Empresa) ou o percentual de CBS União na Empresa, dependendo de qual dos dois a mensagem citar.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:1291-1317 (CALCULA_IMPOSTOS)
P: Deu a mensagem 'Não foi encontrada uma regra para efetuar o Calculo dos impostos IBS e/ou CBS', o que fazer?
R: Não existe nenhuma Regra de Cálculo de CST cadastrada que sirva de fallback (nem específica por Movimentação/NCM/Condição Fiscal, nem a regra Geral). Cadastre ao menos uma regra 'Geral' em Regra de Cálculo CST IBS/CBS.
Fonte: Scripts/RETORNA_REGRACALCULOCST.sql:87-92 (RETORNA_REGRACALCULOCST)
P: Por que a base de PIS/COFINS está sendo calculada como o valor do item menos o ICMS?
R: O Imposto (PIS/COFINS) está parametrizado para deduzir o ICMS (e, conforme a variante, FCP/FECOP/ST/DIFAL) da base de cálculo antes de aplicar a alíquota. Verifique o parâmetro 'Deduzir ICMS da Base' no cadastro do Imposto.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:1359-1423 (CALCULA_IMPOSTOS)
P: Por que o valor de IR retido varia conforme o número de dependentes da pessoa?
R: O cálculo de imposto progressivo reduz a base tributável pelo valor de abatimento multiplicado pelo número de dependentes cadastrados na pessoa, para todo imposto exceto o tipo 'J'. Confira o número de dependentes cadastrado.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:1182-1189 (CALCULA_IMPOSTOS)
P: Por que o valor de ISS de uma NFS-e sai com centavos 'estranhos' em relação a uma calculadora comum?
R: Para NFS-e, o imposto ISS é arredondado pela regra ABNT NBR 5891 (arredondamento bancário, para par/ímpar), configurada na empresa, e não pelo arredondamento matemático simples. Isso é esperado, não é erro.
Fonte: Scripts/ARREDONDAMENTO_ABNT.sql:15-50 (ARREDONDAMENTO_ABNT)
P: Por que o valor de DIFAL/FCP de uma venda interestadual para consumidor final está diferente do esperado?
R: O cálculo de Partilha/DIFAL depende do Tipo de Base de Partilha cadastrado na Alíquota ('Dupla' ou 'Única'), que muda a forma de recalcular a base interestadual. Verifique esse parâmetro e os percentuais de UF Origem/Destino/Partilha na Alíquota.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:847-937 (CALCULA_IMPOSTOS)
P: Por que o IBS/CBS de uma nota de importação está com base maior que o valor do produto?
R: Por determinação da LC 214/2025 (art. 69), na importação a base do IBS/CBS soma o Imposto de Importação e a parcela das despesas de importação, descontando o que já saiu por ICMS/PIS/COFINS/ISS. É um comportamento intencional, não erro de cálculo.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:1278-1289 (CALCULA_IMPOSTOS)
P: Os totais de IPI Isento e Outras do relatório fiscal não fecham quando há Substituição Tributária, isso é falha conhecida?
R: Sim, há indício de bug no cálculo do IPI: quando o valor deveria ser classificado como 'Isento', a parcela referente à Substituição Tributária ainda é somada em 'Outras' em vez de 'Isento'. Repasse para desenvolvimento — não é ajustável via parametrização.
Fonte: Scripts/CALCULA_IMPOSTOS.sql:1043-1053 (CALCULA_IMPOSTOS)
Dúvidas em aberto (o código não responde)
- Qual tela/rotina Delphi do ERP efetivamente chama a procedure CALCULA_IMPOSTOS ao gravar um item de nota fiscal (venda, compra, NFS-e)? — Este módulo é só a procedure Firebird; o código do formulário/unit Delphi que a invoca não fez parte do briefing nem foi lido nesta sessão.
- Quais são todos os valores possíveis de V_TP_IMPOSTO e o nome de cada imposto que representam, além dos observados no código (I=ICMS, P=IPI, B=IBS, Y=CBS, Q aparenta ser ISS/NFS-e, J parece ser um imposto sem dedução por dependente, F/S/L citados juntos para retenção)? — A tabela de domínio de TP_IMPOSTO não foi lida; os significados foram inferidos apenas pelo contexto de uso no código.
- Quais são todos os valores possíveis e o significado de cada letra de V_ST_DEDUZIRICMSBASE (N/S/F/I/A/T) como aparecem nomeados na tela de cadastro de Imposto? — O código só mostra o efeito de cada letra na fórmula, não o rótulo do campo/tela onde o usuário escolhe essa opção (fora do escopo lido: .dfm do cadastro de Imposto).
- Quais são todos os tipos possíveis de TP_MODBASECALC, TP_BASEDIFAL e TP_BASEPARTILHA além dos observados ('C' custo, 'D'/'B' para DIFAL, 'U'/'D' para partilha)? — O código só trata os valores citados; outros valores possíveis do domínio não aparecem tratados na procedure e podem cair no comportamento 'else' padrão sem sinalização.
- O parâmetro V_ST_ICMSDEDUZDESON (dedução de ICMS desonerado) é lido da Alíquota mas não aparece sendo usado em nenhum cálculo dentro deste arquivo — é usado em outra procedure/relatório? — A variável é carregada na consulta de ALIQUOTA (linha 328) mas não referenciada depois no corpo lido da procedure.