Skip to content

Devis Generator : VIBED sur main - #4

Merged
tainalo2 merged 26 commits into
mainfrom
vibed
Oct 28, 2026
Merged

tainalo2 merged 26 commits into
mainfrom
vibed

Conversation

@tainalo2

@tainalo2 tainalo2 commented Oct 25, 2026 •

Copy link
Copy Markdown
Owner

Objectif

Socle VIBED + auth + CRUD/PDF + sources légales + refonte UI/UX / landing / pages légales (draft, pas de merge / pas de tag image).

Correctif TEDB (prod 0.2.0)

  • Cause : l’appel SOAP utilisait le targetNamespace WSDL VatRetrievalService avec des enfants non qualifiés → TEDB-ERR-2 / « XSD validation failed » (HTTP 500), d’où le log legal fetch failed pour tedb.vat_rates.fr.
  • Correction : envelope IVatRetrievalService + enfants dans :types (memberStates / isoCode / situationOn) ; parse STANDARD/DEFAULT + REDUCED (ignore EXEMPTED) ; fixtures anonymisées + fault XSD.
  • Repli inchangé : échec upstream → append error, projection verified/manual conservée ; démarrage et émission de documents non bloqués ; statut visible via /api/v1/legal/status.

Ce lot (UI / site)

  • Design system (Fraunces + Geist, thème clair/sombre encre/teal), toasts, états vides, focus/ARIA
  • Shell : sidebar desktop / menu mobile ; tableau de bord (récents, brouillons, à encaisser)
  • Parcours document avec stepper + aperçu PDF en direct
  • Landing publique (CTA invité, fonctionnalités, conformité, dons, FAQ)
  • Mentions légales + confidentialité ; SEO, favicon, robots, sitemap, 404
  • DONATE_URL + LEGAL_PUBLISHER_* / LEGAL_HOST_* via GET /api/v1/public/config
  • Licence Apache explicite (LICENSE.APACHE-2.0)

Lots précédents

Auth, CRUD, PDF, sources légales (DINUM/VIES/TEDB/BCE), cache legal_values

Env

Obligatoires inchangés. Optionnelles : DONATE_URL, LEGAL_PUBLISHER_*, LEGAL_HOST_*, LEGAL_TEDB_URL, etc.

À compléter / valider

Identité éditeur & hébergeur, lien de don, validation juridique des pages légales, règle pénalités max(3×intérêt légal, BCE+10)

Open in Web Open in Cursor 

cursoragent and others added 2 commits October 25, 2026 16:45
Pose l'architecture Vibed sans toucher au site vanilla ni au
Dockerfile/workflow GHCR existants : API chi/pgx avec migrations,
package legal stub, front Vite/Tailwind/shadcn, compose et CI.

Co-authored-by: tainalo2 <[email protected]>
Nom officiel « Devis Generator : VIBED », LICENSE.vibed (Apache-2.0)
sans toucher au GPL racine, docs/DECISIONS.md, et migration initiale
alignée (types acompte/avoir, TVA par ligne, compteurs, password_hash).

Co-authored-by: tainalo2 <[email protected]>
@cursor cursor Bot changed the title WIP: Socle Vibed (Go + React + Postgres) WIP: Devis Generator : VIBED — socle Oct 25, 2026
cursoragent and others added 4 commits October 25, 2026 17:18
Ajoute vibed-release.yml (tags vibed-v*), sépare liveness/readiness,
retries Postgres + migrations avec verrou advisory, et documente les
variables d'environnement pour le déploiement multi-réplicas.

Co-authored-by: tainalo2 <[email protected]>
Le filtre v* matchait aussi vibed-v* ; on ajoute !vibed-v* pour
laisser les tags vX.Y.Z inchangés tout en isolant VIBED.

Co-authored-by: tainalo2 <[email protected]>
Inscription/connexion/déconnexion, moi, export RGPD et suppression
en cascade ; argon2id ; cookies HttpOnly/Secure/SameSite + CSRF ;
AES-GCM versionné ; SESSION_SECRET et ENCRYPTION_KEY documentés.

Co-authored-by: tainalo2 <[email protected]>
@cursor cursor Bot changed the title WIP: Devis Generator : VIBED — socle WIP: Devis Generator : VIBED — socle + auth Oct 25, 2026
@cursor cursor Bot changed the title WIP: Devis Generator : VIBED — socle + auth WIP: Devis Generator : VIBED — socle, auth, CRUD & PDF Oct 25, 2026
cursoragent and others added 2 commits October 25, 2026 17:58
API métier authentifiée, moteur billing (arrondis/multi-taux/franchise),
émission transactionnelle F-2026-0001, PDF gofpdf compte + invité,
chiffrement IBAN/adresses, front listes/édition en français.

Co-authored-by: tainalo2 <[email protected]>
…EDB, BCE)

Providers HTTP mockables avec timeout/rate-limit/retry, cache append-only
legal_values + projection legal_variables, refresh sous verrou advisory,
API statut/recherche/VIES (invité + anti-abus), UI autocomplétion et
page sources légales. Mentions d'émission remplacent defaults-v1 dès
qu'une valeur vérifiée existe. Insee/PISTE en stub ; API Entreprise exclue.

Co-authored-by: tainalo2 <[email protected]>
@cursor cursor Bot changed the title WIP: Devis Generator : VIBED — socle, auth, CRUD & PDF WIP: Devis Generator : VIBED — socle, auth, CRUD, PDF & sources légales Oct 25, 2026
Shell sidebar desktop / navigation mobile, tableau de bord, parcours
document avec aperçu PDF, design system (Fraunces + thème encre/teal),
landing publique, mentions et confidentialité (éditeur/hébergeur à
compléter), toasts, 404, robots/sitemap/favicon. Config publique
DONATE_URL et LEGAL_* ; licence Apache explicite (LICENSE.APACHE-2.0).

Co-authored-by: tainalo2 <[email protected]>
@cursor cursor Bot changed the title WIP: Devis Generator : VIBED — socle, auth, CRUD, PDF & sources légales WIP: Devis Generator : VIBED — socle, legal sources & UI/UX Oct 25, 2026
cursoragent and others added 16 commits October 25, 2026 18:26
Le décodage JSON échouait sur client.id="" ; GuestParty dédié pour
l’endpoint guest/pdf et l’aperçu en direct.

Co-authored-by: tainalo2 <[email protected]>
La prod échouait avec TEDB-ERR-2 / XSD validation failed car la requête
utilisait le targetNamespace WSDL VatRetrievalService et des enfants non
qualifiés. L'envelope valide lie IVatRetrievalService + :types. Ajoute
fixtures (réponse FR anonymisée + fault XSD) et préserve le repli verified.

Co-authored-by: tainalo2 <[email protected]>
Canvas Design construit sur le design system DevisUI : barre de
navigation, landing, éditeur de document (devis, facture, facture
d'acompte, mobile, modales client et émetteur), zonages et maquettes
complètes des autres pages en version bureau et mobile.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01AgucMgYwpHeh4eAUwAKTZA
- Navigation : barre d'en-tête unique (connecté / invité), menu du compte,
  panneau mobile ; logo dans l'en-tête et le pied de page.
- Pages refaites d'après design/maquettes : accueil, tableau de bord,
  documents, clients, fiche client, Entreprise, connexion, inscription,
  Mon compte, sources légales, mentions légales, confidentialité, 404.
- Éditeur : zones colorées (tokens clair/sombre), formulaire
  redimensionnable et aperçu A4, modales client et émetteur, facture
  d'acompte calculée depuis le devis, autosauvegarde, émission confirmée,
  parcours en trois étapes sur mobile.
- Document émis : suivi envoi / acceptation / paiement, documents liés,
  historique, avoir, conversion devis → facture, duplication.
- Backend : route POST /documents/{id}/status et migration 000005
  (sent_at, accepted_at, paid_at) ; le PDF d'un document émis utilise
  l'émetteur figé à l'émission.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- L'instantané émetteur enregistré à l'émission (documents.issuer_snapshot)
  contenait l'IBAN et l'adresse en clair. Ils sont désormais chiffrés
  (AES-256-GCM, même clé que issuer_profiles) et déchiffrés uniquement à la
  lecture par le propriétaire. Les instantanés existants sont rechiffrés au
  démarrage (SealLegacySnapshots, idempotent).
- Export CSV des documents : les cellules commençant par = + - @ sont
  préfixées d'une apostrophe pour empêcher l'injection de formules dans le
  tableur ; les montants restent numériques.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Un document émis relisait la fiche client à chaque affichage et à chaque
PDF : modifier ou supprimer un client changeait les factures déjà émises.

- Migration 000006 : documents.client_snapshot (nom, e-mail, adresse,
  SIREN, SIRET, TVA ; ni notes internes ni IBAN), adresse chiffrée.
- Émission : le client est figé avec l'émetteur ; le PDF et l'API
  utilisent cette copie. La liste des documents expose client_name.
- Démarrage : les documents déjà émis reçoivent une copie du client
  depuis sa fiche actuelle (idempotent).
- Front : aperçu, fiche latérale, listes et tableau de bord affichent le
  client figé ; texte de suppression d'un client corrigé.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Adresses clients : plus d'écriture dans les colonnes en clair
  (address_line1, address_line2, postal_code, city) ; au démarrage, les
  adresses existantes sont chiffrées puis ces colonnes vidées
  (SealClientAddresses, idempotent).
- Export RGPD : fiche Entreprise, clients et documents exportés
  déchiffrés via la couche métier (l'export lisait les colonnes en clair
  et omettait la fiche Entreprise).
- IP client : X-Forwarded-For n'est lu que depuis un proxy déclaré dans
  TRUSTED_PROXIES (adresse la plus à droite non fiable) ; suppression de
  middleware.RealIP. Limite de connexion par compte (10 / 15 min) en plus
  de la limite par IP.
- Dépendances : chi 5.5.0, pgx 5.11.0, x/text 0.43.0, x/crypto 0.58.0,
  golang-migrate 4.20.1 ; Go 1.26 minimum, toolchain 1.27.3, image de
  build golang:1.27. govulncheck : aucune vulnérabilité atteinte.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ants

- Requêtes API : corps limité à 1 Mio ; Origin, s'il est présent, doit
  correspondre au site ; un corps doit être en application/json (bloque
  la connexion forcée depuis un autre site via un formulaire text/plain).
  Le proxy Vite conserve Host pour que ce contrôle fonctionne en dev.
- Serveur : délais de lecture, d'écriture et d'inactivité, en-têtes de
  64 Kio maximum.
- En-têtes de sécurité : CSP stricte, X-Frame-Options DENY, nosniff,
  Referrer-Policy, Permissions-Policy, COOP, HSTS en HTTPS.
- Endpoints publics : PDF invité limité à 20/min par IP, calcul des totaux
  à 120/min pour les visiteurs sans compte.
- Calcul : 500 lignes et 2000 caractères par désignation maximum ;
  multiplication exacte (math/big) et plafond de 10 000 milliards d'euros
  au lieu d'un débordement silencieux d'int64.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…storique, CI

- Documents : création et modification refusent un client ou un document
  lié qui n'appartient pas au compte.
- Erreurs : les erreurs métier non liées à la validation ne sont plus
  renvoyées telles quelles (journalisées, message générique).
- Suppression du compte : mot de passe exigé, tentatives limitées.
- Cache VIES borné à 10 000 entrées.
- Site historique : saisies recopiées en texte (textContent, DOMParser
  pour les champs multilignes) au lieu d'innerHTML ; jsPDF 2.5.1 → 4.2.1
  (avis critiques et élevés corrigés). PDF vérifié dans le navigateur.
- CI : actions épinglées par SHA, Dependabot (actions, Go, npm).
- compose : Postgres et l'application n'écoutent que sur 127.0.0.1.
- .env.example : TRUSTED_PROXIES documenté.
- Front : composants morts retirés (aperçu iframe, ancien formulaire) ;
  colonne Date du tableau de bord masquée sous 1536 px.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…sécurité

- Intégration du design system et des maquettes (navigation, pages,
  éditeur, document émis).
- Client et émetteur figés à l'émission, chiffrés au repos.
- Correctifs de l'audit de sécurité : adresses chiffrées, IP fiable,
  dépendances, limites de requêtes, CSRF de connexion, en-têtes, montants,
  cloisonnement, suppression de compte, site historique, CI.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
« Docker release » construit le Dockerfile historique (site nginx) : lancé
sur vibed, il publiait l'ancien site au lieu de l'application.

- Workflows renommés : « Docker release (site historique nginx) » et
  « VIBED release (image Go + React) ».
- Docker release refuse les branches vibed et feature/* avec un message
  qui indique le bon workflow.
- Dockerfile.vibed : étapes de build sur la plateforme du runner et
  compilation croisée Go (TARGETARCH), sans émulation QEMU pour arm64.
- make image : construit Dockerfile.vibed (docker build . construit
  l'ancien site).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Sur le modèle de « Publication » de MyInfra :
- lancement manuel avec une version (0.3.0, 0.3.0-rc.1) et la branche à
  publier (vibed par défaut), ou push d'un tag vibed-vX.Y.Z ;
- vérifications Go et front avant toute publication ;
- image multi-architecture sur ghcr.io/tainalo2/devisgenerator-vibed
  (version, majeure.mineure et latest hors préversion) ;
- contrôle de l'image publiée : démarrage en production avec PostgreSQL,
  version renvoyée par /api/v1/healthz, front servi ;
- release GitHub vibed-vX.Y.Z avec compose.yaml prêt à déployer,
  env.example et SHA256SUMS.

Remplace « VIBED release ». La version est gravée dans le binaire
(ARG VERSION de Dockerfile.vibed) ; deploy/compose.vibed.yaml exige
POSTGRES_PASSWORD, ENCRYPTION_KEY et SESSION_SECRET.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Factur-X : XML CII au profil EN 16931
Le dépôt explique, pour un humain, un développeur et un agent, qu'il vise une plateforme gratuite pour signer les factures en France. La page dans docs/ est prête pour GitHub Pages.

Co-authored-by: Cursor <[email protected]>
Documentation et page de présentation
@tainalo2 tainalo2 changed the title WIP: Devis Generator : VIBED — socle, legal sources & UI/UX Devis Generator : VIBED sur main Oct 28, 2026
@tainalo2
tainalo2 marked this pull request as ready for review October 28, 2026 09:28
@tainalo2
tainalo2 merged commit e1e23c7 into main Oct 28, 2026
9 checks passed

This branch was successfully deployed

1 active deployment
github-pages — 172eaadb Deployed Oct 28, 2026 by tainalo2 via deploy #1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants