pub struct Acp {Show 19 fields
pub id: Uuid,
pub organization_id: Option<Uuid>,
pub name: String,
pub slug: String,
pub legal_status: AcpLegalStatus,
pub total_tantiemes: i32,
pub bce_number: Option<String>,
pub address_street: String,
pub address_postal_code: String,
pub address_city: String,
pub fenetre_ag_ordinaire: Option<FenetreAgOrdinaire>,
pub reception_provisoire_parties_communes: Option<NaiveDate>,
pub premiere_cession_de_lot: Option<NaiveDate>,
pub transcription_statuts: Option<NaiveDate>,
pub reserve_fund_balance: Decimal,
pub working_capital_balance: Decimal,
pub reserve_fund_waived: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}Expand description
Représente une Association des Copropriétaires (ACP) — racine d’agrégat.
Cf. ADR-0010 (docs/maury/refonte-ux-multi-role-acp/architecture.md §4).
Fields§
§id: Uuid§organization_id: Option<Uuid>Cabinet syndic gestionnaire. None = ACP auto-gérée (ADR-0010).
name: String§slug: String§legal_status: AcpLegalStatus§total_tantiemes: i32Dénominateur de l’acte de base (quotités). Source de vérité de la
copropriété (Art. 3.84 CC, ADR-0010). 1000/10000/autre. Défaut
DEFAULT_TOTAL_TANTIEMES ; modifiable via with_total_tantiemes.
bce_number: Option<String>Numéro BCE belge (optionnel — toutes les ACPs ne sont pas immatriculées).
address_street: String§address_postal_code: String§address_city: String§fenetre_ag_ordinaire: Option<FenetreAgOrdinaire>Story H13 — solde du fonds de réserve (compte distinct au nom de l’ACP, Art. 3.86 §3). Doit couvrir ≥ 5 % des charges ordinaires N-1 sauf renonciation 4/5. Decimal exact (ADR-0007). La période annuelle de quinze jours pendant laquelle se tient l’AG ordinaire, fixée par le règlement d’ordre intérieur.
Art. 3.85 § 3, 3°. None tant que le ROI n’a pas été encodé : une ACP
sans fenêtre n’est pas en infraction, elle est incomplète. C’est au
SuperAdmin de la renseigner en même temps que le reste des statuts.
Elle sert aussi de point d’ancrage au délai de trois semaines des propositions (Art. 3.87 § 3) : sans elle, ce délai n’a pas de départ.
reception_provisoire_parties_communes: Option<NaiveDate>Date de réception provisoire des parties communes de l’immeuble.
Art. 3.86 § 3 al. 4 : elle fait courir le délai de cinq ans au terme duquel le fonds de réserve devient obligatoire. Ce n’est ni la date de constitution de l’ACP, ni celle de la première assemblée — une confusion facile qui décalerait l’échéance de plusieurs années.
None tant qu’elle n’est pas encodée. Et l’inconnu ne vaut pas
dispense : StatutFondsReserve::ReceptionInconnue le dit plutôt que
de répondre « pas encore exigible » à une ACP qui l’est peut-être
depuis longtemps.
premiere_cession_de_lot: Option<NaiveDate>Date de la première cession ou attribution d’un lot.
Art. 3.86 § 1er, 1° : c’est elle qui fait naître l’indivision, donc l’association. Sans elle, un immeuble encore entier aux mains du promoteur n’a pas d’ACP, quels que soient ses statuts.
transcription_statuts: Option<NaiveDate>Date de transcription des statuts au bureau de la Documentation patrimoniale.
Art. 3.86 § 1er, 2°. Son absence ne supprime pas l’association : elle la prive seulement du droit d’opposer sa personnalité aux tiers, lesquels gardent la faculté de la lui opposer (§ 2). La protection joue dans un seul sens, contre l’association négligente.
reserve_fund_balance: Decimal§working_capital_balance: DecimalStory H13 — solde du fonds de roulement (compte distinct, dépenses courantes récurrentes — loi 2019).
reserve_fund_waived: boolStory H13 — l’AG a-t-elle renoncé au fonds de réserve obligatoire
(vote 4/5, Art. 3.86 §3) ? Si true, la conformité réserve est levée.
created_at: DateTime<Utc>§updated_at: DateTime<Utc>Implementations§
Source§impl Acp
impl Acp
Sourcepub fn new(
organization_id: Option<Uuid>,
name: String,
address_street: String,
address_postal_code: String,
address_city: String,
bce_number: Option<String>,
) -> Result<Self, AcpError>
pub fn new( organization_id: Option<Uuid>, name: String, address_street: String, address_postal_code: String, address_city: String, bce_number: Option<String>, ) -> Result<Self, AcpError>
Constructeur validé.
Invariants vérifiés :
name.trim()≥ 2 chars, ≤ 160 charsaddress_street.trim()non videaddress_postal_code.trim()non videaddress_city.trim()non vide
Le slug est dérivé du name (kebab-case ASCII).
Sourcepub fn set_organization(&mut self, organization_id: Option<Uuid>)
pub fn set_organization(&mut self, organization_id: Option<Uuid>)
Rattache (ou détache, avec None) l’ACP à un cabinet syndic.
Le sens “promote/demote” est interprété par l’application : ici on se
limite à mettre à jour le champ + updated_at.
Sourcepub fn update_info(
&mut self,
name: String,
address_street: String,
address_postal_code: String,
address_city: String,
bce_number: Option<String>,
) -> Result<(), AcpError>
pub fn update_info( &mut self, name: String, address_street: String, address_postal_code: String, address_city: String, bce_number: Option<String>, ) -> Result<(), AcpError>
Mise à jour de l’identité de l’ACP (avec re-validation des invariants).
Sourcepub fn is_self_managed(&self) -> bool
pub fn is_self_managed(&self) -> bool
L’ACP est-elle auto-gérée (sans cabinet syndic) ?
Sourcepub fn with_total_tantiemes(self, value: i32) -> Result<Self, AcpError>
pub fn with_total_tantiemes(self, value: i32) -> Result<Self, AcpError>
Builder consommant : fixe le dénominateur de l’acte de base.
Garde new() stable (les appelants existants conservent le défaut
DEFAULT_TOTAL_TANTIEMES). Valide value > 0 (Art. 3.84 CC — un acte
de base sans tantièmes n’a pas de sens). Cf. ADR-0010.
Sourcepub fn set_total_tantiemes(&mut self, value: i32) -> Result<(), AcpError>
pub fn set_total_tantiemes(&mut self, value: i32) -> Result<(), AcpError>
Mise à jour du dénominateur de l’acte de base (re-validation).
Sourcepub fn is_conformant(&self, metrics: &AcpMetrics) -> bool
pub fn is_conformant(&self, metrics: &AcpMetrics) -> bool
L’ACP est-elle conformante, étant données ses métriques agrégées ?
── Un seul axe, et c’est le bon ───────────────────────────────────────
La conformité ne porte que sur les quotités. C’est l’invariant que le registre légal enregistre, dans les termes de l’Art. 3.85 § 1er al. 2 : « Les quotités sont fixées par l’acte de base ; leur somme est le dénominateur. » Un acte de base donne un total de quotités ; il ne donne pas un compte de lots qu’on ne pourrait pas vérifier autrement.
── Ce qui a été retiré, et pourquoi ───────────────────────────────────
La règle exigeait aussi units_count == declared_units_total, c’est-à-
dire l’égalité entre les lots réellement encodés et un total_units
saisi à la main sur l’immeuble. Rien ne tenait cette déclaration à
jour : créer un lot ne la touchait jamais.
D’où le piège, rencontré en recette dès la première session : un syndic
déclare vingt lots à la création de l’immeuble, en encode trois, et
toute sa comptabilité se ferme — assert_conformant alimente le
garde-fou « valider avant de calculer ». C’est le chemin nominal d’un
syndic qui encode son acte de base progressivement, seule façon
réaliste de le faire.
On demandait deux fois le même fait — le nombre de lots — et on ne le réconciliait jamais. La réponse n’est pas d’affaiblir la règle mais de supprimer la source redondante : le nombre de lots se compte, il ne se déclare pas.
L’écart de lots reste rapporté par assert_conformant, parce qu’il
renseigne. Il ne bloque plus. Voir #770.
Sourcepub fn quota_delta(&self, metrics: &AcpMetrics) -> Decimal
pub fn quota_delta(&self, metrics: &AcpMetrics) -> Decimal
Écart de quotités vs l’acte de base : total_tantiemes - quota_sum.
Positif si l’ACP manque de quotités (drift), négatif si surplus.
Sourcepub fn fixer_fenetre_ag_ordinaire(&mut self, fenetre: FenetreAgOrdinaire)
pub fn fixer_fenetre_ag_ordinaire(&mut self, fenetre: FenetreAgOrdinaire)
Retourne Err(AcpNotConformantError) typée si l’ACP n’est pas conforme.
Consommée par les use-cases (validate-before-compute, Story H7) et le
frontend (banner/toast 422 narratif).
Renseigne la période statutaire de l’AG ordinaire (Art. 3.85 § 3, 3°).
Séparé du constructeur à dessein : le ROI est un acte sous signature privée, encodé après l’acte de base authentique. Une ACP existe juridiquement avant que son ROI soit saisi.
Sourcepub fn ag_ordinaire_dans_la_fenetre(&self, date: NaiveDate) -> Option<bool>
pub fn ag_ordinaire_dans_la_fenetre(&self, date: NaiveDate) -> Option<bool>
L’assemblée ordinaire tombe-t-elle dans la fenêtre statutaire ?
None quand le ROI n’a pas été encodé : on ne peut alors ni confirmer
ni infirmer, et le dire est plus honnête que de répondre « conforme ».
Sourcepub fn enregistrer_reception_provisoire(&mut self, date: NaiveDate)
pub fn enregistrer_reception_provisoire(&mut self, date: NaiveDate)
Enregistre la réception provisoire des parties communes.
Elle fait courir le délai de cinq ans du fonds de réserve obligatoire (Art. 3.86 § 3 al. 4).
Sourcepub fn statut_fonds_de_reserve(
&self,
aujourdhui: NaiveDate,
charges_ordinaires_n_moins_1: Decimal,
) -> StatutFondsReserve
pub fn statut_fonds_de_reserve( &self, aujourdhui: NaiveDate, charges_ordinaires_n_moins_1: Decimal, ) -> StatutFondsReserve
L’état de l’obligation de fonds de réserve, à une date donnée.
charges_ordinaires_n_moins_1 vient de la comptabilité : le domaine ne
va pas la chercher, il la reçoit. Les charges extraordinaires en
sont exclues — les inclure gonflerait l’obligation d’une ACP qui vient
de faire de gros travaux, alors que l’article vise le train de vie
courant.
Sourcepub fn enregistrer_premiere_cession(&mut self, date: NaiveDate)
pub fn enregistrer_premiere_cession(&mut self, date: NaiveDate)
Enregistre la première cession ou attribution d’un lot, qui fait naître l’indivision (Art. 3.86 § 1er, 1°).
Sourcepub fn enregistrer_transcription_statuts(&mut self, date: NaiveDate)
pub fn enregistrer_transcription_statuts(&mut self, date: NaiveDate)
Enregistre la transcription des statuts (Art. 3.86 § 1er, 2°).
Sourcepub fn personnalite_juridique(&self) -> PersonnaliteJuridique
pub fn personnalite_juridique(&self) -> PersonnaliteJuridique
L’état de la personnalité juridique, dérivé des deux conditions.
Jamais saisi à la main : il se déduit des faits. Une ACP acquiert la personnalité parce qu’un lot a été cédé et que les statuts ont été transcrits, pas parce qu’un administrateur l’a coché.
Sourcepub fn peut_engager(&self) -> bool
pub fn peut_engager(&self) -> bool
L’ACP peut-elle engager — signer un contrat, ouvrir un compte à son nom, agir en justice ?
Non tant que ses statuts ne sont pas transcrits : elle ne peut pas opposer sa personnalité au cocontractant (Art. 3.86 § 2).
pub fn assert_conformant( &self, metrics: &AcpMetrics, ) -> Result<(), AcpNotConformantError>
Sourcepub fn set_reserve_fund_balance(
&mut self,
balance: Decimal,
) -> Result<(), AcpError>
pub fn set_reserve_fund_balance( &mut self, balance: Decimal, ) -> Result<(), AcpError>
Fixe le solde du fonds de réserve (validé ≥ 0).
Sourcepub fn set_working_capital_balance(
&mut self,
balance: Decimal,
) -> Result<(), AcpError>
pub fn set_working_capital_balance( &mut self, balance: Decimal, ) -> Result<(), AcpError>
Fixe le solde du fonds de roulement (validé ≥ 0).
Sourcepub fn set_reserve_fund_waived(&mut self, waived: bool)
pub fn set_reserve_fund_waived(&mut self, waived: bool)
Enregistre la décision d’AG de renoncer (ou non) au fonds de réserve obligatoire (vote 4/5, Art. 3.86 §3). Le vote lui-même (quorum/majorité) relève de la gouvernance (CL3) ; ici on consigne l’issue.
Sourcepub fn required_reserve_fund(&self, ordinary_charges_n1: Decimal) -> Decimal
pub fn required_reserve_fund(&self, ordinary_charges_n1: Decimal) -> Decimal
Montant minimal légal du fonds de réserve = 5 % des charges ordinaires
N-1 (RESERVE_FUND_RATE). Exact (Decimal).
Sourcepub fn is_reserve_fund_compliant(&self, ordinary_charges_n1: Decimal) -> bool
pub fn is_reserve_fund_compliant(&self, ordinary_charges_n1: Decimal) -> bool
La réserve est-elle conforme ? Vrai si renoncée (4/5) OU si le solde couvre le minimum légal (≥ 5 % charges N-1). Borne inclusive : exactement 5 % passe.
Sourcepub fn assert_reserve_fund_compliant(
&self,
ordinary_charges_n1: Decimal,
) -> Result<(), ReserveFundInsufficientError>
pub fn assert_reserve_fund_compliant( &self, ordinary_charges_n1: Decimal, ) -> Result<(), ReserveFundInsufficientError>
Retourne Err(ReserveFundInsufficientError) typée si la réserve est
sous le seuil légal et non renoncée. Consommée par les gates de
conformité (CL4) et le frontend (<ReserveFundIndicator>, différé #634).
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Acp
impl<'de> Deserialize<'de> for Acp
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl StructuralPartialEq for Acp
Auto Trait Implementations§
impl Freeze for Acp
impl RefUnwindSafe for Acp
impl Send for Acp
impl Sync for Acp
impl Unpin for Acp
impl UnsafeUnpin for Acp
impl UnwindSafe for Acp
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
§impl<T> Fake for T
impl<T> Fake for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more