Qdelícia Frutas

Manual do Controle de Caixas

Como registrar saída e retorno de caixas retornáveis, e como ler o saldo de cada cliente, rota e unidade — do lançamento no celular ao Painel de Ativos.

O que o app resolve

Contar caixa saindo do galpão é fácil. O problema é o retorno: parte não volta, ninguém sabe de quem é a falta, e a perda só aparece no fechamento do mês como prejuízo sem dono.

O app trata caixa como empréstimo, não como despesa. Cada cliente, filial e galpão tem saldo próprio, recalculado a cada movimento:

saldo do cliente = saídas − retornos − perdas baixadas

Como todo lugar tem saldo, a caixa nunca some no meio do caminho: ela fica na conta de quem estiver com ela.

O ciclo da caixa

ETAPA 1 · GALPÃO Saída Motorista registra 100 caixas ETAPA 2 · NO CLIENTE Retorno Promotor conta 60 para voltar ETAPA 3 · GALPÃO Chegada As 60 entram no estoque SALDO DO CLIENTE DEPOIS DE CADA ETAPA 100 caixas com ele 40 baixou ao ser lançado 40 a chegada não mexe mais contou 55 na chegada? vira divergência de −5, registrada
O retorno baixa o saldo do cliente no instante em que é lançado, esteja quem estiver lançando. A chegada ao galpão não é mais um portão: contagem diferente ali vira divergência registrada, com nome e hora.
A regra que sustenta o app

Todo retorno baixa o saldo assim que é lançado, não importa quem lançou.

Até setembro/2026 não era assim: o retorno contado na rua nascia AGUARDANDO e só a conferência no galpão o confirmava. A etapa de conferência saiu do app de campo — e era o único lugar onde um retorno era confirmado. Mantido o estado de espera, a caixa ficaria presa na conta do cliente para sempre.

A divergência não se perdeu: contagem diferente na chegada continua sendo registrada, com nome e hora. O que ela deixou de ser é portão — virou ajuste.

Rotas

A rota é o caminhão em circulação — e no app ela guarda caixa igual a um cliente. Isso não é detalhe técnico: é o que impede a caixa de sumir entre o galpão e a entrega.

galpão →(carrega)→ ROTA →(entrega)→ cliente →(coleta)→ ROTA →(volta)→ galpão

Sem rota, a saída ia do galpão direto para o cliente. Se o motorista carregava 100 e entregava 80, as outras 20 ficavam registradas no cliente, que nunca as viu. Com rota, essas 20 aparecem onde de fato estão: no caminhão.

Como cadastrar

Cadastros → + Novo cadastro → Tipo: rota (caminhão). Dê o nome pelo qual a equipe já chama (Rota Centro, Rota Litoral) e escolha o motorista responsável.

Depois, em cada cliente, preencha o campo Rota que atende. É esse vínculo que faz o filtro do painel e a lista do celular funcionarem.

No painel

Um quadro Rotas aparece no topo, com duas contas separadas de propósito:

  • No caminhão — carregou e ainda não entregou
  • Nos clientes — já entregou e ainda não voltou

Somar as duas esconderia justamente o que interessa: onde a caixa está agora. O botão ver clientes filtra a lista de baixo pela rota, e o filtro também está no seletor ao lado da busca.

No celular

As rotas aparecem nos seletores de Saída e de Destino, ao lado dos galpões e unidades — o caminhão é destino da entrega e origem da coleta. A escolha é feita em cada tela.

O dia de um motorista com rota

Saída do galpão para a rota (carregar) · Saída da rota para cada cliente (entregar) · Retorno do cliente para a rota (coletar) · Retorno da rota para o galpão (encerrar).

No fim do dia o caminhão tem que fechar em zero. Se não fechou, sobrou caixa a bordo — e agora dá para ver isso no mesmo dia, não no fim do mês.

Como acessar

Não há instalação nem loja de aplicativo. Para quem trabalha na empresa é um endereço só. O cliente tem o dele.

Quem trabalha na empresa — do motorista ao escritório qdelicia-caixas.vercel.app/ Usuário (ou e-mail, ou o nome) e o segredo: os 6 números, ou a senha do painel. A mesma tela para todo mundo.
Cliente …/extrato.html?t=CÓDIGO Abre direto, sem login e sem senha. Cada cliente tem o seu código.

O endereço antigo do escritório — /admin.html — continua funcionando e mostra essa mesma tela. Quem já o tem salvo nos favoritos não precisa mudar nada.

A tela é uma só, e ela é que decide para onde você vai

Antes eram duas telas de entrada quase iguais, cada uma com um link para a outra no rodapé. Quem abria a errada digitava a credencial certa e lia “usuário ou senha incorretos” — uma mensagem que falava do erro errado: a senha estava certa, o endereço é que não era. E não havia como adivinhar qual das duas portas era a sua.

Hoje você digita uma vez e o sistema abre a tela que é sua:

  • você é Administrador e entrou com a senha → abre o painel;
  • todo o resto → abre o app de lançamento, na aba Saída.
Quem não administra começa na operação

Gerente, conferente, promotor e motorista entram direto onde se lança: Saída e Retorno. Antes, quem tivesse a chave do painel era levado para lá logo ao entrar — e caía num painel de números quando o que veio fazer é registrar caixa saindo e voltando.

Nada de permissão mudou. Quem tem o painel liberado continua com o botão ▦ Painel no alto da tela e chega nele em um clique. O que mudou é só por onde o dia começa.

O painel só abre com a senha

Quem tem as duas credenciais e entra pelos 6 números fica no app de lançamento — e o botão ▦ Painel nem aparece. Não é falha: o PIN é curto de propósito, para lançar de luva; o painel vê a operação inteira e mexe em cadastro. Para ir ao painel, saia e entre com a senha.

Por que o campo usa PIN e o escritório usa senha

A tela passou a ser uma só, mas as credenciais continuam duas, e não é descuido: são dois usos diferentes. No galpão a pessoa lança de luva, com o celular numa mão e a caixa na outra, várias vezes por dia — digitar uma senha longa a cada vez atrasa a operação, e o que o PIN protege é só lançamento, que fica registrado com nome e hora e pode ser corrigido. Já o painel vê a operação inteira e mexe em cadastro; ali a senha longa se paga.

Na prática você não precisa saber disso: digite o que você tem, no mesmo campo.

Esqueci a senha do painel

Na tela de entrada, clique em Primeiro acesso ou esqueci a senha. Quem ainda nunca definiu senha prova quem é pelo PIN; quem já tem senha informa a senha atual. Nos dois casos a nova senha vale na hora.

Quem não tem nem um nem outro clica em Pedir ajuda ao escritório. O pedido aparece no painel, em Cadastros → Pedidos de senha, e o administrador cadastra uma senha nova em Usuários. O app não envia e-mail — a senha nova é combinada pessoalmente, e depois disso o administrador marca o pedido como resolvido.

Por que não diz se o e-mail existe

O pedido responde a mesma coisa para qualquer texto digitado. Se dissesse “esse e-mail não existe”, qualquer pessoa poderia usar a tela para descobrir quem trabalha aqui.

No celular

Abra o endereço do campo no Chrome e use ⋮ → Adicionar à tela inicial. Vira ícone e abre em tela cheia, com cara de aplicativo. Mandar o link por WhatsApp para o motorista funciona bem — é link comum.

Antes de distribuir

Troque os PINs de exemplo e a senha do administrador antes de dar o endereço a alguém. O app nasce com PINs curtos de demonstração e o endereço é público — qualquer pessoa que os descubra lança em nome de outra.

Vale lembrar o limite: a permissão por usuário decide o que a tela oferece e o servidor recusa lançamento fora dela, mas as demais rotas da API ainda não pedem prova de quem está chamando. Enquanto for app de teste, tudo bem; virando operação real, é preciso autenticação de verdade.

Motorista

Saída · Retorno · Lançamentos

Registrar uma saída

  1. Preencha o cabeçalho

    Na ordem da tela: Data, Saída (galpão, filial ou rota), Destino, e o Motorista quando for carga do galpão.

    Saindo de um galpão a tela muda: o Destino passa a listar as rotas em vez dos clientes, e aparece o Motorista. É que a carga não vai direto ao cliente — ela sobe no caminhão, e é o caminhão que passa a guardar a caixa até a entrega. Depois, saindo da rota, aí sim você escolhe o cliente.

    O Motorista é lista fechada, não campo de digitar: nome escrito à mão vira grafia diferente do mesmo motorista, e o extrato passa a mostrar duas pessoas onde há uma. Quem vai levar a carga e não aparece na lista precisa ser cadastrado antes, em Cadastros → Motoristas.

  2. Informe a quantidade

    Uma linha por tipo de caixa. Os botões −10 e +10 agilizam volume grande.

  3. Anexe a foto do romaneio

    Opcional, mas é o que sustenta a contagem se alguém contestar depois.

  4. Registrar saída

    Entra como CONFIRMADO na hora — a contagem da saída é a fonte da verdade.

Coletar caixas na rua

A tela de Retorno tem a mesma forma da de Saída — mesma ordem de campos e mesmos rótulos — porque quem alterna entre as duas o dia inteiro não deve ter que reaprender a tela. A diferença está no significado: o Retorno parte da rota, da unidade ou do cliente que está devolvendo — a caixa volta no caminhão, e é o caminhão que a guarda até chegar — e o Destino é o galpão que recebe.

A tela mostra o saldo atual da origem antes de você digitar, o que já evita erro grosseiro.

A sua contagem vale na hora: o saldo baixa no lançamento, sem esperar conferência. Conte com cuidado — e, se der diferença na chegada, o escritório corrige pela aba Movimentos, deixando o rastro de quem mudou o quê.

Promotor

Retorno · Lançamentos

O promotor trabalha dentro do cliente e tem uma função só: contar as caixas prontas para voltar. O app abre direto na tela de Retorno — esse perfil nem enxerga a aba de Saída.

  • Data — o dia da contagem
  • Retorno — a rota em que as caixas estão voltando
  • Destino — o galpão ou a filial que vai receber. Se você só opera um galpão, ou se o seu local padrão for um deles, o campo já vem preenchido
  • Motorista — quem está levando a carga de volta
  • Quantas caixas — o que você contou de fato, por tipo
  • Foto das caixas — opcional, mas é o que sustenta a sua contagem se der diferença

Na aba Lançamentos você confere tudo o que foi lançado no período — o seu e o dos outros.

Galpão

Saída · Retorno · Lançamentos

No galpão as duas pontas se encontram: é de lá que a carga sai e é lá que ela volta. O conferente usa as mesmas duas telas de todo mundo — Saída e Retorno —, e a diferença está em quando ele as usa.

  1. Carga saindo

    Aba Saída, do galpão para a rota. A carga sobe no caminhão, e é o caminhão que passa a guardar a caixa até a entrega.

  2. Caminhão voltando

    Aba Retorno: origem é a rota (ou a unidade de onde as caixas vêm), destino é o galpão. Conte o que chegou de verdade no caminhão.

  3. Pronto

    O saldo baixa no lançamento. Não há segunda etapa esperando ninguém.

A aba Conferência não existe mais

Ela saiu em setembro/2026, junto com o estado AGUARDANDO. Quem procurar por ela no celular não vai achar — o retorno agora vale no ato.

Divergência entre o que o cliente declarou e o que chegou é resolvida pelo escritório, em Movimentos → corrigir, que guarda o valor antigo, o novo, quem mudou e quando.

Lançamentos

A terceira aba do app de campo, visível para todo mundo. Ela mostra o que foi lançado no período — saídas e retornos, os seus e os dos outros —, uma linha por lançamento.

No lugar de um saldo por local, que é a leitura do escritório, aqui está o extrato do dia: Data, Origem, Destino, Saída, Retorno, Motorista e as quantidades por tipo de caixa.

Os três cartões

  • Saída — quantas caixas saíram no que está sendo mostrado
  • Retorno — quantas voltaram
  • Total geral — a soma das duas pontas

Os três seguem os filtros. Filtrou por um motorista, os cartões passam a falar só dele.

Os filtros

Motorista, Origem, Destino e Entrada / Saída são de múltipla escolha: marque dois motoristas e os dois aparecem. Mais o período, com data de início e fim.

Nada marcado quer dizer todos, e não nenhum — senão a tela abriria vazia sem dizer por quê. As opções saem dos lançamentos do período, não do cadastro inteiro: uma lista com trinta locais dos quais dois se moveram obriga a procurar.

Ajuste e perda ficam de fora desta lista: não são viagem de caixa. Eles aparecem no painel do escritório.

Painel de Ativos

A primeira aba do escritório, chamada Controle de Caixas na tela. É o extrato da operação: uma linha por dia, por caminho — de onde saiu, para onde foi, quanto saiu, quanto voltou e quanto sobrou.

As colunas

ColunaO que diz
DataO dia do lançamento. A tabela é ordenada por ela, e dentro do mesmo dia o estoque abre e os caminhos vêm depois
OrigemQuem despachou, e embaixo quantos lançamentos a linha junta
EstoqueO que foi lançado como saldo inicial naquele dia. Zero em cinza nos dias sem lançamento. É por ele, e pelo verde do Saldo inicial, que se reconhece uma linha de estoque
Saldo inicialO acumulado até ali — tudo que já entrou menos tudo que já saiu
DestinoQuem recebeu. Nas linhas de saldo inicial fica vazio, porque elas não são um caminho
SaídaQuanto saiu, com a quebra por tipo de caixa embaixo
RetornoQuanto voltou, idem
Saldo finalVerde quando sobra, vermelho quando falta
Saldo final = Saldo inicial − Saída + Retorno

A cadeia fecha linha a linha: o Saldo final de uma linha é o Saldo inicial da de baixo, mais o que tiver sido lançado de Estoque naquele dia. Quando o saldo dá um salto, é a coluna Estoque que explica o salto.

O Saldo inicial não obedece ao filtro

E é de propósito. Ele é calculado sobre o histórico inteiro, antes de qualquer recorte: filtrando só o dia 17, a linha continua abrindo no saldo real daquele dia, e não no saldo do primeiro dia visível.

Já foi calculado sobre a lista filtrada, e aí escondendo o dia 16 a linha do dia 17 abria como se nada tivesse acontecido no meio.

Os cinco cartões

Ficam acima da tabela, nesta ordem: primeiro o indicador que se cobra, depois o número que dói, depois o que há, e por fim as duas pontas do período.

CartãoO que contaSegue o filtro
Total no EstoqueO que está nas nossas casas: galpões e unidades. Em verdenão
Total de SaídaCaixas que saíram no recortesim
Total de RetornoCaixas que voltaram; no rodapé, a soma das duas pontassim
Caixas que Saíram e Não VoltaramO déficit, somando só quem devesim
Taxa de Retorno do MêsRetorno dividido por saída, contra a metasim

O estoque é o único que não segue o filtro: ele sai do razão — o que está nas nossas casas agora —, e não do fluxo do período. Filtrar por uma origem não o estreitaria, só o deixaria parecendo travado, e por isso o rodapé dele avisa.

Os filtros

Todos moram num painel suspenso, que abre no botão Filtros do rodapé da coluna da esquerda. Ele fecha no mesmo botão, clicando fora ou com Esc, e nasce fechado a cada visita — painel aberto não é preferência, é estado passageiro, e reabri-lo sozinho taparia a tabela de quem só queria consultar.

  • Origem e Destino — as opções saem dos locais que estão nas linhas, não do cadastro inteiro
  • Destino → Estoque Inicial — mostra só os lançamentos de saldo inicial. Só aparece quando há algum no período
  • De e Até — o período; em branco, o mês corrente
  • Só reais / Só de teste — separa a operação do ensaio
  • ✕ Limpar filtros — devolve tudo ao estado inicial, inclusive o grupo da coluna da esquerda. Fica apagado quando não há nada a limpar
Fechado, o painel não esconde o recorte

Esse é o risco de guardar os filtros num painel: a tabela mostra um pedaço e o motivo fica invisível, e quem chega depois conclui que faltam lançamentos.

Por isso o botão conta os filtros ligados — ▸ Filtros (2) — e, com o painel fechado, troca de cor. Ele deixa de ser um controle e passa a ser um aviso. O Limpar filtros fica logo abaixo, para desfazer o que você não está vendo.

A coluna da esquerda agrupa: Todas, Rotas, Unidades, Clientes, Em déficit, Motoristas e Usuários. Os dois últimos trocam a leitura de lugar para pessoa: quanto cada motorista, ou cada usuário, tem em aberto.

No rodapé dessa mesma coluna ficam os quatro botões — Filtros e Limpar filtros em cima, Exportar CSV e Atualizar embaixo. A linha entre eles separa mudar o que vejo de fazer algo com isto.

A coluna inteira recolhe no botão ao lado do título, devolvendo 220px de largura à tabela. Fica guardado neste navegador.

Recolhida, a coluna não leva o recorte junto

O grupo escolhido peneira a tabela. Recolhida a coluna, ele sai da tela — e quem chega depois fica olhando quatro linhas onde havia dezenas, sem saber por quê.

Por isso o botão passa a carregar o nome do grupo — ☰ Usuários — e troca de cor. Em Todas ele fica mudo: aí não há nada escondido para avisar.

Classificar, arrastar, redimensionar

O título da coluna faz três coisas, e nenhuma atrapalha a outra:

  • Clique — classifica por ela. Um clique é crescente, dois é decrescente, três volta à ordem de origem
  • Arraste o título — troca a coluna de lugar
  • Arraste a borda direita — muda a largura

Para esconder uma coluna, e para fazer as mesmas três coisas sem precisar acertar o arrasto, use a aba Colunas. É o mesmo ajuste visto de outro lugar: o que se arrasta aqui aparece lá, e o que se marca lá esta tabela obedece.

A ordem e a largura ficam guardadas neste navegador, porque são preferência de quem olha. A classificação não: ela é um recorte para responder uma pergunta — quem devolveu menos? —, e não um jeito de trabalhar. Guardada, a tela voltaria dias depois fora da ordem de extrato sem ninguém lembrar por quê.

Classificado, o saldo deixa de encadear

Classificar só troca a ordem das linhas na tela: cada número continua o da sua linha. O que se perde é a leitura de extrato — fora da ordem por data, o Saldo final de uma linha deixa de ser o Saldo inicial da de baixo.

A seta no título diz quando você saiu da ordem de origem, e o terceiro clique devolve.

O ⬇ Exportar CSV sai na mesma ordem de colunas da tela, e sempre na ordem de extrato das linhas.

Painel e extratos

O escritório entra em admin.html e encontra sete páginas: Painel de Ativos, Painel, Extratos, Ajustes, Movimentos, Colunas e Cadastros. Quais delas cada pessoa enxerga é decidido no cadastro dela — Ajustes e Cadastros só o administrador vê.

Na barra lateral elas ficam separadas por módulo: Operação (Painel de Ativos, Painel, Movimentos), Dados (Extratos, Cadastros, Colunas) e Sistema (Ajustes). Sete itens seguidos viram uma lista sem forma — separados, você lê um grupo e ignora os outros. O título de um módulo só aparece se você tiver pelo menos uma página dele: nunca sobra um cabeçalho anunciando uma seção vazia.

Elas ficam numa barra lateral, à esquerda, com a página aberta em destaque. No computador ela fica fixa: as sete páginas ficam à vista o tempo todo, sem nenhum clique para descobrir o que existe. No celular ela vira uma gaveta, que abre pelo botão ☰ no canto superior esquerdo e fecha ao escolher uma página, clicando fora ou com Esc.

Acima do conteúdo, um título de página diz onde você está — Operação · Movimentos. No computador a lateral já responde isso; no celular, com a gaveta fechada, ele é a única pista.

No rodapé da lateral ficam o indicador ● Online — verde quando está tudo enviado, âmbar quando há lançamento na fila e vermelho sem internet —, o círculo com as suas iniciais e o botão de sair. Eles ficam sempre à vista: a lista de páginas rola por dentro dela, e o rodapé não desce junto — antes, com a lista cheia, era preciso rolar a lateral para achar o botão de sair.

Recolher a lateral quando a tabela precisa da largura

No computador, o botão ⟨ no alto da lateral a encolhe para uma faixa só de ícones. É útil na aba Movimentos, onde a tabela é larga. Clique de novo para trazê-la de volta — e a escolha fica guardada naquele computador, como a ordem das colunas.

Com a lateral recolhida, passar o mouse por cima dela a abre de relance, só enquanto o cursor estiver ali. Serve para conferir onde você está sem desfazer a escolha. Tirou o mouse, ela volta a ser a faixa de ícones.

Recolhida, a lateral inteira é o botão

Num tablet não existe "passar o mouse". Por isso, com a lateral recolhida, um toque em qualquer parte vazia dela a abre — o ⟨ some justamente porque não é mais necessário. Tocar num ícone continua trocando de página, como sempre.

A lateral empurra o conteúdo em vez de passar por cima dele: abrindo, a tabela se ajusta e nenhuma coluna fica escondida atrás do menu.

A página rola por dentro

A lateral e o título da página não saem do lugar quando você rola: o que se move é só o conteúdo. Descendo numa tabela longa, você continua vendo em que página está e como sair dela.

O app de campo usa exatamente a mesma navegação, com as três páginas dele. Quem passa do celular para o painel não reaprende nada.

Painel

Abre com Caixas em poder de clientes e filiais, a Idade das caixas na rua e o Estoque nos galpões. As etiquetas fazem a triagem:

  • acima do limite — o cliente passou do teto contratado
  • div. −5 — divergência entre o contado no cliente e o conferido na chegada
  • a conferir — há devolução esperando o galpão

O botão ⬇ Exportar CSV leva o quadro inteiro para a planilha.

Extratos

Escolha o cliente e o período e clique em Gerar extrato. A partir dali:

  • 📲 WhatsApp — abre a conversa com o resumo do saldo já escrito
  • 🔗 Link do cliente — o endereço só-leitura para mandar a ele
  • ⬇ CSV e 🖨 Imprimir — para anexar à cobrança

Idade das caixas

O que está na rua é separado em quatro faixas — 0-7, 8-15, 16-30 e +30 dias — considerando que as caixas mais antigas são as que ainda não voltaram.

Serve para separar pendência de perda. Caixa de três dias é operação normal; caixa de quarenta dias não volta mais, e é onde a cobrança deve começar.

Movimentos

Tudo o que foi lançado, por qualquer pessoa, numa lista só. É a aba de auditoria e conserto: onde se acha o lançamento errado e onde ele se corrige.

Os filtros

FiltroO que recorta
Origem · DestinoCada ponta presa na sua — "o que SAIU de Caruaru" é outra pergunta que "o que passou por Caruaru"
Entrada / SaídaO grupo: o que saiu junta saída e transferência; o que voltou é o retorno. Perda e ajuste não entram em lado nenhum, porque não são viagem de caixa
TipoUma linha do razão: saída, retorno, transferência, perda ou ajuste
CaixaUm tipo de caixa
StatusEnviada, Transferida, Parcial, Devolvida, Perda ou Ajuste — o ciclo em que a carga está
Quem lançouA pessoa
LançamentosSó reais ou só de teste
De · AtéO período; abre nos últimos 30 dias

Cada um recarrega a lista sozinho ao mudar. O ⬇ CSV leva o recorte para a planilha.

As colunas da tabela

Arraste o título para trocar a coluna de lugar, e a borda direita para mudar a largura — como no Painel de Ativos. Para esconder, e para fazer as duas sem arrastar, use a aba Colunas.

A coluna dos botões de ação fica de fora: ela não é dado, é o caminho para corrigir. Escondível, alguém a esconderia sem querer e perderia o único jeito de consertar um lançamento; arrastável, cairia no meio da leitura.

Corrigir, cancelar, excluir

  • corrigir — muda data, origem, destino, tipo de caixa, quantidade e mais. Guarda o valor antigo, o novo, quem mudou e quando
  • cancelar — a linha continua no histórico, marcada como cancelada, e deixa de contar no saldo
  • excluir — apaga de vez. Use só para o que nunca deveria ter existido
Apagar o que está no filtro

Apaga tudo o que casa com os filtros de cima, de uma vez. Antes de executar, a tela escreve o recorte por extenso e pede o número de lançamentos que serão apagados — se o número não bater com o que o servidor encontrou, nada acontece.

Quem monta o recorte é a mesma função que monta a lista da tela. Não há um segundo formulário para divergir do primeiro.

Colunas

Uma tela só para o desenho das tabelas. Antes, esconder e mover coluna morava dentro do painel de filtros do Painel de Ativos, e num segundo botão na barra de Movimentos — dois lugares diferentes para o mesmo ajuste, e nenhum deles onde se procura.

Uma ficha por módulo

Cada módulo com tabela ajustável tem a sua ficha, e dentro dela uma linha por coluna. Em cada linha, as três coisas que se pode fazer:

  • ↑ e ↓ — movem a coluna de lugar. A primeira não sobe, a última não desce, e os botões ficam apagados quando não há para onde ir
  • O número em px — a largura da coluna. Vale a partir de 70px
  • ✕ esconder — tira a coluna da tabela. Escondida, a linha fica apagada e o botão vira ↩ mostrar

As três estão escritas por extenso no alto da página. A primeira versão usava uma caixa de marcar para esconder, e ninguém achava: marcada, ela não diz o que acontece ao desmarcar, e a palavra esconder não aparecia em lugar nenhum da tela.

Hoje são três: Painel de Ativos, Movimentos e Cadastros · Usuários. O Painel, os Extratos e as demais listas de Cadastros ainda não aparecem, e a própria tela diz isso no rodapé — módulo que falta sem explicação parece coisa quebrada.

A de Usuários é a mais larga do app: nove colunas de dado. Quem não usa e-mail nem telefone esconde as duas e ganha a tela de volta — e é aí que esta aba paga por si.

Escondida, a coluna continua na lista

Ela fica apagada, e não some. Sumindo, não haveria como trazê-la de volta — e é justamente ela que se procura quando se vem a esta tela.

A ficha do módulo mostra em âmbar quantas estão fora. Nenhuma escondida, nenhum aviso.

É o mesmo ajuste da tabela

Esta tela grava no mesmo lugar que o arrasto no cabeçalho: mover aqui é mover lá. Assim que se muda algo, a tabela do módulo se redesenha — não é preciso trocar de aba para ver.

O restaurar padrão de cada ficha apaga as três preferências de uma vez — ordem, largura e escondidas. Apagar só uma deixaria a tabela num meio-termo que ninguém escolheu.

A largura em pixels é a largura em pixels

Toda tabela ajustável termina numa coluna de folga, sem título e sem largura — em Movimentos e Usuários ela é a coluna dos botões. É ela que recebe o espaço que sobra.

Sem essa folga o navegador reparte a sobra entre as colunas: pedir 95px devolvia 435px sempre que a tabela não enchesse a janela, e esconder uma coluna só esticava as outras em vez de devolver a tela.

Tudo isso fica guardado neste navegador, e não na conta. É preferência de quem olha, como o zoom da tela — não muda dado, não muda saldo, e não viaja para o computador do colega.

A largura grava quando o campo perde o foco, não a cada tecla: digitando 1 antes de 2 e 0, a coluna encolheria ao mínimo no meio da digitação.

Quem vê esta aba

Qualquer pessoa que tenha o painel — ela não é exclusiva do administrador. Escolher coluna não muda dado nenhum; é a mesma natureza de recolher a coluna da esquerda. Como as outras, pode ser tirada de alguém pela lista de abas do cadastro.

Cadastros

Três blocos, cada um com o seu botão de + Novo.

A tabela de Usuários é ajustável: arraste o título para trocar a coluna de lugar, a borda direita para mudar a largura, e use a aba Colunas para esconder o que não interessa. É a mais larga do app — nove colunas de dado —, então é onde mais rende. Os botões de editar, desativar e excluir ficam fora do ajuste.

Locais e rotas

Todos ficam na mesma lista, mudando só o Tipo: galpão, filial, cliente e rota. Os campos que pesam no dia a dia:

CampoPara que serve
Rota que atendeVincula o cliente a uma rota; alimenta o filtro do painel e a lista do celular
Motorista responsávelSó para tipo rota: de quem é aquele caminhão
Responsável / promotorNome que aparece no extrato
WhatsApp (com DDD)Habilita o botão de envio do extrato
Limite de caixasDispara a etiqueta acima do limite
Prazo de devolução (dias)Define quando a caixa passa a contar como atrasada
AtivoSome das listas sem apagar o histórico

Na lista, cada local tem desativar e excluir. Excluir só funciona em cadastro que nunca rodou: se já tem movimento — ou se é uma rota que já atende algum cliente — o sistema desativa e avisa, porque apagar deixaria o histórico apontando para o vazio.

Locais padrão

Onde a pessoa trabalha — Escritório Central, Base Recife. É o que aparece na coluna Local padrão dos usuários.

Repare que é um cadastro diferente de Locais e rotas. Lá ficam os nós que guardam caixa e têm saldo; aqui é só o posto de trabalho. Um escritório nunca vai segurar caixa, mas é onde alguém fica.

Motoristas

Quem leva a carga, com telefone, CPF, número e categoria da CNH, validade e placa habitual. É essa lista que aparece para escolha na saída do galpão.

Tipo: Fixo é quem roda sempre as mesmas rotas; Volante é quem cobre qualquer uma. O volante aparece na lista de todas as rotas, mesmo que tenha rotas marcadas — se não fosse assim, o campo estaria mentindo. Deixar em branco tem o mesmo efeito prático de volante, e é como ficam os motoristas cadastrados antes deste campo existir.

Rotas que atende: marque as rotas de cada motorista e o celular passa a oferecer só quem atende a rota escolhida na saída. Nada marcado quer dizer todas — ele aparece em qualquer rota. Se a rota escolhida não tiver ninguém atribuído, a lista volta a mostrar todos: melhor oferecer todo mundo do que travar a saída porque faltou um cadastro. Sobrando um único motorista, ele já vem preenchido.

Cadastrar aqui é pré-requisito para a saída do galpão: no celular o motorista se escolhe numa lista fechada, e quem não estiver cadastrado não pode ser lançado.

Quem sai da empresa se desativa pelo botão na lista: ele some da escolha de motorista na saída do galpão, mas o nome continua legível no cadastro e nas cargas que já levou. Excluir apaga de vez — use só para quem foi cadastrado errado.

Cadastro separado dos usuários de propósito: motorista é quem dirige, não quem usa o app. A maioria nunca vai fazer login, e criar conta com PIN para cada um seria inventar senha que ninguém usa.

A validade da CNH aparece em vermelho quando está vencida. O app não bloqueia a saída por isso — só mostra, para o escritório resolver.

Tipos de caixa

Nome e peso em quilos. O peso é opcional, mas vale a pena: é o que separa duas caixas de mesmo nome na hora de lançar, quando aparecem como Caixa Banana · 20 kg. Mantenha a lista curta — ela é escolhida no celular, com pressa.

Não há valor em dinheiro em lugar nenhum do app: nem preço de caixa, nem coluna de valor no painel ou no CSV. Foi retirado em setembro/2026. Caixa perdida se conta em caixas.

Cada quadro desta aba abre e fecha no clique do título, e começa fechado — seis cadastros abertos ao mesmo tempo deixam o que você procura a três rolagens de distância. O número ao lado do nome diz quantos itens há dentro, então quadro fechado não se confunde com cadastro vazio. O que você abrir continua aberto na próxima visita, neste mesmo navegador.

Usuários

O campo Perfil aceita escrever: se o cargo que você precisa não está na lista, digite. Um perfil novo nasce sem poder nenhum — não cadastra e não administra. É de propósito: permissão por digitação seria permissão por engano de digitação. O que a pessoa pode fazer vem das chaves logo abaixo, não do que está escrito no cargo.

Perfis de fábrica: Admin, Gestor, Gerente, Conferente, Motorista e Promotor. Só o Admin tem poder próprio — cadastros e correções. Os outros valem como cargo escrito no crachá: o que cada um pode fazer vem das chaves do cadastro, uma a uma, e não do nome do perfil.

Pode entrar no painel? decide, pessoa por pessoa, quem abre o endereço do escritório. Antes isso vinha do perfil: todo GALPAO entrava. Agora um conferente pode lançar no celular sem ver os números da operação, e um promotor pode ver os números sem virar administrador. Quem fica sem acesso continua usando o app de campo normalmente. Administrador entra sempre — a opção fica travada para ele, senão daria para trancar o último administrador do lado de fora.

Nome, e-mail, perfil, PIN e local padrão. O usuário — ou o e-mail, ou o próprio nome — é o que a pessoa digita na tela de entrada, e serve para as duas credenciais: é o segredo que muda, não o identificador. Um PIN por pessoa, nunca um PIN de função compartilhado entre vários: é o nome de quem contou que dá peso à divergência.

Onde cada um pode lançar

No cadastro do usuário, dois quadros de marcar decidem quais locais aparecem no celular daquela pessoa: Saída (de onde as caixas saem) e Destino (para onde vão). Nada marcado quer dizer nenhum — marcar é conceder. Quem tiver um único local liberado já encontra o campo preenchido, sem precisar escolher.

No retorno os papéis se invertem, porque é o caminho de volta: quem devolve vem da lista de Destino, e quem recebe vem da de Saída.

O que cada um pode lançar

Operações decide se a pessoa lança Saída, Retorno ou os dois. A aba que ela não pode usar some do celular — e, mais importante, o servidor recusa o lançamento mesmo que o pedido chegue por fora do app.

Marcar é conceder

Em todos os quadros de marcar do cadastro de usuário, nada marcado quer dizer nada liberado. Se você desmarcar tudo em Abas do painel, a pessoa não vê página nenhuma; se desmarcar tudo em Operações, ela não lança no app.

Até setembro/2026 era o contrário: deixar vazio queria dizer todos. Mudou porque surpreendia — o administrador desmarcava tudo e a pessoa continuava enxergando o sistema inteiro.

O que isso cobra de você: um galpão, motorista, tipo de caixa ou usuário novo não aparece para ninguém até ser marcado no cadastro de cada pessoa. A tela avisa isso na hora de criar.

Duas exceções. O administrador sem nada marcado continua vendo tudo — senão não haveria como desfazer. E os filtros da aba Lançamentos não são permissão: ali, nada marcado segue querendo dizer todos.

Em quais locais ela ajusta o saldo

Ajustes e perdas marca os locais cujo saldo aquela pessoa pode corrigir pela aba Ajustes — saldo inicial e baixa de perda. Nada marcado = nenhum.

Antes, ter a aba Ajustes dava o saldo inteiro: qualquer galpão, filial, cliente ou rota. Agora a aba é a porta e esta lista é o quarto. Um conferente de filial pode corrigir o saldo da filial dele sem poder mexer no da matriz.

Na aba Ajustes, o seletor de local passa a mostrar só os liberados, e um aviso diz quais são e que é o administrador quem libera — lista curta e sem explicação parece cadastro faltando.

Vale também para a perda

A mesma lista governa o Ajuste (que credita o destino) e a Baixa de perda (que debita a origem). Fossem duas regras, quem estivesse barrado no ajuste daria baixa no mesmo local pela outra opção do seletor.

E o servidor recusa por conta própria: o filtro da tela é conveniência, não a tranca.

O que cada um pode ver no painel

Abas do painel marca, uma a uma, quais das sete abas do escritório aquela pessoa enxerga. Um gerente pode ver o Painel de Ativos e os Extratos sem ver Movimentos; um conferente pode entrar só para consultar.

Lançamentos: se vê, e de quem

Duas perguntas, uma embaixo da outra:

  • Vê os lançamentos? — em não, a aba Lançamentos some do app dela e o painel não lista movimento nenhum
  • De quem ela vê os lançamentos — a lista de usuários, com marcar todos. Nada marcado = ninguém. Marque só ela mesma para ela ver apenas o que lançou, ou marque todos para ela ver a operação inteira

O seletor Pode entrar no painel?, mais acima, é um atalho para os casos comuns — todos e apenas os lançamentos dele mesmo. Ele e a lista são a mesma coisa: escolher no seletor marca a lista, e mexer na lista muda o que o seletor mostra. Quando você marca pessoas específicas, ele passa a dizer vê de pessoas escolhidas abaixo.

A segunda trava enquanto a primeira estiver em não — não há de quem ver, e marcar ali não faria efeito.

O recorte vale nas duas telas, e nos números

Vale para o Painel de Ativos, os saldos, os extratos, os movimentos e a aba Lançamentos do app de campo. Os totais dos cartões acompanham — senão ela veria o número do galpão inteiro em cima de uma tabela de três linhas.

Quando ela vê os lançamentos de mais de uma pessoa, a aba Lançamentos do app de campo mostra a coluna Quem lançou e ganha um filtro Usuário — que é o primeiro da fileira, porque "de quem é isto" passa a ser a primeira pergunta. Senão as linhas de duas pessoas ficariam misturadas sem jeito de separar.

Os filtros dessa aba abrem como lista suspensa, por cima da tabela: aberta no lugar, a lista empurrava a tabela para baixo e esticava os outros filtros junto. Uma de cada vez, e clicar fora fecha.

E há uma busca no alto da aba. Os filtros respondem quais; a busca responde cadê aquele. Ela procura em origem, destino, caixa, motorista e quem lançou — o campo diz isso —, não liga para acento nem maiúscula, e aceita mais de uma palavra: isaque joao acha a carga do Isaque para João Pessoa. Os totais acompanham, e o Limpar filtros apaga a busca junto.

Fica de fora, de propósito, o aviso de saldo embaixo da origem no formulário de retorno. Ele mostra quantas caixas estão naquele lugar de verdade — é dele que sai o alerta de "você contou mais do que o saldo", e recortado ele acusaria erro em toda devolução certa.

A tela de quem está restrito não avisa que está: ela mostra os números dela e pronto. Quem ainda não lançou nada vê zeros. Vale combinar com a pessoa, para ela não achar que o app quebrou.

Ajustes e Cadastros aparecem com a etiqueta dá poder, e você pode concedê-las a quem quiser — basta marcar. A diferença delas é que não entram no "nada marcado = todas": só valem se você marcar de propósito.

O que essas duas dão

Cadastros deixa a pessoa criar e editar usuários — inclusive tornar-se administradora. Ajustes deixa lançar correção de saldo.

Por isso elas ficam fora do padrão: sem essa regra, o próximo usuário criado com acesso ao painel e sem nenhuma marca ganharia as duas sem ninguém decidir. Marcando, o formulário avisa o que aquilo permite.

Se uma aba não aparece para a pessoa

O formulário não deixa mais você marcar o que não vai funcionar: quando uma pré-condição está desligada, o quadro fica apagado e uma nota diz qual chave ligar. São três:

  • Ativo em não — a pessoa não entra em lugar nenhum, e nenhuma permissão vale
  • Pode entrar no painel? em não — as abas não valem, porque ela não chega ao painel
  • Sem senha do painel — o acesso fica ligado e o login recusa mesmo assim. São duas senhas diferentes: o painel entra por senha, e o PIN de seis números é do app de campo

Confira nesta ordem: a chave Pode entrar no painel? está ligada; a pessoa tem senha do painel; a aba está marcada aqui; e ela não é Ajustes nem Cadastros, que só o Admin vê.

A mudança vale na próxima vez que a pessoa abrir a página — não é preciso sair e entrar. O que não acontece é a tela dela mudar no mesmo segundo: se ela está com o painel aberto agora, precisa recarregar.

E confira por onde ela chega ao painel. Quem entra pelo app de campo tem um botão ▦ Painel no alto da tela — ele só aparece para quem tem a chave Pode entrar no painel? ligada. Sem essa chave, as abas marcadas aqui não adiantam: a pessoa nunca chega ao painel para vê-las.

Uma causa a mais, fácil de confundir com falta de permissão: se ela entrou com os 6 números, o botão ▦ Painel não aparece mesmo com tudo liberado. O painel só abre para quem entra com a senha. Peça que ela saia e entre de novo com a senha do painel.

No painel, o caminho de volta é o ↩ Lançamentos, no mesmo lugar. Ele só aparece para quem tem senha de lançamento — sem ela o app de campo não deixa entrar, e o botão levaria a uma recusa.

Se a marca não alcançar nenhuma aba que exista — porque guarda uma aba renomeada, ou que saiu do app —, o resultado é o mesmo de não ter marcado nada: nada. Antes esse caso liberava tudo; deixou de liberar quando a regra virou marcar é conceder, porque trocar uma marca quebrada por acesso amplo é o contrário do que o administrador pediu ao marcar. O painel não fica mudo: em vez de abrir vazio, ele escreve na lateral que não há nenhuma página liberada e manda falar com o administrador.

Em todos esses quadros — Saída, Destino, Operações, Abas, Ajustes, Tipos de caixa, Motoristas e De quem vê — nada marcado quer dizer nada liberado. Marcar é conceder.

Depois de mudar

As duas telas releem o cadastro da pessoa a cada abertura, então basta ela recarregar a página — não precisa sair e entrar. O que não acontece é a tela dela mudar no mesmo segundo: se estiver com o app aberto agora, precisa recarregar.

Quem tiver perdido o acesso, ou for desativado, é avisado e mandado para a tela de entrada.

Quem sai da empresa se desativa, pelo botão na lista. Existe também excluir, mas ele só apaga de verdade quem nunca lançou nada: quem já tem movimento no histórico é desativado, porque o nome de quem contou é o que dá peso à divergência. Inativo some das listas e não consegue mais entrar; reativar devolve o acesso.

Pedidos de senha

Este cartão só aparece quando alguém pediu ajuda para entrar no painel. Cada linha mostra o que a pessoa digitou, quando pediu e a qual usuário aquilo corresponde — ou não encontrado, se não corresponder a ninguém cadastrado. Cadastre a senha nova em Usuários, avise a pessoa e depois clique em marcar resolvido.

O último administrador ativo não pode ser desativado nem excluído — nem por ele mesmo. Sem ele ninguém entra no painel, e a volta seria por SQL no banco.

Ajustes

A aba Ajustes existe para o que não passou pelo celular — o histórico anterior ao app, o acerto de erro antigo, a baixa de perda negociada, o saldo inicial de cada local. Só o administrador a enxerga.

TipoQuando usar
SaídaEntrega que não foi lançada no campo
TransferênciaCaixas indo do galpão para a filial, ou o contrário
DevoluçãoRetorno que chegou sem registro do motorista
Baixa de perdaCaixa aceita como perdida — sai do saldo do cliente e entra nas perdas do mês
Ajuste / saldo inicialO ponto de partida de um local. É o que alimenta a coluna Estoque do Painel de Ativos, e pode ser lançado a qualquer momento, não só no primeiro dia
Primeiro dia de uso

Antes de qualquer coisa, lance um Ajuste / saldo inicial por cliente com o que ele já deve hoje, e outro com o que existe no galpão. Sem isso o sistema começa do zero e o passado desaparece.

Nada é apagado neste app. Lançamento errado se cancela na aba Movimentos, informando o motivo — a linha continua no histórico, marcada como cancelada.

Link do cliente

Cada cliente tem um endereço próprio, com um código no fim. Abre sem login, em qualquer celular, e mostra três coisas: quantas caixas ele tem hoje, a idade delas e o histórico completo de saídas e devoluções. Tem botão de imprimir.

Pegue o link em Cadastros → o cliente → Link do cliente → Copiar link, ou no botão 🔗 Link do cliente da aba Extratos.

É a peça que muda a conversa de cobrança: em vez de mandar um número que o cliente precisa acreditar, você manda o extrato que ele consulta sozinho, na hora que quiser.

Trabalho offline

Galpão de parede grossa e estrada de interior derrubam sinal. O app lida com isso sem pedir nada a quem está usando.

  • Sem internet, o lançamento fica guardado no próprio celular, e o topo da tela mostra quantos estão na fila
  • Quando o sinal volta, sobe sozinho — ninguém precisa reenviar
  • Reenvio não duplica: cada lançamento carrega uma chave única, e é o próprio banco que recusa a repetição
  • Se a memória do celular apertar, o app guarda a contagem e descarta a foto — perder a foto é ruim, perder a contagem é pior

O indicador ● Online no topo fica vermelho quando a conexão cai, e mostra o número de itens na fila quando há pendência.

Tipos e estados

Quem vê o quê

O perfil quase não decide nada. chave = vem de um campo do cadastro daquela pessoa, e não do cargo dela.

PerfilSaídaRetornoLançamentosEntra no painelAbas do painelCadastros e correções
Motoristachavechavesimchavechave—
Promotor—simsimchavechave—
Gestorchavechavesimchavechave—
Gerentechavechavesimchavechave—
Conferentechavechavesimchavechave—
Adminchavechavesimsempretodassim

O Promotor é a única exceção que ainda mora no perfil: ele não vê a aba de Saída, porque trabalha dentro do cliente. O Admin entra no painel sempre, mesmo com a chave desligada — senão daria para trancar o último administrador do lado de fora, e a volta seria por SQL.

Tipos de movimento

TipoEfeito no saldo
SAIDATira da origem e põe no destino
DEVOLUCAOTira do cliente e devolve ao galpão, no instante em que é lançada
TRANSFERENCIAMove entre galpão e filial
PERDABaixa do saldo do cliente e entra na conta de perdas do mês
AJUSTECorrige para mais ou para menos; é o que usa no saldo inicial

Status da carga

É a coluna Status da aba Movimentos, e o filtro de mesmo nome. Ela não diz se o lançamento valeu — todos valem na hora —, e sim em que ponto do ciclo aquela carga está.

StatusO que significa
EnviadaSaiu e nada voltou ainda
TransferidaMovida entre unidades
ParcialParte da carga voltou
DevolvidaVoltou por inteiro
PerdaBaixa de caixa aceita como perdida
AjusteSaldo inicial ou correção de posição

O estado AGUARDANDO não existe mais. Lançamentos antigos que ficaram nele passaram a contar no saldo — do contrário ficariam valendo zero para sempre, já que a tela que os confirmava saiu do app.

Lançamento de teste

Quem tem a palavra teste no perfil produz lançamento de teste. Ele conta no saldo como qualquer outro — o que muda é só a leitura: todas as telas têm um seletor Só reais / Só de teste, e nunca os dois misturados. Somar ensaio com operação daria um número que não responde nem a uma pergunta nem a outra.

Nota técnica

Site estático na Vercel, com banco Postgres no Supabase. Sem servidor para manter e sem mensalidade.

navegador → /api (função na Vercel) → Postgres (Supabase)

O navegador nunca fala com o banco. A chave que abre o Postgres fica no servidor, numa variável de ambiente; a página conhece só o caminho /api. É o que permite manter o PIN curto e o link aberto do cliente sem deixar o banco exposto — tentar ler o banco de fora responde 401 não autorizado.

TabelaConteúdo
locaisGalpões, filiais, clientes e rotas — todo mundo que guarda caixa, com limite, prazo e o código do link
tipos_caixaTipos de caixa e o peso de cada um
usuariosNome, perfil, senha, PIN, local padrão e as chaves de permissão
motoristasQuem dirige, com CNH e as rotas que atende. Não faz login
locais_padraoPostos de trabalho. Não guardam caixa
movimentosO livro-razão. Só acrescenta — nada é apagado
configNome da empresa e prazo padrão

As fotos ficam no armazenamento do Supabase, e o link aparece no extrato. Lançamentos antigos podem ter assinatura anexada — o campo saiu da tela em setembro/2026, mas o que já foi gravado continua lá.

Alterou o código? Um git push na branch main e a Vercel publica sozinha, em menos de um minuto. Antes disso rode as duas suítes principais:

node teste/teste_api.js → 487 verificações das regras
node teste/teste_tela.js → 658 verificações das telas
node teste/teste_permissoes.js → 87 verificações das permissões

A primeira executa as regras de produção contra um banco falso em memória — sem rede e sem chave. A segunda lê o HTML e o JavaScript das páginas e confere que cada filtro, coluna e botão está ligado dos dois lados: um campo que aparece na barra mas não viaja no pedido, ou uma coluna com cabeçalho e sem célula, falha ali em vez de falhar na tela de quem usa.

Mexeu em app.js ou styles.css? Rode python scripts/versionar.py antes de commitar. Não há passo de compilação, e sem isso o navegador continua servindo o arquivo antigo do cache — às vezes com HTML novo e JavaScript velho, que é pior do que só estar velho.

Plano gratuito

O banco pausa depois de cerca de 7 dias sem nenhum acesso. Despausar é um clique no painel do Supabase, mas o primeiro acesso depois da pausa falha. Em operação diária isso não acontece.