Skip to content
On this page

Reforma Tributária (IBS / CBS / IS)

A biblioteca calcula e preenche automaticamente o grupo IBSCBS de cada item e os totais IBSCBSTot / vNFTot a partir do cClassTrib, usando a tabela oficial de CST/cClassTrib publicada pela SEFAZ.

Obrigatório em homologação

A SEFAZ já rejeita NF-e modelo 55 sem o grupo IBSCBS (cStat 1115 - Grupo IBSCBS não informado).

Consulta da tabela CST / cClassTrib

A classe ConsultaTributacao consulta a API da SEFAZ com a tabela de classificações tributárias (CFF). O resultado pode ser usado direto no IbsCbsUtil ou salvo em arquivo (ibscbs.json) para não consultar a cada emissão.

java
import br.com.swconsultoria.nfe.ConsultaTributacao;
import br.com.swconsultoria.nfe.dto.CstDTO;
import com.fasterxml.jackson.core.type.TypeReference;

// 1. JSON bruto (para salvar em arquivo/cache)
String json = ConsultaTributacao.getJson(config);

// 2. Já convertido em DTOs
List<CstDTO> lista = ConsultaTributacao.get(config, new TypeReference<List<CstDTO>>() {});
for (CstDTO cst : lista) {
    System.out.println(cst.getCst() + " - " + cst.getDescricaoCST()
            + " | vigência: " + cst.getInicioVigencia() + " a " + cst.getFimVigencia());
}

// 3. Com filtro (parâmetros da API)
Map<String, String> parametros = new HashMap<>();
parametros.put("Cst", "00");
List<CstDTO> filtrado = ConsultaTributacao.get(config, parametros, new TypeReference<List<CstDTO>>() {});

// 4. Verificar se o seu DTO continua compatível com o JSON da API
ConsultaTributacao.ValidationReport report = ConsultaTributacao.validate(config, MeuCstDTO.class);
if (!report.isValid()) {
    report.getExtraFields().forEach(f -> System.out.println("Campo novo no JSON: " + f));
    report.getMissingFields().forEach(f -> System.out.println("Campo ausente no JSON: " + f));
    report.getTypeErrors().forEach((f, erro) -> System.out.println(f + ": " + erro));
}

Exemplo completo: ConsultaTributacaoTeste.java.

Cálculo do IBS/CBS com IbsCbsUtil

java
import br.com.swconsultoria.nfe.schemas.TTribNFe;
import br.com.swconsultoria.nfe.util.IbsCbsUtil;
import br.com.swconsultoria.nfe.util.ObjetoUtil;

// 1. Cria o utilitário a partir do JSON (ou de uma List<CstDTO>).
//    Passando o InfNFe, o ano de emissão é lido do próprio dhEmi da nota (recomendado).
IbsCbsUtil ibsCbsUtil = new IbsCbsUtil(json, DocumentoEnum.NFE, infNFe);

// 2. Para cada item: calcula e adiciona o grupo IBSCBS
for (TNFe.InfNFe.Det det : infNFe.getDet()) {
    TTribNFe ibsCbs = ibsCbsUtil.montaImpostosDet("000001", det);
    det.getImposto().getContent().add(new JAXBElement<>(new QName("IBSCBS"), TTribNFe.class, ibsCbs));
}

// 3. Totais: o IbsCbsUtil acumulou os valores de todos os itens
total.setIBSCBSTot(ibsCbsUtil.preencheTotaisIbsCsb());
total.setVNFTot(ObjetoUtil.getValor2Casas(ibsCbsUtil.calculaVnfTot(icmsTot.getVNF())));

Uma instância por nota

O IbsCbsUtil acumula os totais dos itens. Crie uma instância por documento e não a compartilhe entre notas (nem entre threads). A lista de CstDTO pode ser reaproveitada.

Construtores

ConstrutorUso
IbsCbsUtil(String json, DocumentoEnum doc)JSON da tabela; ano de emissão = ano corrente.
IbsCbsUtil(List<CstDTO> lista, DocumentoEnum doc)Lista já convertida (ex.: cache).
IbsCbsUtil(json | lista, doc, String dhEmi)Ano extraído do dhEmi informado.
IbsCbsUtil(json | lista, doc, TNFe.InfNFe infNFe)Ano extraído do ide/dhEmi da nota (recomendado).

cClassTrib com tributação regular

Quando o cClassTrib exige a tributação regular (ex.: 550001), informe o cClassTrib regular no terceiro parâmetro:

java
TTribNFe ibsCbs = ibsCbsUtil.montaImpostosDet("550001", det, "000001");

Parâmetros opcionais

Alguns grupos dependem de informações que não estão na tabela e devem ser informados antes de chamar montaImpostosDet:

SetterQuando usar
setpAliqIbsUf, setpAliqIbsMun, setpAliqCbsAlíquotas de IBS UF, IBS Município e CBS (padrão do período de teste: IBS 0,1% e CBS 0,9%).
setpAliqDiferimentoPercentual de diferimento.
setCCredPres, setPCredPresIBS, setPCredPresCBSCrédito presumido (IndCredPresOper).
setTpCredPresIBSZFMCrédito presumido IBS Zona Franca de Manaus.
setCompetApurCompetência do ajuste (gAjusteCompet).
setTpEnteGov, setPRedutorCompraGov, setTpOperGovCompras governamentais (gTribCompraGov).
setAnoEmissao / setDhEmiAno que define a modalidade da monofasia (prefira os construtores com dhEmi/InfNFe).

Combustíveis (monofasia)

A modalidade dos grupos monofásicos depende do ano de emissão (NT 2025.002-RTC, regras UB85a/UB95a):

AnoIBSCBS
2026Ad valoremAd valorem
2027Ad valoremAd rem
2028Ad valoremAd rem
2029+Ad remAd rem

Informar a modalidade errada é rejeitado (cStat 1219, 1220, 1245, 1246, 1259). Por isso o ano deve coincidir com o dhEmi da nota — use o construtor que recebe o InfNFe.

Setters específicos da monofasia:

SetterDescrição
setAdRemIBS, setAdRemCBSAlíquotas ad rem (R$ por unidade) — gMonoPadrao.
setAdRemIBSReten, setAdRemCBSReten, setQBCMonoRetenMonofasia sujeita a retenção.
setPAliqMonoUF, setPAliqMonoMun, setPAliqMonoCBSAlíquotas ad valorem.
setPAliqMonoRetenIBS, setPAliqMonoRetenCBSAlíquotas ad valorem da retenção.
setVIBSMonoRet, setVCBSMonoRetValor retido anteriormente (gMonoRet).
setPBioObrig, setQBCBioComb, setAdRemIBSBioComb, setAdRemCBSBioComb, setVIBSDiferenca, setVCBSDiferencaDiferença de biocombustível (gpBioDiferenca).

Monofasia retida anteriormente (620004, 620005, 620006)

O grupo gMonoRet leva só o valor; a SEFAZ o confere por uma tabela por produto que ainda não foi publicada. Hoje ela calcula zero e recusa outro valor com cStat 1240: informe 0.00 em setVIBSMonoRet / setVCBSMonoRet até a tabela sair.

Veja também os requisitos do grupo comb, ICMS 61 e cBenef em Envio → Combustíveis.

Leitura do grupo IBSCBS

Veja Ler XML.

Exemplos no repositório

MIT License.