Skip to main content

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}