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