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 fiscaldc_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")
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")
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
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 produtoKDX02: Número da nota fiscalKDX04KG: Quantidade em quilogramasKDX05: Valor unitárioKDX07: Tipo de movimento ('+' = entrada)-
KDX08: Fornecedor -
CADNOTC: Cadastro de notas fiscais de compra
NOT01: Número da notaNOT06: Tipo/classificação da operação fiscal (18 = operação específica)NOT18: Descrição do tipo de operação
Critérios de Filtro
- NOT06 = 18: Operação com classificação específica
- NOT18 IN ('COMPRA DE MERCADORIA', 'COMPRA DE MERCAD. ST'): Tipos de compra válidos
- fl_Compra_Usina = 'S': Apenas fornecedores do tipo Usina
- KDX08 <> 'LINENSE': Exclui fornecedor LINENSE
Fórmula
Simplificando:
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
}
Dropdown de Seleção
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
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
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
2. ICMS da Operação com ST
3. ICMS da Operação Própria
4. ICMS ST a Recolher (Diferença)
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:
- Substituir valores hard-coded por configurações do banco
- Utilizar serviço
TributosServicepara cálculos - Mapear campos legados para nova estrutura:
_ICMS_PT→tributos.Icms.ValorIcms_BC_ICMS_PT→tributos.Icms.ValorBaseCalculoIcmsdc_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