Pular para conteúdo

ICMS/OP para Compra com 18% - SGE 2.0

Este documento descreve a lógica de cálculo do ICMS da Operação Própria (ICMS/OP) com alíquota de 18% utilizada no SGE 2.0 para operações de compra.


1. Localização dos Arquivos Principais

SGE 2.0 (Sistema Legado)

  • Faturamento: sge_2_0/NM_2015/Faturamento/frm_NF.aspx.cs
  • Pedidos: sge_2_0/NM_2015/Pedido/frm_Pedidos.aspx.cs

SGE 3.0 (Sistema Atual)

  • Serviço de Tributos: src/Nelmetais.SGE.Business/Services/Fiscal/TributosService.cs
  • Modelo ICMS Partilha: src/Nelmetais.SGE.Business/Models/Fiscal/DocumentoFiscalItemIcmsPartilha.cs
  • DTO NF-e: src/Nelmetais.SGE.Business/Dtos/Fiscal/NotaFiscalEletronicaDto.cs

2. Conceito do ICMS/OP (Operação Própria)

Definição

O ICMS da Operação Própria é o valor do ICMS calculado na aquisição de mercadorias com Substituição Tributária (ST), representando o imposto da operação de compra.

Cenários de Aplicação

Segundo os comentários no código SGE 2.0 (linhas 31815-31817 e 33840-33841):

//Ver Planilha Cálculos de ST em pasta JR
//Produto em ST
//Fornecedor: 18% ICMS
//Fornecedor: Fabricante
//Cliente: 18, 12, 7 % de ICMS, ZF, Orca

Aplicável quando: - Produto sujeito à Substituição Tributária - Fornecedor é Fabricante (tipo "F") - Alíquota de ICMS da operação: 18% - Cliente pode ter diferentes alíquotas: 18%, 12%, 7%, Zona Franca ou Orçamento


3. Cálculo do ICMS/OP para Produtos de Terceiros (PT)

Arquivo

sge_2_0/NM_2015/Faturamento/frm_NF.aspx.cs, linhas 6125-6139

Código

//*--Produto de Terceiros --
dc_IVAST = 1.0000m + (Convert.ToDecimal(iva.Valor_IVA_ST(Dr1["ITE23"].ToString().Substring(0, 4), "T")) / 100.0000m);

_BC_ICMS_PT = _Valor_Item * dc_IPI * dc_IVAST;

if (ViewState["Tipo_Fornecedor"].ToString().Equals("F"))
    dcBaseCalculoICMS_PT += _BC_ICMS_PT;

if (Dr0["PED32"].ToString() != DBNull.Value.ToString())
{
    if (ViewState["Tipo_Fornecedor"].ToString().Equals("F"))
    {
        if (Dr1["BASEICMS"].ToString().Equals("S")) // Consumo
            _ICMS_PT = ((_Valor_Item * dc_IPI * dc_IVAST) * 0.18m) - ((_Valor_Item * dc_IPI) * 0.18m);
        else
            _ICMS_PT = ((_Valor_Item * dc_IPI * dc_IVAST) * 0.18m) - (_Valor_Item * 0.18m);
        dcICMS_PT += _ICMS_PT;
    }
}

Variáveis

  • _BC_ICMS_PT = Base de Cálculo do ICMS Produto de Terceiros
  • _Valor_Item = Valor do item da nota fiscal
  • dc_IPI = 1 + (Percentual IPI / 100)
  • dc_IVAST = 1 + (IVA ST / 100) - Índice de Valor Agregado para Substituição Tributária
  • 0.18m = Alíquota de 18% (hard-coded)

Fórmulas

Para CONSUMO (BASEICMS = "S")

ICMS_OP = (Valor_Item × IPI × IVA_ST × 0.18) - (Valor_Item × IPI × 0.18)

Interpretação: - Primeira parte: ICMS sobre o valor com ST (incluindo MVA) - Segunda parte: ICMS sobre a operação própria - Resultado: Diferença que representa o ICMS da substituição

Para INDUSTRIALIZAÇÃO/COMERCIALIZAÇÃO (BASEICMS ≠ "S")

ICMS_OP = (Valor_Item × IPI × IVA_ST × 0.18) - (Valor_Item × 0.18)

Interpretação: - Primeira parte: ICMS sobre o valor com ST - Segunda parte: ICMS sobre o valor base sem IPI - Resultado: ICMS da ST considerando que a base não inclui IPI


4. Cálculo do ICMS/OP para Regime de Beneficiamento (RB)

Arquivo

sge_2_0/NM_2015/Faturamento/frm_NF.aspx.cs, linhas 6239-6246

Código

//IVA ST dentro de SP por produto
dc_IVAST = 1.0000m + (Convert.ToDecimal(iva.Valor_IVA_ST(Dr1["ITE03"].ToString().Substring(0, 4), "E")) / 100.0000m);

if (Dr1["ITE13"].ToString() != "")
    dc_IPI = 1.00m + (Convert.ToDecimal(Dr1["ITE13"].ToString()) / 100.00m);
else
    dc_IPI = 1.00m;

_BC_ICMS_RB = _Valor_Item * dc_IPI * dc_IVAST;
dcBaseCalculoICMS_RB += _BC_ICMS_RB;

if (Dr0["PED32"].ToString() != DBNull.Value.ToString())
{
    _ICMS_RB = ((_Valor_Item * dc_IPI * dc_IVAST) * 0.18m) - (_Valor_Item * Convert.ToDecimal((Convert.ToDouble(Dr0["PED32"].ToString()) / 100.00)));
    dcICMS_RB += _ICMS_RB;
}

Fórmula

ICMS_RB = (Valor_Item × IPI × IVA_ST × 0.18) - (Valor_Item × Alíquota_Cliente)

Diferença: No regime de beneficiamento, o ICMS deduzido usa a alíquota específica do cliente (PED32), não a alíquota fixa de 18%.


5. Cálculo do ICMS por KG (ICMS_KG_OP)

Contexto

Utilizado para buscar o valor de ICMS por quilograma da última compra de mercadoria de usinas.

Query SQL

SELECT TOP(1) ROUND(((KDX04KG * KDX05) * (0.18)) / KDX04KG, 2) AS ICMS_KG_OP
FROM CADKARDE
INNER JOIN CADNOTC ON CADKARDE.KDX02 = CADNOTC.NOT01
WHERE CADKARDE.KDX01 = '[Código_Produto]'
  AND CADKARDE.KDX07 = '+'
  AND NOT06 = 18
  AND NOT18 IN ('COMPRA DE MERCADORIA', 'COMPRA DE MERCAD. ST')
  AND SUBSTRING(CADKARDE.KDX08, 1, 7) IN (
      SELECT SUBSTRING(FO01, 1, 7)
      FROM [NM].[dbo].[CADFORNE]
      WHERE fl_Compra_Usina = 'S'
        AND (SR_DELETED IS NULL OR SR_DELETED <> 'T')
  )
  AND KDX08 <> 'LINENSE'
  AND (CADKARDE.SR_DELETED IS NULL OR CADKARDE.SR_DELETED <> 'T')
  AND (CADNOTC.SR_DELETED IS NULL OR CADNOTC.SR_DELETED <> 'T')

Tabelas Envolvidas

  • CADKARDE: Movimentação de estoque (Kardex)
  • KDX01: Código do produto
  • KDX02: Número da nota fiscal
  • KDX04KG: Quantidade em quilogramas
  • KDX05: Valor unitário
  • KDX07: Tipo de movimento ('+' = entrada)
  • KDX08: Fornecedor

  • CADNOTC: Cadastro de notas fiscais de compra

  • NOT01: Número da nota
  • NOT06: Tipo/classificação da operação fiscal (18 = operação específica)
  • NOT18: Descrição do tipo de operação

Critérios de Filtro

  1. NOT06 = 18: Operação com classificação específica
  2. NOT18 IN ('COMPRA DE MERCADORIA', 'COMPRA DE MERCAD. ST'): Tipos de compra válidos
  3. fl_Compra_Usina = 'S': Apenas fornecedores do tipo Usina
  4. KDX08 <> 'LINENSE': Exclui fornecedor LINENSE

Fórmula

ICMS_KG_OP = ROUND(((Quantidade_KG × Valor_Unitário) × 0.18) / Quantidade_KG, 2)

Simplificando:

ICMS_KG_OP = ROUND(Valor_Unitário × 0.18, 2)

Resultado: Valor do ICMS (18%) por quilograma da mercadoria.


6. Campo cd_BC_ICMS_OP_Liberada

Descrição

Campo utilizado para controlar se a Base de Cálculo do ICMS/OP foi liberada para produtos com protocolo entre estados.

Valores

  • "S" = BC ICMS-OP sobre Total da NF
  • "N" = BC ICMS-OP sobre Produtos individuais
  • "" (vazio) = Não definido

Uso no Sistema

ViewState.Add("cd_BC_ICMS_OP_Liberada", "");

// ...

if (ViewState["cd_BC_ICMS_OP_Liberada"].ToString().Equals(""))
{
    // Lógica quando não está liberado
}
AddEmptyItem(ddlDestinoMercadoria, "BC ICMS-OP s/ Total NF", "S");
AddEmptyItem(ddlDestinoMercadoria, "BC ICMS-OP s/ Produtos", "N");

7. Variáveis Decimais Utilizadas

No SGE 2.0

decimal dcBaseCalculoICMS_PT = 0.00m;     // BC ICMS Produto Terceiros (acumulado)
decimal _BC_ICMS_PT = 0.00m;              // BC ICMS PT por item
decimal dcICMS_PT = 0.00m;                // ICMS PT acumulado na nota
decimal _ICMS_PT = 0.00m;                 // ICMS PT por item

decimal _BC_ICMS_RB = 0.00m;              // BC ICMS Regime Beneficiamento por item
decimal dcBaseCalculoICMS_RB = 0.00m;     // BC ICMS RB acumulado
decimal _ICMS_RB = 0.00m;                 // ICMS RB por item
decimal dcICMS_RB = 0.00m;                // ICMS RB acumulado

decimal dc_ICMS_KG = 0.00m;               // ICMS por KG
decimal _Total_ICMS_OP_Propria = 0.00m;   // Total ICMS Operação Própria

8. Campos na NF-e (XML)

SGE 3.0 - Estrutura de Dados

Campo pBCOp - Percentual da BC da Operação

Arquivo: src/Nelmetais.SGE.Business/Dtos/Fiscal/NotaFiscalEletronicaDto.cs:843-844

[JsonProperty("pBCOp")]
public decimal? PercentualBaseCalculoOperacao { get; set; }

Schema XML: src/Nelmetais.SGE.Business/Dtos/Fiscal/nfe_v4_00.cs:9700

/// <remarks/>
public string pBCOp {
    get {
        return this.pBCOpField;
    }
    set {
        this.pBCOpField = value;
        this.RaisePropertyChanged("pBCOp");
    }
}

Campo vICMSOp - Valor do ICMS da Operação

Arquivo: src/Nelmetais.SGE.Business/Dtos/Fiscal/NotaFiscalEletronicaDto.cs:834-835

[JsonProperty("vICMSOp")]
public decimal? ValorIcmsOperacao { get; set; }

Schema XML: src/Nelmetais.SGE.Business/Dtos/Fiscal/nfe_v4_00.cs:7943

/// <remarks/>
public string vICMSOp {
    get {
        return this.vICMSOpField;
    }
    set {
        this.vICMSOpField = value;
        this.RaisePropertyChanged("vICMSOp");
    }
}

Modelo DocumentoFiscalItemIcmsPartilha

Arquivo: src/Nelmetais.SGE.Business/Models/Fiscal/DocumentoFiscalItemIcmsPartilha.cs:20

public class DocumentoFiscalItemIcmsPartilha : BaseEntity
{
    public int DocumentoFiscalItemId { get; set; }
    public DocumentoFiscalItem DocumentoFiscalItem { get; set; } = null!;
    public int CstIcmsId { get; set; }
    public CstIcms? CstIcms { get; set; }
    public int? ModalidadeBaseCalculoIcms { get; set; }
    public decimal? ValorBaseCalculoIcms { get; set; }
    public decimal? PercentualIcmsReducao { get; set; }
    public decimal? PercentualIcms { get; set; }
    public decimal? ValorIcms { get; set; }
    public int? ModalidadeBaseCalculoIcmsSt { get; set; }
    public decimal? PercentualIcmsStMva { get; set; }
    public decimal? ValorBaseCalculoIcmsSt { get; set; }
    public decimal? PercentualIcmsStReducao { get; set; }
    public decimal? PercentualIcmsSt { get; set; }
    public decimal? ValorIcmsSt { get; set; }

    // Campo específico para ICMS Operação Própria
    public decimal? ValorBaseCalculoIcmsOperacaoPropria { get; set; }

    public string? SiglaUfSt { get; set; }
}

9. Lógica de Importação de NF-e (SGE 3.0)

Arquivo

src/Nelmetais.SGE.Business/Services/Fiscal/DocumentoFiscalService.cs:3700-3726

Código

else if (imposto.GetType() == typeof(TNFeInfNFeDetImpostoICMSICMSPart))
{
    TNFeInfNFeDetImpostoICMSICMSPart icms = (PL_008d.TNFeInfNFeDetImpostoICMSICMSPart)imposto;

    tipoOrigemMercadoriaId = (int)icms.orig;

    CstIcms? cst = await _cstIcmsRepository.ObterCstIcmsPorTributacaoCodigo(
        icms.CST == TNFeInfNFeDetImpostoICMSICMSPartCST.Item10 ? "10" : "90"
    );

    documentoFiscalItemIcmsPartilha = new DocumentoFiscalItemIcmsPartilha()
    {
        CstIcmsId = cst?.Id ?? 0,
        ModalidadeBaseCalculoIcms = (int)icms.modBC,
        PercentualIcmsReducao = ConverterValorNotaFiscalEletronicaParaDecimal(icms.pRedBC),
        ValorBaseCalculoIcms = ConverterValorNotaFiscalEletronicaParaDecimal(icms.vBC),
        PercentualIcms = ConverterValorNotaFiscalEletronicaParaDecimal(icms.pICMS),
        ValorIcms = ConverterValorNotaFiscalEletronicaParaDecimal(icms.vICMS),

        ModalidadeBaseCalculoIcmsSt = (int)icms.modBCST,
        PercentualIcmsStMva = ConverterValorNotaFiscalEletronicaParaDecimal(icms.pMVAST),
        ValorBaseCalculoIcmsSt = ConverterValorNotaFiscalEletronicaParaDecimal(icms.vBCST),
        PercentualIcmsStReducao = ConverterValorNotaFiscalEletronicaParaDecimal(icms.pRedBCST),
        PercentualIcmsSt = ConverterValorNotaFiscalEletronicaParaDecimal(icms.pICMSST),
        ValorIcmsSt = ConverterValorNotaFiscalEletronicaParaDecimal(icms.vICMSST),

        // Importação do pBCOp da NF-e
        ValorBaseCalculoIcmsOperacaoPropria = ConverterValorNotaFiscalEletronicaParaDecimal(icms.pBCOp),
        SiglaUfSt = icms.UFST.GetDisplayName()
    };

    documentoFiscalItemFcp = new DocumentoFiscalItemFcp()
    {
        ValorBaseCalculoFcpSt = ConverterValorNotaFiscalEletronicaParaDecimal(icms.vBCFCPST),
        PercentualFcpSt = ConverterValorNotaFiscalEletronicaParaDecimal(icms.pFCPST),
        ValorFcpSt = ConverterValorNotaFiscalEletronicaParaDecimal(icms.vFCPST)
    };
}

CST Aplicáveis

  • CST 10: Tributada e com cobrança do ICMS por substituição tributária
  • CST 90: Outras

10. Lógica de Exportação/Geração de Documento Fiscal (SGE 3.0)

Arquivo

src/Nelmetais.SGE.Business/Services/Fiscal/DocumentoFiscalService.cs:1540-1564

Código

if (tributos.GerarGrupoIcmsStPartilha)
{
    DocumentoFiscalItemIcmsPartilha documentoFiscalItemIcmsPartilha = new()
    {
        CstIcmsId = tributos.Icms.CstIcmsId,
        ModalidadeBaseCalculoIcms = tributos.Icms.ModalidadeBaseCalculoIcms,
        ValorBaseCalculoIcms = TruncarDuasCasasDecimais(tributos.Icms.ValorBaseCalculoIcms),
        PercentualIcmsReducao = TruncarQuatroCasasDecimais(tributos.Icms.PercentualIcmsReducao),
        PercentualIcms = TruncarQuatroCasasDecimais(tributos.Icms.PercentualIcms),
        ValorIcms = TruncarDuasCasasDecimais(tributos.Icms.ValorIcms),
        ModalidadeBaseCalculoIcmsSt = tributos.Icms.ModalidadeBaseCalculoIcmsSt,
        PercentualIcmsStMva = TruncarQuatroCasasDecimais(tributos.Icms.PercentualIcmsStMva),
        ValorBaseCalculoIcmsSt = TruncarDuasCasasDecimais(tributos.Icms.ValorBaseCalculoIcmsSt),
        PercentualIcmsStReducao = TruncarQuatroCasasDecimais(tributos.Icms.PercentualIcmsStReducao),
        PercentualIcmsSt = TruncarQuatroCasasDecimais(tributos.Icms.PercentualIcmsSt),
        ValorIcmsSt = TruncarDuasCasasDecimais(tributos.Icms.ValorIcmsSt),

        // Geração do campo ValorBaseCalculoIcmsOperacaoPropria
        ValorBaseCalculoIcmsOperacaoPropria = TruncarDuasCasasDecimais(tributos.Icms.ValorBaseCalculoIcms),

        SiglaUfSt = tributos.Icms.SiglaUFSt
    };

    return documentoFiscalItemIcmsPartilha;
}

Observação

No SGE 3.0, o campo ValorBaseCalculoIcmsOperacaoPropria é preenchido com o mesmo valor de ValorBaseCalculoIcms.


11. Exemplo Prático de Cálculo

Cenário

  • Valor do Item: R$ 10.000,00
  • IPI: 5% (dc_IPI = 1.05)
  • IVA ST: 30% (dc_IVAST = 1.30)
  • ICMS: 18% (0.18)
  • Tipo: Consumo (BASEICMS = "S")

Cálculo Passo a Passo

1. Base de Cálculo ICMS PT

_BC_ICMS_PT = 10.000 × 1.05 × 1.30
_BC_ICMS_PT = R$ 13.650,00

2. ICMS da Operação com ST

ICMS_ST = 13.650 × 0.18
ICMS_ST = R$ 2.457,00

3. ICMS da Operação Própria

ICMS_OP = 10.000 × 1.05 × 0.18
ICMS_OP = R$ 1.890,00

4. ICMS ST a Recolher (Diferença)

_ICMS_PT = 2.457,00 - 1.890,00
_ICMS_PT = R$ 567,00

Interpretação

  • R$ 2.457,00: ICMS total calculado com ST
  • R$ 1.890,00: ICMS que seria devido na operação própria
  • R$ 567,00: Diferença que representa o ICMS ST a ser recolhido antecipadamente

12. Referências no Código

SGE 2.0

  • sge_2_0/NM_2015/Faturamento/frm_NF.aspx.cs
  • Linha 4167: Declaração de variáveis ICMS PT
  • Linha 4232: Declaração de variáveis ICMS RB
  • Linha 6125-6139: Cálculo ICMS PT para produtos de terceiros
  • Linha 6239-6246: Cálculo ICMS RB
  • Query ICMS_KG_OP: Busca valor ICMS por KG

  • sge_2_0/NM_2015/Pedido/frm_Pedidos.aspx.cs

  • Linha 31815-31817: Comentários sobre política comercial
  • Linha 33840-33841: Comentários sobre produto fora ST
  • Campo cd_BC_ICMS_OP_Liberada: Controle de liberação BC ICMS-OP

SGE 3.0

  • src/Nelmetais.SGE.Business/Services/Fiscal/TributosService.cs
  • Linha 99-447: Método CalcularIcmsFcp
  • Cálculo de ICMS, ICMS ST, ICMS Diferido, ICMS Desoneração

  • src/Nelmetais.SGE.Business/Services/Fiscal/DocumentoFiscalService.cs

  • Linha 1540-1564: Geração de ICMS Partilha para documento fiscal
  • Linha 3700-3726: Importação de ICMS Partilha de NF-e

13. Observações Importantes

Hard-coded vs Configurável

  • SGE 2.0: Alíquota de 18% (0.18m) é hard-coded no código
  • SGE 3.0: Alíquota é obtida de configurações tributárias (tabela IcmsConfig)

Migração SGE 2.0 → SGE 3.0

Para migrar a lógica do SGE 2.0 para o SGE 3.0:

  1. Substituir valores hard-coded por configurações do banco
  2. Utilizar serviço TributosService para cálculos
  3. Mapear campos legados para nova estrutura:
  4. _ICMS_PTtributos.Icms.ValorIcms
  5. _BC_ICMS_PTtributos.Icms.ValorBaseCalculoIcms
  6. dc_IVAST → IVA ST obtido de configuração

Planilha de Referência

Os comentários fazem referência a uma "Planilha Cálculos de ST em pasta JR" que contém as fórmulas e cenários de cálculo.


14. Glossário

Termo Descrição
ICMS/OP ICMS da Operação Própria - Imposto da operação de compra
ST Substituição Tributária
IVA ST Índice de Valor Agregado para Substituição Tributária
MVA Margem de Valor Agregado
BC Base de Cálculo
PT Produto de Terceiros
RB Regime de Beneficiamento
CST Código de Situação Tributária
pBCOp Percentual da Base de Cálculo da Operação (campo NF-e)
vICMSOp Valor do ICMS da Operação (campo NF-e)

15. Contatos e Suporte

Para dúvidas sobre cálculos fiscais ou política comercial, consultar: - Documentação fiscal da empresa - Planilha "Cálculos de ST em pasta JR" - Equipe de desenvolvimento Nelmetais


Última Atualização: 2025-11-10 Autor: Documentação gerada a partir do código fonte SGE 2.0 e SGE 3.0