koprogo_api/application/dto/
filters.rs

1use chrono::{DateTime, Utc};
2use serde::Deserialize;
3use uuid::Uuid;
4
5/// Filters for building list queries
6#[derive(Debug, Deserialize, Default, Clone)]
7pub struct BuildingFilters {
8    pub organization_id: Option<Uuid>,
9    pub city: Option<String>,
10    pub construction_year: Option<i32>,
11    pub min_units: Option<i32>,
12    pub max_units: Option<i32>,
13}
14
15/// Filters for expense list queries
16#[derive(Debug, Deserialize, Default, Clone)]
17pub struct ExpenseFilters {
18    pub organization_id: Option<Uuid>,
19    pub building_id: Option<Uuid>,
20    pub category: Option<String>,
21    pub status: Option<String>,
22    pub paid: Option<bool>,
23    pub date_from: Option<DateTime<Utc>>,
24    pub date_to: Option<DateTime<Utc>>,
25    pub min_amount: Option<f64>,
26    pub max_amount: Option<f64>,
27}
28
29/// Filters for unit list queries
30#[derive(Debug, Deserialize, Default, Clone)]
31pub struct UnitFilters {
32    pub organization_id: Option<Uuid>,
33    pub building_id: Option<Uuid>,
34    pub unit_type: Option<String>,
35    pub has_owner: Option<bool>,
36    pub floor: Option<i32>,
37    pub min_area: Option<f64>,
38    pub max_area: Option<f64>,
39}
40
41/// Filters for owner list queries
42#[derive(Debug, Deserialize, Default, Clone)]
43pub struct OwnerFilters {
44    pub organization_id: Option<Uuid>,
45    pub email: Option<String>,
46    pub phone: Option<String>,
47    pub last_name: Option<String>,
48    pub first_name: Option<String>,
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    #[test]
56    fn test_building_filters_default() {
57        let filters = BuildingFilters::default();
58        assert!(filters.city.is_none());
59        assert!(filters.construction_year.is_none());
60        assert!(filters.min_units.is_none());
61        assert!(filters.max_units.is_none());
62    }
63
64    #[test]
65    fn test_expense_filters_default() {
66        let filters = ExpenseFilters::default();
67        assert!(filters.building_id.is_none());
68        assert!(filters.category.is_none());
69        assert!(filters.paid.is_none());
70    }
71
72    #[test]
73    fn test_unit_filters_default() {
74        let filters = UnitFilters::default();
75        assert!(filters.building_id.is_none());
76        assert!(filters.has_owner.is_none());
77    }
78
79    #[test]
80    fn test_owner_filters_default() {
81        let filters = OwnerFilters::default();
82        assert!(filters.email.is_none());
83        assert!(filters.last_name.is_none());
84    }
85}