# MyInfoMate Crèche — Spécification technique et fonctionnelle ## Contexte MyInfoMate Crèche est une déclinaison (Flutter flavor) de la solution MyInfoMate destinée aux crèches et milieux d'accueil de la petite enfance. Une instance = une crèche. L'objectif : remplacer les carnets papier, les appels téléphoniques intempestifs et les groupes WhatsApp par une app professionnelle aux couleurs de la crèche. --- ## Nouveaux rôles | Rôle | Description | |------|-------------| | `Director` | Responsable de la crèche — accès complet au manager-app | | `Educator` | Puéricultrice/trice — encodage des journaux quotidiens et des activités | | `Parent` | Accès lecture seule — journal de son/ses enfant(s) uniquement | Les rôles `Director` et `Educator` utilisent le manager-app (web). Les `Parent` utilisent l'app mobile. > **Note :** `User` reste l'entité existante (côté manager-app). `Parent` est une nouvelle entité côté mobile, distincte de `User`, liée à un ou plusieurs `Child`. Même séparation que `Member` dans la déclinaison Sport. --- ## Nouvelles entités backend ### `Child` ``` Id, FirstName, LastName, BirthDate, PhotoUrl GroupId (FK → Group) InstanceId (FK → Instance) ``` ### `Group` ``` Id, Name, Color, EducatorId (FK → User, nullable) InstanceId (FK → Instance) ``` Exemples : "Les Poussins", "Les Lutins", "Les Papillons" ### `Parent` ``` Id, FirstName, LastName, Email, PhoneNumber InstanceId (FK → Instance) ``` Relation many-to-many `Parent ↔ Child` (deux parents peuvent avoir le même enfant). Auth par email/password ou magic link email (comme Member dans Sport). ### `DailyReport` ``` Id, ChildId (FK), Date, EducatorId (FK → User) Meals: { Morning: string, Noon: string, Afternoon: string } Naps: [ { Start: DateTime, End: DateTime } ] Diapers: [ { Time: DateTime, Type: enum (Wet/Dirty/Both) } ] Mood: enum (Happy, Calm, Tired, Difficult) Note: string? Activities: string? ``` Stocké en JSONB pour Meals, Naps, Diapers (listes variables). ### `DailyReportPhoto` ``` Id, DailyReportId (FK), ResourceId (FK → Resource), Caption: string? ``` ### `Announcement` ``` Id, Title, Body, PinnedUntil: DateTime?, TargetGroupId: string? (null = toute la crèche) AuthorId (FK → User), InstanceId, CreatedAt ``` --- ## App mobile parents ### Navigation (bottom bar) | Onglet | Contenu | |--------|---------| | Accueil | Annonces épinglées, dernier journal de chaque enfant, météo | | Journal | Historique des journaux quotidiens de l'enfant sélectionné | | Galerie | Photos de l'enfant (issues des journaux) | | Infos | Horaires de la crèche, règlement, contacts, carte | Si un parent a plusieurs enfants : sélecteur d'enfant en haut de l'écran (comme le sélecteur d'équipe dans Sport). ### Écran Accueil - Carte de bienvenue avec photo et prénom de l'enfant - Météo (module existant MyInfoMate) - Dernière annonce épinglée de la crèche - Résumé du dernier journal : humeur (emoji), repas (oui/non), dernière sieste ### Écran Journal — détail d'un jour - Humeur (icône colorée) - Repas : matin / midi / goûter (texte libre) - Siestes : heures de début/fin - Changes : nombre et type - Note de la puéricultrice - Photos du jour ### Notifications push - Nouveau journal disponible → notification au(x) parent(s) concerné(s) - Nouvelle annonce importante → notification à toute la crèche ou groupe ciblé - Rappel d'absence à déclarer (optionnel, V2) --- ## Manager-app — adaptations ### Onglet "Enfants" (nouveau) - Liste des enfants par groupe - Fiche enfant : infos, liste des parents associés, historique des journaux - Ajout/modification/archivage d'un enfant - Invitation des parents par email ### Onglet "Groupes" (nouveau) - Création et gestion des groupes - Assignation des enfants et de l'éducatrice référente ### Onglet "Journal quotidien" (nouveau — Educator + Director) **Vue liste — point d'entrée** - Date en haut (flèches gauche/droite pour naviguer, défaut : aujourd'hui) - Filtre par groupe (si l'éducatrice a plusieurs groupes) - Liste des enfants du groupe : photo + prénom + badge statut (À compléter / Complété / Absent) - Tap sur un enfant → ouvre le panneau d'encodage (pas une nouvelle page — drawer ou bottom sheet pour rester dans le flux) **Panneau d'encodage rapide (par enfant)** Tout inline, dans l'ordre naturel de la journée : 1. **Présence** — présent / absent (si absent, le reste est masqué) 2. **Arrivée / Départ** — heure d'arrivée et heure de départ (time picker, saisie manuelle ou tap "maintenant") 3. **Humeur** — rangée de 5 icônes colorées (très heureux → difficile), un tap 4. **Repas** - 3 lignes : Matin / Midi / Goûter - Chips prédéfinis par ligne : "Bien mangé" / "Peu mangé" / "Refusé" + champ texte optionnel pour le détail 5. **Siestes** — bouton "+ Ajouter une sieste" → saisie heure début / fin (time picker) - Affiche les plages ajoutées en chips supprimables 6. **Changes** — compteur +/- avec sélecteur type (Mouillé / Sale / Les deux) 7. **Note** — champ texte libre, optionnel 8. **Photos** — bouton appareil photo + galerie, aperçu des photos ajoutées 9. **Bouton "Envoyer"** en bas, sticky — notifie les parents immédiatement **Principes UX à respecter** - Zéro navigation entre les enfants : fermer le panneau → retour liste → tap suivant - Encodage minimum viable (humeur + présence) = 2 taps, 10 secondes - Encodage complet = ~30 secondes par enfant - L'éducatrice peut encoder en plusieurs fois dans la journée (sieste le matin, repas à midi, note en fin de journée) — les données sont sauvegardées à chaque modification - "Envoyer" déclenche la notification push aux parents — distinct de la sauvegarde automatique ### Onglet "Annonces" (nouveau) - Création d'annonces (titre, corps, date d'expiration, groupe cible) - Historique des annonces envoyées ### Sections de contenu existantes réutilisées Les sections suivantes de MyInfoMate sont directement utiles sans adaptation : - `SectionArticle` → règlement intérieur, documents importants - `SectionAgenda` → agenda des activités, fermetures exceptionnelles - `SectionMap` → plan d'accès à la crèche - `SectionWeather` → météo sur la page d'accueil --- ## Stratégie code commun | Composant | Réutilisation | |-----------|---------------| | Backend `manager-service` | Identique — nouvelles entités ajoutées, aucune entité modifiée | | `Instance` | Identique — une crèche = une instance | | Sections de contenu | Identiques — toutes réutilisables | | Push notifications | Identiques — même service FCM | | Auth JWT + API Key | Identiques | | `manager-app` | Code commun + nouveaux onglets conditionnels selon le `InstanceType` | | App mobile | Nouveau flavor Flutter `myinfomate_creche` — UI spécifique, même client API | ### `InstanceType` (à ajouter sur `Instance`) ```csharp public enum InstanceType { Generic, Sport, Creche } public InstanceType Type { get; set; } = InstanceType.Generic; ``` Le manager-app affiche les onglets conditionnellement selon ce type. Pas de duplication de code. --- ## V1 — Périmètre de lancement - Journal quotidien complet (repas, siestes, changes, humeur, note, photos) - Annonces crèche/groupe - App mobile parents avec notifications - Gestion des enfants, groupes, parents dans manager-app - Sections de contenu (règlement, carte, agenda) ## V2 — Évolutions - **Déclaration d'absences** — parent déclare l'absence de son enfant dans l'app - **Galerie partagée** — album photos du groupe (pas nominatif, sur opt-in) - **Signature électronique** — entrée/sortie de l'enfant (RGPD) - **Carnet de santé** — vaccins, poids, taille (données sensibles, chiffrement renforcé) - **Facturation** — export des présences pour calcul de la facturation (format ONE/Kind & Gezin) --- ## Pricing suggéré - **Pilote** : gratuit 3 mois - **Standard** : 40-50€/mois par crèche - Pas de quota IA ni de module arbitrage → coût infra plus faible - **White-label** (Flutter flavor aux couleurs de la crèche) : option sur demande, pas inclus par défaut --- ## Points RGPD à anticiper - Données de mineurs → consentement parental obligatoire - Photos des enfants → opt-in par parent, pas de partage entre familles par défaut - Durée de conservation → supprimer les données à la fin du contrat d'accueil - Hébergement en UE obligatoire (déjà le cas : VPS OVH Belgique)