Wocart
Wocart runs the whole cash-on-delivery business for Algerian stores: an Arabic-first checkout, phone verification, Yalidine, ZR Express, NOEST, Guepex and 82 EcoTrack couriers, your own drivers, and M
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Dashboard + mapa de calor da loja + coletor com leitura de código de barras pela câmera. Substitui a planilha Controle_Validade_v12.xlsx, que continua sendo entrada (importação) e saída (exportação).
Node 20 ou mais novo.
npm install
npm run import -- "../Controle_Validade_v12.xlsx" # carga inicial (já feita neste PC)
npm start # http://localhost:3000 (o coletor é a aba "Coletor")
npm test # 23 testes contra Postgres
O banco é PostgreSQL nos dois ambientes, com o mesmo SQL:
| Onde | Banco |
|---|---|
| Seu computador | PGlite (um Postgres que roda dentro do Node, guardado em data/pg; não precisa instalar nada) |
| Vercel | Neon, pela variável DATABASE_URL |
Localmente o login fica desligado (só o localhost acessa). Com npm run lan ou REQUIRE_LOGIN=1 ele passa a ser obrigatório.
validade-app:
git remote add origin https://github.com/SEU-USUARIO/validade-app.git
git push -u origin main
O .gitignore já deixa de fora node_modules, data/ e .env.DATABASE_URL; não precisa copiar a senha.SESSION_SECRET com um texto aleatório de 32+ caracteres:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
DATABASE_URL=... e salve num arquivo chamado .env.local dentro da pasta validade-app. O Git ignora esse arquivo e os scripts o leem sozinhos, então a string nunca vai para o chat nem para o repositório. Depois:
npm run import -- "../Controle_Validade_v12.xlsx" # sobe produtos e estoque
npm run usuario -- MICHEL 123456 admin # troque pelo PIN que quiser (6 a 8 números)
npm run usuario -- JOAO 654321 operador # um por pessoa da loja
Na Vercel o login é sempre obrigatório. Depois, novos usuários e PINs se gerenciam em Configurações → Equipe.
PIN com hash (scrypt) e bloqueio de 10 min após 5 erros · sessão em cookie HttpOnly/Secure/SameSite=Lax assinado · o nome do operador nos lançamentos vem da sessão, não do que o aparelho manda · cabeçalho obrigatório contra CSRF · Content-Security-Policy restritiva · câmera liberada só para o próprio site · operador não altera regras, planta, equipe nem importa dados.
GÔNDOLA-LADO-PRATELEIRA, por exemplo 1-B-3.
| Parte | Valores |
|---|---|
| Gôndola | 1 a 40 (hoje 1 a 19; sacaria e aquarismo entram depois) |
| Lado | A esquerda · B direita · F ponta da frente · C ponta das costas |
| Prateleira | 1 a 5. Ponta pode vir sem prateleira: 1-F, 1-C |
Endereços antigos fora disso (19, 4-E-1) continuam no estoque, aparecem em Qualidade dos dados e no mapa como “sem endereço válido”, e se corrigem na próxima ronda. Endereço novo fora do padrão é recusado.
| Prazo | Desconto |
|---|---|
| até 30 dias | 50% em tudo |
| até 90 dias | ração (seca e úmida) 20% · demais itens 30% |
| vencido | retirar da loja |
“Ração” vem da categoria do produto; sem categoria, do nome. Não existe mais a faixa de 10%. Perda potencial = valor × desconto (vencido = 100%).
/coletor só redireciona para ela; operadores já abrem nela) — Entrada (receber soma / contar define), Ronda por endereço, Baixa, Buscar. Atalhos de lado e prateleira por toque, câmera para o EAN e para a etiqueta do endereço, fila offline com reenvio sem duplicar, desfazer do último lançamento, aviso de FEFO.This is the beginning of the README. Read the rest at the original. Read the full README ↗