Skip to main content

Acp

Struct Acp 

Source
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: i32

Dé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: Decimal

Story H13 — solde du fonds de roulement (compte distinct, dépenses courantes récurrentes — loi 2019).

§reserve_fund_waived: bool

Story 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

Source

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 :

  1. name.trim() ≥ 2 chars, ≤ 160 chars
  2. address_street.trim() non vide
  3. address_postal_code.trim() non vide
  4. address_city.trim() non vide

Le slug est dérivé du name (kebab-case ASCII).

Source

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.

Source

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).

Source

pub fn is_self_managed(&self) -> bool

L’ACP est-elle auto-gérée (sans cabinet syndic) ?

Source

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.

Source

pub fn set_total_tantiemes(&mut self, value: i32) -> Result<(), AcpError>

Mise à jour du dénominateur de l’acte de base (re-validation).

Source

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.

Source

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.

Source

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.

Source

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 ».

Source

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).

Source

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.

Source

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°).

Source

pub fn enregistrer_transcription_statuts(&mut self, date: NaiveDate)

Enregistre la transcription des statuts (Art. 3.86 § 1er, 2°).

Source

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é.

Source

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).

Source

pub fn assert_conformant( &self, metrics: &AcpMetrics, ) -> Result<(), AcpNotConformantError>

Source

pub fn set_reserve_fund_balance( &mut self, balance: Decimal, ) -> Result<(), AcpError>

Fixe le solde du fonds de réserve (validé ≥ 0).

Source

pub fn set_working_capital_balance( &mut self, balance: Decimal, ) -> Result<(), AcpError>

Fixe le solde du fonds de roulement (validé ≥ 0).

Source

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.

Source

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).

Source

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.

Source

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 Clone for Acp

Source§

fn clone(&self) -> Acp

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl ComposeSchema for Acp

Source§

fn compose(generics: Vec<RefOr<Schema>>) -> RefOr<Schema>

Source§

impl Debug for Acp

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Acp

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for Acp

Source§

fn eq(&self, other: &Acp) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for Acp

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for Acp

Source§

impl ToSchema for Acp

Source§

fn name() -> Cow<'static, str>

Return name of the schema. Read more
Source§

fn schemas(schemas: &mut Vec<(String, RefOr<Schema>)>)

Implement reference [utoipa::openapi::schema::Schema]s for this type. Read more

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

§

impl<T> Fake for T

§

fn fake<U>(&self) -> U
where Self: FakeBase<U>,

§

fn fake_with_rng<U, R>(&self, rng: &mut R) -> U
where R: RngExt + ?Sized, Self: FakeBase<U>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
§

impl<T> PartialSchema for T
where T: ComposeSchema + ?Sized,

§

fn schema() -> RefOr<Schema>

Return ref or schema of implementing type that can then be used to construct combined schemas.
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more