docs: reorganize into architecture/features/reference/archive folders

All docs moved with git mv so --follow preserves history. Flattens the
single-folder layout into goal-oriented folders and adds a README.md index
at every level.

- docs/README.md — new landing page with "I want to…" intent table
- docs/architecture/ — overview, data-model, app-design
- docs/features/ — billing-payments, cpe-management, vision-ocr, flow-editor
- docs/reference/ — erpnext-item-diff, legacy-wizard/
- docs/archive/ — HANDOFF-2026-04-18, MIGRATION, status-snapshots/
- docs/assets/ — pptx sources, build scripts (fixed hardcoded path)
- roadmap.md gains a "Modules in production" section with clickable
  URLs for every ops/tech/portal route and admin surface
- Phase 4 (Customer Portal) flipped to "Largely Shipped" based on
  audit of services/targo-hub/lib/payments.js (16 endpoints, webhook,
  PPA cron, Klarna BNPL all live)
- Archive files get an "ARCHIVED" banner so stale links inside them
  don't mislead readers

Code comments + nginx configs rewritten to use new doc paths. Root
README.md documentation table replaced with intent-oriented index.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
louispaulb 2026-04-22 11:51:33 -04:00
parent 30bfe6175e
commit beb6ddc5e5
41 changed files with 402 additions and 153 deletions

View File

@ -91,7 +91,7 @@ GenieACS Twilio Traccar modem-bridge
**Frontend:** Vue 3, Quasar v2, Pinia, Vite, Mapbox GL JS
**Backend:** ERPNext v16 / Frappe (Python), PostgreSQL, Node.js (targo-hub)
**Infra:** Docker, Traefik v2.11, Authentik SSO, Proxmox
**Integrations:** Twilio (SMS), Mailjet (email), Stripe (payments), Traccar (GPS), GenieACS (TR-069), Gemini 2.5 Flash via targo-hub (vision/OCR — see [docs/VISION_AND_OCR.md](docs/VISION_AND_OCR.md))
**Integrations:** Twilio (SMS), Mailjet (email), Stripe (payments), Traccar (GPS), GenieACS (TR-069), Gemini 2.5 Flash via targo-hub (vision/OCR — see [docs/features/vision-ocr.md](docs/features/vision-ocr.md))
## Data Volumes (migrated from legacy)
@ -128,11 +128,18 @@ Authentik SSO protects staff apps via Traefik `forwardAuth`. The ops app reads `
## Documentation
| Document | Content |
|----------|---------|
| [ARCHITECTURE.md](docs/ARCHITECTURE.md) | Ecosystem overview, remote Docker infrastructure, platform strategy |
| [DATA_AND_FLOWS.md](docs/DATA_AND_FLOWS.md) | ERPNext data models, atomic order creation, customer flows |
| [CPE_MANAGEMENT.md](docs/CPE_MANAGEMENT.md) | Hardware management, XX230v diagnostics, TR-069/TR-369 |
| [APP_DESIGN_GUIDELINES.md](docs/APP_DESIGN_GUIDELINES.md) | Frontend framework architecture rules, UI/UX Wizard guidelines |
| [ROADMAP.md](docs/ROADMAP.md) | Implementation phases and current remote transition tasks |
| [archive/](docs/archive/) | Completed legacy migration analyses and accounting audits |
Start at **[docs/README.md](docs/README.md)** — it indexes every doc with a
"I want to…" intent table. Quick map:
| Area | Entry point |
|---|---|
| Plan & live module URLs | [docs/roadmap.md](docs/roadmap.md) |
| System architecture (services, Docker, SSO) | [docs/architecture/overview.md](docs/architecture/overview.md) |
| ERPNext data model + customer flows | [docs/architecture/data-model.md](docs/architecture/data-model.md) |
| Frontend patterns (Vue/Quasar/Pinia) | [docs/architecture/app-design.md](docs/architecture/app-design.md) |
| Billing, Stripe, invoices | [docs/features/billing-payments.md](docs/features/billing-payments.md) |
| CPE / modems / ONTs / TR-069 | [docs/features/cpe-management.md](docs/features/cpe-management.md) |
| Scanner / OCR / Gemini pipeline | [docs/features/vision-ocr.md](docs/features/vision-ocr.md) |
| Agent flows (Flow Template) | [docs/features/flow-editor.md](docs/features/flow-editor.md) |
| Wizard SKU vs legacy audit | [docs/reference/erpnext-item-diff.md](docs/reference/erpnext-item-diff.md) |
| Historical snapshots & migration logs | [docs/archive/](docs/archive/) |

View File

@ -18,7 +18,7 @@ server {
# NOTE: Ollama Vision proxy removed 2026-04-22 all invoice OCR and
# barcode/equipment scans now go directly to targo-hub (Gemini 2.5 Flash).
# See docs/VISION_AND_OCR.md.
# See docs/features/vision-ocr.md.
# Targo Hub API proxy vision, devices, etc.
location /hub/ {

View File

@ -7,7 +7,7 @@
* vision model behind the hub.
*
* NOTE: apps/field is being folded into apps/ops under /j (see
* docs/ARCHITECTURE.md §"Legacy Retirement Plan"). During the transition
* docs/architecture/overview.md §"Legacy Retirement Plan"). During the transition
* we keep this file in sync with apps/ops/src/api/ocr.js so no surprises
* when code moves over.
*/

View File

@ -21,7 +21,7 @@ server {
# NOTE: Ollama Vision proxy removed 2026-04-22 invoice OCR and all
# barcode/equipment scans now go directly to targo-hub (Gemini 2.5 Flash).
# See docs/VISION_AND_OCR.md. The hub handles CORS + rate-limit, so no
# See docs/features/vision-ocr.md. The hub handles CORS + rate-limit, so no
# nginx pass-through is needed here.
# SPA fallback all routes serve index.html

View File

@ -6,8 +6,8 @@
*
* <FlowEditor v-model="flowDef" :kind-catalog="PROJECT_KINDS" />
*
* See FLOW_EDITOR_ARCHITECTURE.md in /docs/ for the full data model and
* runtime contract.
* See docs/features/flow-editor.md for the full data model and runtime
* contract.
*/
export { default as FlowEditor } from './FlowEditor.vue'

View File

@ -25,7 +25,7 @@
* Merged from apps/ops/src/composables/useScanner.js (which had the
* equipment-label branch) and apps/field/src/composables/useScanner.js
* (which had the resilient timeout + offline queue). See
* docs/ARCHITECTURE.md §"Legacy Retirement Plan" field is being folded
* docs/architecture/overview.md §"Legacy Retirement Plan" field is being folded
* into ops at /j and must not lose offline capability in the process.
*
* @param {object} options

View File

@ -183,7 +183,7 @@ export const RESIDENTIAL_PRESETS = [
// Legacy reuse: gestionclient.product.sku = TELEPMENS
// "Téléphonie IP, options toutes incluses, Canada et É-U illimité".
// Bundle discount (to reach ~10$/mo) is applied manually by the sales
// rep, not auto-generated. See docs/ERPNEXT_ITEM_DIFF_VS_LEGACY.md.
// rep, not auto-generated. See docs/reference/erpnext-item-diff.md.
{ item_code: 'TELEPMENS', item_name: 'Téléphonie IP illimitée CA/US', rate: 28.95, billing: 'recurring', billing_interval: 'Month', contract_months: 24 },
],
},
@ -320,7 +320,7 @@ export const REFERRAL_CREDIT_AMOUNT = 50.00
// Combo rebates are applied MANUALLY by the sales rep from the catalog
// (legacy RAB2X / RAB3X / RAB4X SKUs, -5 / -10 / -15 $). We intentionally
// do NOT auto-insert a combo rebate line — the rep picks the right SKU
// based on the actual bundle. See docs/ERPNEXT_ITEM_DIFF_VS_LEGACY.md.
// based on the actual bundle. See docs/reference/erpnext-item-diff.md.
const CAT_ICON_MAP = { Internet: 'wifi', Téléphonie: 'phone', Bundle: 'inventory_2', Équipement: 'router', Frais: 'receipt', Autre: 'category' }
export function catIcon (cat) {

View File

@ -15,7 +15,7 @@
Interventions upcoming Dispatch Jobs at this Service Location
Info OLT frame/slot/port/ontid if this is an ONT
See docs/VISION_AND_OCR.md §10 for the full relationship map. The data
See docs/features/vision-ocr.md §10 for the full relationship map. The data
loads lazily (equipment first, then location + related entities in
parallel) if the network drops halfway, the first card still renders.

View File

@ -5,7 +5,7 @@
label, Gemini reads the serial, and we look it up in ERPNext, optionally
auto-linking the equipment to the tech's current Dispatch Job.
ERPNext relationships touched (see docs/VISION_AND_OCR.md §10 for the full
ERPNext relationships touched (see docs/features/vision-ocr.md §10 for the full
data-model diagram):
Dispatch Job Customer Service Location Service Equipment
@ -22,7 +22,7 @@
naturally for any downstream ticket view.
Ported from apps/field/src/pages/ScanPage.vue during the fieldops
unification (see docs/ARCHITECTURE.md §"Legacy Retirement Plan"). Adapted
unification (see docs/architecture/overview.md §"Legacy Retirement Plan"). Adapted
for the ops router:
- device-detail route name: 'tech-device' (was 'device' in field)
- same query-param contract from TechJobDetailPage.goScan()

View File

@ -33,7 +33,7 @@
* - `cache-{key}` generic read cache (used for read-through patterns)
*
* Ported from apps/field/src/stores/offline.js as part of the fieldops
* unification (see docs/ARCHITECTURE.md §"Legacy Retirement Plan").
* unification (see docs/architecture/overview.md §"Legacy Retirement Plan").
*/
import { defineStore } from 'pinia'

76
docs/README.md Normal file
View File

@ -0,0 +1,76 @@
# Gigafibre FSM — Documentation
> **Start here.** Everything you need to understand the system is one or two
> clicks away. Pick the row that matches why you're here.
---
## Quick nav by intent
| I want to… | Open |
|---|---|
| **See the plan** — what's shipped, what's queued, with clickable links to every live module | [roadmap.md](roadmap.md) |
| **Understand the system end-to-end** — services, containers, networks, SSO, Traefik routes | [architecture/overview.md](architecture/overview.md) |
| **Build a new feature** — UI patterns, folder layout, router conventions, Pinia, feature-sliced design | [architecture/app-design.md](architecture/app-design.md) |
| **Touch ERPNext data** — doctypes, customer → subscription → equipment → invoice, "Lead to Live" flow | [architecture/data-model.md](architecture/data-model.md) |
| **Work on billing, Stripe, payments** — subscription lifecycle, invoice OCR, payment reconciliation, PPA | [features/billing-payments.md](features/billing-payments.md) |
| **Touch CPE / modems / ONTs** — GenieACS, Oktopus, TR-069 → TR-369 migration, TP-Link XX230v diagnostics | [features/cpe-management.md](features/cpe-management.md) |
| **Build or debug the scanner / OCR** — Gemini vision pipeline, barcode/equipment/invoice endpoints, offline queue, AI_API_KEY rotation | [features/vision-ocr.md](features/vision-ocr.md) |
| **Work on agent flows / automation** — Flow Template model, trigger wiring, step editor, runtime contract | [features/flow-editor.md](features/flow-editor.md) |
| **Audit the wizard's SKU mapping vs legacy** | [reference/erpnext-item-diff.md](reference/erpnext-item-diff.md) |
| **Inspect the legacy PHP wizard** | [reference/legacy-wizard/](reference/legacy-wizard/) |
| **Read a historical status snapshot** | [archive/status-snapshots/](archive/status-snapshots/) |
---
## Folder map
```text
docs/
├── README.md ← you are here
├── roadmap.md ← phase tracker + live module URLs
├── architecture/ ← the system itself
│ ├── overview.md (services, Docker, Traefik, SSO, retirement plan)
│ ├── data-model.md (ERPNext doctypes + "Lead to Live")
│ └── app-design.md (Vue/Quasar patterns, feature-sliced layout)
├── features/ ← one doc per business capability
│ ├── billing-payments.md (Stripe, invoices, subscriptions, PPA)
│ ├── cpe-management.md (GenieACS, Oktopus, XX230v)
│ ├── vision-ocr.md (Gemini, scan pipeline, offline queue, keys)
│ └── flow-editor.md (Flow Template, triggers, runtime)
├── reference/ ← lookup material
│ ├── erpnext-item-diff.md (new SKUs vs legacy gestionclient)
│ └── legacy-wizard/ (read-only snapshot of the PHP wizard)
├── assets/ ← PPTX decks, screenshots, generated diagrams
└── archive/ ← frozen docs, do not edit
├── HANDOFF-2026-04-18.md
├── MIGRATION.md
├── LEGACY-ACCOUNTING-ANALYSIS.md
└── status-snapshots/ (dated session reports)
```
---
## Conventions
- **Edit in place.** Don't copy-paste a section into a new file — link to it instead.
- **Dated snapshots go to `archive/status-snapshots/`.** Don't create `STATUS_YYYY-MM-DD.md` at the root anymore.
- **Code comments that reference a doc** use the full repo-relative path, e.g.
`// See docs/features/vision-ocr.md §10` — so `grep docs/` still surfaces them if we reorganize again.
- **The root `README.md`** (one level up) is the repo introduction for
non-technical readers; `docs/README.md` (this file) is the engineering index.
---
## What changed on 2026-04-22
The docs were flattened out of a single folder into `architecture/`,
`features/`, `reference/`, `archive/`. Every file move used `git mv` so
`git log --follow` still works. The old paths
(`docs/ARCHITECTURE.md`, `docs/VISION_AND_OCR.md`, etc.) no longer exist — if
you land on one of those links from an external bookmark, use the table above
to find the new location.
The only place old names still appear is inside
`archive/HANDOFF-2026-04-18.md` and `archive/status-snapshots/*.md`, where the
links are intentionally preserved as a frozen historical record.

View File

@ -1,111 +0,0 @@
# Gigafibre FSM — Roadmap
> See [STATUS_2026-04-18.md](STATUS_2026-04-18.md) for a full state snapshot and [HANDOFF.md](HANDOFF.md) for the reader's guide.
## Phase 1 — Foundation (Done, March 2026)
- [x] ERPNext v16 + PostgreSQL
- [x] Custom FSM doctypes (Service Location, Equipment, Subscription)
- [x] Dispatch doctypes (Job, Technician, Tag with skill levels)
- [x] Dispatch PWA with timeline, drag-drop, Mapbox map
- [x] GPS tracking (Traccar hybrid REST + WebSocket)
- [x] Authentik SSO (forwardAuth)
- [x] ERPNext API proxy (nginx same-origin)
- [x] Legacy migration (6,667 customers, 21K subs, 115K invoices, 242K tickets)
## Phase 2 — Ops App (Done, March 2026)
- [x] Unified ops PWA (erp.gigafibre.ca/ops/)
- [x] Client list/detail with inline editing (Odoo-style)
- [x] Dispatch module + ticket management
- [x] Equipment tracking with OLT/SNMP diagnostics
- [x] SMS/Email notifications (Twilio + Mailjet)
- [x] Invoice OCR — originally Ollama Vision, migrated to Gemini 2.5 Flash via targo-hub (2026-04-22, no GPU on ops VM). See [VISION_AND_OCR.md](VISION_AND_OCR.md).
- [x] Field tech mobile (/j/, unified into ops app — see Phase 2.7)
- [x] Authentik federation (staff → client SSO)
- [x] Modem-bridge (Playwright headless for TP-Link ONU diagnostics)
- [x] WiFi diagnostic panel (mesh topology, client signal, packet loss)
## Phase 2.5 — Remote Architecture Transition (Current Focus)
- [x] Deprecate local `frappe_docker` development dependencies
- [x] Consolidate architecture and ecosystem documentation
- [ ] Decouple API/Auth (Token-based auth instead of session for frontend apps)
- [ ] Set up dev proxy (Vite) to bridge local env to remote ERPNext API (bypassing CORS)
- [ ] Establish secure PostgreSQL tunnel for `infra-map-vue` development
- [ ] **Sandboxed outbound comms** (required before any scheduler/webhook/Twilio/Mailjet E2E test) — prevents test runs from reaching real customers while legacy still bills
- [ ] Subscription → Sales Invoice scheduler: keep `pause_scheduler=1` until cutover event. Legacy PHP is authoritative until then.
## Phase 2.6 — Quotation + DocuSeal (Shipped 2026-04-18)
- [x] DocuSeal container at sign.gigafibre.ca (Docker + Mailjet SMTP)
- [x] Hub routes: `/accept/generate`, `/accept/docuseal-webhook`, `/accept/confirm`
- [x] Quotation custom fields: `custom_docuseal_signing_url`, `custom_docuseal_envelope_id`, `custom_quote_type`
- [x] Billing Frequency Custom Field on Item + Quotation/Sales Invoice/Sales Order Item (fetch_from item_code)
- [x] Print Format "Soumission TARGO" with split Recurring / One-time sections and QR → signing URL
- [x] Wizard flow: ProjectWizard → `/accept/generate` → DocuSeal submission → signed webhook → `acceptQuotation()`
- [ ] Register DocuSeal webhook in UI (Settings → Webhooks, `form.completed` → hub endpoint) — **manual**
- [ ] First end-to-end signed acceptance on a real customer quote
## Phase 2.7 — Field ↔ Ops unification at /j (In Progress, started 2026-04-22)
Collapse `apps/field` into `apps/ops/src/modules/tech` so there is one
PWA, one deploy, one auth surface. See [VISION_AND_OCR.md](VISION_AND_OCR.md)
for the scan pipeline this depends on.
**Phase 1 — scan + device (Shipped 2026-04-22, commit `e50ea88`)**
- [x] Invoice OCR on Gemini 2.5 Flash via hub `/vision/invoice` — ops VM no longer needs a GPU
- [x] Ollama proxy blocks removed from ops + field nginx configs
- [x] Offline store (`apps/ops/src/stores/offline.js`) — mutation queue + vision queue, time-driven retries, idb-keyval persistence
- [x] Unified scanner composable (`useScanner.js`) with Mode A (barcodes, 8s timeout + queue) and Mode B (equipment label, sync)
- [x] TechScanPage at `/j/scan` — camera, 3-tier lookup (serial → barcode → MAC), auto-link to Dispatch Job context, create/link dialogs
- [x] TechDevicePage at `/j/device/:serial` — 7 cards surfacing full ERPNext relationship graph (Equipment, Customer, Location, Subscription, Issues, Dispatch Jobs, OLT)
- [x] Documentation: `docs/VISION_AND_OCR.md` (pipeline, §10 relationship graph, §8.1 secrets/rotation)
**Phase 2 — PWA hardening**
- [ ] Quasar service worker runtime caching scoped to `/j/*` (stale-while-revalidate for reads, network-first for mutations)
- [ ] Precache the tech route manifest so a cold install with no signal still boots `/j/`
**Phase 4 — Auth unification**
- [ ] Collapse logout URL to `id.gigafibre.ca` (currently ops points to `auth.targo.ca`)
- [ ] Decide whether `/j/*` stays behind Authentik forwardAuth or moves to magic-link only
**Phase 5 — Magic-link tech access**
- [ ] Traefik skip Authentik on `/j/{jwt-token}` route
- [ ] targo-hub `/otp/tech-link` — mint short-lived JWT bound to technician + job
- [ ] JWT validation in TechTasksPage → populate tech context without an SSO session
- [ ] SMS delivery of the link (reuse existing Twilio path)
**Phase 6 — Flow runtime integration**
- [ ] Wire `flow-runtime` to persist pending steps through `offline.queue` so a tech mid-flow survives a dead zone
- [ ] Surface queued flow state in TechTasksPage ("3 actions en attente de sync")
**Phase 7 — Remove apps/field**
- [ ] `git rm -r apps/field` once `/j/*` has parity and has run in production for ≥2 weeks
- [ ] Remove field build + deploy from CI
- [ ] Redirect `*.field.gigafibre.ca` (if any) → `erp.gigafibre.ca/ops/#/j/`
- [ ] Update `docs/ARCHITECTURE.md` service table (drop field row)
## Phase 3 — Workflows & Automation (In Progress)
- [ ] Tag technicians with skills (46 techs to tag)
- [ ] Wire auto-dispatch (cost-optimization matching)
- [ ] Issue → Dispatch Job creation
- [ ] Job completion → equipment status + close ticket
- [ ] Equipment swap → inventory log
- [ ] n8n escalation workflows
- [ ] Twilio 10DLC production upgrade
- [ ] SLA tracking
## Phase 4 — Customer Portal
- [ ] Self-service app (invoices, tickets, equipment)
- [ ] Stripe payments
- [ ] Online appointment booking
- [ ] Real-time tech tracking SMS
- [ ] Legacy password migration (MD5 → PBKDF2)
- [ ] QR code modem → subscriber dashboard
## Phase 5 — Advanced Features
- [ ] Van stock inventory per tech
- [ ] Revenue analytics (MRR, churn, ARPU)
- [ ] Proactive monitoring (auto-ticketing)
- [ ] Online checkout (e-commerce signup)
- [ ] Marketing segmentation + campaigns
- [ ] Tech performance dashboards
- [ ] Preventive maintenance scheduling

View File

@ -0,0 +1,12 @@
# Architecture
How the pieces fit together. Read [overview.md](overview.md) first unless you
have a specific reason not to.
| Doc | Read when… |
|---|---|
| [overview.md](overview.md) | You need the full service map — ERPNext, Ops PWA, targo-hub, DocuSeal, Authentik, Traefik, Docker networks, the legacy retirement plan |
| [data-model.md](data-model.md) | You're about to touch ERPNext: Customer, Service Location, Service Subscription, Service Equipment, Sales Invoice, Payment Entry. Also covers the "Lead to Live" customer flow |
| [app-design.md](app-design.md) | You're building frontend. Feature-sliced layout, Vue/Quasar patterns, Pinia, router, theming, Storybook conventions |
Back to [docs/README.md](../README.md) · [roadmap.md](../roadmap.md)

View File

@ -77,7 +77,7 @@ Internet
- **Model:** Gemini 2.5 Flash (Google) — no local GPU, all inference remote.
- **Endpoints (hub):** `/vision/barcodes`, `/vision/equipment`, `/vision/invoice`.
- **Why centralized:** ops VM has no GPU, so the legacy Ollama `llama3.2-vision` install was retired. All three frontends (ops, field-as-ops `/j`, future client portal) hit the hub, which enforces JSON `responseSchema` per endpoint.
- **Client-side resilience:** barcode scans use an 8s timeout + IndexedDB retry queue so techs in weak-LTE zones don't lose data. See [VISION_AND_OCR.md](VISION_AND_OCR.md) for the full pipeline.
- **Client-side resilience:** barcode scans use an 8s timeout + IndexedDB retry queue so techs in weak-LTE zones don't lose data. See [../features/vision-ocr.md](../features/vision-ocr.md) for the full pipeline.
---

View File

@ -1,6 +1,8 @@
# Gigafibre FSM — Handoff Index
# Gigafibre FSM — Handoff Index (ARCHIVED 2026-04-18)
> **Purpose:** one-page map of every doc in this repo. Pick the path for your role, read in order, stop when you have enough.
> **⚠️ ARCHIVED.** This was the single-page index before the docs were reorganized into folders. Doc paths below are **stale** — use [../README.md](../README.md) for the current index. Kept for historical reference only.
> **Purpose (at time of writing):** one-page map of every doc in this repo. Pick the path for your role, read in order, stop when you have enough.
**Last refreshed:** 2026-04-18

26
docs/archive/README.md Normal file
View File

@ -0,0 +1,26 @@
# Archive
> **Do not edit these files.** They're frozen snapshots kept for historical
> context. Internal links inside archived docs still point at the
> pre-reorganization paths (e.g. `ARCHITECTURE.md`) — that's intentional so
> they read as they did at the time.
For the current state of the system, go back to [docs/README.md](../README.md)
or [roadmap.md](../roadmap.md).
## Contents
| File | What it is |
|---|---|
| [HANDOFF-2026-04-18.md](HANDOFF-2026-04-18.md) | The single-page doc index as it stood before the 2026-04-22 reorganization |
| [MIGRATION.md](MIGRATION.md) | Legacy `gestionclient` (MariaDB) → ERPNext migration: table-by-table mapping, completion log |
| [LEGACY-ACCOUNTING-ANALYSIS.md](LEGACY-ACCOUNTING-ANALYSIS.md) | April 2026 audit of the legacy PHP/MariaDB accounting system, informed the migration plan |
| [status-snapshots/](status-snapshots/) | Dated "state of the system" write-ups from individual work sessions |
## Why these still exist
Old snapshots capture context that doesn't belong in the evergreen docs:
what someone was worried about on a specific date, what tradeoffs we
considered and rejected, what shipped in a given sprint. When reading, assume
code examples and doc paths have drifted — verify in the current code before
acting on them.

View File

@ -1,8 +1,9 @@
# Gigafibre FSM — Status Snapshot (2026-04-18)
# Gigafibre FSM — Status Snapshot (2026-04-18) — ARCHIVED
> **Audience:** new contributor, stakeholder, or future-me opening this cold.
> **Goal:** be able to hold a coherent conversation about the system in 10 minutes.
> **Companion docs:** [README](../README.md) · [ARCHITECTURE](ARCHITECTURE.md) · [ROADMAP](ROADMAP.md) · [DATA_AND_FLOWS](DATA_AND_FLOWS.md) · [BILLING_AND_PAYMENTS](BILLING_AND_PAYMENTS.md) · [CPE_MANAGEMENT](CPE_MANAGEMENT.md) · [APP_DESIGN_GUIDELINES](APP_DESIGN_GUIDELINES.md)
> **⚠️ ARCHIVED snapshot.** Links below point to the pre-reorganization layout and are stale. For the current state, see [../../roadmap.md](../../roadmap.md). For the live index, see [../../README.md](../../README.md).
> **Audience (original):** new contributor, stakeholder, or future-me opening this cold.
> **Goal (original):** be able to hold a coherent conversation about the system in 10 minutes.
---

View File

@ -1,6 +1,8 @@
# Status — 2026-04-18 (session 2)
# Status — 2026-04-18 (session 2) — ARCHIVED
> Follow-up to STATUS_2026-04-18.md. This session was the sales-flow sprint.
> **⚠️ ARCHIVED snapshot.** For current state, see [../../roadmap.md](../../roadmap.md).
> Follow-up to [2026-04-18.md](2026-04-18.md). This session was the sales-flow sprint.
## What changed this session

View File

@ -1,6 +1,8 @@
# Status — 2026-04-19 (wizard legacy-alignment refinement)
# Status — 2026-04-19 (wizard legacy-alignment refinement) — ARCHIVED
> Follow-up to STATUS_2026-04-18b.md. Small session: reviewed the legacy
> **⚠️ ARCHIVED snapshot.** For current state, see [../../roadmap.md](../../roadmap.md).
> Follow-up to [2026-04-18b.md](2026-04-18b.md). Small session: reviewed the legacy
> wizard (`facturation.targo.ca/.../client_wizard`), realized the initial
> preset model fought the real workflow, refactored.

View File

@ -0,0 +1,19 @@
# Status snapshots
Dated "state of the system" write-ups. Each captures what shipped, what
changed, and what was queued on that specific date. **Frozen** — do not edit
past snapshots.
| Date | File | Theme |
|---|---|---|
| 2026-04-18 | [2026-04-18.md](2026-04-18.md) | Foundational 10-min snapshot, TL;DR + architecture refresher |
| 2026-04-18 (session 2) | [2026-04-18b.md](2026-04-18b.md) | Sales-flow sprint |
| 2026-04-19 | [2026-04-19.md](2026-04-19.md) | Wizard legacy-alignment refinement |
For the live state see [../../roadmap.md](../../roadmap.md).
## Creating a new snapshot
- File name: `YYYY-MM-DD.md` (append `b`, `c`, … for multiple sessions per day).
- Link it from the table above when you commit.
- Don't cross-link from evergreen docs — those should point at `roadmap.md` instead.

View File

@ -482,7 +482,8 @@ async function build() {
s.addText("Targo — Avril 2026", { x: 0.8, y: 5.1, w: 9, h: 0.3, fontSize: 10, fontFace: "Calibri", color: C.muted, margin: 0 });
// Write file
await pres.writeFile({ fileName: "/Users/louispaul/Documents/testap/gigafibre-fsm/docs/Gigafibre-FSM-Features.pptx" });
const path = require("path");
await pres.writeFile({ fileName: path.join(__dirname, "Gigafibre-FSM-Features.pptx") });
console.log("Presentation created!");
}

14
docs/features/README.md Normal file
View File

@ -0,0 +1,14 @@
# Features
One doc per business capability. Each describes the user-facing behaviour,
the ERPNext doctypes touched, the API endpoints involved, and the failure
modes. Open the one that matches the feature you're changing.
| Doc | Owns |
|---|---|
| [billing-payments.md](billing-payments.md) | Stripe integration (Checkout, Billing Portal, webhook), subscription lifecycle, invoice generation, payment reconciliation, PPA (Plan de paiement automatique), Klarna BNPL |
| [cpe-management.md](cpe-management.md) | CPE fleet: GenieACS (TR-069), Oktopus (TR-369), provisioning, diagnostics, TP-Link XX230v / Deco deep probe, migration plan |
| [vision-ocr.md](vision-ocr.md) | Camera-based scanning via Gemini 2.5 Flash — barcode, equipment label, invoice OCR. Hub endpoints `/vision/*`, `useScanner` composable, offline queue, AI_API_KEY rotation policy, ERPNext relationships triggered by a scan |
| [flow-editor.md](flow-editor.md) | Agent-flows module: Flow Template + Flow Run doctypes, trigger catalogue, step types, runtime contract, UI editor at `/ops/#/agent-flows` |
Back to [docs/README.md](../README.md) · [roadmap.md](../roadmap.md)

View File

@ -1,8 +1,9 @@
# Facturation & Paiements — Handoff dev
> Référence unique pour toutes les fonctionnalités facture / paiement construites sur
> la stack `erp.gigafibre.ca` + `client.gigafibre.ca` + `ops`. Lisez `ARCHITECTURE.md`
> d'abord pour le contexte réseau/services.
> la stack `erp.gigafibre.ca` + `client.gigafibre.ca` + `ops`. Lisez
> [../architecture/overview.md](../architecture/overview.md) d'abord pour le contexte
> réseau/services.
Dernière MàJ : 2026-04-17

View File

@ -3,7 +3,8 @@
> Authoritative reference for the Flow Editor subsystem: visual builder in the
> Ops PWA, JSON flow-definition language, runtime engine in `targo-hub`, and
> the Frappe scheduler that wakes delayed steps. Companion document to
> `ARCHITECTURE.md` and `DATA_AND_FLOWS.md`.
> [../architecture/overview.md](../architecture/overview.md) and
> [../architecture/data-model.md](../architecture/data-model.md).
---
@ -674,5 +675,6 @@ Deploy order (important):
---
*Last updated: 2026-04-21. Owners: Targo Platform team
(<louis@targo.ca>). See `ROADMAP.md` for upcoming Flow Editor v2 items
(JSONLogic conditions, sub-flows, parallel branches, retry policies).*
(<louis@targo.ca>). See [../roadmap.md](../roadmap.md) for upcoming Flow
Editor v2 items (JSONLogic conditions, sub-flows, parallel branches,
retry policies).*

View File

@ -323,11 +323,13 @@ DevTools, no key in the browser's `Network` tab.
## 9. Related
- [ARCHITECTURE.md](ARCHITECTURE.md) — the full service map this lives in.
- [CPE_MANAGEMENT.md](CPE_MANAGEMENT.md) — how scanned serials flow into
- [../architecture/overview.md](../architecture/overview.md) — the full service map this lives in.
- [cpe-management.md](cpe-management.md) — how scanned serials flow into
the TR-069/TR-369 device management plane.
- [APP_DESIGN_GUIDELINES.md](APP_DESIGN_GUIDELINES.md) — frontend
- [../architecture/app-design.md](../architecture/app-design.md) — frontend
conventions (Vue 3 Composition API, feature folders).
- [../roadmap.md](../roadmap.md) — Phase 2.7 tracks the ongoing /j tech
unification this pipeline depends on.
---

11
docs/reference/README.md Normal file
View File

@ -0,0 +1,11 @@
# Reference
Lookup material. These aren't narratives — open them when you need a specific
fact.
| Doc | Use when… |
|---|---|
| [erpnext-item-diff.md](erpnext-item-diff.md) | Auditing why a wizard SKU doesn't match a legacy `gestionclient.product` row. Lists every new / reused / semantic-reuse item with rationale |
| [legacy-wizard/](legacy-wizard/) | You need to check what the old PHP wizard at `facturation.targo.ca/.../client_wizard` actually did for a given step. These are read-only snapshots — never edit |
Back to [docs/README.md](../README.md) · [roadmap.md](../roadmap.md)

182
docs/roadmap.md Normal file
View File

@ -0,0 +1,182 @@
# Gigafibre FSM — Roadmap
> Live phase tracker. For onboarding or architecture context see
> [README.md](README.md). Historical status snapshots live under
> [archive/status-snapshots/](archive/status-snapshots/).
**Last refreshed:** 2026-04-22
---
## Modules in production — quick links
Everything in this table is reachable from a browser today (Authentik
SSO for staff surfaces, Stripe Checkout for customer ones).
### Ops app — `https://erp.gigafibre.ca/ops/`
| Module | URL | Purpose |
|---|---|---|
| Dashboard | [/ops/#/](https://erp.gigafibre.ca/ops/#/) | Home |
| Clients | [/ops/#/clients](https://erp.gigafibre.ca/ops/#/clients) | Customer list + detail |
| Dispatch | [/ops/#/dispatch](https://erp.gigafibre.ca/ops/#/dispatch) | Timeline, drag-drop, map |
| Tickets | [/ops/#/tickets](https://erp.gigafibre.ca/ops/#/tickets) | Issue management |
| Équipe | [/ops/#/equipe](https://erp.gigafibre.ca/ops/#/equipe) | Technician directory |
| Rapports | [/ops/#/rapports](https://erp.gigafibre.ca/ops/#/rapports) | Revenu / Ventes / Taxes / AR |
| OCR | [/ops/#/ocr](https://erp.gigafibre.ca/ops/#/ocr) | Invoice OCR (Gemini) |
| Téléphonie | [/ops/#/telephony](https://erp.gigafibre.ca/ops/#/telephony) | PBX + SIP |
| Agent flows | [/ops/#/agent-flows](https://erp.gigafibre.ca/ops/#/agent-flows) | Flow editor |
| Réseau | [/ops/#/network](https://erp.gigafibre.ca/ops/#/network) | GenieACS / OLT / TR-069 |
| Settings | [/ops/#/settings](https://erp.gigafibre.ca/ops/#/settings) | Config |
### Tech mobile (same app, mobile layout) — `/j/*`
| Page | URL | Purpose |
|---|---|---|
| Tasks | [/ops/#/j](https://erp.gigafibre.ca/ops/#/j) | Tech's assigned jobs |
| Scan | [/ops/#/j/scan](https://erp.gigafibre.ca/ops/#/j/scan) | Camera scanner, auto-link |
| Device | `/ops/#/j/device/:serial` | Equipment detail + relationships |
| Diagnostic | [/ops/#/j/diagnostic](https://erp.gigafibre.ca/ops/#/j/diagnostic) | ONT/OLT/SNMP probe |
### Customer portal — `https://portal.gigafibre.ca`
| Page | URL | Purpose |
|---|---|---|
| Dashboard | [/](https://portal.gigafibre.ca) | Balance + quick actions |
| Account | [/#/me](https://portal.gigafibre.ca/#/me) | Profile + cards (Stripe Billing Portal) |
| Invoices | [/#/invoices](https://portal.gigafibre.ca/#/invoices) | History + pay (Stripe Checkout + Klarna) |
| Tickets | [/#/tickets](https://portal.gigafibre.ca/#/tickets) | Open tickets |
| Messages | [/#/messages](https://portal.gigafibre.ca/#/messages) | SMS / email thread with support |
| Catalog | [/#/catalog](https://portal.gigafibre.ca/#/catalog) | Add-on purchases |
### Admin surfaces (non-ops)
| Service | URL | Stack |
|---|---|---|
| ERPNext | [erp.gigafibre.ca](https://erp.gigafibre.ca) | Frappe v16 / PostgreSQL |
| Authentik SSO (staff) | [auth.targo.ca](https://auth.targo.ca) | migrating → id.gigafibre.ca |
| Authentik SSO (clients) | [id.gigafibre.ca](https://id.gigafibre.ca) | Federated from auth.targo.ca |
| DocuSeal | [sign.gigafibre.ca](https://sign.gigafibre.ca) | Contract signing |
| n8n | [n8n.gigafibre.ca](https://n8n.gigafibre.ca) | Workflow automation |
| Oktopus | [oss.gigafibre.ca](https://oss.gigafibre.ca) | TR-369 CPE controller |
| GenieACS | internal `10.5.2.115:7557` | TR-069 NBI |
| Traccar | [tracker.targointernet.com](https://tracker.targointernet.com) | GPS tracking |
| Website | [www.gigafibre.ca](https://www.gigafibre.ca) | Marketing + address lookup |
---
## Phase 1 — Foundation (Done, March 2026)
- [x] ERPNext v16 + PostgreSQL
- [x] Custom FSM doctypes (Service Location, Equipment, Subscription) → see [architecture/data-model.md](architecture/data-model.md)
- [x] Dispatch doctypes (Job, Technician, Tag with skill levels)
- [x] Dispatch PWA with timeline, drag-drop, Mapbox map → [/ops/#/dispatch](https://erp.gigafibre.ca/ops/#/dispatch)
- [x] GPS tracking (Traccar hybrid REST + WebSocket)
- [x] Authentik SSO (forwardAuth)
- [x] ERPNext API proxy (nginx same-origin)
- [x] Legacy migration (6,667 customers, 21K subs, 115K invoices, 242K tickets)
## Phase 2 — Ops App (Done, March 2026)
- [x] Unified ops PWA → [erp.gigafibre.ca/ops/](https://erp.gigafibre.ca/ops/)
- [x] Client list/detail with inline editing → [/ops/#/clients](https://erp.gigafibre.ca/ops/#/clients)
- [x] Dispatch module + ticket management → [/ops/#/dispatch](https://erp.gigafibre.ca/ops/#/dispatch), [/ops/#/tickets](https://erp.gigafibre.ca/ops/#/tickets)
- [x] Equipment tracking with OLT/SNMP diagnostics → [/ops/#/network](https://erp.gigafibre.ca/ops/#/network)
- [x] SMS/Email notifications (Twilio + Mailjet)
- [x] Invoice OCR — migrated from Ollama Vision to Gemini 2.5 Flash via targo-hub (2026-04-22, no GPU on ops VM). See [features/vision-ocr.md](features/vision-ocr.md) → [/ops/#/ocr](https://erp.gigafibre.ca/ops/#/ocr)
- [x] Field tech mobile → [/ops/#/j](https://erp.gigafibre.ca/ops/#/j) (unified into ops app, see Phase 2.7)
- [x] Authentik federation (staff → client SSO)
- [x] Modem-bridge (Playwright headless for TP-Link ONU diagnostics)
- [x] WiFi diagnostic panel (mesh topology, client signal, packet loss)
## Phase 2.5 — Remote Architecture Transition (In Progress)
- [x] Deprecate local `frappe_docker` development dependencies
- [x] Consolidate architecture and ecosystem documentation (this reorg, 2026-04-22)
- [ ] Decouple API/Auth (Token-based auth instead of session for frontend apps)
- [ ] Set up dev proxy (Vite) to bridge local env to remote ERPNext API (bypassing CORS)
- [ ] Establish secure PostgreSQL tunnel for `infra-map-vue` development
- [ ] **Sandboxed outbound comms** (required before any scheduler/webhook/Twilio/Mailjet E2E test) — prevents test runs from reaching real customers while legacy still bills
- [ ] Subscription → Sales Invoice scheduler: keep `pause_scheduler=1` until cutover event. Legacy PHP is authoritative until then.
## Phase 2.6 — Quotation + DocuSeal (Shipped 2026-04-18)
- [x] DocuSeal container → [sign.gigafibre.ca](https://sign.gigafibre.ca)
- [x] Hub routes: `/accept/generate`, `/accept/docuseal-webhook`, `/accept/confirm`
- [x] Quotation custom fields: `custom_docuseal_signing_url`, `custom_docuseal_envelope_id`, `custom_quote_type`
- [x] Billing Frequency Custom Field on Item + Quotation/Sales Invoice/Sales Order Item (fetch_from item_code)
- [x] Print Format "Soumission TARGO" with split Recurring / One-time sections and QR → signing URL
- [x] Wizard flow: ProjectWizard → `/accept/generate` → DocuSeal submission → signed webhook → `acceptQuotation()`
- [ ] Register DocuSeal webhook in UI (Settings → Webhooks, `form.completed` → hub endpoint) — **manual**
- [ ] First end-to-end signed acceptance on a real customer quote
## Phase 2.7 — Field ↔ Ops unification at /j (In Progress, started 2026-04-22)
Collapse `apps/field` into `apps/ops/src/modules/tech` so there is one
PWA, one deploy, one auth surface. See [features/vision-ocr.md](features/vision-ocr.md)
for the scan pipeline this depends on.
**Step 1 — scan + device (Shipped 2026-04-22, commit `e50ea88`)**
- [x] Invoice OCR on Gemini 2.5 Flash via hub `/vision/invoice` — ops VM no longer needs a GPU
- [x] Ollama proxy blocks removed from ops + field nginx configs
- [x] Offline store (`apps/ops/src/stores/offline.js`) — mutation queue + vision queue, time-driven retries, idb-keyval persistence
- [x] Unified scanner composable (`useScanner.js`) with Mode A (barcodes, 8s timeout + queue) and Mode B (equipment label, sync)
- [x] TechScanPage → [/ops/#/j/scan](https://erp.gigafibre.ca/ops/#/j/scan) — camera, 3-tier lookup (serial → barcode → MAC), auto-link to Dispatch Job context, create/link dialogs
- [x] TechDevicePage at `/j/device/:serial` — 7 cards surfacing full ERPNext relationship graph (Equipment, Customer, Location, Subscription, Issues, Dispatch Jobs, OLT)
- [x] Documentation: [features/vision-ocr.md](features/vision-ocr.md) (pipeline, §10 relationship graph, §8.1 secrets/rotation)
**Step 2 — PWA hardening**
- [ ] Quasar service worker runtime caching scoped to `/j/*` (stale-while-revalidate for reads, network-first for mutations)
- [ ] Precache the tech route manifest so a cold install with no signal still boots `/j/`
**Step 3 — Auth unification**
- [ ] Collapse logout URL to `id.gigafibre.ca` (currently ops points to `auth.targo.ca`)
- [ ] Decide whether `/j/*` stays behind Authentik forwardAuth or moves to magic-link only
**Step 4 — Magic-link tech access**
- [ ] Traefik skip Authentik on `/j/{jwt-token}` route
- [ ] targo-hub `/otp/tech-link` — mint short-lived JWT bound to technician + job
- [ ] JWT validation in TechTasksPage → populate tech context without an SSO session
- [ ] SMS delivery of the link (reuse existing Twilio path)
**Step 5 — Flow runtime integration**
- [ ] Wire `flow-runtime` to persist pending steps through `offline.queue` so a tech mid-flow survives a dead zone
- [ ] Surface queued flow state in TechTasksPage ("3 actions en attente de sync")
**Step 6 — Remove apps/field**
- [ ] `git rm -r apps/field` once `/j/*` has parity and has run in production for ≥2 weeks
- [ ] Remove field build + deploy from CI
- [ ] Redirect `*.field.gigafibre.ca` (if any) → `erp.gigafibre.ca/ops/#/j/`
- [ ] Update [architecture/overview.md](architecture/overview.md) service table (drop field row)
## Phase 3 — Workflows & Automation (In Progress)
- [ ] Tag technicians with skills (46 techs to tag) → [/ops/#/equipe](https://erp.gigafibre.ca/ops/#/equipe)
- [ ] Wire auto-dispatch (cost-optimization matching)
- [ ] Issue → Dispatch Job creation (triggered from [/ops/#/tickets](https://erp.gigafibre.ca/ops/#/tickets))
- [ ] Job completion → equipment status + close ticket
- [ ] Equipment swap → inventory log
- [x] Flow editor (v1 shipped) → [/ops/#/agent-flows](https://erp.gigafibre.ca/ops/#/agent-flows) — see [features/flow-editor.md](features/flow-editor.md)
- [ ] n8n escalation workflows → [n8n.gigafibre.ca](https://n8n.gigafibre.ca)
- [ ] Twilio 10DLC production upgrade
- [ ] SLA tracking
## Phase 4 — Customer Portal (Largely Shipped)
Portal Vue SPA lives at [portal.gigafibre.ca](https://portal.gigafibre.ca).
All 16 `/payments/*` hub endpoints ship; see
[features/billing-payments.md](features/billing-payments.md) for the full flow.
- [x] Self-service app → [portal.gigafibre.ca](https://portal.gigafibre.ca) (13 pages: Dashboard, Invoices, Account, Tickets, Messages, Catalog, Cart, …)
- [x] Stripe payments → pay-balance, pay-invoice, save-card, Billing Portal, refund, PPA auto-pay cron (daily 06:00 EST). Klarna BNPL supported on invoice payments.
- [x] Webhook handler with signature verification (5-min tolerance) → `/webhook/stripe`
- [x] Payment links via SMS + email (`/payments/send-link`)
- [x] Magic-link redirect after Stripe return (`/payments/return` → portal)
- [ ] Online appointment booking
- [ ] Real-time tech tracking SMS
- [ ] Legacy password migration (MD5 → PBKDF2) — MD5-hashed passwords in legacy need forced reset via OTP email/SMS
- [ ] QR code on modem → subscriber dashboard (`msg.gigafibre.ca/q/{mac}`)
## Phase 5 — Advanced Features
- [ ] Van stock inventory per tech
- [ ] Revenue analytics (MRR, churn, ARPU) → extend [/ops/#/rapports](https://erp.gigafibre.ca/ops/#/rapports)
- [ ] Proactive monitoring (auto-ticketing)
- [ ] Online checkout (e-commerce signup via [www.gigafibre.ca](https://www.gigafibre.ca))
- [ ] Marketing segmentation + campaigns
- [ ] Tech performance dashboards
- [ ] Preventive maintenance scheduling

View File

@ -26,7 +26,7 @@
* { [stepId]: { status: 'pending|running|done|failed|scheduled|skipped',
* started_at, completed_at, result, error, retry_count } }
*
* See docs/FLOW_EDITOR_ARCHITECTURE.md for full data model + trigger wiring.
* See docs/features/flow-editor.md for full data model + trigger wiring.
*/
const { log, erpFetch } = require('./helpers')