koprogo_api/application/dto/
filters.rs1use crate::domain::entities::ApprovalStatus;
2use chrono::{DateTime, Utc};
3use rust_decimal::Decimal;
4use serde::Deserialize;
5use uuid::Uuid;
6
7#[derive(Debug, Deserialize, Default, Clone)]
9pub struct BuildingFilters {
10 pub organization_id: Option<Uuid>,
15 pub acp_id: Option<Uuid>,
17 pub city: Option<String>,
18 pub construction_year: Option<i32>,
19 pub min_units: Option<i32>,
20 pub max_units: Option<i32>,
21 pub owner_user_id: Option<Uuid>,
23 pub search: Option<String>,
28}
29
30#[derive(Debug, Deserialize, Default, Clone)]
32pub struct ExpenseFilters {
33 pub organization_id: Option<Uuid>,
34 pub building_id: Option<Uuid>,
35 pub category: Option<String>,
36 pub status: Option<String>,
37 pub paid: Option<bool>,
38 pub approval_status: Option<ApprovalStatus>, pub date_from: Option<DateTime<Utc>>,
40 pub date_to: Option<DateTime<Utc>>,
41 pub min_amount: Option<Decimal>,
42 pub max_amount: Option<Decimal>,
43}
44
45#[derive(Debug, Deserialize, Default, Clone)]
47pub struct UnitFilters {
48 pub organization_id: Option<Uuid>,
53 pub acp_id: Option<Uuid>,
55 pub building_id: Option<Uuid>,
56 pub unit_type: Option<String>,
57 pub has_owner: Option<bool>,
58 pub floor: Option<i32>,
59 pub min_area: Option<f64>,
60 pub max_area: Option<f64>,
61}
62
63#[derive(Debug, Deserialize, Default, Clone)]
65pub struct OwnerFilters {
66 pub organization_id: Option<Uuid>,
67 pub email: Option<String>,
68 pub phone: Option<String>,
69 pub last_name: Option<String>,
70 pub first_name: Option<String>,
71}
72
73#[derive(Debug, Deserialize, Default, Clone)]
75pub struct WorkReportFilters {
76 pub organization_id: Option<Uuid>,
77 pub building_id: Option<Uuid>,
78 pub work_type: Option<String>,
79 pub warranty_type: Option<String>,
80 pub contractor_name: Option<String>,
81 pub work_date_from: Option<DateTime<Utc>>,
82 pub work_date_to: Option<DateTime<Utc>>,
83 pub min_cost: Option<Decimal>,
94 pub max_cost: Option<Decimal>,
95 pub warranty_active: Option<bool>,
96}
97
98#[derive(Debug, Deserialize, Default, Clone)]
100pub struct TechnicalInspectionFilters {
101 pub organization_id: Option<Uuid>,
102 pub building_id: Option<Uuid>,
103 pub inspection_type: Option<String>,
104 pub status: Option<String>,
105 pub inspector_name: Option<String>,
106 pub inspector_company: Option<String>,
107 pub inspection_date_from: Option<DateTime<Utc>>,
108 pub inspection_date_to: Option<DateTime<Utc>>,
109 pub overdue: Option<bool>,
110 pub compliant: Option<bool>,
111}
112
113#[cfg(test)]
114mod tests {
115 use super::*;
116
117 #[test]
118 fn test_building_filters_default() {
119 let filters = BuildingFilters::default();
120 assert!(filters.city.is_none());
121 assert!(filters.construction_year.is_none());
122 assert!(filters.min_units.is_none());
123 assert!(filters.max_units.is_none());
124 }
125
126 #[test]
127 fn test_expense_filters_default() {
128 let filters = ExpenseFilters::default();
129 assert!(filters.building_id.is_none());
130 assert!(filters.category.is_none());
131 assert!(filters.paid.is_none());
132 }
133
134 #[test]
135 fn test_unit_filters_default() {
136 let filters = UnitFilters::default();
137 assert!(filters.building_id.is_none());
138 assert!(filters.has_owner.is_none());
139 }
140
141 #[test]
142 fn test_owner_filters_default() {
143 let filters = OwnerFilters::default();
144 assert!(filters.email.is_none());
145 assert!(filters.last_name.is_none());
146 }
147}