Faculdade
Pedro & Caio
Sistema de controle de presença e divisão de gastos de faculdade. Registre os dias que foi, configure o valor por pessoa e acompanhe quem deve quanto — com histórico, créditos de gasolina e resumo anual.
Visão Geral
O sistema nasceu da necessidade de dividir os custos de transporte até a faculdade entre duas pessoas: Pedro e Caio. A ideia central é simples: você define um valor por pessoa por dia, marca os dias que foi, e o sistema calcula tudo automaticamente.
Estrutura de Arquivos
O projeto é composto por 7 arquivos que devem estar todos na mesma pasta. Cada arquivo tem uma responsabilidade bem definida.
Os scripts são carregados no index.html em ordem: storage.js primeiro (pois define funções usadas pelos demais), depois os painéis, e por último app.js que inicializa tudo.
| Arquivo | Responsabilidade | Funções principais |
|---|---|---|
| storage.js | Persistência e cálculos | calcMonthOwed, calcMonthPaid, syncCaioAutoPay |
| calendar.js | Calendário interativo | renderCalendar, toggleDay, renderMonthStrip |
| payments.js | Pagamentos Pedro/Caio/Gas | registerPayment, registerGas, renderPayments |
| annual.js | Resumo consolidado por ano | renderAnnual |
| app.js | Bootstrap e navegação | initTabs, initConfig, resyncAllCaio, renderAll |
Deploy no GitHub Pages
Por ser um projeto estático (sem backend), o GitHub Pages funciona perfeitamente. Siga os passos:
-
1Crie um repositório no GitHub Pode ser público ou privado. Sugestão de nome: faculdade-gastos
-
2Faça upload dos 7 arquivos Todos na raiz do repositório (mesma pasta). Não crie subpastas.
-
3Ative o GitHub Pages Vá em Settings → Pages → Branch: main → / (root) → Save
-
4Acesse pelo link gerado Formato: https://seu-usuario.github.io/nome-do-repo/
Calendário
O painel principal. Aqui você marca os dias que foi à faculdade e configura o valor cobrado por pessoa por dia.
Como usar
-
1Configure o valor por pessoa/dia Digite no campo no topo. O total do dia (Pedro + Caio) aparece automaticamente.
-
2Clique nos dias úteis para marcar presença Fins de semana são bloqueados. Dias marcados ficam azuis. Clique novamente para desmarcar.
-
3Navegue entre meses Use as setas ‹ › ou clique nos chips de mês na faixa horizontal abaixo do calendário.
Cards de resumo
Strip de meses
A barra horizontal mostra os 5 meses anteriores ao mês atual e 2 futuros. Cada chip exibe o total do mês (em reais). Clicar em um chip navega para aquele mês no calendário.
Pagamentos
Controle de quem pagou quanto por mês. Ao entrar nesta aba, o mês exibido é sincronizado automaticamente com o mês visível no Calendário.
Pedro — pagamento manual
Pedro precisa informar manualmente o quanto pagou. Digite o valor no campo e clique em Pagar. O sistema nunca permite registrar mais do que o pendente.
Caio — auto-pago
Caio é marcado como auto-pago: sempre que um dia é marcado no calendário, o sistema registra automaticamente o pagamento de Caio no valor correspondente. Não é necessária nenhuma ação manual para Caio, a menos que você queira fazer um ajuste.
Colunas por pessoa
| Coluna | Significado |
|---|---|
| Deve | Valor total que a pessoa deve no mês (dias × valor/dia) |
| Pago | Soma dos pagamentos manuais + créditos de gasolina recebidos |
| Pendente | max(0, Deve − Pago) — nunca negativo |
Badges de status
| Badge | Condição |
|---|---|
| 🟢 Pago ✓ / Auto-pago ✓ | Pendente ≤ R$ 0,01 |
| 🟡 Parcial | Há pagamentos, mas ainda há pendência |
| 🔴 Pendente | Nenhum pagamento registrado |
| ⚪ Sem débito | Nenhum dia marcado no mês |
Histórico
Cada pagamento registrado aparece como uma linha no histórico com valor e data. Clique no ✕ para remover uma entrada (o valor é estornado do total pago). Entradas de auto-pagamento do Caio não podem ser removidas manualmente.
Ajuda com Gasolina
Quando um terceiro (familiar, colega, etc.) contribui com dinheiro para ajudar nos custos, use este campo. O valor é dividido igualmente entre Pedro e Caio.
Regra de divisão
Exemplo: alguém contribuiu R$ 100,00
→ Pedro recebe crédito de R$ 50,00
→ Caio recebe crédito de R$ 50,00
Comportamento do crédito
O crédito de gasolina é sempre somado ao "Pago", independentemente de a pessoa já ter quitado o mês. Se Pedro já havia pago R$200,00 (valor total do mês) e chega um crédito de R$50,00, o campo "Pago" passará a mostrar R$250,00 — e "Pendente" permanece R$0,00.
Como aparece no histórico
Cada crédito de gasolina aparece como uma linha verde no bloco de cada pessoa (identificado como "⛽ Crédito gasolina"), e também no bloco de gasolina com o valor total e data. Clique em ✕ para remover um crédito.
Resumo Anual
Visão consolidada por ano calendário (Janeiro a Dezembro). Só exibe anos que possuem pelo menos um dado registrado.
| Coluna | Descrição |
|---|---|
| Total | Soma de todos os meses do ano: Σ (dias_mês × vpd × 2) |
| Pago | Soma de tudo que foi pago (manual + gas), limitado ao total devido por mês |
| Pendente | max(0, Total − Pago) |
Armazenamento (localStorage)
Todos os dados são persistidos no localStorage do navegador, sem servidor, sem banco de dados. São três chaves independentes:
| Chave localStorage | Conteúdo |
|---|---|
| fac_presence_v3 | Dias marcados como presente |
| fac_payments_v4 | Pagamentos e créditos de gasolina |
| fac_settings_v3 | Configurações (valor por dia) |
Estrutura dos dados de presença
// fac_presence_v3
{
"2026-02-10": true,
"2026-02-11": true,
"2026-02-12": true,
// chave: "YYYY-MM-DD", valor: true (dias sem presença não existem)
}
Estrutura dos dados de pagamento
// fac_payments_v4
{
"2026-02": {
pedro: {
paid: 150.00, // soma de pagamentos manuais
history: [
{ amount: 150.00, date: "27/02/2026", note: "Pagamento manual" }
]
},
caio: {
paid: 200.00, // auto-pay + manuais
history: [
{ amount: 200.00, date: "Auto", note: "Auto-pagamento" }
]
},
gas: [
{
amount: 100.00,
date: "27/02/2026",
pedro_credit: 50.00,
caio_credit: 50.00
}
]
}
}
Estrutura das configurações
// fac_settings_v3
{
valuePerDay: "25.00" // valor por pessoa por dia, como string
}
Lógica Financeira
Todas as funções de cálculo ficam em storage.js. Aqui está o fluxo de como os valores são calculados:
Invariante principal
Gas entries = créditos independentes, nunca modificam rec.paid
Display "Pago" = rec.paid + Σ gas_credits
calcMonthOwed(y, m)
Calcula quanto cada pessoa deve no mês, baseado nos dias marcados e no valor configurado.
calcMonthOwed(y, m) → {
total: dias × vpd × 2, // total do mês (ambos)
pedro: dias × vpd, // cota de Pedro
caio: dias × vpd, // cota de Caio
days: dias, // dias marcados
workDays: dias_uteis // dias úteis totais do mês
}
calcMonthPaid(payments, y, m)
Retorna quanto cada pessoa efetivamente pagou (registros + créditos de gasolina). Nunca é limitado ao valor devido — pode exceder em caso de crédito excedente.
calcMonthPaid(payments, y, m) → {
pedro: rec.pedro.paid + Σ(gas[].pedro_credit),
caio: rec.caio.paid + Σ(gas[].caio_credit)
}
syncCaioAutoPay(y, m)
Sincroniza o auto-pagamento de Caio. Chamado apenas quando a presença muda ou o valor/dia muda. Nunca chamado quando gasolina é registrada.
syncCaioAutoPay(y, m):
manualPaid = Σ(caio.history filtrado sem Auto-pagamento)
autoPay = max(0, owed.caio - manualPaid)
caio.paid = autoPay + manualPaid
// gas NÃO entra neste cálculo
Referência dos Arquivos
storage.js — Funções exportadas
| Função | Parâmetros | Retorno |
|---|---|---|
| loadPresence() | — | Objeto com dias marcados |
| savePresence(d) | objeto | void |
| loadPayments() | — | Objeto com pagamentos por mês |
| savePayments(d) | objeto | void |
| loadSettings() | — | Objeto com configurações |
| saveSettings(d) | objeto | void |
| getValuePerDay() | — | number (vpd atual) |
| calcMonthOwed(y, m) | year, month (0-11) | {total, pedro, caio, days, workDays} |
| calcMonthPaid(payments, y, m) | objeto, year, month | {pedro, caio} |
| syncCaioAutoPay(y, m) | year, month (0-11) | void (salva direto) |
| brl(val) | number | string "R$ X,XX" |
| brlShort(val) | number | string curta (ex: "R$ 1,5k") |
| todayStr() | — | string "DD/MM/YYYY" |
| dayKey(y,m,d) | year, month(0-11), day | string "YYYY-MM-DD" |
| monthKey(y,m) | year, month(0-11) | string "YYYY-MM" |
app.js — Funções globais
| Função | Descrição |
|---|---|
| showToast(msg) | Exibe notificação flutuante por 2,2 segundos |
| renderAll() | Re-renderiza todos os painéis |
| resyncAllCaio() | Sincroniza auto-pay do Caio para todos os meses com presença |
Variáveis de estado globais
| Variável | Arquivo | Uso |
|---|---|---|
| NOW | calendar.js | Data atual (new Date() na inicialização) |
| calYear / calMonth | calendar.js | Mês visível no calendário |
| payYear / payMonth | payments.js | Mês visível no painel de pagamentos |
Fórmulas
| Campo | Fórmula |
|---|---|
| Total do dia | vpd × 2 |
| Cota de cada pessoa/dia | vpd × 1 |
| Total do mês | dias_marcados × vpd × 2 |
| Devido por pessoa/mês | dias_marcados × vpd |
| Pago efetivo (display) | rec.paid + Σ gas_credits |
| Pendente | max(0, devido − pago_efetivo) |
| Crédito de gasolina/pessoa | valor_ajuda ÷ 2 |
| Ausências no mês | dias_úteis_mês − dias_marcados |
| Total anual | Σ (total_mês) para Jan–Dez do ano |
| Pago anual | Σ min(pago_efetivo_mês, devido_mês) |