1use crate::common::is_false;
2use serde::{Deserialize, Serialize};
3use sqlx::FromRow;
4use std::fmt::Display;
5use tabled::Tabled;
6
7#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq, FromRow)]
8pub struct UserBudget {
9 pub id: u32,
10 pub user: u32,
11 pub username: String,
12 pub year: u32,
13 pub amount: u32,
14}
15
16impl Display for UserBudget {
17 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18 f.write_str(&format!("UserBudget(id={})", self.id))
19 }
20}
21
22#[derive(Clone, Debug, Serialize, Deserialize)]
23pub struct UserBudgetListParams {
24 pub user: Option<u32>,
25 pub project: Option<u32>,
26 pub all: Option<bool>,
27 pub year: Option<u32>,
28}
29
30#[derive(Clone, Debug, Serialize, Deserialize)]
31pub struct UserBudgetCreateData {
32 pub user: u32,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub year: Option<u32>,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub amount: Option<i64>,
37}
38
39impl UserBudgetCreateData {
40 pub fn new(user: u32) -> Self {
41 Self {
42 user,
43 year: None,
44 amount: None,
45 }
46 }
47}
48
49#[derive(Clone, Debug, Serialize, Deserialize)]
50pub struct UserBudgetModifyData {
51 pub id: u32,
52
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub amount: Option<u32>,
55 #[serde(skip_serializing_if = "is_false")]
56 pub force: bool,
57}
58
59impl UserBudgetModifyData {
60 pub fn new(id: u32) -> Self {
61 Self {
62 id,
63 amount: None,
64 force: false,
65 }
66 }
67}
68
69#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq)]
70pub struct UserBudgetOver {
71 pub budget_id: u32,
72 pub user_id: u32,
73 pub user_name: String,
74 pub over: bool,
75}
76
77#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq)]
78pub struct UserBudgetCombined {
79 pub budget_id: u32,
80 pub user_id: u32,
81 pub user_name: String,
82 pub project_budget_id: u32,
83 pub project_id: u32,
84 pub project_name: String,
85 pub over: bool,
86}
87
88#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq)]
89pub struct UserBudgetDetail {
90 pub budget_id: u32,
91 pub user_id: u32,
92 pub user_name: String,
93 pub over: bool,
94 pub cost: f64,
95 pub budget: u32,
96}
97
98#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq)]
99pub struct UserBudgetCombinedDetail {
100 pub budget_id: u32,
101 pub user_id: u32,
102 pub user_name: String,
103 pub project_budget_id: u32,
104 pub project_id: u32,
105 pub project_name: String,
106 pub over: bool,
107 pub project_cost: f64,
108 pub project_budget: u32,
109 pub user_cost: f64,
110 pub user_budget: u32,
111}
112
113#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq)]
114pub struct UserBudgetSync {
115 pub updated_budget_count: u32,
116}