PROMPT BACKEND — MyKollector®
==============================

Le document en annexe est la documentation technique complète de la plateforme MyKollector®.
Utilise-le comme référence unique et exhaustive. Ne complète pas avec des suppositions.

---

MISSION
-------
Génère le backend complet de MyKollector® en Python / Flask.

STACK IMPOSÉE
-------------
- Python 3.11+ / Flask 3.0+
- SQLAlchemy (SQLite dev / PostgreSQL prod)
- flask-jwt-extended (JWT 24h)
- ezdxf (génération DXF)
- ReportLab 4.0+ (PDF étiquettes)
- cryptography (AES-256 pour tokens Strava)

STRUCTURE DE FICHIERS ATTENDUE
-------------------------------
Respecte exactement l'arborescence décrite dans le document (section 2.2) :

  backend/
  ├── app.py
  ├── models.py
  ├── run.py
  ├── modules/
  │   ├── module_parcours.py
  │   ├── module_gravure.py
  │   ├── module_etiquettes.py
  │   ├── module_prestashop.py
  │   └── module_strava.py
  ├── utils/
  │   ├── rate_limiter.py
  │   ├── circuit_breaker.py
  │   └── security.py
  ├── templates_dxf/
  ├── dxf_output/
  ├── templates_etiquettes/
  ├── etiquettes_output/
  └── migrations/

À IMPLÉMENTER (dans l'ordre)
-----------------------------
1. Tous les modèles SQLAlchemy (26 tables, section 4 et 28.2 du document)
2. Tous les endpoints API (section 5 du document)
3. Module gravure : génération DXF avec calques "repérage" et "gravures", batch, placeholders
4. Module étiquettes : templates HTML → PDF, génération numéro de suivi
5. Module Strava : OAuth, algorithme de détection GPS, webhook
6. Module PrestaShop : auth unique, import commandes (cron), push statuts, sync parcours
7. Module SAV express + défauts
8. Module chat (messagerie interne)
9. Module notifications : SMTP configurable, seuils de relance
10. Sécurité : rate limiting par route, circuit breaker (5 échecs → open 60s), backups, health check

RÈGLES ABSOLUES
---------------
- Format d'erreur uniforme : { "error": true, "code": "...", "message": "..." }
- Compatibilité SQLite / PostgreSQL (pas de types spécifiques PG)
- Démarrage sans seed : premier accès déclenche l'écran de setup (GET /api/setup)
- La route /api/setup est bloquée définitivement après création du super_admin
- Multi-domaine via Host header (une seule instance Flask)
- Tokens Strava chiffrés AES-256 en base

LIVRABLES
---------
- Tous les fichiers Python fonctionnels
- requirements.txt complet
- .env.example avec toutes les variables nécessaires
- run.py qui crée les tables et lance le serveur
