docs: RentCharge 006.2026 — SPEC-ACCOUNT-RECEIVABLES.md
This commit is contained in:
parent
cbbad7c64d
commit
acd9fb618c
1 changed files with 259 additions and 0 deletions
259
Infra-Network/SPEC-ACCOUNT-RECEIVABLES.md
Normal file
259
Infra-Network/SPEC-ACCOUNT-RECEIVABLES.md
Normal file
|
|
@ -0,0 +1,259 @@
|
|||
# SPEC — Account Receivables / Credit Book / Period dashboard
|
||||
|
||||
**Data:** 2026-09-08 → 2026-09-09 (noite)
|
||||
**Status:** implementado na VM500 (`rentcharge-backend` + `rentcharge-frontend`)
|
||||
**Produto:** RentCharge / RenteCharge Weekly & Arrears
|
||||
**Operador:** Roger
|
||||
|
||||
**Relacionados:** `SPEC-VM500-RENTCHARGE.md` (infra) · `PROJECT-RENTCHARGE.md` (produto) · Rules UI `/rules` secção **12. Credit Book (R-CB01…R-CB05)** · **`SPEC-AR-QR-BINARY-EYE.md`** (cartões QR 1–50 + Binary Eye — draft) · **`SPEC-TRANSACTION-IDS.md`** (prefixos ME/KC/EL/DN/LY · CR/CT · hash ROI)
|
||||
|
||||
---
|
||||
|
||||
## 1. Escopo desta noite
|
||||
|
||||
Módulo **Account Receivables** (ancillary, ≠ rent SA / arrears):
|
||||
|
||||
- Meals (Lunch / Dinner / Cup of tea)
|
||||
- Access key
|
||||
- Electricity top-up
|
||||
|
||||
Canais:
|
||||
|
||||
| Canal (código) | Label IE | Cor |
|
||||
|----------------|----------|-----|
|
||||
| `cash` | Cash sale | Verde |
|
||||
| `credit` | Credit sale (ex-fiado) | Vermelho |
|
||||
| `credit_payment` | Credit settlement | Azul |
|
||||
|
||||
Glossário contabilístico (Irlanda):
|
||||
|
||||
| Conceito | Termo canónico |
|
||||
|----------|----------------|
|
||||
| Fiado | **Credit sale** |
|
||||
| Pagamento do fiado | **Credit settlement** |
|
||||
| Crédito a haver (pagou a mais) | **Over-settlement** |
|
||||
| Ainda a limpar | **To clear** |
|
||||
| Status | Clear · Outstanding · Over-settlement |
|
||||
|
||||
---
|
||||
|
||||
## 2. Credit Book — saldo assinado (R-CB01…R-CB05)
|
||||
|
||||
### Fórmula
|
||||
|
||||
```
|
||||
signed_balance = Σ credit sales − Σ credit settlements
|
||||
```
|
||||
|
||||
| signed_balance | UI | Cor |
|
||||
|----------------|----|-----|
|
||||
| `> 0` | **To clear** / status **Outstanding** | Vermelho |
|
||||
| `< 0` | **Over-settlement** | Azul |
|
||||
| `≈ 0` | **Clear** | Neutro |
|
||||
|
||||
Helpers: `backend/app/services/ledger.py` → `credit_book_balance`, `credit_book_position`.
|
||||
|
||||
### R-CB02 — Settlement pode criar over-settlement
|
||||
|
||||
Exemplo: deve €25, paga €50 settlement → limpa €25; sobra **€25 over-settlement** (signed −€25).
|
||||
Cash do settlement entra no remittance ROI Finance; o surplus fica no Credit Book (não é crédito de rent).
|
||||
|
||||
**Implementação:** deixou de bloquear `credit_payment > to_clear`.
|
||||
|
||||
### R-CB03 — Novos tickets consomem over-settlement primeiro
|
||||
|
||||
Novo **Credit sale** (meals / key / electricity) com over-settlement existente: o lançamento move o saldo em direção a zero; só o excedente vira **Outstanding**.
|
||||
|
||||
### R-CB04 — Credit consumption statuses
|
||||
|
||||
Clear · Outstanding · Over-settlement (filtro + cores no report).
|
||||
|
||||
### R-CB05 — Modal Post sale
|
||||
|
||||
Mostra **To clear** (vermelho) + **Over-settlement** (azul) do residente seleccionado + stamp + hints R-CB02/03.
|
||||
|
||||
Documentado também em `/rules` secção 12.
|
||||
|
||||
---
|
||||
|
||||
## 3. APIs ledger
|
||||
|
||||
Base: `/api/ledger/…` · auth: utilizador logado; create/edit/delete: `require_payment_editor` (`can_edit_payments` / superuser).
|
||||
|
||||
| Método | Path | Notas |
|
||||
|--------|------|-------|
|
||||
| GET | `/api/ledger/accounts` | Catálogo MEALS_* / ACCESS_KEY / ELEC_TOPUP |
|
||||
| GET | `/api/ledger/entries` | Filtros date/resident/account/channel |
|
||||
| POST | `/api/ledger/entries` | Create; stamp week/weekday/time |
|
||||
| PUT | `/api/ledger/entries/{id}` | Edit + `confirm_password` |
|
||||
| POST | `/api/ledger/entries/{id}/delete` | Delete + `confirm_password` |
|
||||
| GET | `/api/ledger/credit-book` | Overview + `to_clear` / `credit_available` / `status` |
|
||||
| GET | `/api/residents/{id}/credit-book` | Posição + entries |
|
||||
| GET | `/api/ledger/reports/roi-finance` | Pack ROI Finance |
|
||||
| GET | `/api/ledger/reports/credit-consumption` | Credit report |
|
||||
| GET | `/api/ledger/reports/roi-finance` | Pack JSON ROI Finance |
|
||||
| GET | `/api/ledger/reports/roi-finance/pack` | **A4 remittance pack HTML** (print) |
|
||||
| GET | `/api/brand/sa-shield` | Escudo Salvation Army (PNG) |
|
||||
| GET | `/api/ledger/reports/payables-remittance` | Remittance view |
|
||||
|
||||
Tabela: `service_ledger_entries`.
|
||||
|
||||
**Public Txn id:** ver **`SPEC-TRANSACTION-IDS.md`**. Cash sale manual → curto **`000000-AA`** padded (`000084-ME`, `000010-EL`, …). Credit sale → `CR-…`. Credit settlement → `CT-…`. Import mantém ids do ficheiro.
|
||||
|
||||
Edit/delete: mesma matriz de acesso que pagamentos de rent (`User.can_edit_payments`); password do utilizador obrigatória.
|
||||
|
||||
---
|
||||
|
||||
## 4. Stamp padrão (todo lançamento AR)
|
||||
|
||||
Em create/list/UI:
|
||||
|
||||
- Dia da semana (Mon…Sun)
|
||||
- Semana ISO `Wxx/yyyy`
|
||||
- Hora `HH:MM` (`created_at`)
|
||||
|
||||
Campo composto: `stamp` (ex.: `Tue · W37/2026 · 23:58`).
|
||||
Modal mostra preview live antes do post.
|
||||
|
||||
---
|
||||
|
||||
## 5. UI — Account Receivables `/receivables`
|
||||
|
||||
- Layout estilo dashboard Residents (grelha + painel Credit Book)
|
||||
- Nav colorida: Receivables · Payables · ROI Finance · Credit report
|
||||
- Botões: **+ Cash sale** (verde) · **+ Credit sale** (vermelho) · **+ Credit settlement** (azul)
|
||||
- Modal Post sale / credit / settlement com tabs coloridas
|
||||
- Coluna Stamp; Actions Edit / Delete (senha)
|
||||
- Painel lateral: saldos Credit Book (Outstanding vermelho / Over-settlement azul)
|
||||
|
||||
---
|
||||
|
||||
## 6. UI — ROI Finance report `/receivables/roi-finance`
|
||||
|
||||
### Cards (drill-down → modal de lançamentos)
|
||||
|
||||
| Card | Cor | Conteúdo |
|
||||
|------|-----|----------|
|
||||
| Rent cash | Verde | SAGE SA cash no range |
|
||||
| Ancillary cash | Verde | Cash meals/keys/elec |
|
||||
| Credit settlements | Azul | Cash que limpa Credit Book |
|
||||
| Credit sales | Vermelho | Credit sales (≠ cash till) |
|
||||
| Credit net | Cinza / ± cor | Sales − Settlements |
|
||||
| Total cash to ROI Finance | Verde | Rent + ancillary cash + settlements |
|
||||
|
||||
**Regra remittance:** Total cash = rent + ancillary cash + settlements.
|
||||
Credit sales **não** entram no cash to ROI Finance.
|
||||
Credit net = movimento do livro (≠ dinheiro físico).
|
||||
|
||||
### By account (colunas)
|
||||
|
||||
Account · Cash · Credit sales · Settlements · **Remit to ROI Finance** · **Credit net** · Family · (footer Total)
|
||||
|
||||
- Remit to ROI Finance = Cash + Settlements
|
||||
- Credit net = Credit sales − Settlements (+ vermelho / − azul)
|
||||
|
||||
### By resident
|
||||
|
||||
Room · Resident · Rent cash · Ancillary cash · Credit sales · Credit paid · Total cash
|
||||
|
||||
### A4 remittance pack (print)
|
||||
|
||||
UI fields on the same page + **Print ROI Finance pack (A4)**:
|
||||
|
||||
| Campo UI | No documento |
|
||||
|----------|--------------|
|
||||
| Bank logbook no. | Controlo depósito / livro banco |
|
||||
| Brinks Priority Bag no. | Selo Priority Bag |
|
||||
| Brinks Malote / collection bag no. | Malote / bag de coleta Brinks |
|
||||
| Manager 1 / Manager 2 / Prepared by | Três blocos de assinatura |
|
||||
|
||||
Documento HTML A4 (~98% da folha):
|
||||
|
||||
- Letterhead **The Salvation Army** + escudo oficial (`sa-shield-white-bg.png`, embutido base64)
|
||||
- Período do material (From → To)
|
||||
- KPIs: Rent cash · Ancillary cash · Settlements · Credit sales · Credit net · Cash to ROI Finance
|
||||
- Tabela **Accounts remittance schedule** (todas as contas + Remit to ROI Finance + Credit net)
|
||||
- Tabela **Resident cash detail** (linhas com movimento)
|
||||
- Nota contabilística (cash ≠ credit sales; R-CB02/03)
|
||||
- Assinaturas: Manager 1 · Manager 2 · Prepared / presented by
|
||||
- Rodapé SA vermelho com total cash + período + ref `ROI-FINANCE-YYYYMMDD-YYYYMMDD`
|
||||
|
||||
**API:** `GET /api/ledger/reports/head-office/pack` (HTML, auth cookie)
|
||||
**Template:** `backend/app/templates/ho_remittance_pack.html`
|
||||
**Brand:** `GET /api/brand/sa-shield` · `backend/app/static/brand/`
|
||||
|
||||
---
|
||||
|
||||
## 7. UI — Credit consumption report `/receivables/credit-report`
|
||||
|
||||
- Head período: Opening · Issued (vermelho) · Paid (azul) · Closing (cards clicáveis)
|
||||
- Botão **Today** + Generate
|
||||
- Grelha estilo Residents: # · Room · SAGE · Name · Staff · Opening · Issued · Paid · Closing · Status · View
|
||||
- Filtros por coluna; Status inclui **Over-settlement**
|
||||
- Closing < 0 mostrado como over-settlement (azul)
|
||||
- Lista todos os residentes activos (+ inactivos com movimento)
|
||||
|
||||
---
|
||||
|
||||
## 8. UI — Period dashboard (ficha residente)
|
||||
|
||||
### Cards principais (5)
|
||||
|
||||
1. **Should have paid by now** — weeks × weekly due
|
||||
2. **Actually paid** — cash SA no período (verde)
|
||||
3. **Arrears / Positive balance** — paid − due (vermelho se − / azul se +)
|
||||
4. **% vs amount due** — variance % + liquidation %
|
||||
5. **Still to pay to year-end (W52/53)**
|
||||
|
||||
Removido o bloco duplicado “Period position” (Should/Actually/Arrears/%).
|
||||
|
||||
### Other balances (4 cards)
|
||||
|
||||
1. **Prior years unpaid** — preview agreement cut-off dia anterior ao From; link Payment map
|
||||
2. **Credit Book · to clear** — vermelho; link Credit consumption
|
||||
3. **Credit Book · over-settlement** — azul; link Receivables
|
||||
4. **Agreements** — balance activo(s); link `#agreements-panel`
|
||||
|
||||
---
|
||||
|
||||
## 9. Payables
|
||||
|
||||
`/payables` — remittance view (cash + settlements por conta) alinhado ao ROI Finance.
|
||||
|
||||
---
|
||||
|
||||
## 10. Ficheiros tocados (noite)
|
||||
|
||||
Backend:
|
||||
|
||||
- `backend/app/services/ledger.py` (`render_ho_remittance_pack`, Credit Book helpers)
|
||||
- `backend/app/modules/ledger/router.py` (`/roi-finance/pack`)
|
||||
- `backend/app/templates/ho_remittance_pack.html`
|
||||
- `backend/app/main.py` (`/api/brand/sa-shield`)
|
||||
- `backend/app/database.py` (`ServiceLedgerEntry` — já existente)
|
||||
|
||||
Frontend:
|
||||
|
||||
- `frontend/src/app/receivables/page.tsx`
|
||||
- `frontend/src/app/receivables/roi-finance/page.tsx` (pack fields + Print A4)
|
||||
- `frontend/src/app/receivables/credit-report/page.tsx`
|
||||
- `frontend/src/app/payables/page.tsx`
|
||||
- `frontend/src/app/residents/[id]/page.tsx`
|
||||
- `frontend/src/app/rules/page.tsx` (secção 12)
|
||||
- `frontend/src/lib/api.ts` (`openRoiFinancePack`)
|
||||
|
||||
Docs:
|
||||
|
||||
- Este ficheiro: `docs/SPEC-ACCOUNT-RECEIVABLES.md`
|
||||
|
||||
---
|
||||
|
||||
## 11. Checklist agente (AR)
|
||||
|
||||
1. Nunca misturar Credit Book com rent arrears / SAGE SA.
|
||||
2. Total cash to ROI Finance = rent cash + ancillary cash + settlements (não inclui credit sales).
|
||||
3. Over-settlement = settlement > to clear; novos credit sales consomem primeiro.
|
||||
4. Edit/delete ledger = senha + `can_edit_payments`.
|
||||
5. Stamp Mon–Sun week + hora em todo post AR.
|
||||
6. Cores: cash verde · credit sale vermelho · settlement azul · over-settlement azul.
|
||||
7. Rebuild frontend sem `.env.local`; restart `rentcharge-backend` + `rentcharge-frontend`.
|
||||
Loading…
Reference in a new issue