koprogo_api/application/dto/
board_member_dto.rs

1use serde::{Deserialize, Serialize};
2use validator::Validate;
3
4/// DTO pour créer un nouveau membre du conseil
5/// Note: board members must be property owners (Owner), not platform users
6#[derive(Debug, Serialize, Deserialize, Validate, Clone)]
7pub struct CreateBoardMemberDto {
8    pub owner_id: String, // UUID as string - ID du copropriétaire (Owner)
9
10    pub building_id: String, // UUID as string
11
12    #[validate(length(min = 1, message = "Position cannot be empty"))]
13    pub position: String, // "president", "treasurer", or "member"
14
15    pub mandate_start: String, // ISO 8601 datetime string
16
17    pub mandate_end: String, // ISO 8601 datetime string
18
19    pub elected_by_meeting_id: String, // UUID as string - ID de l'AG qui élit
20}
21
22/// DTO pour renouveler un mandat existant
23#[derive(Debug, Serialize, Deserialize, Validate, Clone)]
24pub struct RenewMandateDto {
25    pub new_elected_by_meeting_id: String, // UUID de la nouvelle AG qui renouvelle
26    #[serde(default = "default_mandate_duration_days")]
27    pub mandate_duration_days: i64, // Durée du mandat en jours (365-1095, défaut: 1095 = 3 ans)
28}
29
30fn default_mandate_duration_days() -> i64 {
31    1095 // 3 years (Art. 3.89 CC max)
32}
33
34/// DTO pour la réponse API d'un membre du conseil
35#[derive(Debug, Serialize, Deserialize, Clone)]
36pub struct BoardMemberResponseDto {
37    pub id: String,
38    pub owner_id: String, // ID du copropriétaire (Owner)
39    pub building_id: String,
40    pub position: String,
41    pub mandate_start: String,
42    pub mandate_end: String,
43    pub elected_by_meeting_id: String,
44    pub is_active: bool,     // Calculé: mandat actuellement actif?
45    pub days_remaining: i64, // Calculé: jours restants dans le mandat
46    pub expires_soon: bool,  // Calculé: expire dans < 60 jours?
47    pub created_at: String,
48    pub updated_at: String,
49}
50
51/// DTO pour obtenir des statistiques sur le conseil
52#[derive(Debug, Serialize, Deserialize, Clone)]
53pub struct BoardStatsDto {
54    pub building_id: String,
55    pub total_members: i64,
56    pub active_members: i64,
57    pub expiring_soon: i64, // Nombre de mandats expirant dans < 60 jours
58    pub has_president: bool,
59    pub has_treasurer: bool,
60}