📋 Release Notes

Sprint S63

Portail Client complet · Eliot tools étendus · Email nodemailer · Harmonisation charte docs

📅 1er avril 2026 🔀 3 commits (dont 94 fichiers docs) 📄 3 846 lignes custom-routes.ts 🖥️ 106 pages UI 🔌 ~115 routes API
11
Routes Portail Client
3
Nouveaux tools Eliot
2
Pages TSX Portail
94
Fichiers docs harmonisés
85
Score global /100
🔗 Portail Client — Routes API ROUGE

11 routes déployées via instance.use()

POST /portail/auth/login POST /portail/auth/logout GET /portail/animaux GET /portail/seances GET /portail/factures GET /portail/notifications GET /portail/admin/acces POST /portail/admin/acces PUT /portail/admin/acces/:id/toggle POST /portail/admin/acces/:id/send-link POST /portail/seances/:id/confirmer

Corrections colonnes BDD réelles appliquées

  • portail_client_acces : PCA_ID, PCA_TOKEN, PCA_ACTIF, PCA_DATE_EXPIRATION, PCA_EMAIL, TIE_ID
  • portail_client_session : PCS_SESSION_TOKEN, PCS_DATE_FIN, PCS_ACTIF, PCA_ID
  • animal : ANI_CLI (pas TIE_ID), ANI_PUC (pas ANI_PUCE)
  • seance : SEA_DATE_DEBUT (pas SEA_DATE)
  • tiers : TIE_RAISON_SOCIALE (pas TIE_NOM/TIE_PRENOM)
  • reglement : pas de REG_STATUT — colonnes réelles : REG_ID, FAC_ID, REG_DATE, REG_MONTANT, REG_MODE, REG_REFERENCE

Helper _readBody() obligatoire sur tous les POST

NestJS ne parse pas le body avant instance.use(). Toutes les routes POST portail utilisent désormais le helper _readBody() pour parser le corps de la requête.

🖥️ Portail Client — Pages frontend ROUGE

/client/[token] — Espace client public

Login automatique via token URL, 3 onglets : Séances / Factures / Animaux. Confirmation de séance intégrée.

/app/parametres/portail — Page admin portail

  • Select client (500 tiers chargés, filtrage local)
  • Email pré-rempli depuis TIE_EMAIL avec badge "depuis la fiche client"
  • Actions : 📋 Copier le lien · ✉️ Envoyer par email · ✓/✗ Activer/Désactiver
  • Stats : accès créés / actifs / connexions totales

4 points d'entrée vers le portail

  • URL directe : http://[host]/client/[TOKEN_64_chars]
  • Sidebar : Communauté → 🔗 Portail Client
  • Liste clients : bouton "🔗 Portail" par ligne → mini-modal
  • Fiche client : bouton "🔗 Portail" dans le header

✅ Test portail validé S63

TIE_ID=1 (Deneuve, Catherine) — Login OK, 5 animaux, 4 séances, 8 factures affichés correctement.

📧 Email — Vrai envoi nodemailer ORANGE

nodemailer ^6.9.14 intégré dans l'API

  • Tool Eliot send_email → vrai envoi nodemailer (lit param_smtp, génère PDF, envoie avec PJ)
  • Route POST /portail/admin/acces/:id/send-link → envoie lien portail par email
  • Route PUT /param-smtp → sauvegarde config SMTP depuis l'UI

✅ Test email validé

SMTP : smtp.gmail.com:465, App Password configuré. Email reçu sur nicolashermilly@gmail.com.

🤖 Eliot — Nouveaux tools S63 ORANGE

3 nouveaux tools fonctionnels

  • update_statut_devis — Transitions BROUILLON→ENVOYE→ACCEPTE→REFUSE→ANNULE ✅
  • create_facture_depuis_devis — Convertit devis ACCEPTE en facture via /devis/:id/facturer
  • create_reglement — INSERT reglement sans REG_STATUT (colonnes réelles) ✅

⚠️ Dette à corriger en S64

3 tools (update_statut_devis, create_facture_depuis_devis, create_reglement) apparaissent en doublon dans la liste déclarée (pas dans l'implémentation). À nettoyer.

📚 Documentation — Harmonisation charte

94 fichiers harmonisés — harmoniser_charte.py

Script Python appliqué sur l'ensemble des fichiers HTML de C:\AnimGest_Sav. Design system Anim'Gest (navy/gold, Playfair Display + DM Sans, nav sticky) uniformisé sur toute la documentation.

Scripts d'inspection permanents

  • mon_script.py — inspection complète de custom-routes.ts : routes, app.use() / instance.use(), getDb(), tools Eliot, colonnes problématiques
⚠️ Dette technique identifiée

102 app.use() restants → migrer vers instance.use()

Migration progressive par module planifiée (formules, devis, factures…). 48 routes déjà migrées en S63.

4 createConnection sur BDD GED (lignes 2286, 2317, 2355, 2393)

À remplacer par un helper getDbGed() pour uniformiser la gestion des connexions.

REG_STATUT résiduel dans un INSERT reglement

Colonne inexistante encore présente dans un INSERT (~L56376). À supprimer en S64.

🔀 Commits S63
HashDescriptionRepo
b687f04S63 - Portail Client complet + Eliot tools S63 + Email nodemailer + Sidebarmicro_logiciel
4a7b95eS63 - Handover finalpetsuite-docs
fbe0e7dcharte: harmonisation design system Anim'Gest — 94 fichierspetsuite-docs
📊 Scores qualité S63
Backend
85
S62 : 84 ▲ +1
Frontend
84
S62 : 82 ▲ +2
BDD
85
S62 : 85 — stable
Global
85
S62 : 83 ▲ +2

Routes API : ~115 · Pages UI : 106 · Eliot tools : 10 (déclarés : 13 avec doublons à corriger)