koprogo_api/application/dto/
meeting_dto.rs

1use crate::domain::entities::{Meeting, MeetingStatus, MeetingType};
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6/// Response DTO for Meeting
7#[derive(Debug, Serialize, Deserialize)]
8pub struct MeetingResponse {
9    pub id: Uuid,
10    pub building_id: Uuid,
11    pub meeting_type: MeetingType,
12    pub title: String,
13    pub description: Option<String>,
14    pub scheduled_date: DateTime<Utc>,
15    pub location: String,
16    pub status: MeetingStatus,
17    pub agenda: Vec<String>,
18    pub attendees_count: Option<i32>,
19    // Quorum — Art. 3.87 §5 CC
20    pub quorum_validated: bool,
21    pub quorum_percentage: Option<f64>,
22    pub total_quotas: Option<f64>,
23    pub present_quotas: Option<f64>,
24    pub is_second_convocation: bool,
25    pub minutes_document_id: Option<Uuid>,
26    pub minutes_sent_at: Option<DateTime<Utc>>,
27    pub created_at: DateTime<Utc>,
28    pub updated_at: DateTime<Utc>,
29}
30
31impl From<Meeting> for MeetingResponse {
32    fn from(meeting: Meeting) -> Self {
33        Self {
34            id: meeting.id,
35            building_id: meeting.building_id,
36            meeting_type: meeting.meeting_type,
37            title: meeting.title,
38            description: meeting.description,
39            scheduled_date: meeting.scheduled_date,
40            location: meeting.location,
41            status: meeting.status,
42            agenda: meeting.agenda,
43            attendees_count: meeting.attendees_count,
44            quorum_validated: meeting.quorum_validated,
45            quorum_percentage: meeting.quorum_percentage,
46            total_quotas: meeting.total_quotas,
47            present_quotas: meeting.present_quotas,
48            is_second_convocation: meeting.is_second_convocation,
49            minutes_document_id: meeting.minutes_document_id,
50            minutes_sent_at: meeting.minutes_sent_at,
51            created_at: meeting.created_at,
52            updated_at: meeting.updated_at,
53        }
54    }
55}
56
57/// Request DTO for validating quorum (Art. 3.87 §5 CC)
58#[derive(Debug, Deserialize)]
59pub struct ValidateQuorumRequest {
60    /// Millièmes présents + représentés par procuration
61    pub present_quotas: f64,
62    /// Total millièmes du bâtiment (généralement 1000)
63    pub total_quotas: f64,
64}
65
66/// Request DTO for creating a meeting
67#[derive(Debug, Deserialize)]
68pub struct CreateMeetingRequest {
69    #[serde(default)]
70    pub organization_id: Uuid, // Will be overridden by JWT token
71    pub building_id: Uuid,
72    pub meeting_type: MeetingType,
73    pub title: String,
74    pub description: Option<String>,
75    pub scheduled_date: DateTime<Utc>,
76    pub location: String,
77}
78
79/// Request DTO for updating a meeting
80#[derive(Debug, Deserialize)]
81pub struct UpdateMeetingRequest {
82    pub title: Option<String>,
83    pub description: Option<String>,
84    pub scheduled_date: Option<DateTime<Utc>>,
85    pub location: Option<String>,
86}
87
88/// Request DTO for adding agenda item
89#[derive(Debug, Deserialize)]
90pub struct AddAgendaItemRequest {
91    pub item: String,
92}
93
94/// Request DTO for completing a meeting
95#[derive(Debug, Deserialize)]
96pub struct CompleteMeetingRequest {
97    pub attendees_count: i32,
98}
99
100/// Request DTO for rescheduling a meeting
101#[derive(Debug, Deserialize)]
102pub struct RescheduleMeetingRequest {
103    pub scheduled_date: DateTime<Utc>,
104}
105
106/// Request DTO for attaching minutes document to a completed meeting (Issue #313)
107#[derive(Debug, Deserialize)]
108pub struct AttachMinutesRequest {
109    pub document_id: Uuid,
110}
111
112/// Request DTO for scheduling a second convocation (Issue #311)
113#[derive(Debug, Deserialize)]
114pub struct ScheduleSecondConvocationRequest {
115    pub building_id: Uuid,
116    pub first_meeting_id: Uuid,
117    pub new_meeting_date: DateTime<Utc>,
118    pub language: String,
119}