Como você programaria isso?

Estou trabalhando em um módulo de um sistema, que é basicamente um Ponto de Venda.

Alguns clientes pediram a possibilidade de ler o código de barras de um produto vendido a granel (separado, por peso e valor variável), e o sistema automaticamente colocar o peso e o valor.

Comecei a estudar os códigos de barras, mas ainda não consigo montar uma solução que agrade a maioria dos clientes.

Como você faria isso?

Códigos de barras são uma hash computável, o que significa que eles são matemáticamente válidos, usando EAN-13 (que é o padrão), temos o seguinte algoritmo:

  • Some todos os dígitos das posições ímpares do código
  • Some todos os dígitos das posições pares
  • Multiplique a soma dos dígitos das posições pares por 3
  • Some os dois resultados das etapas anteriores
  • Determine o número que deve ser adicionado ao resultado da soma

O que geralmente fazem é:

1 - Reservar os 3 primeiros para identificar a empresa 2 - Usar os 2 últimos para os centavos 3 - usar os 4 penúltimos para o valor em reais 4 - Os dígitos de 4 a 6 para identificar o produto internamente e o 7º para garantir que código fique inválido:

----------------------------------------
7--
8-- Identifica a empresa que fornece
9--
----------------------------------------
5--
6-- Identifica o produto
3--
----------------------------------------
2-- Digito para garantir que seu código seja inválido para EAN 13
----------------------------------------
0--
0-- Quanto deu em reais
5--
6--
-----------------------------------------
4--
5--  Quanto deu em centavos
-----------------------------------------

Essa metodologia é interessante porque permite:

  • 1000 empresas cadastradas
  • 1000 produtos a granel para cada empresa
  • Vendas de até R$ 9999,99
  • Garante que não vai a ver conflito com códigos EAN-13 reais
Exposição bem elucidativa, foi bom aprender um pouco sobre código de barras.
Aula linda. Resumida, mas sem faltar nada. 👏👏👏

Qual está sendo a sua dificuldade? Compartilhe alguns exemplos que deram certo e errado diante das expectativas dos clientes. Nas experiências que tive, códigos de barras gerados por balanças seguiam um padrão, começando com 2, seguido pelo código (6 dígitos) e depois pela quantidade.

um exemplo de cliente mostrava um padrão diferente, começava por 2, seguido pelo código, e o preço do produto em centavos com até 5 digitos (ex: 00641 = R$ 6,41), seguido por um digito verficador. porém, alguns exemplos que eu encontrei na internet mostram que esses codigos de barras podem vir com o valor, ou com a quantidade. o correto seria eu pedir para o usuário definir esse padrão, mas e se ele não puder reconhecer qual está sendo utilizado?

não tenho muito conhecimento nessa área então posso tá errado, e não sei como de fato os códigos de barra funciona, mais só um pensamento de rascunho aqui: não daria para criar um modulo que gera os códigos de barra (ou use um já existente) e junto dele guarda as informações do produto, tem muitos software que faz a impressão dos códigos para ser usado nas gôndolas.

Por exemplo trabalhei em um supermercado, e nos tinhas os códigos internos para os produtos pesaveis, como queijo, presunto etc, tinha até uma lista com todos os códigos.

nos colocava o produto na balança, digitava o código interno, e a balança se comunicava como o servidor e gerava uma etiqueta com as informações do produto como nome, código de barras, peso, data, data de vencimento e outras informações.

Isso era bom pois, quando o gerente precisava fazer alguma alteração no produto tipo o preço ele só ia no cell dele acessava o sistema e alterava o que queria e todas as balanças pegava as novas alterações no mesmo instante.

Não tenho certeza se é exatamente isso que você deseja, mas vou explicar como funciona o código de barras para produtos pesados, como o Queijo Mussarela com o código: 2003600017377.

Esse código de barras pode ser dividido em quatro seções:

  1. 2: O primeiro dígito indica que se trata de um produto pesado. Em muitos sistemas de balança, o número 2 é usado para identificar produtos que foram pesados e vendidos por peso, ao invés de uma quantidade fixa.

  2. 0036: Esses quatro dígitos representam o código do produto, que é definido manualmente por nós. Nesse caso, o código 0036 identifica o Queijo Mussarela. Podemos cadastrar produtos com códigos que vão de 0000 a 9999.

  3. 0001737: Essa sequência representa o valor do produto. No caso, o valor do Queijo é R$ 17,37 e podemos atribuir valores de até R$ 99.999,99.

  4. 7: O último dígito é o dígito verificador, utilizado para garantir a validade do código de barras. Esse dígito é calculado a partir dos outros 12 dígitos do código, utilizando o algoritmo detalhado neste artigo da Wikipédia.

Implementei o algoritmo nesta função em JavaScript. Ela recebe os primeiros 12 dígitos do código de barras, calcula o dígito verificador e retorna o código completo, com os 13 dígitos:

function calcularCodigoDeBarras(codigoCom12Digitos) {
  const array = codigoCom12Digitos.split('');
  const soma = array.reduce(
    (total, numero, i) => total + (i % 2 === 0 ? numero * 1 : numero * 3),
    0
  );
  const digitoVerificador = ((Math.floor(soma / 10) + 1) * 10 - soma) % 10;
  const codigoDeBarrasCompleto = codigoCom12Digitos + digitoVerificador;
  return codigoDeBarrasCompleto;
}

console.log(calcularCodigoDeBarras('200360001737')) // '2003600017377'