**Implémentation :** `LeaseChecklistViewSet.update_subscription()` et `.confirm_subscription()` dans `apps/properties/views.py`. Format généré par `_make_subscription()` dans `apps/properties/models.py`.
Resources
11Install
npx skillscat add pardoengreg/immo Install via the SkillsCat registry.
SKILL.md
Product Requirements — Immo
Ce fichier trace les règles métier validées pour l'application Immo.
Accès locataires par propriétaire
- Un propriétaire ne peut voir que les locataires qu'il a lui-même invités (via
TenantInvitation). - Si un bail est supprimé, le locataire reste visible dans la liste du propriétaire (car la relation est tracée via l'invitation, pas uniquement via le bail).
- Un compte locataire peut donc être visible par plusieurs propriétaires, mais pas par tous — uniquement ceux qui l'ont invité.
- Implémentation :
TenantsListViewetAllTenantsViewfiltrent viaTenantInvitation.objects.filter(invited_by=owner).TenantDetailViewaccepte l'accès si bail existant OU invitation existante.
Création de locataire avec email existant
- Si un propriétaire crée un locataire avec un email déjà utilisé par un compte locataire actif : aucun nouveau compte n'est créé, la relation est enregistrée (invitation marquée
is_used=True), la réponse retournealready_exists: true. - Si l'email appartient à un locataire inactif : une nouvelle invitation est renvoyée sans créer de doublon.
- Si l'email appartient à un utilisateur non-locataire (ex. propriétaire) : erreur 400.
- Implémentation :
OwnerCreateTenantViewvérifie l'existence avant création. La validation email a été retirée deOwnerCreateTenantSerializerpour laisser la vue gérer ce cas.
Téléchargement du bail par le locataire
- Le locataire doit pouvoir télécharger son bail signé.
- Le bail est accessible via deux mécanismes backend :
GET /api/documents/?doc_type=lease&lease=<id>— liste les documents de type bail liés au bail du locataire, chaque document expose son URL dans le champgenerated_file.context_data.lease_document_urldans les étapes de la checklist — URL directe du dernier bailfully_signedavec fichier généré.
- Le locataire n'a accès qu'aux documents de son propre bail (
DocumentViewSet.get_queryset()filtre parlease__tenant=user). - Le frontend doit exposer ce lien de téléchargement depuis la checklist (étape
lease_signature) ou depuis une section Documents dédiée.
Checklist — Dépôt de garantie et assurance habitation
- Pour les étapes de type
guarantee_depositetinsurance, la confirmation du propriétaire suffit à considérer l'étape comme complète. - Quand le propriétaire confirme (
owner_confirmed = True),tenant_completedest automatiquement mis àTrue— le locataire n'a rien de plus à faire. - Quand le propriétaire retire sa confirmation,
tenant_completedrepasse àFalse. - Implémentation :
LeaseChecklistViewSet.owner_confirm()dansapps/properties/views.py— les typesGUARANTEE_DEPOSITetINSURANCEsont dansOWNER_COMPLETES_STEPS.
Checklist — Prise des abonnements
Chaque abonnement dans l'étape subscriptions a un statut individuel géré par le propriétaire :
| Statut | Valeur | Signification |
|---|---|---|
| Obligatoire | required |
Le locataire doit souscrire cet abonnement |
| Non applicable | not_applicable |
L'abonnement n'existe pas pour ce logement (ex. charges incluses) |
| Recommandé | recommended |
Optionnel mais conseillé |
- Par défaut à la création du bail : les abonnements couverts par
charges_includedsontnot_applicable, les autresrequired, et internetrecommended. - Le propriétaire peut modifier le statut et ajouter un relevé de compteur (
meter_reading) pour chaque abonnementrequired, afin de faciliter la prise de contrat. - Quand le statut est modifié par le propriétaire, la confirmation du locataire pour cet abonnement est remise à zéro.
- Le locataire voit la liste complète avec les statuts et relevés, et doit confirmer individuellement chaque abonnement
required. - L'étape globale
tenant_completedpasse àTrueautomatiquement dès que tous les abonnementsrequiredsont confirmés par le locataire.
Format config :
{
"subscriptions": [
{
"key": "electricity",
"label": "Électricité",
"status": "required",
"meter_reading": "12345 kWh",
"tenant_confirmed": false,
"tenant_confirmed_at": null
}
]
}Endpoints :
POST /api/properties/checklist-steps/{id}/update-subscription/— propriétaire, body{ key, status, meter_reading }POST /api/properties/checklist-steps/{id}/confirm-subscription/— locataire, body{ key, confirmed: true|false }
Implémentation : LeaseChecklistViewSet.update_subscription() et .confirm_subscription() dans apps/properties/views.py. Format généré par _make_subscription() dans apps/properties/models.py.