koprogo_api/domain/copropriete/majorites.rs
1//! L'affectation des majorités par nature de décision.
2//!
3//! Art. 3.88. Le domaine portait déjà les seuils — absolue, deux tiers, quatre
4//! cinquièmes, unanimité — et les calculait correctement, abstentions exclues
5//! (Art. 3.87 § 8). Ce qui n'avait jamais été confronté à l'article, c'est
6//! leur **affectation** : quel seuil pour quelle décision.
7//!
8//! L'écart est sérieux dans les deux sens. Un seuil trop bas rend la décision
9//! annulable ; un seuil trop haut bloque une copropriété sans base légale.
10//!
11//! Le modèle portait `ResolutionType { Ordinary, Extraordinary }`, qui ne
12//! correspond à rien dans le texte : la loi ne connaît pas de décisions
13//! « ordinaires » et « extraordinaires », elle énumère des natures et leur
14//! attache un seuil. D'où [`NatureDeDecision`], calquée sur l'énumération de
15//! l'article, et une majorité **dérivée** plutôt que choisie — un appelant qui
16//! choisit peut choisir mal.
17//!
18//! Trois subtilités que l'énumération seule ne rend pas :
19//!
20//! 1. **l'exception du 1°, b)** — les travaux affectant les parties communes
21//! exigent les deux tiers, *sauf* les travaux imposés par la loi, les
22//! travaux conservatoires et ceux d'administration provisoire, qui passent
23//! à la majorité absolue. Confondre les deux bloquerait une toiture qui
24//! fuit derrière un vote qualifié ;
25//! 2. **le § 3, alinéa 2** — la modification de la répartition des quotes-parts
26//! exige l'unanimité, *mais* quand l'assemblée décide de travaux, d'une
27//! division de lots ou d'un acte de disposition à la majorité qualifiée,
28//! elle peut statuer **à cette même majorité** sur la modification de
29//! quotités qui en découle nécessairement. Sans cette porte, toute
30//! division de lot deviendrait impossible dès qu'un copropriétaire s'y
31//! oppose ;
32//! 3. **le défaut est la majorité absolue** (Art. 3.87 § 8) : « sauf si la loi
33//! exige une majorité qualifiée ». Ce qui n'est pas énuméré relève du droit
34//! commun.
35//!
36//! Voir issue #751.
37
38use super::resolution::MajorityType;
39
40/// La nature d'une décision, telle que l'Art. 3.88 l'énumère.
41#[derive(Debug, Clone, Copy, PartialEq, Eq)]
42pub enum NatureDeDecision {
43 // ── § 1er, 1° — deux tiers ──────────────────────────────────────
44 /// a) Modification des statuts portant sur la jouissance, l'usage ou
45 /// l'administration des parties communes.
46 ModificationStatutsUsageDesCommuns,
47 /// b) Travaux affectant les parties communes.
48 TravauxAuxPartiesCommunes,
49 /// c) Montant des marchés à partir duquel la mise en concurrence est
50 /// obligatoire.
51 SeuilDeMiseEnConcurrence,
52 /// d) Travaux à des parties privatives exécutés par l'ACP, sur motivation
53 /// spéciale.
54 TravauxPrivatifsExecutesParLacp,
55
56 // ── § 1er, 1°, b), exception — majorité absolue ─────────────────
57 /// Travaux imposés par la loi.
58 TravauxImposesParLaLoi,
59 /// Travaux conservatoires.
60 TravauxConservatoires,
61 /// Actes d'administration provisoire.
62 AdministrationProvisoire,
63
64 // ── § 1er, 2° — quatre cinquièmes ───────────────────────────────
65 /// a) Toute autre modification des statuts, **y compris la répartition des
66 /// charges**.
67 ///
68 /// À ne pas confondre avec la répartition des **quotes-parts**, qui relève
69 /// de l'unanimité (§ 3). Les charges se répartissent, les quotités
70 /// s'établissent.
71 AutreModificationDesStatuts,
72 /// b) Modification de la destination de l'immeuble ou d'une partie.
73 ModificationDeLaDestination,
74 /// c) Reconstruction ou remise en état après destruction partielle.
75 ReconstructionApresDestructionPartielle,
76 /// d) Acquisition de biens immobiliers destinés à devenir communs.
77 AcquisitionDeBiensCommuns,
78 /// e) Actes de disposition de biens immobiliers communs.
79 ActeDeDispositionDeBiensCommuns,
80 /// f) Modification des statuts pour créer des associations partielles.
81 CreationDassociationsPartielles,
82 /// g) Division d'un lot, ou réunion de plusieurs lots.
83 DivisionOuReunionDeLots,
84 /// h) Démolition et reconstruction totales pour raisons de salubrité, de
85 /// sécurité, ou de coût excessif de mise en conformité.
86 DemolitionReconstructionPourSalubriteOuCout,
87
88 // ── § 3 — unanimité ────────────────────────────────────────────
89 /// Modification de la répartition des quotes-parts de copropriété.
90 ModificationDesQuotesParts,
91 /// Démolition et reconstruction totales pour un autre motif que ceux du
92 /// 2°, h).
93 DemolitionReconstructionAutreMotif,
94
95 /// Tout le reste : droit commun de l'Art. 3.87 § 8.
96 DroitCommun,
97}
98
99impl NatureDeDecision {
100 /// La majorité que la loi exige pour cette nature de décision.
101 ///
102 /// Dérivée, jamais choisie : c'est le point de cette construction.
103 pub fn majorite_requise(&self) -> MajorityType {
104 match self {
105 Self::ModificationStatutsUsageDesCommuns
106 | Self::TravauxAuxPartiesCommunes
107 | Self::SeuilDeMiseEnConcurrence
108 | Self::TravauxPrivatifsExecutesParLacp => MajorityType::TwoThirds,
109
110 Self::TravauxImposesParLaLoi
111 | Self::TravauxConservatoires
112 | Self::AdministrationProvisoire
113 | Self::DroitCommun => MajorityType::Absolute,
114
115 Self::AutreModificationDesStatuts
116 | Self::ModificationDeLaDestination
117 | Self::ReconstructionApresDestructionPartielle
118 | Self::AcquisitionDeBiensCommuns
119 | Self::ActeDeDispositionDeBiensCommuns
120 | Self::CreationDassociationsPartielles
121 | Self::DivisionOuReunionDeLots
122 | Self::DemolitionReconstructionPourSalubriteOuCout => MajorityType::FourFifths,
123
124 Self::ModificationDesQuotesParts | Self::DemolitionReconstructionAutreMotif => {
125 MajorityType::Unanimity
126 }
127 }
128 }
129
130 /// Cette nature ouvre-t-elle la porte du § 3, alinéa 2 ?
131 ///
132 /// « Lorsque l'assemblée générale, à la majorité qualifiée requise par la
133 /// loi, décide de **travaux**, de la **division ou la réunion de lots** ou
134 /// d'**actes de disposition**, elle peut statuer, à la même majorité
135 /// qualifiée, sur la modification de la répartition des quotes-parts dans
136 /// les cas où cette modification est nécessaire. »
137 pub fn autorise_quotes_parts_a_la_meme_majorite(&self) -> bool {
138 matches!(
139 self,
140 Self::TravauxAuxPartiesCommunes
141 | Self::DivisionOuReunionDeLots
142 | Self::ActeDeDispositionDeBiensCommuns
143 | Self::CreationDassociationsPartielles
144 )
145 }
146}
147
148/// La majorité applicable à une modification de quotes-parts, selon qu'elle
149/// découle ou non d'une décision qui l'autorise (Art. 3.88 § 3, alinéa 2).
150///
151/// `decision_dorigine` est la décision qui rend la modification nécessaire.
152/// `None` — une modification de quotités décidée pour elle-même — exige
153/// l'unanimité.
154///
155/// Sans cette porte, toute division de lot deviendrait impossible dès qu'un
156/// seul copropriétaire s'y oppose, alors que la loi organise précisément le
157/// contraire.
158pub fn majorite_pour_modifier_les_quotes_parts(
159 decision_dorigine: Option<NatureDeDecision>,
160) -> MajorityType {
161 match decision_dorigine {
162 Some(nature) if nature.autorise_quotes_parts_a_la_meme_majorite() => {
163 nature.majorite_requise()
164 }
165 _ => MajorityType::Unanimity,
166 }
167}
168
169#[cfg(test)]
170mod tests {
171 use super::*;
172
173 // ── § 1er, 1° — les deux tiers ─────────────────────────────────
174
175 #[test]
176 fn happy_les_quatre_natures_du_premier_point_exigent_les_deux_tiers() {
177 for nature in [
178 NatureDeDecision::ModificationStatutsUsageDesCommuns,
179 NatureDeDecision::TravauxAuxPartiesCommunes,
180 NatureDeDecision::SeuilDeMiseEnConcurrence,
181 NatureDeDecision::TravauxPrivatifsExecutesParLacp,
182 ] {
183 assert_eq!(
184 nature.majorite_requise(),
185 MajorityType::TwoThirds,
186 "{nature:?}"
187 );
188 }
189 }
190
191 /// L'exception du 1°, b), et pourquoi elle compte.
192 ///
193 /// Confondre travaux ordinaires et travaux conservatoires bloquerait une
194 /// toiture qui fuit derrière un vote qualifié, alors que la loi veut
195 /// précisément qu'on puisse agir vite.
196 #[test]
197 fn happy_les_travaux_conservatoires_passent_a_la_majorite_absolue() {
198 for nature in [
199 NatureDeDecision::TravauxImposesParLaLoi,
200 NatureDeDecision::TravauxConservatoires,
201 NatureDeDecision::AdministrationProvisoire,
202 ] {
203 assert_eq!(
204 nature.majorite_requise(),
205 MajorityType::Absolute,
206 "{nature:?} relève de l'exception du 1°, b)"
207 );
208 }
209 assert_eq!(
210 NatureDeDecision::TravauxAuxPartiesCommunes.majorite_requise(),
211 MajorityType::TwoThirds,
212 "les autres travaux restent aux deux tiers"
213 );
214 }
215
216 // ── § 1er, 2° — les quatre cinquièmes ──────────────────────────
217
218 #[test]
219 fn happy_les_huit_natures_du_second_point_exigent_les_quatre_cinquiemes() {
220 for nature in [
221 NatureDeDecision::AutreModificationDesStatuts,
222 NatureDeDecision::ModificationDeLaDestination,
223 NatureDeDecision::ReconstructionApresDestructionPartielle,
224 NatureDeDecision::AcquisitionDeBiensCommuns,
225 NatureDeDecision::ActeDeDispositionDeBiensCommuns,
226 NatureDeDecision::CreationDassociationsPartielles,
227 NatureDeDecision::DivisionOuReunionDeLots,
228 NatureDeDecision::DemolitionReconstructionPourSalubriteOuCout,
229 ] {
230 assert_eq!(
231 nature.majorite_requise(),
232 MajorityType::FourFifths,
233 "{nature:?}"
234 );
235 }
236 }
237
238 /// La confusion la plus coûteuse de l'article : charges contre quotités.
239 ///
240 /// La **répartition des charges** se modifie aux quatre cinquièmes (2°, a) ;
241 /// la **répartition des quotes-parts** exige l'unanimité (§ 3). Les charges
242 /// se répartissent, les quotités s'établissent — et une AG qui croirait
243 /// pouvoir toucher aux secondes aux quatre cinquièmes prendrait une
244 /// décision annulable.
245 #[test]
246 fn security_les_charges_et_les_quotes_parts_nont_pas_la_meme_majorite() {
247 assert_eq!(
248 NatureDeDecision::AutreModificationDesStatuts.majorite_requise(),
249 MajorityType::FourFifths,
250 "la répartition des CHARGES est aux 4/5"
251 );
252 assert_eq!(
253 NatureDeDecision::ModificationDesQuotesParts.majorite_requise(),
254 MajorityType::Unanimity,
255 "la répartition des QUOTES-PARTS exige l'unanimité"
256 );
257 }
258
259 // ── § 3 — l'unanimité et sa porte ──────────────────────────────
260
261 #[test]
262 fn happy_une_modification_de_quotites_pour_elle_meme_exige_lunanimite() {
263 assert_eq!(
264 majorite_pour_modifier_les_quotes_parts(None),
265 MajorityType::Unanimity
266 );
267 }
268
269 /// § 3, alinéa 2 : la porte que la loi ouvre.
270 ///
271 /// Sans elle, toute division de lot deviendrait impossible dès qu'un seul
272 /// copropriétaire s'y oppose.
273 #[test]
274 fn happy_une_division_de_lot_emporte_les_quotites_a_sa_propre_majorite() {
275 assert_eq!(
276 majorite_pour_modifier_les_quotes_parts(Some(
277 NatureDeDecision::DivisionOuReunionDeLots
278 )),
279 MajorityType::FourFifths
280 );
281 }
282
283 #[test]
284 fn happy_des_travaux_emportent_les_quotites_aux_deux_tiers() {
285 assert_eq!(
286 majorite_pour_modifier_les_quotes_parts(Some(
287 NatureDeDecision::TravauxAuxPartiesCommunes
288 )),
289 MajorityType::TwoThirds
290 );
291 }
292
293 /// @security — la porte ne s'ouvre pas pour n'importe quelle décision.
294 ///
295 /// Une modification de destination ne rend pas nécessaire un remaniement
296 /// des quotités : l'article énumère travaux, division/réunion et actes de
297 /// disposition, et l'étendre reviendrait à contourner l'unanimité.
298 #[test]
299 fn security_toute_decision_qualifiee_nouvre_pas_la_porte() {
300 assert_eq!(
301 majorite_pour_modifier_les_quotes_parts(Some(
302 NatureDeDecision::ModificationDeLaDestination
303 )),
304 MajorityType::Unanimity,
305 "seuls travaux, division/réunion et actes de disposition l'ouvrent"
306 );
307 }
308
309 // ── Le droit commun ────────────────────────────────────────────
310
311 /// Art. 3.87 § 8 : « sauf si la loi exige une majorité qualifiée ».
312 #[test]
313 fn happy_ce_qui_nest_pas_enumere_releve_de_la_majorite_absolue() {
314 assert_eq!(
315 NatureDeDecision::DroitCommun.majorite_requise(),
316 MajorityType::Absolute
317 );
318 }
319
320 /// La démolition totale relève de deux régimes selon son motif.
321 #[test]
322 fn edge_la_demolition_totale_change_de_majorite_selon_son_motif() {
323 assert_eq!(
324 NatureDeDecision::DemolitionReconstructionPourSalubriteOuCout.majorite_requise(),
325 MajorityType::FourFifths,
326 "salubrité, sécurité ou coût excessif : 4/5 (§ 1er, 2°, h)"
327 );
328 assert_eq!(
329 NatureDeDecision::DemolitionReconstructionAutreMotif.majorite_requise(),
330 MajorityType::Unanimity,
331 "tout autre motif : unanimité (§ 3)"
332 );
333 }
334}