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    /// Art. 3.87 §5 CC: 2nd convocation skips quorum requirement
78    #[serde(default)]
79    pub is_second_convocation: bool,
80}
81
82/// Request DTO for updating a meeting
83#[derive(Debug, Deserialize)]
84pub struct UpdateMeetingRequest {
85    pub title: Option<String>,
86    pub description: Option<String>,
87    pub scheduled_date: Option<DateTime<Utc>>,
88    pub location: Option<String>,
89}
90
91/// Request DTO for adding agenda item
92#[derive(Debug, Deserialize)]
93pub struct AddAgendaItemRequest {
94    pub item: String,
95}
96
97/// Request DTO for completing a meeting
98#[derive(Debug, Deserialize)]
99pub struct CompleteMeetingRequest {
100    pub attendees_count: i32,
101}
102
103/// Request DTO for rescheduling a meeting
104#[derive(Debug, Deserialize)]
105pub struct RescheduleMeetingRequest {
106    pub scheduled_date: DateTime<Utc>,
107}
108
109/// Request DTO for attaching minutes document to a completed meeting (Issue #313)
110#[derive(Debug, Deserialize)]
111pub struct AttachMinutesRequest {
112    pub document_id: Uuid,
113}
114
115/// Request DTO for scheduling a second convocation (Issue #311)
116#[derive(Debug, Deserialize)]
117pub struct ScheduleSecondConvocationRequest {
118    pub building_id: Uuid,
119    pub first_meeting_id: Uuid,
120    pub new_meeting_date: DateTime<Utc>,
121    pub language: String,
122}