pardoengreg

Product Requirements — Immo

**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`.

pardoengreg 0 Updated 1mo ago

Resources

11
GitHub

Install

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 : TenantsListView et AllTenantsView filtrent via TenantInvitation.objects.filter(invited_by=owner). TenantDetailView accepte 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 retourne already_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 : OwnerCreateTenantView vérifie l'existence avant création. La validation email a été retirée de OwnerCreateTenantSerializer pour 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 :
    1. 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 champ generated_file.
    2. context_data.lease_document_url dans les étapes de la checklist — URL directe du dernier bail fully_signed avec fichier généré.
  • Le locataire n'a accès qu'aux documents de son propre bail (DocumentViewSet.get_queryset() filtre par lease__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_deposit et insurance, la confirmation du propriétaire suffit à considérer l'étape comme complète.
  • Quand le propriétaire confirme (owner_confirmed = True), tenant_completed est automatiquement mis à True — le locataire n'a rien de plus à faire.
  • Quand le propriétaire retire sa confirmation, tenant_completed repasse à False.
  • Implémentation : LeaseChecklistViewSet.owner_confirm() dans apps/properties/views.py — les types GUARANTEE_DEPOSIT et INSURANCE sont dans OWNER_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_included sont not_applicable, les autres required, et internet recommended.
  • Le propriétaire peut modifier le statut et ajouter un relevé de compteur (meter_reading) pour chaque abonnement required, 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_completed passe à True automatiquement dès que tous les abonnements required sont 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.