Le Bailleur rencontre une accumulation d'incohérences visuelles, de retours d'opération ambigus et de parcours bloquants dans les formulaires du Profil bailleur, des Locataires, du Bail, de l'Inventaire du mobilier et de l'État des lieux. Certaines actions réussissent sans retour visible, certains échecs sont présentés comme des erreurs génériques, les contrôles changent de comportement selon la page ou le navigateur et plusieurs mises en page deviennent difficiles à utiliser sur ordinateur ou mobile.
Ces problèmes ne sont pas uniquement cosmétiques. Les Pièces jointes des Locataires sont modifiables depuis une carte de liste au lieu de leur formulaire, l'ajout d'une Garantie locative est confus, la série IRL n'est pas réellement présélectionnée, un Appartement sans Espace privatif mène à une erreur d'Inventaire non actionnable et un même meuble peut être constaté deux fois dans l'État des lieux. Le Bailleur ne peut donc pas distinguer clairement une donnée manquante, une opération en cours, une réussite ou une incohérence de modèle.
Solution
Unifier les parcours concernés autour des composants Angular Material déjà installés, des contrats d'erreur structurés existants et des règles du domaine. Chaque opération observable expose un état de chargement, une réussite transitoire ou un échec récupérable à l'endroit où le Bailleur agit. Les formulaires conservent les saisies après échec, restent utilisables au clavier et sur mobile et n'ajoutent aucune dépendance d'interface.
Le parcours Locataire permet de sélectionner plusieurs fichiers en attente avant la première création, puis crée le Locataire et téléverse chaque fichier avec reprise individuelle. Le Bail distingue désormais les Garanties locatives apportées par un Garant personne physique, un Organisme garant ou une Garantie Visale. Le contrat Visale est validé avant la signature, conservé séparément du PDF unique et lié à sa Révision par son empreinte.
L'Inventaire du mobilier expose un prérequis actionnable lorsqu'aucun Espace privatif n'existe, utilise toute sa largeur de formulaire et revient aux Baux après enregistrement. L'État des lieux adopte une navigation verticale lisible, découpe chaque Espace privatif en panneaux, conserve une confirmation unique par Étape de visite et fait de la ligne d'Inventaire l'unique constat du meuble correspondant.
User Stories
En tant que Bailleur, je veux que le spinner et le texte du bouton d'enregistrement du Profil bailleur restent centrés, afin de comprendre que le même bouton est toujours actif pendant l'opération.
En tant que Bailleur, je veux que le bouton du Profil bailleur conserve une largeur stable pendant l'enregistrement, afin d'éviter un déplacement visuel inattendu.
En tant que Bailleur, je veux voir une icône calendrier explicite sur chaque champ de date, afin de pouvoir ouvrir le sélecteur sans dépendre du comportement du navigateur.
En tant que Bailleur, je veux pouvoir saisir une date au clavier ou la choisir dans le calendrier, afin d'utiliser le mode le plus adapté à ma situation.
En tant que Bailleur, je veux que les calendriers utilisent la présentation française, afin de lire les jours, mois et semaines sans ambiguïté.
En tant que Bailleur, je veux que toutes les dates civiles conservent le jour choisi sans conversion UTC, afin d'éviter un décalage de date.
En tant que Bailleur, je veux retrouver le même sélecteur sur tous les formulaires, afin de ne pas réapprendre le contrôle selon le parcours.
En tant que Bailleur, je veux ajouter et supprimer les Pièces jointes uniquement depuis la création ou l'édition d'un Locataire, afin de regrouper toutes ses modifications dans un même parcours.
En tant que Bailleur, je veux continuer à télécharger une Pièce jointe depuis la liste des Locataires, afin de la consulter sans ouvrir le formulaire.
En tant que Bailleur, je veux que la carte d'un Locataire soit en lecture seule pour ses Pièces jointes, afin d'éviter une modification accidentelle depuis la liste.
En tant que Bailleur, je veux sélectionner plusieurs fichiers en attente avant la première création du Locataire, afin de préparer son dossier en une seule fois.
En tant que Bailleur, je veux voir la liste des fichiers en attente avant l'enregistrement, afin de vérifier ce qui sera envoyé.
En tant que Bailleur, je veux retirer un fichier de la sélection avant l'enregistrement, afin de corriger une erreur sans recommencer le formulaire.
En tant que Bailleur, je veux que « Créer le locataire » enchaîne la création puis les téléversements, afin de ne pas devoir quitter le formulaire pour ajouter les documents.
En tant que Bailleur, je veux que le formulaire passe en mode édition dès que le Locataire est créé, afin que les téléversements utilisent son identité persistée.
En tant que Bailleur, je veux qu'un échec de création conserve tous les fichiers en attente sans démarrer leur envoi, afin de corriger le formulaire puis de réessayer.
En tant que Bailleur, je veux que la création du Locataire reste acquise si un fichier échoue et réessayer uniquement les fichiers en échec, afin de ne recréer ni la personne ni les Pièces jointes déjà stockées.
En tant que Bailleur, je veux que chaque fichier expose sa propre progression, réussite ou erreur, afin de savoir exactement ce qui reste à faire.
En tant que Bailleur, je veux que les fichiers en échec restent disponibles tant que le formulaire est ouvert, afin de pouvoir réessayer sans les rechercher.
En tant que Bailleur, je veux empêcher une double création ou un double téléversement pendant une opération en cours, afin d'éviter les doublons.
En tant que Bailleur, je veux une aide sur les choix contractuels dont la conséquence n'est pas évidente, afin de comprendre ce que j'inscris dans le Bail.
En tant que Bailleur utilisant une souris, je veux ouvrir l'aide au survol ou au clic, afin de consulter rapidement une explication.
En tant que Bailleur utilisant un clavier, je veux atteindre et ouvrir chaque aide au focus, afin de ne pas dépendre du pointeur.
En tant que Bailleur sur écran tactile, je veux ouvrir l'aide par une action explicite, afin de ne pas dépendre du survol.
En tant que Bailleur, je veux voir des exemples concrets dans l'aide lorsqu'ils clarifient le choix, afin de pouvoir décider avec confiance.
En tant que Bailleur, je veux éviter une icône redondante sur une attestation déjà explicite ou une clause déjà décrite, afin de garder le formulaire lisible.
En tant que Bailleur, je veux que la série IRL soit réellement présélectionnée depuis le département de l'Appartement, afin de ne pas recopier une référence connue.
En tant que Bailleur d'un Appartement métropolitain hors Corse, je veux obtenir la série 001515333, afin d'utiliser l'identifiant INSEE officiel plutôt que la valeur erronée de la demande initiale.
En tant que Bailleur d'un Appartement en Corse ou dans un territoire ultramarin pris en charge, je veux obtenir respectivement la série 010760507 ou 010760509, afin de ne pas appliquer la série métropolitaine universellement.
En tant que Bailleur, je veux que la présélection remplisse seulement un nouveau champ vide et que la série persistée devienne un fait du Bail, afin qu'une correction ou un changement ultérieur d'adresse ne la remplace pas silencieusement.
En tant que Bailleur, je veux que les libellés des Travaux récents apparaissent au-dessus de leurs champs, afin de comprendre immédiatement quelle valeur saisir.
En tant que Bailleur sur ordinateur, je veux que le montant puis la description des Travaux récents occupent chacun une ligne complète, afin que les champs ne suivent pas le texte horizontalement.
En tant que Bailleur sur mobile, je veux conserver cette présentation mono-colonne, afin d'éviter une grille trop étroite.
En tant que Bailleur, je veux voir initialement un seul bouton centré « Ajouter une garantie », afin de ne pas être confronté à un formulaire vide permanent.
En tant que Bailleur, je veux n'avoir qu'une Garantie locative inachevée à la fois, afin de savoir quel formulaire bloque l'enregistrement.
En tant que Bailleur, je veux annuler une Garantie locative inachevée sans modifier les autres, afin de revenir proprement au Bail.
En tant que Bailleur, je veux qu'une Garantie locative validée se replie en carte récapitulative, afin de réduire la longueur du formulaire.
En tant que Bailleur, je veux modifier ou supprimer une Garantie locative depuis sa carte, afin de corriger le brouillon explicitement.
En tant que Bailleur, je veux voir « Ajouter une autre garantie » après une première saisie valide, afin d'ajouter plusieurs Garanties sans ambiguïté.
En tant que Bailleur, je veux que la rubrique « Garanties du bail » me permette de choisir entre Garant personne physique, Organisme garant et Garantie Visale, afin de représenter la couverture réellement utilisée sans présenter Visale comme un Garant.
En tant que Bailleur, je veux renseigner une personne physique avec prénom, nom et e-mail obligatoires et téléphone et adresse facultatifs, afin de conserver le contrat actuel.
En tant que Bailleur, je veux identifier un Organisme garant par sa dénomination, son siège et son représentant, afin de ne pas le forcer dans des champs prénom et nom.
En tant que Bailleur, je veux renseigner facultativement l'immatriculation, l'e-mail et le téléphone d'un Organisme garant, afin de conserver les informations disponibles sans bloquer les organismes qui n'en disposent pas.
En tant que Bailleur, je veux que chaque Garantie apportée par une personne physique ou un Organisme désigne explicitement un Locataire du Bail, afin que les Actes exigés proviennent des seuls couples Garant–Locataire déclarés.
En tant que Bailleur, je veux téléverser avant la Finalisation un Acte signé distinct pour chaque couple Garant–Locataire déclaré et attester sa correspondance, afin que chaque engagement soit vérifiable et conservé avec son auteur, son horodatage UTC et son empreinte SHA-256.
En tant que Bailleur, je veux déclarer une Garantie Visale unique pour l'ensemble exact des Locataires figurant sur le visa, afin de refléter le contrat réel.
En tant que Bailleur, je veux voir la couverture Visale auprès de chaque Locataire concerné sans dupliquer la garantie, afin de comprendre qui est couvert.
En tant que Bailleur, je veux renseigner obligatoirement le numéro du visa, afin d'identifier la Garantie Visale.
En tant que Bailleur, je veux pouvoir conserver facultativement le PDF du visa certifié, afin de garder la preuve reçue du Locataire.
En tant que Bailleur, je veux téléverser le contrat de cautionnement Visale validé avant de générer le dossier unique, afin que le Bail ne soit pas signé avant l'activation de la garantie.
En tant que Bailleur, je veux conserver le contrat Visale séparément du PDF signé par les parties, afin de ne pas leur faire signer un contrat déjà validé auprès de Visale.
En tant que Bailleur, je veux que l'empreinte du contrat Visale participe à la Révision du document de bail, afin de lier la Révision à la preuve exacte.
En tant que Bailleur, je veux que le remplacement du contrat Visale crée un nouveau document immuable et invalide la Révision courante, afin de conserver l'historique sans signer un dossier lié à une ancienne preuve.
En tant que Bailleur, je veux être averti lorsque Visale est combinée avec une autre Garantie locative, afin d'évaluer un risque de cumul incompatible.
En tant que Bailleur, je veux pouvoir confirmer explicitement et de manière auditée une dérogation à cet avertissement, afin de ne pas être bloqué par une règle juridique susceptible d'évoluer.
En tant que Bailleur, je veux qu'un Avenant m'oblige à retirer, remplacer ou confirmer explicitement la Garantie Visale, afin qu'elle ne soit jamais prolongée silencieusement.
En tant que Bailleur, je veux que les démarches annuelles, les impayés et la sortie restent gérés sur Visale.fr, afin que l'application ne prétende pas intégrer un service externe qu'elle ne pilote pas.
En tant que Bailleur, je veux comprendre pourquoi l'Inventaire du mobilier ne peut pas commencer sans Espace privatif, afin de corriger l'Appartement plutôt que de subir une erreur générique.
En tant que Bailleur, je veux accéder directement à « Modifier l'appartement » depuis ce blocage, afin d'ajouter l'Espace privatif manquant.
En tant que Bailleur, je veux que le prérequis soit appliqué par le serveur quel que soit le point d'entrée, afin qu'un lien direct ne contourne pas le domaine.
En tant que Bailleur, je veux que l'option invalide « Tout l'appartement » disparaisse, afin que chaque ligne d'Inventaire référence un véritable Espace privatif.
En tant que Bailleur, je veux que les champs de l'Inventaire utilisent la largeur et la grille prévues par le formulaire, afin de saisir les descriptions confortablement.
En tant que Bailleur, je veux conserver la limite de largeur générale de l'application, afin que la correction ne transforme pas l'Inventaire en page excessivement étendue.
En tant que Bailleur, je veux que le bouton annonce « Enregistrer et revenir aux baux », afin de connaître la conséquence de l'action.
En tant que Bailleur, je veux revenir à la page des Baux uniquement après un enregistrement réussi, afin de ne pas perdre une saisie en erreur.
En tant que Bailleur, je veux voir « Inventaire enregistré » après la redirection, afin d'obtenir une confirmation au point d'arrivée.
En tant que Bailleur, je veux rester sur l'Inventaire avec mes données après un échec, afin de corriger ou réessayer sans perte.
En tant que Bailleur, je veux constater une seule fois l'état d'un meuble ou appareil de l'Inventaire, afin d'éviter une double saisie contradictoire.
En tant que Bailleur, je veux que la ligne d'Inventaire porte quantité observée, états, observations et preuves du meuble, afin d'avoir une source de vérité unique.
En tant que Bailleur, je veux que les équipements absents de l'Inventaire restent constatés séparément, afin de ne pas perdre les éléments propres à l'Appartement.
En tant que Bailleur, je veux que le PDF et les exigences photographiques ne dupliquent pas un objet de l'Inventaire comme équipement, afin de ne pas fournir deux fois la même preuve.
En tant que Bailleur, je veux parcourir l'État des lieux dans un stepper vertical utilisable de 2 à 15 Espaces privatifs, afin que les libellés restent lisibles.
En tant que Bailleur, je veux accéder directement à toute Étape de visite dans l'Ordre de visite enregistré et n'afficher que le contenu de l'étape active, afin de conserver un parcours non linéaire sans surcharger la page.
En tant que Bailleur, je veux que le numéro de chaque étape reste toujours visible, afin de conserver mes repères après confirmation.
En tant que Bailleur, je veux qu'une coche séparée indique une étape confirmée, afin que le numéro ne soit pas remplacé par un texte ou une icône cassée.
En tant que Bailleur, je veux des libellés d'étape courts, afin de lire la navigation sans troncature.
En tant que Bailleur, je veux que chaque Espace privatif soit divisé en panneaux « Surfaces », « Équipements et éléments supplémentaires », « Mobilier » et « Photos et preuves », afin de traiter une partie cohérente à la fois.
En tant que Bailleur, je veux ouvrir directement chaque panneau, afin de revenir sur une information sans suivre un sous-parcours imposé.
En tant que Bailleur, je veux voir quel panneau contient une erreur, afin de corriger rapidement une Étape de visite incomplète.
En tant que Bailleur, je veux conserver une seule Confirmation d'une étape d'état des lieux par Espace privatif, afin qu'une pièce ne soit jamais considérée comme partiellement confirmée.
En tant que Bailleur, je veux que les Éléments supplémentaires d'état des lieux soient présentés comme des cartes structurées, afin de distinguer clairement leurs champs.
En tant que Bailleur, je veux que « Supprimer » soit placé dans l'en-tête de la carte concernée, afin de comprendre immédiatement quel élément sera retiré.
En tant que Bailleur, je veux lire « Neuf », « Bon état », « État d'usage », « Dégradé », « Absent » ou « Non applicable », afin de ne jamais voir les valeurs techniques de l'énumération.
En tant que Bailleur, je veux retrouver ces libellés français dans les formulaires, références d'entrée, synthèses et comparaisons, afin d'avoir un vocabulaire cohérent.
En tant que Bailleur, je veux que les formulaires généraux et le dossier à signer occupent la même largeur visible, afin d'éviter une hiérarchie visuelle accidentelle.
En tant que Bailleur, je veux que le fuseau horaire soit détecté et figé sans être affiché ni modifiable, afin de renseigner seulement des informations utiles.
En tant que Bailleur, je veux que la date civile de l'État des lieux soit validée dans ce fuseau sans conversion UTC, afin de préserver le jour réel.
En tant que Bailleur, je veux qu'aucun message de connexion ne s'affiche lorsque tout fonctionne, afin d'éviter un statut sans action.
En tant que Bailleur hors ligne, je veux une bannière informative indiquant « Hors ligne — vos modifications restent sur cette page, mais leur enregistrement et l'envoi des photos nécessitent une connexion. », afin de savoir comment reprendre.
En tant que Bailleur hors ligne, je veux conserver ma saisie dans la page et rendre indisponibles seulement les opérations réseau concernées, afin d'éviter une perte de travail.
En tant que Bailleur, je veux voir « Enregistré » brièvement près du stepper après une sauvegarde automatique, afin de savoir qu'elle a réussi sans subir un snackbar répétitif.
En tant que Bailleur, je veux voir le MatSnackBar « Brouillon enregistré » après un enregistrement explicitement demandé, afin d'obtenir une confirmation visible mais temporaire.
En tant que Bailleur, je veux qu'un échec reste affiché dans l'étape concernée avec « Réessayer », afin de ne pas manquer une erreur éphémère.
En tant que Bailleur, je veux voir « Dossier unique à signer » uniquement dans la Vérification finale, afin de ne pas croire qu'il appartient à chaque formulaire.
En tant que Bailleur, je veux voir la liste précise des confirmations et écarts encore manquants, afin de rendre le dossier prêt sans tâtonner.
En tant que Bailleur, je veux voir « Préparer le dossier à signer » dès que toutes les conditions sont réunies, afin de poursuivre au bon moment.
Implementation Decisions
Réutiliser Angular Material et Font Awesome déjà installés. Ne pas ajouter de bibliothèque de date, de stepper, d'icônes, de notification ou de stockage.
Corriger uniquement l'alignement interne du contenu de chargement du bouton du Profil bailleur. Son emplacement actuel dans la page Paramètres et dans la boîte de complétion reste inchangé.
Remplacer tous les contrôles natifs date par un contrôle Angular Material cohérent, avec déclencheur visible, saisie clavier, locale française et adaptation explicite entre la valeur du contrôle et la date civile ISO.
Ne jamais convertir une date civile en instant UTC. Les règles existantes de fuseau IANA restent applicables.
Ajouter une aide accessible uniquement aux choix contractuels qui nécessitent une explication. Les attestations explicites et les clauses de catalogue qui affichent déjà leur description n'ajoutent pas une icône redondante.
Le déclencheur d'aide réutilise Angular Material et rend le même contenu accessible au survol, au focus clavier, au clic et au toucher.
Brancher la présélection IRL existante sur le département de l'Appartement : 001515333 en métropole hors Corse, 010760507 en Corse et 010760509 dans les territoires ultramarins pris en charge.
La série présélectionnée initialise réellement un nouveau champ vide au lieu de rester un simple placeholder. Elle ne réécrit jamais une valeur persistée ou corrigée ; les corrections exceptionnelles conservent le mécanisme existant de confirmation auditée.
Afficher « Montant des travaux récents », « Description des travaux récents » et les autres conditions dans une seule colonne, même sur ordinateur. Chaque contrôle apparaît sous son texte et utilise la largeur disponible.
Déplacer toutes les mutations de Pièces jointes dans le formulaire Locataire. Les cartes de liste conservent l'affichage et le téléchargement, mais plus l'ajout ni la suppression.
Le formulaire Locataire accepte une sélection multifichier avant la création. Les fichiers restent en mémoire dans le navigateur ; aucun stockage serveur temporaire ni nouvel identifiant de brouillon n'est introduit.
La soumission crée d'abord le Locataire avec le contrat existant, bascule le formulaire sur l'identifiant retourné, puis utilise l'endpoint de téléversement existant pour chaque fichier. Si la création échoue, aucun téléversement ne démarre et tous les fichiers en attente restent sélectionnés.
La création et les téléversements ne forment pas une transaction atomique. Un échec de fichier ne supprime jamais le Locataire créé ni les fichiers déjà acceptés.
Chaque fichier possède son état local, sa progression, son erreur et son action de reprise. Les fichiers non encore acceptés restent disponibles tant que la page reste ouverte.
Les contrôles backend existants sur le fichier non vide, sa taille, ses métadonnées et l'autorisation du Bailleur restent inchangés.
Renommer la rubrique « Garanties du bail » et introduire Garantie locative comme union explicite : Garantie par personne physique, Garantie par Organisme garant ou Garantie Visale.
Une Garantie par personne physique exige prénom, nom et e-mail ; téléphone et adresse restent facultatifs.
Un Organisme garant exige une dénomination, une adresse de siège et un nom de représentant. Son identifiant d'immatriculation, son e-mail et son téléphone sont facultatifs.
Un Organisme garant reste interne au Bail et ne devient pas un nouvel agrégat. Il suit les mêmes snapshots, autorisations et règles d'Avenant que les Garanties existantes.
Chaque Garantie par personne physique ou Organisme garant référence explicitement un unique Locataire du Bail. Les exigences d'Actes sont calculées à partir de ces couples déclarés, jamais comme le produit cartésien de tous les Garants et de tous les Locataires.
Un Acte de cautionnement signé est obligatoire avant Finalisation pour chaque couple déclaré. Le Bailleur atteste sa correspondance avec le Bail ; l'application conserve l'auteur du téléversement, l'horodatage UTC et l'empreinte SHA-256.
Ne pas créer de gestion des Kbis, statuts ou pièces d'identité de représentant dans ce périmètre.
Une Garantie Visale est un fait unique du Bail avec un ensemble non vide et sans doublon d'identifiants de Locataires couverts. Cet ensemble doit correspondre aux Locataires désignés sur le visa et le contrat.
L'affichage de Visale auprès de chaque Locataire est dérivé de cette Garantie unique ; aucune copie indépendante de la garantie ou de ses documents n'est créée.
Une Garantie Visale exige un numéro de visa. Le PDF du visa certifié est une Pièce jointe facultative ; ni le numéro ni ce PDF n'activent seuls la garantie.
Le contrat de cautionnement Visale validé est obligatoire avant la première génération du dossier unique à signer. L'application ne lit ni ne certifie le contenu du PDF.
Le contrat Visale est conservé comme document immuable séparé du PDF unique signé par Bailleur et Locataires. Il reste dans le dossier de la Révision finalisée.
L'empreinte du contrat Visale participe à l'empreinte source de la Révision du document de bail. Son ajout, retrait ou remplacement rend toute Révision générée obsolète ; un remplacement crée un nouveau document immuable sans modifier le précédent.
Toute modification du numéro de visa ou des Locataires couverts rend le contrat associé caduc jusqu'à un nouveau téléversement.
La génération et la Finalisation revalident la présence, l'appartenance au Bailleur, les métadonnées, l'intégrité et l'empreinte du document stocké ainsi que la couverture déclarée : ensemble non vide, sans doublon et composé uniquement de Locataires du Bail.
La combinaison déclarée de Visale avec une autre Garantie locative produit une Alerte de conformité juridique versionnée, contournable et auditée, jamais un blocage permanent.
Tout Avenant d'un Bail couvert par Visale exige soit le retrait ou remplacement de Visale à sa date d'effet, soit une dérogation juridique explicite et auditée. Aucun Avenant ne prolonge Visale silencieusement.
Le parcours Garantie affiche initialement un bouton centré sans formulaire vide. Une seule Garantie peut être inachevée ; l'annulation la retire sans toucher aux autres.
Une Garantie valide devient une carte récapitulative avec actions Modifier et Supprimer. Le bouton suivant est libellé « Ajouter une autre garantie ».
Continuer à utiliser les erreurs structurées et chemins indexés pour les Garanties imbriquées. Une erreur d'une carte ne doit ni effacer ni invalider visuellement les autres.
Lorsque l'Appartement ne possède aucun Espace privatif, l'initialisation de l'Inventaire retourne HTTP 409 avec le code stable furniture_inventory_private_areas_missing plutôt qu'une exception générique.
La page d'Inventaire traduit ce code en un état bloqué actionnable avec « Modifier l'appartement », qui ouvre l'édition de l'Appartement associé. Le backend reste la source d'autorité afin de couvrir aussi les accès directs.
Ne pas créer automatiquement d'Espace privatif et supprimer l'option « Tout l'appartement », puisque chaque ligne d'Inventaire doit référencer un Espace privatif réel.
Restaurer dans l'Inventaire la grille et les classes de largeur partagées déjà utilisées par les autres formulaires. Conserver la largeur maximale générale de la page.
Renommer l'action finale « Enregistrer et revenir aux baux ». Naviguer uniquement après réussite et transmettre un succès transitoire à la page des Baux.
En cas d'échec d'enregistrement de l'Inventaire, conserver les valeurs et erreurs locales, rester sur la page et proposer une reprise.
Une ligne d'Inventaire constitue l'unique constat du meuble ou appareil correspondant dans l'État des lieux. Elle porte quantité observée, répartitions d'état, observation et preuves.
Supprimer FurnitureEquipmentKind et equipmentKind des lignes d'Inventaire, snapshots, DTO, documents Mongo et formulaires : ce champ ne sert qu'à créer le constat d'équipement dupliqué.
Ne plus créer de zone d'équipement dérivée d'une ligne d'Inventaire. Les zones d'équipement restent réservées aux éléments de l'Appartement qui ne figurent pas dans l'Inventaire.
Mettre à jour le brouillon d'État des lieux, la validation, les cibles photo, la comparaison et le rendu documentaire afin qu'un objet d'Inventaire n'apparaisse et ne demande une preuve qu'une seule fois.
Remplacer le stepper horizontal par un stepper Angular Material vertical et non linéaire sur toutes les tailles d'écran. Il conserve l'Ordre de visite, n'affiche que le contenu de l'étape active et reste utilisable de 2 à 15 Espaces privatifs.
Conserver le numéro de l'étape après confirmation et afficher une coche indépendante. Ne pas dépendre d'une ligature Material Icons absente.
Raccourcir les libellés de navigation ; exposer le statut confirmé ou incomplet séparément et de manière accessible.
Chaque Étape de visite d'un Espace privatif contient quatre panneaux Material directement accessibles : Surfaces ; Équipements et éléments supplémentaires ; Mobilier ; Photos et preuves.
Les panneaux sont une organisation visuelle seulement. L'Espace privatif conserve une unique Confirmation d'une étape d'état des lieux et les mêmes règles d'invalidation.
Chaque panneau signale les erreurs qu'il contient et le focus de validation cible le premier contrôle invalide réel.
Présenter chaque Élément supplémentaire d'état des lieux dans une carte Material avec en-tête et action Supprimer associée clairement à cette carte.
Réutiliser la fonction existante de traduction des états partout où une valeur est visible. Les valeurs brutes de l'énumération ne sont jamais affichées.
Aligner les surfaces de formulaire sur une même largeur visible, y compris Informations générales, Étapes de visite et Vérification finale.
Détecter le fuseau IANA lors de la création du brouillon d'État des lieux, le figer avec celui-ci et ne plus l'exposer comme champ ni comme texte de synthèse. La réponse conserve ce fait pour l'audit ; timeZone disparaît du contrat de mutation et les validations utilisent toujours la valeur figée du brouillon.
Ne rien afficher lorsque le navigateur est en ligne. Hors ligne, afficher la bannière informative « Hors ligne — vos modifications restent sur cette page, mais leur enregistrement et l'envoi des photos nécessitent une connexion. » ; les champs locaux restent éditables et seules les opérations réseau concernées sont indisponibles.
Une sauvegarde automatique expose brièvement « Enregistré » près du stepper. Seul un enregistrement explicitement demandé expose le MatSnackBar « Brouillon enregistré » ; la confirmation d'une étape et l'autosave ne le déclenchent pas.
Les erreurs de sauvegarde, photo, génération ou finalisation restent persistantes et locales avec une action Réessayer ; elles ne sont jamais remplacées par une réussite ou un état vide.
Déplacer « Dossier unique à signer » dans la Vérification finale. Avant disponibilité, afficher la liste précise des confirmations et écarts manquants ; après disponibilité, afficher l'action de préparation.
Continuer à respecter ADR-0009 pour Angular Material, ADR-0011 pour les frontières d'agrégats, ADR-0015 pour les alertes juridiques et ADR-0021 pour le dossier unique Bail–Inventaire–État des lieux.
Modifier directement les contrats API, documents Mongo de développement, modèles frontend et tests. Aucune migration de production, compatibilité descendante, double lecture ou double écriture n'est requise.
Toutes les nouvelles valeurs externes sont validées côté serveur et toutes les réponses inconnues sont parsées avant d'être exposées à l'interface.
Testing Decisions
Tester les comportements observables et les invariants métier, jamais les classes CSS internes, les méthodes privées, l'ordre des appels entre collaborateurs internes ou la structure exacte des composants.
Utiliser comme couture navigateur principale les projets Playwright existants avec API simulée aux largeurs 360, 768 et 1280 px. Couvrir les interactions au clic et au clavier, la navigation, le focus, les retours d'opération et les mises en page responsive.
Vérifier par assertions géométriques, sans snapshots, que le contenu du bouton Profil reste centré et stable, que montant puis description des Travaux apparaissent chacun sous leur libellé sur leur propre ligne en desktop, et que les formulaires et le dossier final partagent la largeur attendue.
Couvrir dans Playwright les sélecteurs de date globaux ; l'absence de mutation de Pièce jointe depuis une carte ; le cycle d'ajout des Garanties ; le prérequis et la redirection de l'Inventaire ; le stepper vertical et ses panneaux avec 2 puis 15 Espaces privatifs, des libellés non tronqués, un seul contenu actif, l'accès direct dans l'Ordre de visite et les erreurs de panneau ; l'absence de bannière en ligne, sa présence hors ligne, les mutations réseau indisponibles et la saisie locale conservée.
Tester au niveau du formulaire Locataire que la création n'est appelée qu'une fois, que seuls les fichiers en échec sont repris, qu'un fichier accepté n'est jamais renvoyé et qu'un échec de création conserve tous les fichiers sans déclencher de téléversement.
Tester dans LeaseForm que le choix d'un Appartement initialise la série IRL d'un nouveau champ vide et qu'une édition, une correction ou un changement d'Appartement ne remplace jamais silencieusement une valeur déjà persistée.
Tester l'adaptation des dates civiles autour du contrôle partagé : saisie manuelle et calendrier produisent le même ISO civil, sans conversion UTC, dans la locale française.
Tester les Garanties au niveau du domaine pour l'union des trois variantes, leurs champs requis, l'unicité de la Garantie Visale, l'ensemble non vide et sans doublon de ses Locataires et l'obligation de décision d'Avenant. Tester au niveau application le calcul des seuls couples Garant–Locataire déclarés, l'exigence de chaque Acte, le contrat Visale requis et l'invalidation de Révision par l'empreinte.
Étendre les tests Web ciblés pour les nouvelles unions de requête/réponse, les erreurs indexées, les identifiants de Locataires couverts, les documents, les codes d'erreur et les refus de références appartenant à un autre Bailleur ou Bail.
Étendre les parcours API Spring Boot existants, avec MockMvc, MongoDB Testcontainers en replica set et stockage temporaire, par cas ciblés plutôt que créer un nouveau scénario monolithique. Couvrir les trois Garanties, la Finalisation avec les seuls Actes déclarés, le cumul Visale audité et la décision explicite d'Avenant ; conserver les tests de rollback déjà présents.
Vérifier dans FurnitureInventoryWebTest le HTTP 409 et le code furniture_inventory_private_areas_missing, dans FurnitureInventoryServiceTest l'absence d'initialisation sans Espace privatif et le refus de toute ligne sans Espace réel.
Vérifier au niveau du modèle de brouillon puis de PropertyConditionReportServiceTest qu'une ligne d'Inventaire ne crée ni zone d'équipement ni seconde cible photo, tandis qu'un équipement absent de l'Inventaire reste constaté séparément.
Créer un État des lieux avec un fuseau IANA, le recharger et l'enregistrer depuis un navigateur configuré dans un autre fuseau, puis vérifier que le fuseau d'origine reste inchangé et que la validation de date civile l'utilise. Le contrat de mutation ne doit pas permettre son remplacement.
Tester les retours exacts de l'État des lieux : « Enregistré » local après autosave, aucun snackbar après autosave ou confirmation d'étape, MatSnackBar « Brouillon enregistré » après sauvegarde explicite et erreur locale persistante avec reprise.
Adapter le test existant du renderer qui extrait le texte avec PDFBox et compte les images : le meuble reste présent dans l'annexe Inventaire et dans son constat d'État des lieux, mais jamais dans un second constat d'équipement ni dans une seconde exigence photo. Vérifier séparément la conservation du contrat Visale et son empreinte, sans comparer les octets complets d'un PDF ou d'un ZIP.
Utiliser une horloge fixe, des identifiants déterministes lorsque nécessaire et des fichiers temporaires isolés. Aucun test ne dépend de son ordre d'exécution, d'INSEE, de Visale.fr ou d'un autre service externe.
Exécuter le formatage, le lint, la vérification TypeScript, les tests frontend pertinents, les contrôles backend et le build du projet avant livraison.
Out of Scope
Découpage de #71 en tickets enfants ; il sera réalisé séparément.
Stockage serveur temporaire ou transaction atomique englobant la création du Locataire et tous ses téléversements.
Gestion des Kbis, statuts, pièces d'identité de représentants ou autres dossiers justificatifs des Organismes garants.
Actualisation annuelle d'un contrat Visale, déclaration d'impayé, suivi de remboursement, notification de sortie ou intégration à l'espace Visale.
Appel automatique aux API ou au site d'INSEE pour choisir la série lors de la saisie du Bail ; la sélection reste fondée sur la règle départementale embarquée.
Détection juridique automatique complète de l'applicabilité d'une Garantie ou suppression des dérogations auditées.
Fusion du contrat Visale dans le PDF unique signé par Bailleur et Locataires.
Garantie Visale dupliquée par Locataire ou Acte de cautionnement commun à plusieurs Locataires hors Visale.
Création automatique d'un Espace privatif ou lignes d'Inventaire rattachées à « Tout l'appartement ».
Plusieurs confirmations indépendantes à l'intérieur d'un même Espace privatif.
Mode hors ligne durable, service worker, stockage navigateur persistant ou synchronisation différée.
Envoi d'e-mail, signature électronique, OCR ou vérification cryptographique des signatures.
Nouvelle bibliothèque de composants, de dates, de stepper, de notifications, d'icônes ou d'état.
Refonte générale du design system ou des domaines non nécessaires à ces parcours.
Migration de données de production ou compatibilité avec les anciens contrats de développement.
Further Notes
Le terme demandé 00151333 comportait une erreur. La série IRL métropolitaine officielle est 001515333; la Corse et les territoires ultramarins conservent leurs séries déjà prises en charge.
La liste officielle des justificatifs d'un Organisme garant motive les faits structurés retenus, sans ajouter leur téléversement à ce périmètre.
La Garantie Visale doit être validée avant la signature du Bail. Le contrat est un document distinct du dossier signé par les parties, mais son empreinte appartient à la Révision.
La documentation officielle Visale indique également qu'un cumul de garanties peut invalider le contrat et qu'un Avenant peut mettre fin à la couverture. L'application traduit ces règles évolutives en décisions explicites et alertes auditées conformément à ADR-0015.
CONTEXT.md contient désormais les définitions de Garantie locative, Organisme garant et Garantie Visale, ainsi que les décisions sur le constat unique du mobilier et le fuseau figé de l'État des lieux.
Aucun nouvel ADR n'est créé : les décisions suivent les frontières et principes déjà acceptés, et les choix d'interface restent réversibles.
## Problem Statement
Le Bailleur rencontre une accumulation d'incohérences visuelles, de retours d'opération ambigus et de parcours bloquants dans les formulaires du Profil bailleur, des Locataires, du Bail, de l'Inventaire du mobilier et de l'État des lieux. Certaines actions réussissent sans retour visible, certains échecs sont présentés comme des erreurs génériques, les contrôles changent de comportement selon la page ou le navigateur et plusieurs mises en page deviennent difficiles à utiliser sur ordinateur ou mobile.
Ces problèmes ne sont pas uniquement cosmétiques. Les Pièces jointes des Locataires sont modifiables depuis une carte de liste au lieu de leur formulaire, l'ajout d'une Garantie locative est confus, la série IRL n'est pas réellement présélectionnée, un Appartement sans Espace privatif mène à une erreur d'Inventaire non actionnable et un même meuble peut être constaté deux fois dans l'État des lieux. Le Bailleur ne peut donc pas distinguer clairement une donnée manquante, une opération en cours, une réussite ou une incohérence de modèle.
## Solution
Unifier les parcours concernés autour des composants Angular Material déjà installés, des contrats d'erreur structurés existants et des règles du domaine. Chaque opération observable expose un état de chargement, une réussite transitoire ou un échec récupérable à l'endroit où le Bailleur agit. Les formulaires conservent les saisies après échec, restent utilisables au clavier et sur mobile et n'ajoutent aucune dépendance d'interface.
Le parcours Locataire permet de sélectionner plusieurs fichiers en attente avant la première création, puis crée le Locataire et téléverse chaque fichier avec reprise individuelle. Le Bail distingue désormais les Garanties locatives apportées par un Garant personne physique, un Organisme garant ou une Garantie Visale. Le contrat Visale est validé avant la signature, conservé séparément du PDF unique et lié à sa Révision par son empreinte.
L'Inventaire du mobilier expose un prérequis actionnable lorsqu'aucun Espace privatif n'existe, utilise toute sa largeur de formulaire et revient aux Baux après enregistrement. L'État des lieux adopte une navigation verticale lisible, découpe chaque Espace privatif en panneaux, conserve une confirmation unique par Étape de visite et fait de la ligne d'Inventaire l'unique constat du meuble correspondant.
## User Stories
1. En tant que Bailleur, je veux que le spinner et le texte du bouton d'enregistrement du Profil bailleur restent centrés, afin de comprendre que le même bouton est toujours actif pendant l'opération.
2. En tant que Bailleur, je veux que le bouton du Profil bailleur conserve une largeur stable pendant l'enregistrement, afin d'éviter un déplacement visuel inattendu.
3. En tant que Bailleur, je veux voir une icône calendrier explicite sur chaque champ de date, afin de pouvoir ouvrir le sélecteur sans dépendre du comportement du navigateur.
4. En tant que Bailleur, je veux pouvoir saisir une date au clavier ou la choisir dans le calendrier, afin d'utiliser le mode le plus adapté à ma situation.
5. En tant que Bailleur, je veux que les calendriers utilisent la présentation française, afin de lire les jours, mois et semaines sans ambiguïté.
6. En tant que Bailleur, je veux que toutes les dates civiles conservent le jour choisi sans conversion UTC, afin d'éviter un décalage de date.
7. En tant que Bailleur, je veux retrouver le même sélecteur sur tous les formulaires, afin de ne pas réapprendre le contrôle selon le parcours.
8. En tant que Bailleur, je veux ajouter et supprimer les Pièces jointes uniquement depuis la création ou l'édition d'un Locataire, afin de regrouper toutes ses modifications dans un même parcours.
9. En tant que Bailleur, je veux continuer à télécharger une Pièce jointe depuis la liste des Locataires, afin de la consulter sans ouvrir le formulaire.
10. En tant que Bailleur, je veux que la carte d'un Locataire soit en lecture seule pour ses Pièces jointes, afin d'éviter une modification accidentelle depuis la liste.
11. En tant que Bailleur, je veux sélectionner plusieurs fichiers en attente avant la première création du Locataire, afin de préparer son dossier en une seule fois.
12. En tant que Bailleur, je veux voir la liste des fichiers en attente avant l'enregistrement, afin de vérifier ce qui sera envoyé.
13. En tant que Bailleur, je veux retirer un fichier de la sélection avant l'enregistrement, afin de corriger une erreur sans recommencer le formulaire.
14. En tant que Bailleur, je veux que « Créer le locataire » enchaîne la création puis les téléversements, afin de ne pas devoir quitter le formulaire pour ajouter les documents.
15. En tant que Bailleur, je veux que le formulaire passe en mode édition dès que le Locataire est créé, afin que les téléversements utilisent son identité persistée.
16. En tant que Bailleur, je veux qu'un échec de création conserve tous les fichiers en attente sans démarrer leur envoi, afin de corriger le formulaire puis de réessayer.
17. En tant que Bailleur, je veux que la création du Locataire reste acquise si un fichier échoue et réessayer uniquement les fichiers en échec, afin de ne recréer ni la personne ni les Pièces jointes déjà stockées.
18. En tant que Bailleur, je veux que chaque fichier expose sa propre progression, réussite ou erreur, afin de savoir exactement ce qui reste à faire.
19. En tant que Bailleur, je veux que les fichiers en échec restent disponibles tant que le formulaire est ouvert, afin de pouvoir réessayer sans les rechercher.
20. En tant que Bailleur, je veux empêcher une double création ou un double téléversement pendant une opération en cours, afin d'éviter les doublons.
21. En tant que Bailleur, je veux une aide sur les choix contractuels dont la conséquence n'est pas évidente, afin de comprendre ce que j'inscris dans le Bail.
22. En tant que Bailleur utilisant une souris, je veux ouvrir l'aide au survol ou au clic, afin de consulter rapidement une explication.
23. En tant que Bailleur utilisant un clavier, je veux atteindre et ouvrir chaque aide au focus, afin de ne pas dépendre du pointeur.
24. En tant que Bailleur sur écran tactile, je veux ouvrir l'aide par une action explicite, afin de ne pas dépendre du survol.
25. En tant que Bailleur, je veux voir des exemples concrets dans l'aide lorsqu'ils clarifient le choix, afin de pouvoir décider avec confiance.
26. En tant que Bailleur, je veux éviter une icône redondante sur une attestation déjà explicite ou une clause déjà décrite, afin de garder le formulaire lisible.
27. En tant que Bailleur, je veux que la série IRL soit réellement présélectionnée depuis le département de l'Appartement, afin de ne pas recopier une référence connue.
28. En tant que Bailleur d'un Appartement métropolitain hors Corse, je veux obtenir la série `001515333`, afin d'utiliser l'identifiant INSEE officiel plutôt que la valeur erronée de la demande initiale.
29. En tant que Bailleur d'un Appartement en Corse ou dans un territoire ultramarin pris en charge, je veux obtenir respectivement la série `010760507` ou `010760509`, afin de ne pas appliquer la série métropolitaine universellement.
30. En tant que Bailleur, je veux que la présélection remplisse seulement un nouveau champ vide et que la série persistée devienne un fait du Bail, afin qu'une correction ou un changement ultérieur d'adresse ne la remplace pas silencieusement.
31. En tant que Bailleur, je veux que les libellés des Travaux récents apparaissent au-dessus de leurs champs, afin de comprendre immédiatement quelle valeur saisir.
32. En tant que Bailleur sur ordinateur, je veux que le montant puis la description des Travaux récents occupent chacun une ligne complète, afin que les champs ne suivent pas le texte horizontalement.
33. En tant que Bailleur sur mobile, je veux conserver cette présentation mono-colonne, afin d'éviter une grille trop étroite.
34. En tant que Bailleur, je veux voir initialement un seul bouton centré « Ajouter une garantie », afin de ne pas être confronté à un formulaire vide permanent.
35. En tant que Bailleur, je veux n'avoir qu'une Garantie locative inachevée à la fois, afin de savoir quel formulaire bloque l'enregistrement.
36. En tant que Bailleur, je veux annuler une Garantie locative inachevée sans modifier les autres, afin de revenir proprement au Bail.
37. En tant que Bailleur, je veux qu'une Garantie locative validée se replie en carte récapitulative, afin de réduire la longueur du formulaire.
38. En tant que Bailleur, je veux modifier ou supprimer une Garantie locative depuis sa carte, afin de corriger le brouillon explicitement.
39. En tant que Bailleur, je veux voir « Ajouter une autre garantie » après une première saisie valide, afin d'ajouter plusieurs Garanties sans ambiguïté.
40. En tant que Bailleur, je veux que la rubrique « Garanties du bail » me permette de choisir entre Garant personne physique, Organisme garant et Garantie Visale, afin de représenter la couverture réellement utilisée sans présenter Visale comme un Garant.
41. En tant que Bailleur, je veux renseigner une personne physique avec prénom, nom et e-mail obligatoires et téléphone et adresse facultatifs, afin de conserver le contrat actuel.
42. En tant que Bailleur, je veux identifier un Organisme garant par sa dénomination, son siège et son représentant, afin de ne pas le forcer dans des champs prénom et nom.
43. En tant que Bailleur, je veux renseigner facultativement l'immatriculation, l'e-mail et le téléphone d'un Organisme garant, afin de conserver les informations disponibles sans bloquer les organismes qui n'en disposent pas.
44. En tant que Bailleur, je veux que chaque Garantie apportée par une personne physique ou un Organisme désigne explicitement un Locataire du Bail, afin que les Actes exigés proviennent des seuls couples Garant–Locataire déclarés.
45. En tant que Bailleur, je veux téléverser avant la Finalisation un Acte signé distinct pour chaque couple Garant–Locataire déclaré et attester sa correspondance, afin que chaque engagement soit vérifiable et conservé avec son auteur, son horodatage UTC et son empreinte SHA-256.
46. En tant que Bailleur, je veux déclarer une Garantie Visale unique pour l'ensemble exact des Locataires figurant sur le visa, afin de refléter le contrat réel.
47. En tant que Bailleur, je veux voir la couverture Visale auprès de chaque Locataire concerné sans dupliquer la garantie, afin de comprendre qui est couvert.
48. En tant que Bailleur, je veux renseigner obligatoirement le numéro du visa, afin d'identifier la Garantie Visale.
49. En tant que Bailleur, je veux pouvoir conserver facultativement le PDF du visa certifié, afin de garder la preuve reçue du Locataire.
50. En tant que Bailleur, je veux téléverser le contrat de cautionnement Visale validé avant de générer le dossier unique, afin que le Bail ne soit pas signé avant l'activation de la garantie.
51. En tant que Bailleur, je veux conserver le contrat Visale séparément du PDF signé par les parties, afin de ne pas leur faire signer un contrat déjà validé auprès de Visale.
52. En tant que Bailleur, je veux que l'empreinte du contrat Visale participe à la Révision du document de bail, afin de lier la Révision à la preuve exacte.
53. En tant que Bailleur, je veux que le remplacement du contrat Visale crée un nouveau document immuable et invalide la Révision courante, afin de conserver l'historique sans signer un dossier lié à une ancienne preuve.
54. En tant que Bailleur, je veux être averti lorsque Visale est combinée avec une autre Garantie locative, afin d'évaluer un risque de cumul incompatible.
55. En tant que Bailleur, je veux pouvoir confirmer explicitement et de manière auditée une dérogation à cet avertissement, afin de ne pas être bloqué par une règle juridique susceptible d'évoluer.
56. En tant que Bailleur, je veux qu'un Avenant m'oblige à retirer, remplacer ou confirmer explicitement la Garantie Visale, afin qu'elle ne soit jamais prolongée silencieusement.
57. En tant que Bailleur, je veux que les démarches annuelles, les impayés et la sortie restent gérés sur Visale.fr, afin que l'application ne prétende pas intégrer un service externe qu'elle ne pilote pas.
58. En tant que Bailleur, je veux comprendre pourquoi l'Inventaire du mobilier ne peut pas commencer sans Espace privatif, afin de corriger l'Appartement plutôt que de subir une erreur générique.
59. En tant que Bailleur, je veux accéder directement à « Modifier l'appartement » depuis ce blocage, afin d'ajouter l'Espace privatif manquant.
60. En tant que Bailleur, je veux que le prérequis soit appliqué par le serveur quel que soit le point d'entrée, afin qu'un lien direct ne contourne pas le domaine.
61. En tant que Bailleur, je veux que l'option invalide « Tout l'appartement » disparaisse, afin que chaque ligne d'Inventaire référence un véritable Espace privatif.
62. En tant que Bailleur, je veux que les champs de l'Inventaire utilisent la largeur et la grille prévues par le formulaire, afin de saisir les descriptions confortablement.
63. En tant que Bailleur, je veux conserver la limite de largeur générale de l'application, afin que la correction ne transforme pas l'Inventaire en page excessivement étendue.
64. En tant que Bailleur, je veux que le bouton annonce « Enregistrer et revenir aux baux », afin de connaître la conséquence de l'action.
65. En tant que Bailleur, je veux revenir à la page des Baux uniquement après un enregistrement réussi, afin de ne pas perdre une saisie en erreur.
66. En tant que Bailleur, je veux voir « Inventaire enregistré » après la redirection, afin d'obtenir une confirmation au point d'arrivée.
67. En tant que Bailleur, je veux rester sur l'Inventaire avec mes données après un échec, afin de corriger ou réessayer sans perte.
68. En tant que Bailleur, je veux constater une seule fois l'état d'un meuble ou appareil de l'Inventaire, afin d'éviter une double saisie contradictoire.
69. En tant que Bailleur, je veux que la ligne d'Inventaire porte quantité observée, états, observations et preuves du meuble, afin d'avoir une source de vérité unique.
70. En tant que Bailleur, je veux que les équipements absents de l'Inventaire restent constatés séparément, afin de ne pas perdre les éléments propres à l'Appartement.
71. En tant que Bailleur, je veux que le PDF et les exigences photographiques ne dupliquent pas un objet de l'Inventaire comme équipement, afin de ne pas fournir deux fois la même preuve.
72. En tant que Bailleur, je veux parcourir l'État des lieux dans un stepper vertical utilisable de 2 à 15 Espaces privatifs, afin que les libellés restent lisibles.
73. En tant que Bailleur, je veux accéder directement à toute Étape de visite dans l'Ordre de visite enregistré et n'afficher que le contenu de l'étape active, afin de conserver un parcours non linéaire sans surcharger la page.
74. En tant que Bailleur, je veux que le numéro de chaque étape reste toujours visible, afin de conserver mes repères après confirmation.
75. En tant que Bailleur, je veux qu'une coche séparée indique une étape confirmée, afin que le numéro ne soit pas remplacé par un texte ou une icône cassée.
76. En tant que Bailleur, je veux des libellés d'étape courts, afin de lire la navigation sans troncature.
77. En tant que Bailleur, je veux que chaque Espace privatif soit divisé en panneaux « Surfaces », « Équipements et éléments supplémentaires », « Mobilier » et « Photos et preuves », afin de traiter une partie cohérente à la fois.
78. En tant que Bailleur, je veux ouvrir directement chaque panneau, afin de revenir sur une information sans suivre un sous-parcours imposé.
79. En tant que Bailleur, je veux voir quel panneau contient une erreur, afin de corriger rapidement une Étape de visite incomplète.
80. En tant que Bailleur, je veux conserver une seule Confirmation d'une étape d'état des lieux par Espace privatif, afin qu'une pièce ne soit jamais considérée comme partiellement confirmée.
81. En tant que Bailleur, je veux que les Éléments supplémentaires d'état des lieux soient présentés comme des cartes structurées, afin de distinguer clairement leurs champs.
82. En tant que Bailleur, je veux que « Supprimer » soit placé dans l'en-tête de la carte concernée, afin de comprendre immédiatement quel élément sera retiré.
83. En tant que Bailleur, je veux lire « Neuf », « Bon état », « État d'usage », « Dégradé », « Absent » ou « Non applicable », afin de ne jamais voir les valeurs techniques de l'énumération.
84. En tant que Bailleur, je veux retrouver ces libellés français dans les formulaires, références d'entrée, synthèses et comparaisons, afin d'avoir un vocabulaire cohérent.
85. En tant que Bailleur, je veux que les formulaires généraux et le dossier à signer occupent la même largeur visible, afin d'éviter une hiérarchie visuelle accidentelle.
86. En tant que Bailleur, je veux que le fuseau horaire soit détecté et figé sans être affiché ni modifiable, afin de renseigner seulement des informations utiles.
87. En tant que Bailleur, je veux que la date civile de l'État des lieux soit validée dans ce fuseau sans conversion UTC, afin de préserver le jour réel.
88. En tant que Bailleur, je veux qu'aucun message de connexion ne s'affiche lorsque tout fonctionne, afin d'éviter un statut sans action.
89. En tant que Bailleur hors ligne, je veux une bannière informative indiquant « Hors ligne — vos modifications restent sur cette page, mais leur enregistrement et l'envoi des photos nécessitent une connexion. », afin de savoir comment reprendre.
90. En tant que Bailleur hors ligne, je veux conserver ma saisie dans la page et rendre indisponibles seulement les opérations réseau concernées, afin d'éviter une perte de travail.
91. En tant que Bailleur, je veux voir « Enregistré » brièvement près du stepper après une sauvegarde automatique, afin de savoir qu'elle a réussi sans subir un snackbar répétitif.
92. En tant que Bailleur, je veux voir le `MatSnackBar` « Brouillon enregistré » après un enregistrement explicitement demandé, afin d'obtenir une confirmation visible mais temporaire.
93. En tant que Bailleur, je veux qu'un échec reste affiché dans l'étape concernée avec « Réessayer », afin de ne pas manquer une erreur éphémère.
94. En tant que Bailleur, je veux voir « Dossier unique à signer » uniquement dans la Vérification finale, afin de ne pas croire qu'il appartient à chaque formulaire.
95. En tant que Bailleur, je veux voir la liste précise des confirmations et écarts encore manquants, afin de rendre le dossier prêt sans tâtonner.
96. En tant que Bailleur, je veux voir « Préparer le dossier à signer » dès que toutes les conditions sont réunies, afin de poursuivre au bon moment.
## Implementation Decisions
- Réutiliser Angular Material et Font Awesome déjà installés. Ne pas ajouter de bibliothèque de date, de stepper, d'icônes, de notification ou de stockage.
- Corriger uniquement l'alignement interne du contenu de chargement du bouton du Profil bailleur. Son emplacement actuel dans la page Paramètres et dans la boîte de complétion reste inchangé.
- Remplacer tous les contrôles natifs `date` par un contrôle Angular Material cohérent, avec déclencheur visible, saisie clavier, locale française et adaptation explicite entre la valeur du contrôle et la date civile ISO.
- Ne jamais convertir une date civile en instant UTC. Les règles existantes de fuseau IANA restent applicables.
- Ajouter une aide accessible uniquement aux choix contractuels qui nécessitent une explication. Les attestations explicites et les clauses de catalogue qui affichent déjà leur description n'ajoutent pas une icône redondante.
- Le déclencheur d'aide réutilise Angular Material et rend le même contenu accessible au survol, au focus clavier, au clic et au toucher.
- Brancher la présélection IRL existante sur le département de l'Appartement : `001515333` en métropole hors Corse, `010760507` en Corse et `010760509` dans les territoires ultramarins pris en charge.
- La série présélectionnée initialise réellement un nouveau champ vide au lieu de rester un simple placeholder. Elle ne réécrit jamais une valeur persistée ou corrigée ; les corrections exceptionnelles conservent le mécanisme existant de confirmation auditée.
- Afficher « Montant des travaux récents », « Description des travaux récents » et les autres conditions dans une seule colonne, même sur ordinateur. Chaque contrôle apparaît sous son texte et utilise la largeur disponible.
- Déplacer toutes les mutations de Pièces jointes dans le formulaire Locataire. Les cartes de liste conservent l'affichage et le téléchargement, mais plus l'ajout ni la suppression.
- Le formulaire Locataire accepte une sélection multifichier avant la création. Les fichiers restent en mémoire dans le navigateur ; aucun stockage serveur temporaire ni nouvel identifiant de brouillon n'est introduit.
- La soumission crée d'abord le Locataire avec le contrat existant, bascule le formulaire sur l'identifiant retourné, puis utilise l'endpoint de téléversement existant pour chaque fichier. Si la création échoue, aucun téléversement ne démarre et tous les fichiers en attente restent sélectionnés.
- La création et les téléversements ne forment pas une transaction atomique. Un échec de fichier ne supprime jamais le Locataire créé ni les fichiers déjà acceptés.
- Chaque fichier possède son état local, sa progression, son erreur et son action de reprise. Les fichiers non encore acceptés restent disponibles tant que la page reste ouverte.
- Les contrôles backend existants sur le fichier non vide, sa taille, ses métadonnées et l'autorisation du Bailleur restent inchangés.
- Renommer la rubrique « Garanties du bail » et introduire Garantie locative comme union explicite : Garantie par personne physique, Garantie par Organisme garant ou Garantie Visale.
- Une Garantie par personne physique exige prénom, nom et e-mail ; téléphone et adresse restent facultatifs.
- Un Organisme garant exige une dénomination, une adresse de siège et un nom de représentant. Son identifiant d'immatriculation, son e-mail et son téléphone sont facultatifs.
- Un Organisme garant reste interne au Bail et ne devient pas un nouvel agrégat. Il suit les mêmes snapshots, autorisations et règles d'Avenant que les Garanties existantes.
- Chaque Garantie par personne physique ou Organisme garant référence explicitement un unique Locataire du Bail. Les exigences d'Actes sont calculées à partir de ces couples déclarés, jamais comme le produit cartésien de tous les Garants et de tous les Locataires.
- Un Acte de cautionnement signé est obligatoire avant Finalisation pour chaque couple déclaré. Le Bailleur atteste sa correspondance avec le Bail ; l'application conserve l'auteur du téléversement, l'horodatage UTC et l'empreinte SHA-256.
- Ne pas créer de gestion des Kbis, statuts ou pièces d'identité de représentant dans ce périmètre.
- Une Garantie Visale est un fait unique du Bail avec un ensemble non vide et sans doublon d'identifiants de Locataires couverts. Cet ensemble doit correspondre aux Locataires désignés sur le visa et le contrat.
- L'affichage de Visale auprès de chaque Locataire est dérivé de cette Garantie unique ; aucune copie indépendante de la garantie ou de ses documents n'est créée.
- Une Garantie Visale exige un numéro de visa. Le PDF du visa certifié est une Pièce jointe facultative ; ni le numéro ni ce PDF n'activent seuls la garantie.
- Le contrat de cautionnement Visale validé est obligatoire avant la première génération du dossier unique à signer. L'application ne lit ni ne certifie le contenu du PDF.
- Le contrat Visale est conservé comme document immuable séparé du PDF unique signé par Bailleur et Locataires. Il reste dans le dossier de la Révision finalisée.
- L'empreinte du contrat Visale participe à l'empreinte source de la Révision du document de bail. Son ajout, retrait ou remplacement rend toute Révision générée obsolète ; un remplacement crée un nouveau document immuable sans modifier le précédent.
- Toute modification du numéro de visa ou des Locataires couverts rend le contrat associé caduc jusqu'à un nouveau téléversement.
- La génération et la Finalisation revalident la présence, l'appartenance au Bailleur, les métadonnées, l'intégrité et l'empreinte du document stocké ainsi que la couverture déclarée : ensemble non vide, sans doublon et composé uniquement de Locataires du Bail.
- La combinaison déclarée de Visale avec une autre Garantie locative produit une Alerte de conformité juridique versionnée, contournable et auditée, jamais un blocage permanent.
- Tout Avenant d'un Bail couvert par Visale exige soit le retrait ou remplacement de Visale à sa date d'effet, soit une dérogation juridique explicite et auditée. Aucun Avenant ne prolonge Visale silencieusement.
- Le parcours Garantie affiche initialement un bouton centré sans formulaire vide. Une seule Garantie peut être inachevée ; l'annulation la retire sans toucher aux autres.
- Une Garantie valide devient une carte récapitulative avec actions Modifier et Supprimer. Le bouton suivant est libellé « Ajouter une autre garantie ».
- Continuer à utiliser les erreurs structurées et chemins indexés pour les Garanties imbriquées. Une erreur d'une carte ne doit ni effacer ni invalider visuellement les autres.
- Lorsque l'Appartement ne possède aucun Espace privatif, l'initialisation de l'Inventaire retourne HTTP 409 avec le code stable `furniture_inventory_private_areas_missing` plutôt qu'une exception générique.
- La page d'Inventaire traduit ce code en un état bloqué actionnable avec « Modifier l'appartement », qui ouvre l'édition de l'Appartement associé. Le backend reste la source d'autorité afin de couvrir aussi les accès directs.
- Ne pas créer automatiquement d'Espace privatif et supprimer l'option « Tout l'appartement », puisque chaque ligne d'Inventaire doit référencer un Espace privatif réel.
- Restaurer dans l'Inventaire la grille et les classes de largeur partagées déjà utilisées par les autres formulaires. Conserver la largeur maximale générale de la page.
- Renommer l'action finale « Enregistrer et revenir aux baux ». Naviguer uniquement après réussite et transmettre un succès transitoire à la page des Baux.
- En cas d'échec d'enregistrement de l'Inventaire, conserver les valeurs et erreurs locales, rester sur la page et proposer une reprise.
- Une ligne d'Inventaire constitue l'unique constat du meuble ou appareil correspondant dans l'État des lieux. Elle porte quantité observée, répartitions d'état, observation et preuves.
- Supprimer `FurnitureEquipmentKind` et `equipmentKind` des lignes d'Inventaire, snapshots, DTO, documents Mongo et formulaires : ce champ ne sert qu'à créer le constat d'équipement dupliqué.
- Ne plus créer de zone d'équipement dérivée d'une ligne d'Inventaire. Les zones d'équipement restent réservées aux éléments de l'Appartement qui ne figurent pas dans l'Inventaire.
- Mettre à jour le brouillon d'État des lieux, la validation, les cibles photo, la comparaison et le rendu documentaire afin qu'un objet d'Inventaire n'apparaisse et ne demande une preuve qu'une seule fois.
- Remplacer le stepper horizontal par un stepper Angular Material vertical et non linéaire sur toutes les tailles d'écran. Il conserve l'Ordre de visite, n'affiche que le contenu de l'étape active et reste utilisable de 2 à 15 Espaces privatifs.
- Conserver le numéro de l'étape après confirmation et afficher une coche indépendante. Ne pas dépendre d'une ligature Material Icons absente.
- Raccourcir les libellés de navigation ; exposer le statut confirmé ou incomplet séparément et de manière accessible.
- Chaque Étape de visite d'un Espace privatif contient quatre panneaux Material directement accessibles : Surfaces ; Équipements et éléments supplémentaires ; Mobilier ; Photos et preuves.
- Les panneaux sont une organisation visuelle seulement. L'Espace privatif conserve une unique Confirmation d'une étape d'état des lieux et les mêmes règles d'invalidation.
- Chaque panneau signale les erreurs qu'il contient et le focus de validation cible le premier contrôle invalide réel.
- Présenter chaque Élément supplémentaire d'état des lieux dans une carte Material avec en-tête et action Supprimer associée clairement à cette carte.
- Réutiliser la fonction existante de traduction des états partout où une valeur est visible. Les valeurs brutes de l'énumération ne sont jamais affichées.
- Aligner les surfaces de formulaire sur une même largeur visible, y compris Informations générales, Étapes de visite et Vérification finale.
- Détecter le fuseau IANA lors de la création du brouillon d'État des lieux, le figer avec celui-ci et ne plus l'exposer comme champ ni comme texte de synthèse. La réponse conserve ce fait pour l'audit ; `timeZone` disparaît du contrat de mutation et les validations utilisent toujours la valeur figée du brouillon.
- Ne rien afficher lorsque le navigateur est en ligne. Hors ligne, afficher la bannière informative « Hors ligne — vos modifications restent sur cette page, mais leur enregistrement et l'envoi des photos nécessitent une connexion. » ; les champs locaux restent éditables et seules les opérations réseau concernées sont indisponibles.
- Une sauvegarde automatique expose brièvement « Enregistré » près du stepper. Seul un enregistrement explicitement demandé expose le `MatSnackBar` « Brouillon enregistré » ; la confirmation d'une étape et l'autosave ne le déclenchent pas.
- Les erreurs de sauvegarde, photo, génération ou finalisation restent persistantes et locales avec une action Réessayer ; elles ne sont jamais remplacées par une réussite ou un état vide.
- Déplacer « Dossier unique à signer » dans la Vérification finale. Avant disponibilité, afficher la liste précise des confirmations et écarts manquants ; après disponibilité, afficher l'action de préparation.
- Continuer à respecter ADR-0009 pour Angular Material, ADR-0011 pour les frontières d'agrégats, ADR-0015 pour les alertes juridiques et ADR-0021 pour le dossier unique Bail–Inventaire–État des lieux.
- Modifier directement les contrats API, documents Mongo de développement, modèles frontend et tests. Aucune migration de production, compatibilité descendante, double lecture ou double écriture n'est requise.
- Toutes les nouvelles valeurs externes sont validées côté serveur et toutes les réponses inconnues sont parsées avant d'être exposées à l'interface.
## Testing Decisions
- Tester les comportements observables et les invariants métier, jamais les classes CSS internes, les méthodes privées, l'ordre des appels entre collaborateurs internes ou la structure exacte des composants.
- Utiliser comme couture navigateur principale les projets Playwright existants avec API simulée aux largeurs 360, 768 et 1280 px. Couvrir les interactions au clic et au clavier, la navigation, le focus, les retours d'opération et les mises en page responsive.
- Vérifier par assertions géométriques, sans snapshots, que le contenu du bouton Profil reste centré et stable, que montant puis description des Travaux apparaissent chacun sous leur libellé sur leur propre ligne en desktop, et que les formulaires et le dossier final partagent la largeur attendue.
- Couvrir dans Playwright les sélecteurs de date globaux ; l'absence de mutation de Pièce jointe depuis une carte ; le cycle d'ajout des Garanties ; le prérequis et la redirection de l'Inventaire ; le stepper vertical et ses panneaux avec 2 puis 15 Espaces privatifs, des libellés non tronqués, un seul contenu actif, l'accès direct dans l'Ordre de visite et les erreurs de panneau ; l'absence de bannière en ligne, sa présence hors ligne, les mutations réseau indisponibles et la saisie locale conservée.
- Tester au niveau du formulaire Locataire que la création n'est appelée qu'une fois, que seuls les fichiers en échec sont repris, qu'un fichier accepté n'est jamais renvoyé et qu'un échec de création conserve tous les fichiers sans déclencher de téléversement.
- Tester dans `LeaseForm` que le choix d'un Appartement initialise la série IRL d'un nouveau champ vide et qu'une édition, une correction ou un changement d'Appartement ne remplace jamais silencieusement une valeur déjà persistée.
- Tester l'adaptation des dates civiles autour du contrôle partagé : saisie manuelle et calendrier produisent le même ISO civil, sans conversion UTC, dans la locale française.
- Tester les Garanties au niveau du domaine pour l'union des trois variantes, leurs champs requis, l'unicité de la Garantie Visale, l'ensemble non vide et sans doublon de ses Locataires et l'obligation de décision d'Avenant. Tester au niveau application le calcul des seuls couples Garant–Locataire déclarés, l'exigence de chaque Acte, le contrat Visale requis et l'invalidation de Révision par l'empreinte.
- Étendre les tests Web ciblés pour les nouvelles unions de requête/réponse, les erreurs indexées, les identifiants de Locataires couverts, les documents, les codes d'erreur et les refus de références appartenant à un autre Bailleur ou Bail.
- Étendre les parcours API Spring Boot existants, avec MockMvc, MongoDB Testcontainers en replica set et stockage temporaire, par cas ciblés plutôt que créer un nouveau scénario monolithique. Couvrir les trois Garanties, la Finalisation avec les seuls Actes déclarés, le cumul Visale audité et la décision explicite d'Avenant ; conserver les tests de rollback déjà présents.
- Vérifier dans `FurnitureInventoryWebTest` le HTTP 409 et le code `furniture_inventory_private_areas_missing`, dans `FurnitureInventoryServiceTest` l'absence d'initialisation sans Espace privatif et le refus de toute ligne sans Espace réel.
- Vérifier au niveau du modèle de brouillon puis de `PropertyConditionReportServiceTest` qu'une ligne d'Inventaire ne crée ni zone d'équipement ni seconde cible photo, tandis qu'un équipement absent de l'Inventaire reste constaté séparément.
- Créer un État des lieux avec un fuseau IANA, le recharger et l'enregistrer depuis un navigateur configuré dans un autre fuseau, puis vérifier que le fuseau d'origine reste inchangé et que la validation de date civile l'utilise. Le contrat de mutation ne doit pas permettre son remplacement.
- Tester les retours exacts de l'État des lieux : « Enregistré » local après autosave, aucun snackbar après autosave ou confirmation d'étape, `MatSnackBar` « Brouillon enregistré » après sauvegarde explicite et erreur locale persistante avec reprise.
- Adapter le test existant du renderer qui extrait le texte avec PDFBox et compte les images : le meuble reste présent dans l'annexe Inventaire et dans son constat d'État des lieux, mais jamais dans un second constat d'équipement ni dans une seconde exigence photo. Vérifier séparément la conservation du contrat Visale et son empreinte, sans comparer les octets complets d'un PDF ou d'un ZIP.
- Utiliser une horloge fixe, des identifiants déterministes lorsque nécessaire et des fichiers temporaires isolés. Aucun test ne dépend de son ordre d'exécution, d'INSEE, de Visale.fr ou d'un autre service externe.
- Exécuter le formatage, le lint, la vérification TypeScript, les tests frontend pertinents, les contrôles backend et le build du projet avant livraison.
## Out of Scope
- Découpage de #71 en tickets enfants ; il sera réalisé séparément.
- Stockage serveur temporaire ou transaction atomique englobant la création du Locataire et tous ses téléversements.
- Gestion des Kbis, statuts, pièces d'identité de représentants ou autres dossiers justificatifs des Organismes garants.
- Actualisation annuelle d'un contrat Visale, déclaration d'impayé, suivi de remboursement, notification de sortie ou intégration à l'espace Visale.
- Appel automatique aux API ou au site d'INSEE pour choisir la série lors de la saisie du Bail ; la sélection reste fondée sur la règle départementale embarquée.
- Détection juridique automatique complète de l'applicabilité d'une Garantie ou suppression des dérogations auditées.
- Fusion du contrat Visale dans le PDF unique signé par Bailleur et Locataires.
- Garantie Visale dupliquée par Locataire ou Acte de cautionnement commun à plusieurs Locataires hors Visale.
- Création automatique d'un Espace privatif ou lignes d'Inventaire rattachées à « Tout l'appartement ».
- Plusieurs confirmations indépendantes à l'intérieur d'un même Espace privatif.
- Mode hors ligne durable, service worker, stockage navigateur persistant ou synchronisation différée.
- Envoi d'e-mail, signature électronique, OCR ou vérification cryptographique des signatures.
- Nouvelle bibliothèque de composants, de dates, de stepper, de notifications, d'icônes ou d'état.
- Refonte générale du design system ou des domaines non nécessaires à ces parcours.
- Migration de données de production ou compatibilité avec les anciens contrats de développement.
## Further Notes
- Le terme demandé `00151333` comportait une erreur. La [série IRL métropolitaine officielle](https://www.insee.fr/fr/statistiques/serie/001515333) est `001515333`; la Corse et les territoires ultramarins conservent leurs séries déjà prises en charge.
- La liste officielle des justificatifs d'un [Organisme garant](https://www.service-public.fr/particuliers/vosdroits/F1169?lang=fr) motive les faits structurés retenus, sans ajouter leur téléversement à ce périmètre.
- La Garantie Visale doit être [validée avant la signature du Bail](https://www.visale.fr/faq/quelles-sont-les-conditions-liees-a-la-date-de-signature-et-deffet-du-bail-2/). Le contrat est un document distinct du dossier signé par les parties, mais son empreinte appartient à la Révision.
- La documentation officielle Visale indique également qu'un [cumul de garanties](https://www.visale.fr/vos-questions/faq-bailleurs/les-garanties-loyer-impaye/) peut invalider le contrat et qu'un [Avenant peut mettre fin à la couverture](https://www.visale.fr/contrat-visale_3-reflexes/). L'application traduit ces règles évolutives en décisions explicites et alertes auditées conformément à ADR-0015.
- `CONTEXT.md` contient désormais les définitions de Garantie locative, Organisme garant et Garantie Visale, ainsi que les décisions sur le constat unique du mobilier et le fuseau figé de l'État des lieux.
- Aucun nouvel ADR n'est créé : les décisions suivent les frontières et principes déjà acceptés, et les choix d'interface restent réversibles.
<p>changed title from <code class="idiff">UI problems</code> to <code class="idiff">UI<span class="idiff left right addition">/UX</span> problems</code></p>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem Statement
Le Bailleur rencontre une accumulation d'incohérences visuelles, de retours d'opération ambigus et de parcours bloquants dans les formulaires du Profil bailleur, des Locataires, du Bail, de l'Inventaire du mobilier et de l'État des lieux. Certaines actions réussissent sans retour visible, certains échecs sont présentés comme des erreurs génériques, les contrôles changent de comportement selon la page ou le navigateur et plusieurs mises en page deviennent difficiles à utiliser sur ordinateur ou mobile.
Ces problèmes ne sont pas uniquement cosmétiques. Les Pièces jointes des Locataires sont modifiables depuis une carte de liste au lieu de leur formulaire, l'ajout d'une Garantie locative est confus, la série IRL n'est pas réellement présélectionnée, un Appartement sans Espace privatif mène à une erreur d'Inventaire non actionnable et un même meuble peut être constaté deux fois dans l'État des lieux. Le Bailleur ne peut donc pas distinguer clairement une donnée manquante, une opération en cours, une réussite ou une incohérence de modèle.
Solution
Unifier les parcours concernés autour des composants Angular Material déjà installés, des contrats d'erreur structurés existants et des règles du domaine. Chaque opération observable expose un état de chargement, une réussite transitoire ou un échec récupérable à l'endroit où le Bailleur agit. Les formulaires conservent les saisies après échec, restent utilisables au clavier et sur mobile et n'ajoutent aucune dépendance d'interface.
Le parcours Locataire permet de sélectionner plusieurs fichiers en attente avant la première création, puis crée le Locataire et téléverse chaque fichier avec reprise individuelle. Le Bail distingue désormais les Garanties locatives apportées par un Garant personne physique, un Organisme garant ou une Garantie Visale. Le contrat Visale est validé avant la signature, conservé séparément du PDF unique et lié à sa Révision par son empreinte.
L'Inventaire du mobilier expose un prérequis actionnable lorsqu'aucun Espace privatif n'existe, utilise toute sa largeur de formulaire et revient aux Baux après enregistrement. L'État des lieux adopte une navigation verticale lisible, découpe chaque Espace privatif en panneaux, conserve une confirmation unique par Étape de visite et fait de la ligne d'Inventaire l'unique constat du meuble correspondant.
User Stories
001515333, afin d'utiliser l'identifiant INSEE officiel plutôt que la valeur erronée de la demande initiale.010760507ou010760509, afin de ne pas appliquer la série métropolitaine universellement.MatSnackBar« Brouillon enregistré » après un enregistrement explicitement demandé, afin d'obtenir une confirmation visible mais temporaire.Implementation Decisions
datepar un contrôle Angular Material cohérent, avec déclencheur visible, saisie clavier, locale française et adaptation explicite entre la valeur du contrôle et la date civile ISO.001515333en métropole hors Corse,010760507en Corse et010760509dans les territoires ultramarins pris en charge.furniture_inventory_private_areas_missingplutôt qu'une exception générique.FurnitureEquipmentKindetequipmentKinddes lignes d'Inventaire, snapshots, DTO, documents Mongo et formulaires : ce champ ne sert qu'à créer le constat d'équipement dupliqué.timeZonedisparaît du contrat de mutation et les validations utilisent toujours la valeur figée du brouillon.MatSnackBar« Brouillon enregistré » ; la confirmation d'une étape et l'autosave ne le déclenchent pas.Testing Decisions
LeaseFormque le choix d'un Appartement initialise la série IRL d'un nouveau champ vide et qu'une édition, une correction ou un changement d'Appartement ne remplace jamais silencieusement une valeur déjà persistée.FurnitureInventoryWebTestle HTTP 409 et le codefurniture_inventory_private_areas_missing, dansFurnitureInventoryServiceTestl'absence d'initialisation sans Espace privatif et le refus de toute ligne sans Espace réel.PropertyConditionReportServiceTestqu'une ligne d'Inventaire ne crée ni zone d'équipement ni seconde cible photo, tandis qu'un équipement absent de l'Inventaire reste constaté séparément.MatSnackBar« Brouillon enregistré » après sauvegarde explicite et erreur locale persistante avec reprise.Out of Scope
Further Notes
00151333comportait une erreur. La série IRL métropolitaine officielle est001515333; la Corse et les territoires ultramarins conservent leurs séries déjà prises en charge.CONTEXT.mdcontient désormais les définitions de Garantie locative, Organisme garant et Garantie Visale, ainsi que les décisions sur le constat unique du mobilier et le fuseau figé de l'État des lieux.changed the description
changed the description
changed the description
changed title from
UI problemstoUI/UX problemschanged the description
changed the description
changed the description
mentioned in issue #72
mentioned in issue #73
mentioned in issue #74
mentioned in issue #75
mentioned in issue #76
mentioned in issue #77
mentioned in issue #78
mentioned in issue #79
mentioned in issue #80
mentioned in issue #81
mentioned in issue #82
mentioned in issue #83
mentioned in issue #84
mentioned in issue #85
mentioned in issue #86
mentioned in issue #87
Preserved GitLab #71 history: source attribution, exact timestamps, discussion grouping and review positions. Historical diff snapshots: 1; visible source notes: 23.
gitlab-47-issue-71.md (SHA-256
097779b915fd988ac4202ad9b4c1605f94692e3010a8310d9cf404902e312674)gitlab-47-issue-71.json (SHA-256
44dc772b22fb548b26d7da359f79558e3d8e6f0d4ce60cd9c7108d306e0fdbe8)Old CI job execution and reports are omitted. Original source files and rollback backups remain protected.