koprogo_api/application/dto/
filters.rs

1use crate::domain::entities::ApprovalStatus;
2use chrono::{DateTime, Utc};
3use serde::Deserialize;
4use uuid::Uuid;
5
6/// Filters for building list queries
7#[derive(Debug, Deserialize, Default, Clone)]
8pub struct BuildingFilters {
9    pub organization_id: Option<Uuid>,
10    pub city: Option<String>,
11    pub construction_year: Option<i32>,
12    pub min_units: Option<i32>,
13    pub max_units: Option<i32>,
14}
15
16/// Filters for expense list queries
17#[derive(Debug, Deserialize, Default, Clone)]
18pub struct ExpenseFilters {
19    pub organization_id: Option<Uuid>,
20    pub building_id: Option<Uuid>,
21    pub category: Option<String>,
22    pub status: Option<String>,
23    pub paid: Option<bool>,
24    pub approval_status: Option<ApprovalStatus>, // Nouveau: pour filtrer par statut workflow
25    pub date_from: Option<DateTime<Utc>>,
26    pub date_to: Option<DateTime<Utc>>,
27    pub min_amount: Option<f64>,
28    pub max_amount: Option<f64>,
29}
30
31/// Filters for unit list queries
32#[derive(Debug, Deserialize, Default, Clone)]
33pub struct UnitFilters {
34    pub organization_id: Option<Uuid>,
35    pub building_id: Option<Uuid>,
36    pub unit_type: Option<String>,
37    pub has_owner: Option<bool>,
38    pub floor: Option<i32>,
39    pub min_area: Option<f64>,
40    pub max_area: Option<f64>,
41}
42
43/// Filters for owner list queries
44#[derive(Debug, Deserialize, Default, Clone)]
45pub struct OwnerFilters {
46    pub organization_id: Option<Uuid>,
47    pub email: Option<String>,
48    pub phone: Option<String>,
49    pub last_name: Option<String>,
50    pub first_name: Option<String>,
51}
52
53/// Filters for work report list queries
54#[derive(Debug, Deserialize, Default, Clone)]
55pub struct WorkReportFilters {
56    pub organization_id: Option<Uuid>,
57    pub building_id: Option<Uuid>,
58    pub work_type: Option<String>,
59    pub warranty_type: Option<String>,
60    pub contractor_name: Option<String>,
61    pub work_date_from: Option<DateTime<Utc>>,
62    pub work_date_to: Option<DateTime<Utc>>,
63    pub min_cost: Option<f64>,
64    pub max_cost: Option<f64>,
65    pub warranty_active: Option<bool>,
66}
67
68/// Filters for technical inspection list queries
69#[derive(Debug, Deserialize, Default, Clone)]
70pub struct TechnicalInspectionFilters {
71    pub organization_id: Option<Uuid>,
72    pub building_id: Option<Uuid>,
73    pub inspection_type: Option<String>,
74    pub status: Option<String>,
75    pub inspector_name: Option<String>,
76    pub inspector_company: Option<String>,
77    pub inspection_date_from: Option<DateTime<Utc>>,
78    pub inspection_date_to: Option<DateTime<Utc>>,
79    pub overdue: Option<bool>,
80    pub compliant: Option<bool>,
81}
82
83#[cfg(test)]
84mod tests {
85    use super::*;
86
87    #[test]
88    fn test_building_filters_default() {
89        let filters = BuildingFilters::default();
90        assert!(filters.city.is_none());
91        assert!(filters.construction_year.is_none());
92        assert!(filters.min_units.is_none());
93        assert!(filters.max_units.is_none());
94    }
95
96    #[test]
97    fn test_expense_filters_default() {
98        let filters = ExpenseFilters::default();
99        assert!(filters.building_id.is_none());
100        assert!(filters.category.is_none());
101        assert!(filters.paid.is_none());
102    }
103
104    #[test]
105    fn test_unit_filters_default() {
106        let filters = UnitFilters::default();
107        assert!(filters.building_id.is_none());
108        assert!(filters.has_owner.is_none());
109    }
110
111    #[test]
112    fn test_owner_filters_default() {
113        let filters = OwnerFilters::default();
114        assert!(filters.email.is_none());
115        assert!(filters.last_name.is_none());
116    }
117}