Commit Graph

1026 Commits

Author SHA1 Message Date
Colin Maudry 92e30979d9 fix(abonnement): erreur Dash au chargement de mes-infos en mode configure
Le callback _toggle_submit référence inf-cb-retractation/inf-cb-cgu en
Input sans condition, mais ces cases n'étaient rendues qu'en mode
"subscribe". Elles sont maintenant toujours montées (masquées et
pré-cochées en mode configure) pour que Dash trouve toujours ces ids.
2026-07-06 11:01:26 +02:00
Colin Maudry ad028b9e6b Rédactionnel 2026-07-06 10:49:08 +02:00
Colin Maudry fb3292d41e feat(admin): afficher l'email dans subscriptions et subscriber_state
user_id seul n'est pas assez parlant pour débugger ; jointure LEFT JOIN
sur users pour afficher l'email en colonne (lecture seule).
2026-07-06 10:42:53 +02:00
Colin Maudry e8f74aa529 feat(abonnement): message 'changement à la prochaine échéance' sous les cards (#109)
Ajoute la fonction _change_hint et étend le callback _select_plan pour afficher
un hint "changement à la prochaine échéance" quand l'utilisateur sélectionne
un plan différent du plan courant.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-05 20:46:54 +02:00
Colin Maudry 7ae5b75db9 feat(abonnement): mode configure sur mes-infos (formule préactivée, sans cases) (#109)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-05 20:42:09 +02:00
Colin Maudry a2962c2163 feat(abonnement): prix + bouton Configurer sur /compte/abonnement (#109)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-05 20:35:50 +02:00
Colin Maudry b04f97cb8c feat(abonnement): route /subscriptions/update (maj formule + facturation) (#109)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-05 20:31:42 +02:00
Colin Maudry 3645c098c2 feat(abonnement): client.change_subscription (PUT /v1/subscription) (#109)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-05 20:28:11 +02:00
Colin Maudry ee1f64a53b docs(abonnement): plan d'implémentation changement d'abonnement (#109)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 20:19:52 +02:00
Colin Maudry 6610f2d73e docs(abonnement): design changement d'abonnement depuis /compte/abonnement (#109)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 20:13:48 +02:00
Colin Maudry ee214677bd feat(abonnement): bouton changer de méthode de paiement sur /compte/abonnement
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-05 17:03:28 +02:00
Colin Maudry 081811bea7 feat(abonnement): route /subscriptions/change-payment-method 2026-07-05 16:52:16 +02:00
Colin Maudry ae98e2cec4 docs(abonnement): plan d'implémentation changement de méthode de paiement (#108) 2026-07-05 16:48:37 +02:00
Colin Maudry 1cfb3e91e2 feat(abonnement): client.get_payment_info_url pour le changement de carte Frisbii 2026-07-05 16:46:38 +02:00
Colin Maudry 7664fe368d docs(abonnement): design changement de méthode de paiement (#108) 2026-07-05 16:39:40 +02:00
Colin Maudry 3e3ba7c4f8 Utilisation de uv and pre-commmit avant git add dans CLAUDE 2026-07-05 00:03:06 +02:00
Colin Maudry 349fb17c90 feat(abonnement): sélection de formule par cartes cliquables dans mes-infos
Remplace la garde ?plan= (redirection si absent) par une sélection
interactive : deux cartes de formule (réutilisées de la page publique via
_plan_card) cliquables, un callback recopie le choix dans un champ caché
natif soumis avec le POST du formulaire. Le bouton de soumission reste
désactivé tant qu'aucune formule n'est choisie (en plus des cases à
cocher existantes).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 23:43:39 +02:00
Colin Maudry 315c500005 feat(abonnement): CTA connexion vers /a-propos/abonnement
Remplace le CTA du bas de /connexion ("Créer un compte avec mon adresse
email" → "/inscription") par un lien vers l'offre d'abonnement ("Pas encore
de compte ? Voir les abonnements" → "/a-propos/abonnement").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 23:39:06 +02:00
Colin Maudry 3b744d87f0 feat(abonnement): /compte/abonnement non-abonné affiche M'abonner/Me réabonner 2026-07-04 23:34:35 +02:00
Colin Maudry c5c63cb68e fix(abonnement): calcul du prix TTC robuste (évite les artefacts flottants)
Remplace le hack `str(int(prix_ht) * 1.2).replace('.0', '')` par
`round(prix_ht * 1.2, 2)` formaté avec `:g`, qui gère correctement les
prix qui ne multiplient pas proprement par 1.2 (ex: 24 -> 28.8 au lieu
de 28.799999999999997).

Le fichier src/pages/compte/abonnement.py contient le même bug mais
n'est pas touché ici : sa copie de _plan_card sera supprimée à la
tâche 4 du plan de refonte du tunnel d'abonnement.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 23:28:14 +02:00
Colin Maudry e904ec4a7d feat(abonnement): page publique avec cards et bouton Je m'abonne conditionnel
La page publique /a-propos/abonnement affiche désormais les cards de
formule (informatives, sans bouton par card), un explainer des
fonctionnalités, et un unique CTA "Je m'abonne" dont la cible dépend
de l'état d'authentification/abonnement. Retrait de la sous-section
"Fonctionnalités incluses" des CGU (doublon avec l'explainer).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 23:21:19 +02:00
Colin Maudry 6464baebd2 feat(auth): auto-login à la validation d'email, redirection vers mes-infos
Quand l'utilisateur valide son email, il est maintenant connecté automatiquement
via login_user() et redirigé directement vers /compte/abonnement/mes-infos
au lieu de /connexion?verified=1.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 23:16:29 +02:00
Colin Maudry cc2b34e84a feat(abonnement): linkedin_button paramétrable par next, inscription vers mes-infos
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 23:13:11 +02:00
Colin Maudry a24a96288d Task 6 : sélection de formule par cartes cliquables (au lieu de RadioItems)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 23:05:32 +02:00
Colin Maudry 38743cfb95 Plan d'implémentation refonte tunnel abonnement (+ correction spec radios Dash 3.4)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 22:56:29 +02:00
Colin Maudry b89da05c84 Spec : refonte du tunnel d'abonnement (offre publique)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 22:46:43 +02:00
Colin Maudry e44e2940fc Tous les libellés de sources apparaissent dans la matrice 2026-07-04 20:50:30 +02:00
Colin Maudry c748cb944e Déplacement de la matrice de doublon vers Données 2026-07-04 20:44:41 +02:00
Colin Maudry c9ece32601 Rédactionnel, tableau étapes dans Donnéees 2026-07-04 20:19:51 +02:00
Colin Maudry 6256adf826 Taille du point de l'org 2026-07-03 23:31:24 +02:00
Colin Maudry 1551faaf0c Normaliser les échecs d'écriture set_cell en ValueError
- IntegrityError (ex: email déjà utilisé) est désormais capturée et
  reconvertie en ValueError, pour rester dans le funnel d'alerte
  existant du callback admin au lieu de faire planter le callback Dash.
- Une UPDATE qui touche 0 ligne (ligne supprimée entre le chargement du
  tableau et la soumission de l'édition) lève désormais une ValueError
  au lieu d'être silencieusement traitée comme un succès (ce qui aurait
  créé un log d'audit trompeur).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-03 23:10:32 +02:00
Colin Maudry eb8f54dbf2 fix(figures): calculer center/zoom côté serveur au lieu d'utiliser bounds
La prop `bounds` de dash-leaflet lève une exception JS (TypeError sur
.equals() avec une valeur précédente indéfinie) au tout premier montage
du composant Map — confirmé via la stack trace navigateur, reproductible
même en dernière version (1.1.3). Cette exception laissait le clustering
dans un état incohérent (declustering impossible avant un zoom complet
suivi d'un dézoom).

bounds_to_center_zoom calcule un center/zoom approximatifs (projection
Web Mercator, taille de conteneur supposée) pour cadrer l'organisme et
ses contreparties, en évitant complètement la prop `bounds` bugguée.
Cadrage moins précis qu'un vrai fitBounds() navigateur, mais robuste.
2026-07-03 22:54:21 +02:00
Colin Maudry 6739e4926b test(admin): add end-to-end Selenium coverage for the generic table editor
Covers anonymous/non-admin access (404), and the full admin flow: switch
table, edit a subscriptions.prix_ht cell through the real DataTable UI,
verify the write lands in the DB, and verify the edit is logged and
visible in the admin_actions table.

tests/users.test.sqlite is committed and shared by the whole Selenium
session, so _cleanup_user deletes every row the tests create. Beyond
resetting sqlite_sequence (already needed for the AUTOINCREMENT
counter), a plain DELETE also leaves stale, never-zeroed bytes behind
in the admin_actions/subscriptions b-tree pages once they go back to
zero rows, which byte-diffs the file even though its logical content
is unchanged. VACUUM rebuilds the file from live data only, producing
a deterministic page layout (verified empirically across independent
runs with different random test data). Re-baselined the fixture to
that canonical vacuumed state so `git status` stays clean after
running the suite.
2026-07-03 22:43:53 +02:00
Colin Maudry 9d3b0dd068 fix(figures): réactiver l'animation du fitBounds sur les cartes organisme
animate: False (ajouté pour contourner le point organisme surdimensionné,
désormais résolu via un rendu en icône) empêchait apparemment la
bibliothèque de clustering de recalculer correctement son arbre de
clusters par niveau de zoom au montage, bloquant le declustering des
contreparties jusqu'à un zoom complet suivi d'un dézoom.
2026-07-03 22:34:26 +02:00
Colin Maudry e763a0b878 Taille du point de l'org 2026-07-03 22:29:04 +02:00
Colin Maudry 86977bd37e fix(figures): rendre le point de l'organisme en icône plutôt qu'en circleMarker
bringToFront() sur un circleMarker SVG (overlayPane) ne pouvait pas passer
devant les bulles de cluster (markerPane, toujours au-dessus dans l'ordre
des panes Leaflet), et le rendu SVG se redimensionnait visuellement pendant
l'animation de zoom. Le point is_home est maintenant un L.marker + divIcon
(comme les clusters), avec zIndexOffset élevé : toujours au premier plan et
taille constante quel que soit le zoom.
2026-07-03 22:17:54 +02:00
Colin Maudry f1c28acc96 feat(figures): mettre en avant le point de l'organisme consulté sur la carte
Marque is_home=True sur les marqueurs du home_type (acheteur ou titulaire
selon la page) dans get_org_location_map. Côté client, pointToLayer donne
à ce point un rayon légèrement plus grand (8 vs 5) et le ramène toujours
au premier plan (bringToFront), indépendamment de l'ordre des couches.
2026-07-03 22:08:43 +02:00
Colin Maudry a96f772d7a fix(figures): désactiver l'animation du fitBounds sur les cartes organisme
Un fitBounds animé interrompu (deux Input sur pathname+année pouvant
re-déclencher le callback quasi simultanément) laissait le transform CSS
de zoom de Leaflet figé à une grande échelle (ex: scale(16)), faisant
apparaître les marqueurs individuels démesurément gros sur /acheteurs et
/titulaires. Constaté en vérification manuelle sur test.colibre.fr.
2026-07-03 16:43:04 +02:00
Colin Maudry 22dd49f337 docs(figures): corriger le commentaire d'ordre des couches GeoJSON
Le commentaire affirmait à tort que l'organisme consulté est toujours
peint au-dessus de sa contrepartie ; l'ordre est en réalité fixe
(titulaire puis acheteur), indépendant de home_type. Relevé par la
revue finale de branche.
2026-07-03 16:15:13 +02:00
Colin Maudry acb8d5e0d1 feat(titulaire): afficher les acheteurs sur la carte de la fiche titulaire
Supprime point_on_map, devenue inutilisée après migration des deux pages
vers get_org_location_map.
2026-07-03 16:10:02 +02:00
Colin Maudry d201b7a3c6 feat(acheteur): afficher les titulaires sur la carte de la fiche acheteur 2026-07-03 16:05:05 +02:00
Colin Maudry 8b69fee31c feat(figures): ajouter get_org_location_map (carte cluster organisme + contrepartie) 2026-07-03 15:59:47 +02:00
Colin Maudry 21d3a30d8b refactor(figures): extraite build_org_markers pour réutilisation 2026-07-03 15:55:29 +02:00
Colin Maudry ad872d3b2c docs: ajouter le plan d'implémentation des cartes acheteur/titulaire 2026-07-03 15:48:32 +02:00
Colin Maudry f301c2ab0f docs: ajouter le design des cartes acheteur/titulaire avec contrepartie 2026-07-03 15:15:46 +02:00
Colin Maudry caf800e5e8 fix(admin): guard find_changed_cell against cross-table schema mismatch
When switching tables, the table-switch branch writes fresh data for the
new table, which re-fires the same callback with data_previous still
holding the old table's rows. find_changed_cell only checked row count
before diffing, so if the two tables happened to have the same number of
rows it would zip mismatched-schema dicts and report a spurious changed
cell (usually the PK column), producing a confusing red alert right after
switching tables.
2026-07-03 14:46:12 +02:00
Colin Maudry d229b58f3b feat(admin): replace dedicated pages with a generic table editor at /admin 2026-07-03 14:19:01 +02:00
Colin Maudry cf23863a30 refactor(admin): apply formatting fixes from linter hooks 2026-07-03 13:04:15 +02:00
Colin Maudry 19991dd22f Ajouter le plan d'implémentation de l'éditeur générique de tables (/admin) 2026-07-03 12:34:22 +02:00
Colin Maudry 6bec76535c Remplacer le design du panneau admin par un éditeur générique de tables
Pivot avant merge : au lieu de pages dédiées par cas d'usage, une seule
page /admin avec sélecteur de table + édition de cellule DataTable,
plus facile à faire évoluer au fil des besoins de support.
2026-07-03 12:27:04 +02:00