Ciclo: do crédito ao próximo crédito. App (PWA) para controlar o saldo dos cartões de vale-alimentação, refeição e multibenefício da família, com leitura de cupom fiscal no celular ou pelo Gemini, cadastro de cartão por foto e cofre de senhas.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Do crédito ao próximo crédito.
Ciclo controla o saldo dos cartões de vale-alimentação, vale-refeição e multibenefício da família (VR, Alelo, Pluxee, Ticket, Flash, Caju e outros). É um app web instalável (PWA) para Android: abre pelo navegador, vira ícone na tela inicial e funciona sem internet.
Abrir o app: https://jessicadopke.github.io/ciclo/
Tudo fica só no celular (IndexedDB do navegador): cartões, extratos, fotos e senhas. Este site entrega apenas o programa, e nenhum dado pessoal passa por aqui. As únicas exceções são opcionais e só valem se você ligar: a leitura com o Gemini (as fotos de cupons e cartões vão para o Google), o backup no Drive (uma cópia dos dados vai para o seu Google Drive) e a Planilha (veja abaixo). Se você ligar a Planilha, os lançamentos, cartões (sem número completo) e as senhas cifradas também ficam na sua Planilha Google; fotos de cupons e a senha mestra nunca saem do celular. Por isso:
Em Ajustes → Sincronizar com a Planilha o Ciclo manda uma cópia dos cartões e lançamentos para uma Planilha Google sua (abas Cartões, Lançamentos e Cofre, esta só com texto cifrado). O celular continua sendo a cópia principal: o app grava nele primeiro e, sem internet, guarda o que falta numa fila e envia quando a conexão voltar. A Planilha é só para consultar; o script nunca apaga linhas (o que você apaga no app aparece marcado como apagado). Para ligar, uma vez, no computador: crie a Planilha, abra Extensões → Apps Script, cole apps-script/planilha.gs (o passo a passo está no começo do arquivo), rode configurar com o código copiado do app, implante como App da Web (qualquer pessoa) e cole o link no app. Quando o planilha.gs mudar numa versão nova, cole de novo e reimplante com "Nova versão". O link e o código ficam só no celular, fora do backup e do Drive.
O Ciclo guarda sozinho uma cópia dos dados na pasta Ciclo – backups do seu Google Drive (a cada 7 dias ou 30 lançamentos novos, ao abrir o app), com os 30 mais novos. Para ligar, uma vez, no computador:
apps-script/backup.gs.SEGREDO_LOCAL pelo código copiado (só no editor; não coloque o código real no repositório) e rode a função configurar.Segurança: quem tiver o link e o código consegue ler e gravar os backups; não compartilhe os dois. O link e o código ficam só no celular e não entram no backup. O backup do Drive é sem fotos, a menos que você marque "Incluir fotos" (limite de 20 MB). Para restaurar: Ajustes → Restaurar do Drive.
https://jessicadopke.github.io/*. Assim, se a chave vazar, ela não funciona em outros sites.Com o Gemini ligado, a foto do cupom é enviada ao Google. No plano gratuito, o Google pode usar esse conteúdo para melhorar os produtos dele; com o faturamento ativado no AI Studio, não. A chave fica só no celular e não entra no backup. Sem internet ou se o Gemini falhar, o app lê a foto no próprio celular.
Tocando e segurando o ícone aparecem os atalhos Ler cupom e Lançar gasto.
O app é HTML, CSS e JavaScript puros, sem etapa de build. O que está neste repositório é exatamente o que o GitHub Pages publica.
index.html página do app
styles.css visual (identidade Ciclo, temas claro e escuro)
manifest.webmanifest nome, ícones e cores do app instalado
sw.js service worker: guarda o app para uso offline
js/app.js entrada do app: versão, eventos gerais e inicialização (módulo ES; o código fica em js/app/)
js/app/ o resto do app, um módulo ES por assunto (sem etapa de montagem):
base (só importam outra base): util, estado, cripto, periodos, armazenamento
telas e ações: telas, folhas, inicio, cartoes, cofre, cupom, conferencia, pagamento,
backup, sincronizacao, atualizacao, gemini-ui
js/recorte.js recorte automático da foto do cupom (acha o papel e endireita; sem tela, com testes)
js/receipt.js leitura do cupom no celular (OCR) e interpretação do texto
js/gemini.js leitura de cupons e cartões pelo Gemini (opcional)
js/drive.js backup no Google Drive (opcional): montagem do backup, regras de quando salvar e chamada ao script
js/sync.js sincronização com a Planilha Google (opcional): regras de mesclagem, fila de envio e chamada ao script
apps-script/ scripts que a usuária cola no Google Apps Script: backup.gs (Drive) e planilha.gs (Planilha); não são usados pelo app
js/issuers.js emissores de cartão (nome, cor, sigla e como reconhecer): um emissor novo entra só aqui
js/graficos.js gráficos de gastos por categoria, loja e titular (SVG, sem biblioteca)
js/credito.js aviso do dia do crédito: cartões com crédito hoje ou nos próximos dias, agenda e texto da notificação
js/match.js qual cartão pagou o cupom e aviso de cartão que não está na carteira
tests/ testes automáticos da leitura de cupons e da escolha do cartão
fonts/ fonte Outfit, embutida
icons/ ícones do app (inclui a versão "maskable" do Android). `icons/icone.svg` é a fonte de `icon-192.png` e `icon-512.png`; para refazer: `node scripts/gerar-icones.mjs`
vendor/tesseract/ Tesseract.js 5.1.1 e o modelo de português, embutidos
CHANGELOG.md histórico de versões
version.json versão publicada (usada pelo aviso de atualização)
Regras de js/app/: o estado do app é um objeto só (S, em estado.js); os módulos de base nunca importam telas (um teste confere); só export nomeado; nenhum módulo importa js/app.js. Os outros scripts de js/ continuam clássicos (<script defer>) e aparecem para os módulos como variáveis globais (Match, Credito...).
O projeto segue o Versionamento Semântico (MAJOR.MINOR.PATCH). As mudanças de cada versão estão no CHANGELOG, e a versão em uso aparece no rodapé de Ajustes.
Para publicar uma versão nova:
Atualize APP_VERSION em js/app.js, VERSION em sw.js e o número em version.json. Arquivo novo em js/ ou em js/app/ também entra na lista FILES do sw.js.
Escreva a entrada nova no CHANGELOG.md.
Rode os testes (node --test, veja abaixo). Todos precisam passar.
Faça o commit e envie com a tag da versão:
git commit -am "X.Y.Z: resumo"
git tag vX.Y.Z
git push origin main vX.Y.Z
O GitHub Pages publica em 1 ou 2 minutos.
Crie a release no GitHub a partir da tag vX.Y.Z, com as notas do CHANGELOG.
O login do GitHub no terminal é feito uma vez no computador (o Windows guarda a credencial).
No celular, o app compara a versão instalada com o version.json publicado. Quando há versão nova, ele avisa no Início ("A versão X está disponível · Atualizar"). Também dá para conferir em Ajustes → Sobre o app → Buscar atualização.
Com o Node.js 18 ou mais novo, nesta pasta:
node --test
Os testes ficam em tests/ e não precisam de instalação. Eles cobrem a leitura de cupons pelo leitor do celular (tests/cupons/, textos de cupons reais anonimizados), a conversão das respostas do Gemini (tests/gemini/, respostas salvas, sem chamar o Google) , a escolha do cartão e os gráficos de gastos (tests/graficos.test.js, dados fictícios). Quando um defeito de leitura for corrigido, acrescente o cupom ou a resposta que o mostrou.
Nesta pasta, rode:
python -m http.server 8765
Depois abra http://localhost:8765 no Chrome. O cofre e a instalação só funcionam em localhost ou em https.