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.
Validar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca
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
cEANecEANTrib. - 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
0000000a 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.lengthslimita 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.getInfopara 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âmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
options | IsValidGtinOptions | não |
options.lengths | GtinLength[] | não |
| retorna | boolean |
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
cEANecEANTrib: GTIN-8, GTIN-12 (UPC), GTIN-13 (EAN) e GTIN-14 (DUN-14). - Opções (
IsValidGtinOptions):lengthsaceita 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
0000000para 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; usegetGtinInfopara 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)Teste com JavaScript isValidGtin
Casos de teste compartilhados (36) e o resultado em cada biblioteca gtin.isValid
Decodificar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca
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-13ouGTIN-14) elengthdescrevem o valor como foi escrito. Um GTIN-14 que começa com 0 é informado comoGTIN-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. Assim10000078912349tem prefixo789, o prefixo de um GTIN-12 começa com 0, e um GTIN-14 tem o prefixo do GTIN que ele agrupa.isBrazilianétruepara os prefixos 789 e 790 (GS1 Brasil, como as regras da SEFAZ os chamam).isRestrictedCirculationétruepara 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âmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
| retorna | GtinInfo | null |
Extrai os campos de um GTIN, como um GtinInfo.
- Retorna
nullquando o valor não é um GTIN válido, sob as mesmas regras deisValidGtin. - 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.
| Campo | Descrição |
|---|---|
type | 'GTIN-8', 'GTIN-12', 'GTIN-13' ou 'GTIN-14' (GtinType), conforme o tamanho com que o valor foi escrito |
length | 8, 12, 13 ou 14 (GtinLength) |
prefix | O 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 |
isBrazilian | true quando o prefixo é um dos da GS1 Brasil, 789 ou 790, o que a NT 2021.003 chama de "prefixo do Brasil" |
isRestrictedCirculation | true 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 |
checkDigit | O 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/javascriptTeste com JavaScript getGtinInfo
Casos de teste compartilhados (35) e o resultado em cada biblioteca gtin.getInfo
Fontes oficiais
Atualizado em
