koprogo_api/application/dto/
etat_date_dto.rs

1use crate::domain::entities::{EtatDate, EtatDateLanguage, EtatDateStatus};
2use chrono::{DateTime, Utc};
3
4use serde::{Deserialize, Serialize};
5use uuid::Uuid;
6
7/// Request pour créer un nouvel état daté
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct CreateEtatDateRequest {
10    #[serde(default)]
11    pub organization_id: Uuid, // Will be overridden by JWT token
12    pub building_id: Uuid,
13    pub unit_id: Uuid,
14    pub reference_date: DateTime<Utc>,
15    pub language: EtatDateLanguage,
16    pub notary_name: String,
17    pub notary_email: String,
18    pub notary_phone: Option<String>,
19}
20
21/// Request pour mettre à jour les données financières d'un état daté
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct UpdateEtatDateFinancialRequest {
24    pub owner_balance: f64,
25    pub arrears_amount: f64,
26    pub monthly_provision_amount: f64,
27    pub total_balance: f64,
28    pub approved_works_unpaid: f64,
29}
30
31/// Request pour mettre à jour les données additionnelles (sections 7-16)
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct UpdateEtatDateAdditionalDataRequest {
34    pub additional_data: serde_json::Value,
35}
36
37/// Response DTO pour un état daté
38#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct EtatDateResponse {
40    pub id: Uuid,
41    pub organization_id: Uuid,
42    pub building_id: Uuid,
43    pub unit_id: Uuid,
44    pub reference_date: DateTime<Utc>,
45    pub requested_date: DateTime<Utc>,
46    pub generated_date: Option<DateTime<Utc>>,
47    pub delivered_date: Option<DateTime<Utc>>,
48    pub status: EtatDateStatus,
49    pub language: EtatDateLanguage,
50    pub reference_number: String,
51    pub notary_name: String,
52    pub notary_email: String,
53    pub notary_phone: Option<String>,
54    pub building_name: String,
55    pub building_address: String,
56    pub unit_number: String,
57    pub unit_floor: Option<String>,
58    pub unit_area: Option<f64>,
59    pub ordinary_charges_quota: f64,
60    pub extraordinary_charges_quota: f64,
61    pub owner_balance: f64,
62    pub arrears_amount: f64,
63    pub monthly_provision_amount: f64,
64    pub total_balance: f64,
65    pub approved_works_unpaid: f64,
66    pub additional_data: serde_json::Value,
67    pub pdf_file_path: Option<String>,
68    pub created_at: DateTime<Utc>,
69    pub updated_at: DateTime<Utc>,
70    // Computed fields
71    pub is_overdue: bool,
72    pub is_expired: bool,
73    pub days_since_request: i64,
74}
75
76impl From<EtatDate> for EtatDateResponse {
77    fn from(etat_date: EtatDate) -> Self {
78        let is_overdue = etat_date.is_overdue();
79        let is_expired = etat_date.is_expired();
80        let days_since_request = etat_date.days_since_request();
81
82        Self {
83            id: etat_date.id,
84            organization_id: etat_date.organization_id,
85            building_id: etat_date.building_id,
86            unit_id: etat_date.unit_id,
87            reference_date: etat_date.reference_date,
88            requested_date: etat_date.requested_date,
89            generated_date: etat_date.generated_date,
90            delivered_date: etat_date.delivered_date,
91            status: etat_date.status,
92            language: etat_date.language,
93            reference_number: etat_date.reference_number,
94            notary_name: etat_date.notary_name,
95            notary_email: etat_date.notary_email,
96            notary_phone: etat_date.notary_phone,
97            building_name: etat_date.building_name,
98            building_address: etat_date.building_address,
99            unit_number: etat_date.unit_number,
100            unit_floor: etat_date.unit_floor,
101            unit_area: etat_date.unit_area,
102            ordinary_charges_quota: etat_date.ordinary_charges_quota,
103            extraordinary_charges_quota: etat_date.extraordinary_charges_quota,
104            owner_balance: etat_date.owner_balance,
105            arrears_amount: etat_date.arrears_amount,
106            monthly_provision_amount: etat_date.monthly_provision_amount,
107            total_balance: etat_date.total_balance,
108            approved_works_unpaid: etat_date.approved_works_unpaid,
109            additional_data: etat_date.additional_data,
110            pdf_file_path: etat_date.pdf_file_path,
111            created_at: etat_date.created_at,
112            updated_at: etat_date.updated_at,
113            is_overdue,
114            is_expired,
115            days_since_request,
116        }
117    }
118}
119
120/// Response avec statistiques pour dashboard syndic
121#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct EtatDateStatsResponse {
123    pub total_requests: i64,
124    pub requested_count: i64,
125    pub in_progress_count: i64,
126    pub generated_count: i64,
127    pub delivered_count: i64,
128    pub expired_count: i64,
129    pub overdue_count: i64, // En retard (>10 jours)
130    pub average_processing_days: f64,
131}