Tracker de vie auto-hébergé : suivi poids/calories/sport avec planning de pesées, sevrage tabac (vape) avec modèle de coût DIY et économies, et finances personnelles avec import de relevés bancaires. Architecture : FastAPI + SQLAlchemy 2.0 + PostgreSQL 16, React 18 + TS + Vite + Tailwind + ECharts, déploiement Docker Compose. Modules auto-découverts des deux côtés (pkgutil / import.meta.glob) et framework de connecteurs à deux voies (importeurs de fichiers + ingestion JSON) pour brancher de nouvelles sources sans toucher au noyau. Validé : 292 tests pytest, tsc + vite build, contrat API/web vérifié contre le schéma OpenAPI, et déploiement Docker réel sur PostgreSQL 16 (28 tables, SPA servie par nginx, wizard de premier démarrage). Documentation : README.md, docs/GUIDE.md, CONVENTIONS.md, et les documents de conception et de recherche dans docs/. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
51 lines
2.7 KiB
Markdown
51 lines
2.7 KiB
Markdown
# Addendum — Planning de suivi (jours de pesée, séances, journal)
|
|
|
|
> Demande utilisateur : « pour le suivi calorique/poids/sport il faut un genre de planning avec
|
|
> les jours de pesée, pouvoir noter la pesée du jour, etc. »
|
|
|
|
## Concept
|
|
|
|
Un **planning hebdomadaire par habitude** (pesée, séance de sport, journal alimentaire) +
|
|
une **checklist du jour** + un **suivi d'assiduité** (streaks, calendrier, %).
|
|
Le « fait / pas fait » est **dérivé des données existantes** — aucune double saisie :
|
|
|
|
| Habitude | Jour « fait » si… |
|
|
|---|---|
|
|
| `weigh_in` (pesée) | une `WeightEntry` existe ce jour local |
|
|
| `workout` (séance) | un `Workout` existe ce jour local |
|
|
| `food_log` (journal) | ≥ 1 `FoodEntry` ce jour local |
|
|
|
|
## Modèle (module `health`)
|
|
|
|
`tracking_schedules` : `id`, `user_id`, `kind` enum (`weigh_in`|`workout`|`food_log`,
|
|
`native_enum=False`), `weekdays` JSON (liste d'entiers, 0 = lundi … 6 = dimanche),
|
|
`enabled` bool — **une ligne max par (user, kind)** (contrainte unique). Pas de table de
|
|
check-ins en v1 (dérivation ci-dessus) ; habitudes personnalisées = v2.
|
|
|
|
## API (module `health`)
|
|
|
|
- `GET /api/health/schedules` → liste des 3 plannings (avec défauts désactivés si absents) ;
|
|
`PUT /api/health/schedules/{kind}` → upsert `{weekdays, enabled}`.
|
|
- `GET /api/health/today?tz=` → `{ date, items: [{kind, planned, done, value}], streaks }`
|
|
— `value` : poids saisi (kg) / nb de séances / kcal saisies du jour.
|
|
- `GET /api/health/stats/adherence?from&to&tz&kind=` → données prêtes pour un **calendar
|
|
heatmap ECharts** (par jour : `planned`/`done`/`missed`) + `% d'assiduité` (fait ÷ planifié),
|
|
`streak` courant et record par habitude (le streak ne compte que les jours planifiés).
|
|
|
|
## UX
|
|
|
|
- **Accueil** : carte « **Aujourd'hui** » en tête — checklist du jour : « Pesée » (✓ + valeur si
|
|
faite, sinon bouton **« Noter ma pesée »** ouvrant la modale rapide), « Séance », « Journal
|
|
alimentaire » (kcal saisies) ; badge streak « 🔥 n jours ». Les habitudes non planifiées
|
|
aujourd'hui sont grisées (« Repos »).
|
|
- **Page Poids & Objectif** : éditeur de planning (cases `L M M J V S D` + interrupteur),
|
|
carte « Pesée du jour » (planifiée / faite / manquée + CTA), **calendrier heatmap** des pesées
|
|
(vert = faite, contour = planifiée manquée), KPI « Assiduité 30 j » + streak.
|
|
- **Page Activité & Sport** : même motif pour les jours de séance planifiés.
|
|
- **Réglages → Objectif** : raccourci vers l'éditeur de planning.
|
|
|
|
## Empty states (français)
|
|
|
|
- Planning vide : « Aucun jour planifié. Choisis tes jours de pesée pour suivre ton assiduité. »
|
|
- Aujourd'hui, rien de planifié : « Rien de prévu aujourd'hui. Profites-en bien ! »
|