GTIN (EAN/UPC)

Global Trade Item Number, o número sob um código de barras EAN/UPC: GTIN-8, GTIN-12, GTIN-13 e GTIN-14, terminado em um dígito verificador GS1 por módulo 10. A NF-e o traz nos campos cEAN e cEANTrib.

  • Matriz de paridade

Validar

Valida um GTIN: 8, 12, 13 ou 14 dígitos e o dígito verificador GS1 por módulo 10.

  • Dígito verificador: os outros dígitos com pesos 3 e 1 alternados a partir da direita. O dígito verificador leva a soma ao próximo múltiplo de 10. É o que as regras I03-10 e I12-10 da NF-e verificam nos campos cEAN e cEANTrib.
  • Só uma string de dígitos é lida; espaços nas pontas do valor são ignorados. Máscara, espaço no meio e letra são rejeitados. Número também é rejeitado, porque os zeros à esquerda definem o comprimento.
  • Um valor só de zeros é rejeitado em qualquer comprimento, apesar de o dígito verificador ser válido. É uma regra da biblioteca, não da NF-e nem da GS1: a rejeição 611 é só o dígito verificador, e a GS1 reserva o prefixo 0000000 a números de circulação restrita dentro de uma empresa, em vez de proibi-lo. Zeros são rejeitados por serem o preenchimento comum de um GTIN ausente.
  • SEM GTIN, o texto que a NF-e usa para produto sem GTIN, é rejeitado.
  • options.lengths limita os comprimentos aceitos, por exemplo { lengths: [13] }. Uma lista vazia não aceita nada. Quando ausente ou quando não é uma lista, os quatro comprimentos são aceitos.
  • O prefixo não muda o resultado: números de circulação restrita e as faixas de ISBN, ISSN e cupons têm a mesma estrutura e são válidos. Use gtin.getInfo para ler o prefixo.
  • O prefixo não é conferido contra lista. A SEFAZ também o confere contra a sua "Tabela Prefixo GS1" (regras I03-20 e I12-20), que a biblioteca não carrega. O registro na GS1 (Cadastro Centralizado de GTIN) não pode ser verificado offline.
ParâmetroTipoObrigatório
valuestringsim
optionsIsValidGtinOptionsnão
options.lengthsGtinLength[]não
retornaboolean

Verifica se um GTIN (Global Trade Item Number, o número sob um código de barras EAN/UPC) é válido.

  • Cobre as quatro estruturas das GS1 General Specifications, as mesmas quatro que a NF-e aceita em cEAN e cEANTrib: GTIN-8, GTIN-12 (UPC), GTIN-13 (EAN) e GTIN-14 (DUN-14).
  • Opções (IsValidGtinOptions): lengths aceita só alguns dos quatro tamanhos. O padrão são os quatro.
  • O valor deve ser uma string de 8, 12, 13 ou 14 dígitos, fora os espaços em volta, cujo último dígito é o dígito verificador módulo 10 da GS1: pesos 3 e 1 alternados a partir da direita, e a soma subtraída do múltiplo de dez igual ou imediatamente superior. É o que as regras I03-10 e I12-10 da Nota Técnica 2021.003 da SEFAZ verificam (rejeições 611 e 612).
  • Zeros à esquerda contam, então um número nunca é aceito, e um valor com máscara ('7 890000 000017') é rejeitado em vez de ter seus dígitos extraídos.
  • O literal 'SEM GTIN', que a NF-e usa para produto sem GTIN, não é um GTIN e portanto não é válido aqui: teste por ele antes de chamar.
  • Um valor só com zeros é rejeitado, embora o dígito verificador seja válido. Essa é uma regra desta biblioteca, não da NF-e nem da GS1: a rejeição 611 trata só do dígito verificador, e as GS1 General Specifications (release 26.0, tabela 1-4) reservam o GS1 Prefix 0000000 para Números de Circulação Restrita dentro de uma empresa, sem proibi-lo. Os zeros são rejeitados por serem o preenchimento usual de um GTIN ausente.
  • O prefixo não muda o veredito. Os Números de Circulação Restrita (prefixos 02, 04 e 20 a 29, os códigos que a loja imprime nas etiquetas da própria balança) e as faixas de ISSN, ISBN e cupons têm a mesma estrutura e o mesmo dígito verificador, e a "Tabela Prefixo GS1", contra a qual a SEFAZ valida o cEAN, lista essas faixas como válidas; use getGtinInfo para distingui-las.
  • O prefixo também não é conferido contra a lista de Organizações Membro da GS1: a GS1 segue atribuindo faixas, e uma cópia dessa lista passaria a recusar números válidos conforme envelhecesse. Se o número está cadastrado (a consulta ao Cadastro Centralizado de GTIN que a SEFAZ faz para os prefixos 789 e 790) não dá para verificar offline.
import { isValidGtin } from '@brazilian-utils/brazilian-utils';

isValidGtin('7890000000017'); // true (GTIN-13, prefixo da GS1 Brasil)
isValidGtin('6291041500213'); // true (o exemplo da página de dígito verificador da GS1)
isValidGtin('78912342'); // true (GTIN-8)
isValidGtin('061414112345'); // true (GTIN-12)
isValidGtin('17890000000014'); // true (GTIN-14)
isValidGtin('7890000000018'); // false (dígito verificador errado)
isValidGtin('17890000000014', { lengths: [8, 12, 13] }); // false (GTIN-14 não aceito)
isValidGtin('7 890000 000017'); // false (somente dígitos)
isValidGtin('SEM GTIN'); // false
isValidGtin('0000000000000'); // false (só zeros, regra desta biblioteca)
Código: brazilian-utils/javascript
Teste com JavaScript isValidGtin
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 (36) e o resultado em cada biblioteca gtin.isValid

Decodificar

Lê os campos de um GTIN: estrutura, comprimento, prefixo GS1, se o prefixo é brasileiro ou de faixa restrita, e o dígito verificador. Aceita a mesma entrada de gtin.isValid sem opções e retorna null exatamente quando gtin.isValid é false.

  • type (GTIN-8, GTIN-12, GTIN-13 ou GTIN-14) e length descrevem o valor como foi escrito. Um GTIN-14 que começa com 0 é informado como GTIN-14.
  • prefix é lido da forma de 14 dígitos (o valor completado com zeros à esquerda): posições 7 a 9 quando as posições 2 a 6 são zeros (um prefixo GS1-8, como em todo GTIN-8), posições 2 a 4 nos outros casos. O primeiro dígito, zero de preenchimento ou indicador, nunca entra no prefixo. Assim 10000078912349 tem prefixo 789, o prefixo de um GTIN-12 começa com 0, e um GTIN-14 tem o prefixo do GTIN que ele agrupa.
  • isBrazilian é true para os prefixos 789 e 790 (GS1 Brasil, como as regras da SEFAZ os chamam).
  • isRestrictedCirculation é true para as faixas de circulação restrita das GS1 General Specifications: prefixos GS1 02, 04, 20 a 29 e 0000000, e prefixos GS1-8 000 a 099 e 200 a 299. Faixa restrita não invalida o código. Só é informada.
  • checkDigit é o último dígito, como número.
  • O prefixo não é conferido contra a lista de Member Organisations da GS1, e nenhum nome de país é retornado. O prefixo indica a organização GS1 que licenciou o número, não o país de origem.
  • Retorna um objeto novo a cada chamada.
ParâmetroTipoObrigatório
valuestringsim
retornaGtinInfo | null

Extrai os campos de um GTIN, como um GtinInfo.

  • Retorna null quando o valor não é um GTIN válido, sob as mesmas regras de isValidGtin.
  • O prefixo é lido como as GS1 General Specifications (tabelas 1-4, 1-5 e 1-9) organizam os números: o valor é preenchido com zeros à esquerda até 14 dígitos, e o prefixo são as posições 7 a 9 quando as posições 2 a 6 são zeros (um GTIN-8, ou um GTIN-14 que agrupa um) e as posições 2 a 4 caso contrário. O primeiro dígito, o zero de preenchimento ou o dígito indicador, nunca faz parte do prefixo, então um GTIN-12 tem um prefixo que começa com 0, e um GTIN-14 tem o prefixo do GTIN que ele agrupa.
CampoDescrição
type'GTIN-8', 'GTIN-12', 'GTIN-13' ou 'GTIN-14' (GtinType), conforme o tamanho com que o valor foi escrito
length8, 12, 13 ou 14 (GtinLength)
prefixO Prefixo GS1 de três dígitos, ou um Prefixo GS1-8 quando as posições 2 a 6 da forma de 14 dígitos são zeros, o que cobre todo GTIN-8, um GTIN-14 que agrupa um e o Prefixo GS1 0000000. Identifica a Organização Membro da GS1 que licenciou o número, não o país de origem
isBraziliantrue quando o prefixo é um dos da GS1 Brasil, 789 ou 790, o que a NT 2021.003 chama de "prefixo do Brasil"
isRestrictedCirculationtrue quando o prefixo está em uma faixa que a GS1 reserva para Números de Circulação Restrita (Prefixos GS1 02, 04 e 20 a 29; Prefixos GS1-8 000 a 099 e 200 a 299, faixa em que também cai o Prefixo GS1 0000000, já que sua forma de 14 dígitos começa com seis zeros), ou seja, o número só é único dentro de uma empresa ou região
checkDigitO dígito verificador módulo 10, o último dígito
import { getGtinInfo } from '@brazilian-utils/brazilian-utils';

getGtinInfo('7890000000017');
// { type: 'GTIN-13', length: 13, prefix: '789', isBrazilian: true,
//   isRestrictedCirculation: false, checkDigit: 7 }

getGtinInfo('17890000000014');
// { type: 'GTIN-14', length: 14, prefix: '789', isBrazilian: true,
//   isRestrictedCirculation: false, checkDigit: 4 }

getGtinInfo('061414112345');
// { type: 'GTIN-12', length: 12, prefix: '006', isBrazilian: false,
//   isRestrictedCirculation: false, checkDigit: 5 }

getGtinInfo('2000000000015')?.isRestrictedCirculation; // true (número interno da loja)
getGtinInfo('7890000000018'); // null (dígito verificador errado)

Fonte: GS1 General Specifications, calculadora de dígito verificador da GS1, Nota Técnica 2021.003 da SEFAZ e Tabela Prefixo GS1 do Portal da NF-e.

Código: brazilian-utils/javascript
Teste com JavaScript getGtinInfo
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 (35) e o resultado em cada biblioteca gtin.getInfo

Fontes oficiais

Veja também ISBN, NCM, CEST

Atualizado em

Nesta página