Files
fuj-management/docs/by-gemini/architecture.md
Jan Novak 9b99f6d33b
All checks were successful
Deploy to K8s / deploy (push) Successful in 8s
docs: experiment with generated documentation, let's keep it in git for
now
2026-03-11 11:57:30 +01:00

2.4 KiB

System Architecture

The FUJ Management system is designed around a "Sheet-as-a-Database" architecture. This allows for easy manual editing and transparency while enabling powerful automation.

🔄 High-Level Data Flow

graph TD
    Fio[Fio Bank API] -->|Sync Script| GS(Google Spreadsheet)
    Att[Attendance Sheet] -->|CSV Export| App(Flask Web App)
    GS -->|API Fetch| App
    App -->|Display| UI[Manager Dashboard]
    GS -.->|Manual Edits| GS
    App -->|Generate| QR[QR Codes for Members]

1. Data Ingestion (Bank to Sheet)

The synchronization pipeline moves raw bank data into a structured format:

  • sync_fio_to_sheets.py fetches transactions and appends them to the "Transactions" sheet.
  • Each transaction is assigned a unique Sync ID to prevent duplicates.
  • infer_payments.py processes new rows, attempting to fill the Person, Purpose, and Inferred Amount columns based on the message and sender.

2. Logic & Reconciliation

The core logic resides in shared Python scripts:

  • Attendance: attendance.py pulls the latest practice data from a separate attendance sheet and calculates expected fees (e.g., 0/200/750 CZK rules).
  • Matching: match_payments.py performs the "heavy lifting" by correlating members, months, and payments. It handles partial payments, overpayments (credits), and manual exceptions.

3. Presentation Layer

The Flask application (app.py) serves as the primary interface:

  • Fees View: Shows attendance-based charges.
  • Reconciliation View: The main "truth" dashboard showing balance per member.
  • Payments View: Historical list of transactions grouped by member.

🛡 Security & Authentication

  • Fio Bank: Authorized via a private API token (kept in .secret/).
  • Google Sheets: Authenticated via a Service Account or OAuth2 (using .secret/fuj-management-bot-credentials.json).
  • Environment: Secrets are never committed; the .secret/ directory is git-ignored.

🧩 Key Components

Component Responsibility
Google Spreadsheet Unified source of truth for transactions and manual overrides.
scripts/ A suite of CLI utilities for batch processing and data maintenance.
Flask App Read-only views for state visualization and QR code generation.
czech_utils.py Diacritic-normalization and NLP for Czech month/name parsing.