fix: distingue un lot reloué d'un lot sorti de la gestion

La fiche du lot 15 annonçait « dernier loyer connu, arrêté après févr. 26 »
alors qu'un locataire y est entré le 8 juillet — et la courbe juste dessous,
où la barre de juillet est bien là, la contredisait.

Le loyer en vigueur se lit sur les paliers, et un mois facturé au seul
prorata n'en ouvre pas : celui d'avant s'arrête donc à la dernière mensualité
pleine, quatre mois avant le nouveau bail. Ne rien lire après lui confond deux
états que le compte rendu sépare : un lot qui n'est plus loué, et un lot entre
deux locataires.

La distinction tient à la frontière qui sert déjà à séparer loyer plein et
prorata, la période portée par le compte rendu :

- un prorata qui finit le dernier jour du mois sans partir du premier facture
  la fin du mois : quelqu'un est entré, le bail court encore après ;
- un prorata qui part du premier sans l'atteindre facture le début : le bail
  s'arrête là ;
- un montant négatif ne fait ni l'un ni l'autre. Un avoir porte parfois la
  période exacte de la ligne qu'il annule, et le lire comme une entrée
  inventerait une relocation là où rien n'a été loué.

L'entrée l'emporte sur la sortie parce qu'elle vient après : ce lot voit son
locataire partir le 10 mars et le suivant arriver le 8 juillet, et c'est le
second qui décrit son état.

Le montant affiché ne bouge pas — le nouveau bail n'a été facturé qu'au
prorata, et en tirer un loyer mensuel l'inventerait. Seul ce qu'on en dit
change : « dernier loyer plein · nouveau bail depuis juil. 26 ».

Sans relocation, la sortie date enfin la fin de la location au mois où elle a
lieu : « arrêté en cours de mars 26 » plutôt qu'« arrêté après févr. 26 », qui
l'avançait d'un mois.

Sur le parc : 31 lots loués, 1 relouté, 1 réellement arrêté.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 20:50:54 +02:00
parent faab7173bd
commit b15f5c95b6
5 changed files with 319 additions and 6 deletions

View File

@@ -139,6 +139,57 @@ class TestRepartition:
assert point.prorata == -1390.0
assert point.en_transition is False
def test_un_prorata_qui_finit_le_mois_est_une_entree(self):
"""Lot 15 du parc : le locataire entre le 8 juillet. La location ne
s'arrête donc pas au dernier loyer plein, elle recommence."""
serie = repartir([ligne("2026-07-08", "2026-07-31", 1111.67)])
point = serie.mois[0]
assert point.entree is True
assert point.sortie is False
def test_un_prorata_qui_ouvre_le_mois_est_une_sortie(self):
"""Même lot, quatre mois plus tôt : le locataire part le 10 mars."""
serie = repartir([ligne("2026-03-01", "2026-03-10", 482.35)])
point = serie.mois[0]
assert point.sortie is True
assert point.entree is False
def test_un_mois_qui_change_de_locataire_porte_les_deux(self):
"""Sortie le 3, entrée le 14 : le mois ferme un bail et en ouvre un
autre, et c'est l'entrée qui dit que le lot reste loué."""
serie = repartir(
[
ligne("2025-03-01", "2025-03-03", 109.68),
ligne("2025-03-14", "2025-03-31", 622.2),
]
)
point = serie.mois[0]
assert point.entree is True
assert point.sortie is True
def test_un_avoir_n_ouvre_ni_ne_ferme_de_bail(self):
"""Un avoir porte la période qu'il annule : lu comme une entrée, il
ferait croire à une relocation là où rien n'a été loué."""
serie = repartir(
[
ligne("2024-10-15", "2024-10-31", -700.0),
ligne("2024-11-18", "2024-11-18", -1390.0),
]
)
assert [point.entree for point in serie.mois] == [False, False]
assert [point.sortie for point in serie.mois] == [False, False]
def test_un_mois_plein_n_est_ni_entree_ni_sortie(self):
serie = repartir([ligne("2026-01-01", "2026-01-31", 1447.05)])
point = serie.mois[0]
assert point.entree is False
assert point.sortie is False
def test_une_regularisation_a_cheval_reste_hors_de_la_courbe(self):
"""De mars à août sans couvrir un mois entier : l'étaler inventerait
six demi-mois de loyer."""