koprogo_api/application/dto/
expense_dto.rs1use crate::domain::entities::{ApprovalStatus, ExpenseCategory, PaymentStatus};
2use serde::{Deserialize, Serialize};
3use validator::Validate;
4
5#[derive(Debug, Deserialize, Validate, Clone)]
8pub struct CreateExpenseDto {
9 pub organization_id: String,
10 pub building_id: String,
11 pub category: ExpenseCategory,
12
13 #[validate(length(min = 1))]
14 pub description: String,
15
16 #[validate(range(min = 0.01))]
17 pub amount: f64,
18
19 pub expense_date: String,
20 pub supplier: Option<String>,
21 pub invoice_number: Option<String>,
22
23 #[validate(length(max = 40))]
26 pub account_code: Option<String>,
27}
28
29#[derive(Debug, Serialize)]
30pub struct ExpenseResponseDto {
31 pub id: String,
32 pub building_id: String,
33 pub category: ExpenseCategory,
34 pub description: String,
35 pub amount: f64,
36 pub expense_date: String,
37 pub payment_status: PaymentStatus,
38 pub approval_status: ApprovalStatus,
39 pub supplier: Option<String>,
40 pub invoice_number: Option<String>,
41 pub account_code: Option<String>,
43}
44
45#[derive(Debug, Deserialize, Validate, Clone)]
49pub struct CreateInvoiceDraftDto {
50 pub organization_id: String,
51 pub building_id: String,
52 pub category: ExpenseCategory,
53
54 #[validate(length(min = 1))]
55 pub description: String,
56
57 #[validate(range(min = 0.01))]
58 pub amount_excl_vat: f64, #[validate(range(min = 0.0, max = 100.0))]
61 pub vat_rate: f64, pub invoice_date: String, pub due_date: Option<String>, pub supplier: Option<String>,
66 pub invoice_number: Option<String>,
67}
68
69#[derive(Debug, Deserialize, Validate, Clone)]
71pub struct UpdateInvoiceDraftDto {
72 #[validate(length(min = 1))]
73 pub description: Option<String>,
74
75 pub category: Option<ExpenseCategory>,
76
77 #[validate(range(min = 0.01))]
78 pub amount_excl_vat: Option<f64>,
79
80 #[validate(range(min = 0.0, max = 100.0))]
81 pub vat_rate: Option<f64>,
82
83 pub invoice_date: Option<String>,
84 pub due_date: Option<String>,
85 pub supplier: Option<String>,
86 pub invoice_number: Option<String>,
87}
88
89#[derive(Debug, Deserialize, Clone)]
91pub struct SubmitForApprovalDto {
92 }
94
95#[derive(Debug, Deserialize, Clone)]
97pub struct ApproveInvoiceDto {
98 pub approved_by_user_id: String, }
100
101#[derive(Debug, Deserialize, Validate, Clone)]
103pub struct RejectInvoiceDto {
104 pub rejected_by_user_id: String,
105
106 #[validate(length(min = 1))]
107 pub rejection_reason: String,
108}
109
110#[derive(Debug, Deserialize, Validate, Clone)]
112pub struct CreateInvoiceLineItemDto {
113 pub expense_id: String,
114
115 #[validate(length(min = 1))]
116 pub description: String,
117
118 #[validate(range(min = 0.01))]
119 pub quantity: f64,
120
121 #[validate(range(min = 0.0))]
122 pub unit_price: f64,
123
124 #[validate(range(min = 0.0, max = 100.0))]
125 pub vat_rate: f64,
126}
127
128#[derive(Debug, Serialize)]
132pub struct InvoiceResponseDto {
133 pub id: String,
134 pub organization_id: String,
135 pub building_id: String,
136 pub category: ExpenseCategory,
137 pub description: String,
138
139 pub amount: f64, pub amount_excl_vat: Option<f64>,
142 pub vat_rate: Option<f64>,
143 pub vat_amount: Option<f64>,
144 pub amount_incl_vat: Option<f64>,
145
146 pub expense_date: String,
148 pub invoice_date: Option<String>,
149 pub due_date: Option<String>,
150 pub paid_date: Option<String>,
151
152 pub approval_status: ApprovalStatus,
154 pub submitted_at: Option<String>,
155 pub approved_by: Option<String>,
156 pub approved_at: Option<String>,
157 pub rejection_reason: Option<String>,
158
159 pub payment_status: PaymentStatus,
161 pub supplier: Option<String>,
162 pub invoice_number: Option<String>,
163
164 pub created_at: String,
165 pub updated_at: String,
166}
167
168#[derive(Debug, Serialize)]
170pub struct InvoiceLineItemResponseDto {
171 pub id: String,
172 pub expense_id: String,
173 pub description: String,
174 pub quantity: f64,
175 pub unit_price: f64,
176 pub amount_excl_vat: f64,
177 pub vat_rate: f64,
178 pub vat_amount: f64,
179 pub amount_incl_vat: f64,
180 pub created_at: String,
181}
182
183#[derive(Debug, Serialize)]
185pub struct ChargeDistributionResponseDto {
186 pub id: String,
187 pub expense_id: String,
188 pub unit_id: String,
189 pub owner_id: String,
190 pub quota_percentage: f64, pub amount_due: f64,
192 pub created_at: String,
193}
194
195#[derive(Debug, Serialize)]
197pub struct PendingInvoicesListDto {
198 pub invoices: Vec<InvoiceResponseDto>,
199 pub count: usize,
200}