pub struct Meeting {Show 23 fields
pub id: Uuid,
pub acp_id: Uuid,
pub organization_id: Uuid,
pub building_id: Uuid,
pub meeting_type: MeetingType,
pub title: String,
pub description: Option<String>,
pub scheduled_date: DateTime<Utc>,
pub location: String,
pub status: MeetingStatus,
pub agenda: Vec<String>,
pub attendees_count: Option<i32>,
pub quorum_validated: bool,
pub quorum_percentage: Option<f64>,
pub total_quotas: Option<Decimal>,
pub present_quotas: Option<Decimal>,
pub is_second_convocation: bool,
pub minutes_document_id: Option<Uuid>,
pub minutes_sent_at: Option<DateTime<Utc>>,
pub mode: MeetingMode,
pub videoconf_url: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}Expand description
Représente une assemblée générale de copropriétaires
Fields§
§id: Uuid§acp_id: UuidL’ACP dont c’est l’assemblée.
Art. 3.87 § 1er : « Chaque propriétaire d’un lot fait partie de l’assemblée générale ». L’assemblée est l’organe de l’association, pas une réunion que le syndic organiserait pour son compte. Il la tient (Art. 3.87 § 2), il ne la possède pas. Cf. ADR-0045.
organization_id: UuidLe syndic qui a tenu l’assemblée, conservé comme trace d’auteur.
building_id: Uuid§meeting_type: MeetingType§title: String§description: Option<String>§scheduled_date: DateTime<Utc>§location: String§status: MeetingStatus§agenda: Vec<String>§attendees_count: Option<i32>§quorum_validated: bool§quorum_percentage: Option<f64>§total_quotas: Option<Decimal>§present_quotas: Option<Decimal>§is_second_convocation: bool§minutes_document_id: Option<Uuid>§minutes_sent_at: Option<DateTime<Utc>>§mode: MeetingMode§videoconf_url: Option<String>URL de connexion à la session distancielle. Obligatoire si mode ∈
{Remote, Hybrid} — cf. set_mode().
created_at: DateTime<Utc>§updated_at: DateTime<Utc>Implementations§
Source§impl Meeting
impl Meeting
pub fn new( acp_id: Uuid, organization_id: Uuid, building_id: Uuid, meeting_type: MeetingType, title: String, description: Option<String>, scheduled_date: DateTime<Utc>, location: String, ) -> Result<Self, String>
Sourcepub fn set_mode(
&mut self,
mode: MeetingMode,
videoconf_url: Option<String>,
) -> Result<(), MeetingModeError>
pub fn set_mode( &mut self, mode: MeetingMode, videoconf_url: Option<String>, ) -> Result<(), MeetingModeError>
Configure la modalité de tenue de l’AG (Story 4.1, Art. 3.87 §1er CC).
Les modes Remote et Hybrid supposent qu’un copropriétaire puisse
effectivement se connecter : sans URL de visioconférence, l’annonce du
mode est creuse. Refusé avant persistance (422), pas découvert après
convocation.
pub fn add_agenda_item(&mut self, item: String) -> Result<(), String>
Sourcepub fn complete_internal(&mut self) -> Result<(), String>
pub fn complete_internal(&mut self) -> Result<(), String>
Transition d’état pure : Scheduled → Completed.
Track H Story H3 : ancien complete(attendees_count) renommé en
complete_internal(). La validation des invariants Art. 3.87 §3-5 CC
(convocations envoyées, votes clôturés, présences enregistrées,
quorum, minutes draft) est gérée par
assert_can_complete(&checklist) (cf. story H3).
Le use-case complete_meeting() enchaîne :
completion_checker.build_checklist(meeting_id)(port DB)meeting.assert_can_complete(&checklist)?(gate métier — 422 narratif)meeting.complete_internal()?(state machine — cette méthode)repository.update(&meeting)
attendees_count (legacy param) reste accepté par le handler pour
compat backward ; depuis Track H Story H3 la source de vérité est
checklist.attended_quotas (présents + représentés agrégés DB-side).
Sourcepub fn complete(&mut self, attendees_count: i32) -> Result<(), String>
👎Deprecated: Use complete_internal() after assert_can_complete(&checklist) — Track H Story H3
pub fn complete(&mut self, attendees_count: i32) -> Result<(), String>
Use complete_internal() after assert_can_complete(&checklist) — Track H Story H3
DEPRECATED — préservé pour la compatibilité backward des tests
internes au domain qui historiquement passaient attendees_count à
complete(). Délègue à complete_internal() puis stocke
attendees_count sur l’entité.
Nouveaux call-sites : utiliser complete_internal() après
assert_can_complete(&checklist) — la valeur d’attendance est
dérivée de la checklist (Art. 3.87 §5 CC, present_quotas DB-side).
Sourcepub fn assert_can_complete(
&self,
checklist: &MeetingCompletionChecklist,
) -> Result<(), MeetingNotCompletableError>
pub fn assert_can_complete( &self, checklist: &MeetingCompletionChecklist, ) -> Result<(), MeetingNotCompletableError>
Track H Story H3 — Vérifie que toutes les conditions Art. 3.87 §3-5 CC
sont réunies pour clôturer la réunion. Retourne Err avec la liste
exhaustive des invariants manquants pour permettre au FE de guider
le syndic (cf. composant <MissingInvariantsList>).
Logique métier :
convocations_sent(Art. 3.87 §3 CC — convocations envoyées en amont)open_resolutions == 0(Art. 3.87 §4 CC — tous votes clôturés)attendance_recorded(Art. 3.87 §5 CC — présences enregistrées)- Quorum double (Art. 3.87 §5, Story H9) : (A) têtes > 50 % strict
ET quotités ≥ 50 % inclusif, OU (B) alternative quotités > 3/4 strict.
Volet quotités KO →
QuorumNotReached; volet têtes KO →HeadCountQuorumNotReached.total_* == 0→ volet KO (pas de div/0). minutes_draft_exists(PV draft sauvegardé avant clôture)
Pureté : aucune I/O, aucune dépendance infra. La checklist est
construite par le port MeetingCompletionCheckerPort (DB-side).
pub fn cancel(&mut self) -> Result<(), String>
pub fn reschedule(&mut self, new_date: DateTime<Utc>) -> Result<(), String>
pub fn is_upcoming(&self) -> bool
Sourcepub fn quotas_three_quarters_reached(
attended_quotas: Decimal,
total_quotas: Decimal,
) -> bool
pub fn quotas_three_quarters_reached( attended_quotas: Decimal, total_quotas: Decimal, ) -> bool
Alternative de l’Art. 3.87 §5 : quotités présentes > 3/4 du total, quel que soit le nombre de têtes.
Sourcepub fn quotas_half_reached(
attended_quotas: Decimal,
total_quotas: Decimal,
) -> bool
pub fn quotas_half_reached( attended_quotas: Decimal, total_quotas: Decimal, ) -> bool
Volet quotités du quorum double : au moins la moitié des quotes-parts (inclusif — « au moins la moitié »).
Sourcepub fn heads_majority_reached(
present_owners_count: i32,
total_owners_count: i32,
) -> bool
pub fn heads_majority_reached( present_owners_count: i32, total_owners_count: i32, ) -> bool
Volet têtes du quorum double : plus de la moitié des copropriétaires présents ou représentés (strict — « plus de la moitié »).
Sourcepub fn double_quorum_reached(
attended_quotas: Decimal,
total_quotas: Decimal,
present_owners_count: i32,
total_owners_count: i32,
) -> bool
pub fn double_quorum_reached( attended_quotas: Decimal, total_quotas: Decimal, present_owners_count: i32, total_owners_count: i32, ) -> bool
Quorum double complet (Art. 3.87 §5 CC) : (A) têtes > 50% ET quotités ≥ 50%, ou (B) quotités > 3/4 seules.
Sourcepub fn validate_quorum(
&mut self,
present_quotas: Decimal,
total_quotas: Decimal,
) -> Result<bool, String>
pub fn validate_quorum( &mut self, present_quotas: Decimal, total_quotas: Decimal, ) -> Result<bool, String>
Valide le quorum de l’AG (Art. 3.87 §5 CC). Quorum atteint si les quotes-parts présentes/représentées dépassent 50% du total. Retourne Ok(true) si quorum atteint, Ok(false) si insuffisant (2e convocation requise).
Decimal exact — ADR-0008. quorum_percentage reste en f64 pour compat
affichage (mémoire no-f64-in-money : f64 OK pour pourcentage display, pas pour
montants/quotas).
Sourcepub fn check_quorum_for_voting(&self) -> Result<(), String>
pub fn check_quorum_for_voting(&self) -> Result<(), String>
Vérifie si le quorum est atteint avant d’autoriser un vote. Retourne Err si le quorum n’a pas encore été validé ou n’est pas atteint.
EXCEPTION (Art. 3.87 §5 CC): No quorum check required for second convocation (is_second_convocation = true). Belgian law: 2e convocation = voting allowed without quorum requirement.
Sourcepub fn set_minutes_sent(&mut self, document_id: Uuid) -> Result<(), String>
pub fn set_minutes_sent(&mut self, document_id: Uuid) -> Result<(), String>
Sets minutes as sent (Issue #313: PV distribution tracking). Can only be called once meeting is Completed.
Sourcepub fn is_minutes_overdue(&self) -> bool
pub fn is_minutes_overdue(&self) -> bool
Checks if minutes are overdue (Issue #313: 30 days after meeting completion). Returns true if meeting is Completed, minutes not yet sent, and >30 days have passed.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Meeting
impl<'de> Deserialize<'de> for Meeting
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<Meeting> for MeetingResponse
impl From<Meeting> for MeetingResponse
Source§impl PieceDeGestion for Meeting
impl PieceDeGestion for Meeting
impl StructuralPartialEq for Meeting
Auto Trait Implementations§
impl Freeze for Meeting
impl RefUnwindSafe for Meeting
impl Send for Meeting
impl Sync for Meeting
impl Unpin for Meeting
impl UnsafeUnpin for Meeting
impl UnwindSafe for Meeting
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