1use chrono::NaiveDate;
4use rust_decimal::Decimal;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
9#[serde(rename_all = "snake_case")]
10pub enum ReconciliationStatus {
11 #[default]
13 InProgress,
14 Completed,
16 CompletedWithExceptions,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
22#[serde(rename_all = "snake_case")]
23pub enum Direction {
24 Inflow,
26 Outflow,
28}
29
30#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
32#[serde(rename_all = "snake_case")]
33pub enum MatchStatus {
34 #[default]
36 Unmatched,
37 AutoMatched,
39 ManuallyMatched,
41 BankCharge,
43 Interest,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct BankStatementLine {
50 pub line_id: String,
52 pub bank_account_id: String,
54 pub statement_date: NaiveDate,
56 pub value_date: NaiveDate,
58 #[serde(with = "rust_decimal::serde::str")]
60 pub amount: Decimal,
61 pub direction: Direction,
63 pub description: String,
65 pub bank_reference: String,
67 pub match_status: MatchStatus,
69 pub matched_document_id: Option<String>,
71 pub company_code: String,
73}
74
75#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
77#[serde(rename_all = "snake_case")]
78pub enum ReconcilingItemType {
79 OutstandingCheck,
81 DepositInTransit,
83 BankCharge,
85 InterestEarned,
87 ReturnedCheck,
89 ErrorCorrection,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct ReconcilingItem {
96 pub item_id: String,
98 pub item_type: ReconcilingItemType,
100 pub document_id: Option<String>,
102 #[serde(with = "rust_decimal::serde::str")]
104 pub amount: Decimal,
105 pub date: NaiveDate,
107 pub description: String,
109 pub expected_clearing_date: Option<NaiveDate>,
111}
112
113#[derive(Debug, Clone, Serialize, Deserialize)]
115pub struct BankReconciliation {
116 pub reconciliation_id: String,
118 pub bank_account_id: String,
120 pub company_code: String,
122 pub reconciliation_date: NaiveDate,
124 pub status: ReconciliationStatus,
126 #[serde(with = "rust_decimal::serde::str")]
128 pub bank_ending_balance: Decimal,
129 #[serde(with = "rust_decimal::serde::str")]
131 pub book_ending_balance: Decimal,
132 pub statement_lines: Vec<BankStatementLine>,
134 pub reconciling_items: Vec<ReconcilingItem>,
136 #[serde(with = "rust_decimal::serde::str")]
138 pub net_difference: Decimal,
139 #[serde(with = "rust_decimal::serde::str")]
141 pub opening_balance: Decimal,
142 pub preparer_id: String,
144 pub reviewer_id: Option<String>,
146}