koprogo_api/application/dto/
board_decision_dto.rs

1use serde::{Deserialize, Serialize};
2use validator::Validate;
3
4/// DTO pour créer une nouvelle décision à suivre
5#[derive(Debug, Serialize, Deserialize, Validate, Clone)]
6pub struct CreateBoardDecisionDto {
7    pub building_id: String, // UUID as string
8
9    pub meeting_id: String, // UUID as string - AG qui a pris la décision
10
11    #[validate(length(min = 1, message = "Subject cannot be empty"))]
12    pub subject: String,
13
14    #[validate(length(min = 1, message = "Decision text cannot be empty"))]
15    pub decision_text: String,
16
17    pub deadline: Option<String>, // ISO 8601 datetime string (optionnel)
18}
19
20/// DTO pour mettre à jour une décision
21#[derive(Debug, Serialize, Deserialize, Validate, Clone)]
22pub struct UpdateBoardDecisionDto {
23    #[validate(length(min = 1, message = "Status cannot be empty"))]
24    pub status: String, // "pending", "in_progress", "completed", "overdue", "cancelled"
25
26    pub notes: Option<String>, // Notes du conseil
27}
28
29/// DTO pour ajouter des notes à une décision
30#[derive(Debug, Serialize, Deserialize, Validate, Clone)]
31pub struct AddDecisionNotesDto {
32    #[validate(length(min = 1, message = "Notes cannot be empty"))]
33    pub notes: String,
34}
35
36/// DTO pour la réponse API d'une décision
37#[derive(Debug, Serialize, Deserialize, Clone)]
38pub struct BoardDecisionResponseDto {
39    pub id: String,
40    pub building_id: String,
41    pub meeting_id: String,
42    pub subject: String,
43    pub decision_text: String,
44    pub deadline: Option<String>,
45    pub status: String,
46    pub completed_at: Option<String>,
47    pub notes: Option<String>,
48    pub is_overdue: bool,                 // Calculé: deadline dépassée?
49    pub days_until_deadline: Option<i64>, // Calculé: jours restants jusqu'à deadline
50    pub created_at: String,
51    pub updated_at: String,
52}
53
54/// DTO pour obtenir des statistiques sur les décisions
55#[derive(Debug, Serialize, Deserialize, Clone)]
56pub struct DecisionStatsDto {
57    pub building_id: String,
58    pub total_decisions: i64,
59    pub pending: i64,
60    pub in_progress: i64,
61    pub completed: i64,
62    pub overdue: i64,
63    pub cancelled: i64,
64}
65
66/// DTO pour les alertes de deadlines approchant
67#[derive(Debug, Serialize, Deserialize, Clone)]
68pub struct DeadlineAlertDto {
69    pub decision_id: String,
70    pub subject: String,
71    pub deadline: String,
72    pub days_remaining: i64,
73    pub urgency: String, // "critical" (<= 7 days), "high" (<= 14 days), "medium" (<= 30 days)
74}