1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
use chrono::{DateTime, Utc};
use ulid::Ulid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct AccountId(Ulid);
impl AccountId {
pub fn as_ulid(&self) -> Ulid {
self.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct PostingId(Ulid);
impl PostingId {
pub fn as_ulid(&self) -> Ulid {
self.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct JournalEntryId(Ulid);
impl JournalEntryId {
pub fn as_ulid(&self) -> Ulid {
self.0
}
}
#[derive(PartialEq)]
pub enum AccountType {
Asset,
Liability,
Equity,
Revenue,
Expense
}
pub struct Account {
account_id: AccountId,
pub account_type: AccountType,
pub name: String,
pub description: String
}
pub struct NewAccount {
pub account_type: AccountType,
pub name: String,
pub description: String
}
impl NewAccount {
fn new(account_type: AccountType, name: impl Into<String>, description: impl Into<String>) -> NewAccount {
NewAccount {
account_type,
name: name.into(),
description: description.into()
}
}
}
#[derive(PartialEq)]
pub enum PostingType {
Debit,
Credit
}
pub struct Posting {
posting_id: PostingId,
pub posting_type: PostingType,
pub account_id: AccountId,
pub amount: u64
}
pub struct NewPosting {
pub posting_type: PostingType,
pub account_id: AccountId,
pub amount: u64
}
impl NewPosting {
fn new(posting_type: PostingType, account_id: AccountId, amount: u64) -> NewPosting {
NewPosting {
posting_type,
account_id,
amount
}
}
}
pub struct JournalEntry {
journal_entry_id: JournalEntryId,
pub date: DateTime<Utc>,
pub postings: Vec<Posting>,
pub description: String
}
pub struct NewJournalEntry {
pub date: DateTime<Utc>,
pub postings: Vec<NewPosting>,
pub description: String
}
impl NewJournalEntry {
fn new(date: DateTime<Utc>, postings: Vec<NewPosting>, description: impl Into<String>) -> NewJournalEntry {
NewJournalEntry {
date,
postings,
description: description.into()
}
}
}
|