CEST

Código Especificador da Substituição Tributária: os códigos de 7 dígitos do Convênio ICMS 142/18 para mercadorias sujeitas à substituição tributária do ICMS.

  • Matriz de paridade

Validar

Verifica se um CEST consta dos anexos do Convênio ICMS 142/18 (Anexos II a XXVI do texto consolidado, alterado até o Convênio ICMS 180/24).

  • Um CEST tem 7 dígitos: os dois primeiros dígitos são o segmento, os dígitos 3 a 5 são o item do segmento e os dois últimos são a especificação do item (cláusula sexta, IV do Convênio).
  • Formas aceitas em string: 7 dígitos, ou NN.NNN.NN com qualquer sequência de separadores (espaço, ., - ou /) entre os grupos, ou nenhum, e espaços opcionais nas pontas. Qualquer outra string é inválida: a função não extrai os dígitos dela.
  • Dígitos sem máscara são completados com zeros à esquerda até 7, em string ou em número, porque os segmentos 01 a 09 começam com zero: 100100, "100100" e "0100100" são o mesmo código. Um valor com máscara é lido como foi escrito.
  • Um número só é lido se for um inteiro seguro não negativo. Número negativo, fracionário, não finito ou inseguro é inválido.
  • Itens revogados são inválidos, por exemplo 01.110.00, 03.001.00, 03.002.00, 03.004.00, 03.010.03, 03.014.00, 03.016.00, 10.023.00, 17.049.08, 17.049.09 e 20.035.01.
  • A tabela tem 1.040 códigos em 25 segmentos (Anexo I). Os segmentos 15, 18 e 27 não existem.
  • A coluna NCM/SH dos anexos não é carregada, e não há validação cruzada CEST×NCM. Pela cláusula sétima, a descrição é o critério que decide.
  • Saber se o estado aplica ICMS-ST ao código depende da lei estadual e fica fora do escopo. MVA/PMPF e o Anexo XXVII também ficam fora.
ParâmetroTipoObrigatório
valuestring | numbersim
retornaboolean

Valida um CEST (Código Especificador da Substituição Tributária) contra os anexos do Convênio ICMS 142/18, no texto consolidado vigente.

  • Só os itens em vigor contam: um item que os anexos marcam como revogado é rejeitado.
  • A verificação é só do código: ela não diz se o código combina com um dado NCM, nem se um estado aplica o regime de substituição tributária a ele.
  • Um CEST tem 7 dígitos: os dois primeiros são o segmento, do terceiro ao quinto o item do segmento e os dois últimos a especificação do item (cláusula sexta, IV).
  • Aceita uma string com os 7 dígitos ou com a forma NN.NNN.NN que os anexos imprimem, com qualquer sequência de separadores (espaço, ., - ou /) entre os grupos e espaços opcionais nas extremidades, ou um inteiro seguro não negativo. Qualquer outra string é rejeitada em vez de ter os dígitos pinçados.
  • O zero à esquerda dos segmentos 01 a 09 faz parte do código, então um valor escrito apenas com dígitos é completado com zeros à esquerda até 7, como string ou como número: 100100, '100100' e '0100100' são o mesmo código. Um valor mascarado é lido como foi escrito.
import { isValidCest } from '@brazilian-utils/brazilian-utils';

isValidCest('01.001.00'); // true
isValidCest('0100100'); // true
isValidCest(100100); // true (completado para 7 dígitos, ou seja, '0100100')
isValidCest('03.001.00'); // false (um item revogado)
isValidCest('0000000'); // false
isValidCest('abc0100100'); // false (não é uma forma documentada)
isValidCest(-100100); // false (não é um inteiro seguro não negativo)
Código: brazilian-utils/javascript
Teste com JavaScript isValidCest
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (30) e o resultado em cada biblioteca cest.isValid

Formatar

Formata um CEST com a máscara NN.NNN.NN (segmento, item, especificação), a forma que os anexos imprimem. Só a estrutura muda (use cest.isValid para verificar o código).

  • A máscara é progressiva: um valor parcial é formatado até onde vai (01001 dá 01.001). Caracteres que não são dígitos são descartados, e dígitos depois do 7º são ignorados.
  • options.pad primeiro completa o valor com zeros à esquerda até 7 dígitos. Sem ele, um número que perdeu o zero à esquerda desloca a máscara: 100100 dá 10.010.0, e 01.001.00 com pad.
  • Um valor sem dígitos, e null ou undefined, retorna uma string vazia também com pad.
  • Um número só é lido se for um inteiro seguro não negativo. Um número negativo, fracionário, não finito ou inseguro retorna uma string vazia.
ParâmetroTipoObrigatório
valuestring | numbersim
optionsFormatCestOptionsnão
options.padbooleannão
retornastring

Formata um CEST (Código Especificador da Substituição Tributária) na forma NN.NNN.NN que os anexos do Convênio ICMS 142/18 imprimem. Só a estrutura muda; use isValidCest para conferir um código com os anexos.

  • Opções (FormatCestOptions): pad (padrão false) completa antes o valor com zeros à esquerda até os 7 dígitos de um código completo. Um valor vazio, ou sem dígitos, devolve '' mesmo com pad.
  • Mesmas regras de formatNcm: sem pad a máscara é aplicada até onde o valor vai, que é o que um campo sendo digitado precisa, os caracteres fora dela são descartados e um número é lido como a string dos seus dígitos, ou seja, só é completado com pad: true. Um número só é lido quando é um inteiro seguro não negativo; qualquer outro número retorna ''.
import { formatCest } from '@brazilian-utils/brazilian-utils';

formatCest('0100100'); // 01.001.00
formatCest(2899900); // 28.999.00
formatCest('01001'); // 01.001 (máscara aplicada até onde o valor vai)
formatCest(100100, { pad: true }); // 01.001.00 (completado até 7 dígitos antes)
formatCest('abc0100100'); // 01.001.00 (só os dígitos são lidos)
formatCest(-2899900); // '' (não é um inteiro seguro não negativo)
Código: brazilian-utils/javascript
Teste com JavaScript formatCest
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (27) e o resultado em cada biblioteca cest.format

Interpretar

Remove a formatação do CEST e mantém apenas os dígitos, limitados a 7.

  • A função não completa o valor com zeros à esquerda. Ela mantém um código parcial como foi escrito, então o zero dos segmentos 01 a 09 precisa ser escrito. cest.isValid e cest.get completam dígitos sem máscara.
  • Retorna uma string vazia quando não há nenhum dígito (null e undefined incluídos).
  • Um número só é lido se for um inteiro seguro não negativo. Um número negativo, fracionário, não finito ou inseguro retorna uma string vazia.
ParâmetroTipoObrigatório
valuestring | numbersim
retornastring

Remove a formatação do CEST (Código Especificador da Substituição Tributária), mantém apenas os dígitos e limita o resultado aos 7 dígitos de um código completo.

  • Mesmas regras de parseCbo: nada é completado com zeros à esquerda aqui, então o zero à esquerda dos segmentos 01 a 09 precisa estar escrito. Use isValidCest ou getCest, que completam um código numérico sem máscara, para consultar um código.
import { parseCest } from '@brazilian-utils/brazilian-utils';

parseCest('01.001.00'); // '0100100'
parseCest('28.999'); // '28999' (um código parcial é mantido como foi escrito)
Código: brazilian-utils/javascript
Teste com JavaScript parseCest
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (10) e o resultado em cada biblioteca cest.parse

Consultar

Consulta um CEST nos anexos do Convênio ICMS 142/18 e retorna o código, a descrição e o segmento. Retorna null exatamente quando cest.isValid é false.

  • Mesmas regras de entrada de cest.isValid (inclusive uma sequência de separadores entre os grupos, 05..001.00): item revogado, código desconhecido e valor fora das formas aceitas retornam null.
  • code são os 7 dígitos, sem máscara. description é a redação vigente do anexo. segment é o nome do segmento no Anexo I.
  • Retorna um objeto novo a cada chamada.
  • Os códigos NCM/SH que os anexos associam a cada CEST não fazem parte do registro.
ParâmetroTipoObrigatório
valuestring | numbersim
retornaCest | null

Consulta um CEST (Código Especificador da Substituição Tributária) e retorna a descrição do bem ou mercadoria e o nome do seu segmento, como os Anexos I a XXVI do Convênio ICMS 142/18 os redigem. O resultado é um registro Cest: { code, description, segment }.

  • Mesmas regras de isValidCest. Retorna null para um código desconhecido, revogado ou malformado.
  • Os códigos NCM/SH que os anexos associam a cada CEST não fazem parte do resultado.
import { getCest } from '@brazilian-utils/brazilian-utils';

getCest('05.001.00'); // { code: '0500100', description: 'Cimento', segment: 'Cimentos' }
getCest(500100); // { code: '0500100', description: 'Cimento', segment: 'Cimentos' }
getCest('03.001.00'); // null (um item revogado)
getCest('0000000'); // null
getCest('abc0500100'); // null (não é uma forma documentada)

Fonte: Convênio ICMS 142/18 consolidado, alterado por último pelo Convênio ICMS 180/24.

Código: brazilian-utils/javascript
Teste com JavaScript getCest
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (27) e o resultado em cada biblioteca cest.get

Fontes oficiais

Veja também NCM

Atualizado em

Nesta página