lrzcc_wire/budgeting/
project_budget.rs1use 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 ProjectBudget {
9 pub id: u32,
10 pub project: u32,
11 pub project_name: String,
12 pub year: u32,
13 pub amount: u32,
14}
15
16impl Display for ProjectBudget {
17 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18 f.write_str(&format!("ProjectBudget(id={})", self.id))
19 }
20}
21
22#[derive(Clone, Debug, Serialize, Deserialize)]
23pub struct ProjectBudgetListParams {
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 ProjectBudgetCreateData {
32 pub project: 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 ProjectBudgetCreateData {
40 pub fn new(project: u32) -> Self {
41 Self {
42 project,
43 year: None,
44 amount: None,
45 }
46 }
47}
48
49#[derive(Clone, Debug, Serialize, Deserialize)]
50pub struct ProjectBudgetModifyData {
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 ProjectBudgetModifyData {
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 ProjectBudgetOver {
71 pub budget_id: u32,
72 pub project_id: u32,
73 pub project_name: String,
74 pub over: bool,
75}
76
77#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq)]
78pub struct ProjectBudgetDetail {
79 pub budget_id: u32,
80 pub project_id: u32,
81 pub project_name: String,
82 pub over: bool,
83 pub cost: f64,
84 pub budget: u32,
85}