gigafibre-fsm/docs/MIGRATION-PLAN.md
louispaulb 93dd7a525f feat: migration legacy → ERPNext phases 1-4 complete
Phase 1: 833 Items + 34 Item Groups + custom fields (ISP speeds, RADIUS, legacy IDs)
Phase 2: 6,667 Customers + Contacts + Addresses via direct PG (~30s)
Phase 3: Tax template QC TPS+TVQ + 92 Subscription Plans
Phase 4: 21,876 Subscriptions with RADIUS data

CRITICAL: ERPNext scheduler is PAUSED — do not reactivate without explicit go.

Includes:
- ARCHITECTURE-COMPARE.md: full schema mapping legacy vs ERPNext
- CHANGELOG.md: detailed migration log
- MIGRATION-PLAN.md: strategy and next steps
- scripts/migration/: idempotent Python scripts (direct PG method)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:35:02 -04:00

10 KiB

Plan de migration — Legacy Facturation → ERPNext

1. Portrait du système legacy

Base de données : gestionclient (MariaDB sur 10.100.80.100)

Table Records Description
account 15,303 Clients (6,510 actifs, 8,594 terminés)
delivery 17,114 Adresses d'installation (GPS inclus)
service 66,879 Abonnements (39,624 actifs)
product 833 Catalogue forfaits/produits
product_cat 34 Catégories produits
invoice 629,944 Factures
invoice_item 1,859,260 Lignes de facture
payment 540,522 Paiements
payment_item 684,778 Application paiements → factures
compta_journal_ecriture 1,211,991 Écritures comptables
compta_comptes 48 Plan comptable
ticket 242,618 Tickets support/install/facturation
ticket_msg 784,290 Messages tickets (8,123 avec images base64)
device 10,377 Équipements réseau
fibre 16,057 Raccordements fibre (OLT, VLAN, ports)
staff 155 Employés
bon_travail 14,472 Bons de travail technicien
tax 4 TPS/TVQ

Revenu mensuel actif (~$742K/mois)

Catégorie Services actifs Revenu mensuel
Mensualités fibre 17,050 $454,364
Mensualités sans fil 4,200 $189,799
Mensualités télévision 2,001 $46,360
Téléphonie 2,236 $34,004
Installation fibre 10,926 $7,285
Adresse IP fixe 138 $3,485
Autres ~70 ~$7K

Relations entre tables

account (client)
  ├── 1:N delivery (adresses d'installation, GPS)
  │     └── 1:N fibre (raccordement OLT, VLAN, ports)
  ├── 1:N service (abonnements actifs)
  │     ├── N:1 product (forfait, prix, vitesses)
  │     ├── N:1 delivery (lieu du service)
  │     └── N:1 device (équipement assigné)
  ├── 1:N invoice (factures)
  │     └── 1:N invoice_item (lignes → product)
  ├── 1:N payment (paiements)
  │     └── 1:N payment_item (répartition sur factures)
  └── 1:N ticket (support, install, réparation)
        └── 1:N ticket_msg (messages, images base64)

product
  ├── N:1 product_cat (catégorie → num_compte)
  └── vitesses (download_speed, upload_speed, quota)

compta_comptes (plan comptable, 48 comptes)
  └── 1:N compta_journal_ecriture (1.2M écritures)

staff (155 employés)
  └── ticket.assign_to, bon_travail.tech1/tech2

2. Mapping Legacy → ERPNext

Phase A : Données maîtres (référence)

Legacy ERPNext Notes
account Customer customer_id, company, group_id, statut, PPA, Stripe
account (adresse) Address address1, city, zip, linked to Customer
account (contact) Contact first_name, last_name, email, tel, cell
delivery Address (type=Shipping) + Service Location (FSM) GPS, name, lié au Customer
product Item (type=Service) SKU, prix, vitesses dans custom fields
product_cat Item Group Hiérarchie catégories, num_compte pour comptabilité
tax / tax_group Tax Template TPS 5% + TVQ (8.925% → 9.975%)
staff Employee username, email, dept
device Asset ou Service Equipment (FSM) SN, MAC, modèle, parent device
fibre Champs dans Service Location OLT info, VLAN, frame/slot/port
compta_comptes Chart of Accounts 48 comptes → plan comptable ERPNext
ticket_dept Issue Type ou Department 21 départements de tickets

Phase B : Données transactionnelles

Legacy ERPNext Volume Notes
invoice + invoice_item Sales Invoice + Items 630K factures Importer seulement les 2-3 dernières années ?
payment + payment_item Payment Entry + References 540K Idem — soldes historiques en opening balance
service (actifs) Subscription 39,624 Critique — abonnements récurrents en cours
compta_journal_ecriture Journal Entry 1.2M Opening balance uniquement — pas d'import ligne par ligne
ticket + ticket_msg Issue ou import dans HD 242K Les fermés → archive, ouverts → migration
bon_travail Dispatch Job (FSM) 14K Historique tech

Phase C : Fichiers et images

Source Volume Stratégie
ticket_msg base64 images ~8,123 messages Extraire → fichier → upload ERPNext File → remplacer dans texte
intranet_doc attachments ~33 docs Copier fichiers → ERPNext File
uploads/ directory À vérifier Copier vers ERPNext sites/[site]/public/files/

3. Stratégie de migration

Principes

  1. Ne pas tout migrer — Les données historiques fermées (factures payées, tickets clos) restent consultables dans le legacy en lecture seule
  2. Opening balance — Un seul Journal Entry avec les soldes de chaque compte au jour J de migration
  3. Services actifs = priorité #1 — Les 39,624 abonnements actifs doivent être fonctionnels dans ERPNext avant le cutover
  4. Coexistence temporaire — Les deux systèmes roulent en parallèle pendant la phase de validation (1-2 mois)
  5. Images base64 — Extraites en fichiers, uploadées dans ERPNext, lien URL dans le champ texte

Phases d'exécution

Phase 1 : Fondations (Semaine 1-2)

  • Créer le Chart of Accounts dans ERPNext (48 comptes)
  • Configurer les Tax Templates (TPS 5% + TVQ 9.975%)
  • Créer les Item Groups (34 catégories produits)
  • Importer les 833 Items (produits/forfaits) avec custom fields (vitesses, quota, profils OLT)
  • Configurer les Pricing Rules si nécessaire

Phase 2 : Clients et adresses (Semaine 2-3)

  • Importer les Customers actifs (6,510) avec mapping group_id → Customer Group
  • Importer les Addresses (delivery) avec GPS → Service Location (FSM)
  • Importer les Contacts (email, téléphones)
  • Lier fibre data aux Service Locations (OLT, VLAN, ports)
  • Importer les Employees (155 staff)

Phase 3 : Abonnements actifs (Semaine 3-4)

  • Créer les Subscription Plans dans ERPNext
  • Importer les 39,624 services actifs comme Subscriptions
  • Valider : chaque service → bon Customer, bon Item, bon prix, bonne adresse
  • Gérer les hijack (prix spéciaux par service) → Pricing Rule ou custom field

Phase 4 : Soldes et comptabilité (Semaine 4-5)

  • Calculer les soldes de chaque compte client (factures - paiements)
  • Créer l'Opening Balance dans ERPNext (1 Journal Entry)
  • Valider que le total des comptes à recevoir correspond
  • Importer les factures des 12 derniers mois (optionnel, pour historique)

Phase 5 : Cutover (Semaine 5-6)

  • Freeze le legacy (lecture seule)
  • Run final delta sync (nouvelles transactions depuis dernier import)
  • Activer la facturation récurrente dans ERPNext
  • Rediriger les flux PPA/Stripe vers ERPNext
  • Formation utilisateurs
  • Go-live

Phase 6 : Post-migration (Semaine 7+)

  • Migrer les tickets ouverts (904 open + 487 pending)
  • Extraire et uploader les images base64 des ticket_msg
  • Legacy en mode archive (consultation seulement)
  • Supprimer les accès écriture au legacy

4. Risques et décisions

Décisions à prendre

  1. Historique des factures — Combien d'années importer ? Suggestion : 2 ans pour référence, opening balance pour le reste
  2. Tickets historiques — Garder le legacy en consultation ou tout migrer vers Issue ?
  3. PPA (pré-autorisé bancaire) — ERPNext supporte GoCardless/Stripe mais pas AccesD directement. Middleware requis ?
  4. Numérotation — Garder les IDs legacy (customer_id, invoice_id) dans un champ legacy_id pour traçabilité ?
  5. Portail client — account_profile (659 profils) → ERPNext Portal ou www.gigafibre.ca custom ?
  6. Camping — Tables camping_* encore utilisées ?
  7. RADIUS — Les services ont radius_user/radius_pwd. Intégration FreeRADIUS → ERPNext ?

Risques

Risque Impact Mitigation
Soldes incorrects après migration Clients facturés en double ou manquant Réconciliation avant/après avec rapport
PPA cassé pendant cutover Perte de revenus Coexistence : legacy facture, ERPNext prend le relais progressivement
Abonnements manquants Client sans service Script de validation : service legacy actif → Subscription ERPNext existe
Images base64 perdues Contexte tickets perdu Extraction batch avant cutover
Performance ERPNext avec 630K factures Lenteur Import seulement 2 ans, opening balance pour le reste

5. Scripts de migration (à développer)

migration/
  01_chart_of_accounts.py     # compta_comptes → Chart of Accounts
  02_tax_templates.py          # tax → Tax Templates
  03_item_groups.py            # product_cat → Item Group
  04_items.py                  # product → Item
  05_customers.py              # account → Customer + Address + Contact
  06_service_locations.py      # delivery + fibre → Service Location
  07_employees.py              # staff → Employee
  08_equipment.py              # device → Service Equipment
  09_subscriptions.py          # service (actifs) → Subscription
  10_opening_balance.py        # Soldes calculés → Journal Entry
  11_recent_invoices.py        # invoice (2 ans) → Sales Invoice
  12_recent_payments.py        # payment (2 ans) → Payment Entry
  13_open_tickets.py           # ticket (ouverts) → Issue
  14_extract_base64_images.py  # ticket_msg base64 → fichiers
  15_validation.py             # Réconciliation legacy vs ERPNext

Chaque script utilise le MCP ERPNext (Frappe Assistant Core) pour créer les documents directement, avec validation et rollback en cas d'erreur.


6. Données à NE PAS migrer

  • compta_journal_ecriture complet (1.2M) → opening balance seulement
  • invoice > 2 ans → opening balance
  • ticket fermés (241K) → consultables dans legacy
  • ticket_msg fermés → consultables dans legacy
  • conso_* (consommation RADIUS) → données opérationnelles, pas comptables
  • phonecall_log_* → historique téléphonique
  • tmp*, *_bk, *_archive → backup tables
  • camping_* → à confirmer si encore utilisé
  • passwords_manager* → ne jamais migrer les mots de passe tiers