pub struct Building {Show 19 fields
pub id: Uuid,
pub acp_id: Uuid,
pub name: String,
pub address: String,
pub city: String,
pub postal_code: String,
pub country: String,
pub total_units: i32,
pub total_tantiemes: i32,
pub construction_year: Option<i32>,
pub syndic_name: Option<String>,
pub syndic_email: Option<String>,
pub syndic_phone: Option<String>,
pub syndic_address: Option<String>,
pub syndic_office_hours: Option<String>,
pub syndic_emergency_contact: Option<String>,
pub slug: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}Expand description
Représente un immeuble en copropriété
Fields§
§id: Uuid§acp_id: UuidStory 1.2 — FK vers acps.id (anciennement organization_id).
La migration 20260601040000 a DROP la colonne organization_id ;
le scoping org se fait désormais via acps.organization_id.
name: String§address: String§city: String§postal_code: String§country: String§total_units: i32§total_tantiemes: i32§construction_year: Option<i32>§syndic_name: Option<String>§syndic_email: Option<String>§syndic_phone: Option<String>§syndic_address: Option<String>§syndic_office_hours: Option<String>§syndic_emergency_contact: Option<String>§slug: Option<String>§created_at: DateTime<Utc>§updated_at: DateTime<Utc>Implementations§
Source§impl Building
impl Building
pub fn new( acp_id: Uuid, name: String, address: String, city: String, postal_code: String, country: String, total_units: i32, total_tantiemes: i32, construction_year: Option<i32>, ) -> Result<Self, String>
pub fn update_info( &mut self, name: String, address: String, city: String, postal_code: String, country: String, total_units: i32, total_tantiemes: i32, construction_year: Option<i32>, )
Sourcepub fn update_syndic_info(
&mut self,
syndic_name: Option<String>,
syndic_email: Option<String>,
syndic_phone: Option<String>,
syndic_address: Option<String>,
syndic_office_hours: Option<String>,
syndic_emergency_contact: Option<String>,
)
pub fn update_syndic_info( &mut self, syndic_name: Option<String>, syndic_email: Option<String>, syndic_phone: Option<String>, syndic_address: Option<String>, syndic_office_hours: Option<String>, syndic_emergency_contact: Option<String>, )
Update syndic public information (Belgian legal requirement)
Sourcepub fn has_public_syndic_info(&self) -> bool
pub fn has_public_syndic_info(&self) -> bool
Check if building has public syndic information available
Sourcepub fn is_conformant(&self, metrics: &BuildingMetrics) -> bool
pub fn is_conformant(&self, metrics: &BuildingMetrics) -> bool
Méthode d’instance : l’immeuble est-il conformant, étant donné les métriques agrégées (count units + SUM quotas) ?
Strict Decimal — aucune tolérance d’arrondi (cf. ADR-0007 + mémoire
no-f64-in-money). Un immeuble à 999/1000 millièmes est non-conformant.
La cible est l’acte de base (self.total_tantiemes) — pas une
constante (bug fix Story H1).
Sourcepub fn compute_is_conformant(
_declared_units: i32,
total_tantiemes: i32,
metrics: &BuildingMetrics,
) -> bool
pub fn compute_is_conformant( _declared_units: i32, total_tantiemes: i32, metrics: &BuildingMetrics, ) -> bool
Variante statique (pour tests purs sans instancier Building).
Story H1 : total_tantiemes est paramètre (acte de base de
l’immeuble, 1000 / 10000 / autre) — plus de constante hard-codée.
declared_units n’entre plus dans le verdict : la conformité ne porte
que sur les quotités, seul axe que l’acte de base fixe et que le
registre légal enregistre (Art. 3.85 § 1er al. 2). Le paramètre est
conservé pour ne pas casser les appelants, et parce que l’écart de lots
reste rapporté par assert_conformant — il renseigne sans bloquer.
Voir la note détaillée sur Acp::is_conformant et l’issue #770.
Sourcepub fn quota_delta(&self, metrics: &BuildingMetrics) -> Decimal
pub fn quota_delta(&self, metrics: &BuildingMetrics) -> Decimal
Delta des quotas vs acte de base (positif = manque, négatif = surplus). Utilisé par la fiche immeuble pour afficher un message explicite à l’utilisateur (FR11).
Story H1 : méthode d’instance qui lit self.total_tantiemes —
plus de constante hard-codée. Convention :
quota_delta = total_tantiemes - quota_sum. Un drift de 2.5 sur
acte 1000 → +2.5 (manque). Un surplus de 50 sur acte 10000 → -50.
Sourcepub fn assert_conformant(
&self,
metrics: &BuildingMetrics,
) -> Result<(), BuildingNotConformantError>
pub fn assert_conformant( &self, metrics: &BuildingMetrics, ) -> Result<(), BuildingNotConformantError>
Assertion typée (Track H Story H1) — retourne Err(BuildingNotConformantError)
si l’immeuble n’est pas conforme. Erreur exploitable par les use-cases
(validate-before-compute) et le frontend (toast 422 narratif).
Validate unit shares distribution according to Art. 577-2 §4 Code Civil belge. Sum of unit shares must equal building total_shares (typically 1000 ou 10000 millièmes). Returns Ok(()) if valid, Err if invalid or excessive.
Story H1 : total_tantiemes est paramètre (acte de base) au lieu
d’être hard-codé à 1000.
Belgian legal requirement: All units’ shares must sum to the building’s total_shares to ensure proper copropriété governance and voting/cost allocation.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Building
impl<'de> Deserialize<'de> for Building
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>,
Source§impl From<Building> for PublicSyndicInfoResponse
impl From<Building> for PublicSyndicInfoResponse
impl StructuralPartialEq for Building
Auto Trait Implementations§
impl Freeze for Building
impl RefUnwindSafe for Building
impl Send for Building
impl Sync for Building
impl Unpin for Building
impl UnsafeUnpin for Building
impl UnwindSafe for Building
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