use serde::{Deserialize, Serialize};
use uuid::Uuid;
use chrono::{DateTime, Utc, NaiveDate};
use rust_decimal::Decimal;
use crate::domain::entity::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct BankId(pub Uuid);
impl BankId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for BankId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<BankId> for Uuid {
fn from(id: BankId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankDto {
pub id: BankId,
pub name: String,
pub swift_bic: Option<String>,
pub country: String,
pub status: BankStatus,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankSummary {
pub id: BankId,
pub name: String,
pub status: BankStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankRef {
pub id: BankId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct BankAccountId(pub Uuid);
impl BankAccountId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for BankAccountId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<BankAccountId> for Uuid {
fn from(id: BankAccountId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankAccountDto {
pub id: BankAccountId,
pub branch_id: Option<Uuid>,
pub bank_id: Uuid,
pub account_name: String,
pub account_number: String,
pub gl_account_id: Uuid,
pub clearing_account_id: Uuid,
pub currency: String,
pub account_type: BankAccountType,
pub is_default: bool,
pub status: BankAccountStatus,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankAccountSummary {
pub id: BankAccountId,
pub account_name: String,
pub status: BankAccountStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankAccountRef {
pub id: BankAccountId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct BankClearanceId(pub Uuid);
impl BankClearanceId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for BankClearanceId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<BankClearanceId> for Uuid {
fn from(id: BankClearanceId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankClearanceDto {
pub id: BankClearanceId,
pub bank_transaction_id: Uuid,
pub matched_source_type: MatchedSourceType,
pub matched_source_id: Uuid,
pub matched_amount: Decimal,
pub match_method: MatchMethod,
pub clearance_date: NaiveDate,
pub accounting_post_id: Option<Uuid>,
pub journal_id: Option<Uuid>,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankClearanceSummary {
pub id: BankClearanceId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankClearanceRef {
pub id: BankClearanceId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct BankReconciliationId(pub Uuid);
impl BankReconciliationId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for BankReconciliationId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<BankReconciliationId> for Uuid {
fn from(id: BankReconciliationId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankReconciliationDto {
pub id: BankReconciliationId,
pub bank_account_id: Uuid,
pub from_date: NaiveDate,
pub to_date: NaiveDate,
pub statement_closing_balance: Decimal,
pub ledger_balance: Decimal,
pub computed_difference: Decimal,
pub unreconciled_count: i32,
pub status: ReconStatus,
pub preset_id: Option<Uuid>,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankReconciliationSummary {
pub id: BankReconciliationId,
pub status: ReconStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankReconciliationRef {
pub id: BankReconciliationId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct BankStatementImportId(pub Uuid);
impl BankStatementImportId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for BankStatementImportId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<BankStatementImportId> for Uuid {
fn from(id: BankStatementImportId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankStatementImportDto {
pub id: BankStatementImportId,
pub bank_account_id: Uuid,
pub source_format: SourceFormat,
pub statement_period_start: NaiveDate,
pub statement_period_end: NaiveDate,
pub opening_balance: Decimal,
pub closing_balance: Decimal,
pub file_ref: Option<String>,
pub status: ImportStatus,
pub row_count: i32,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankStatementImportSummary {
pub id: BankStatementImportId,
pub status: ImportStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankStatementImportRef {
pub id: BankStatementImportId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct BankTransactionId(pub Uuid);
impl BankTransactionId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for BankTransactionId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<BankTransactionId> for Uuid {
fn from(id: BankTransactionId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankTransactionDto {
pub id: BankTransactionId,
pub bank_account_id: Uuid,
pub import_id: Uuid,
pub txn_date: NaiveDate,
pub value_date: Option<NaiveDate>,
pub description: Option<String>,
pub reference_no: Option<String>,
pub deposit: Decimal,
pub withdrawal: Decimal,
pub currency: String,
pub status: TxnStatus,
pub allocated_amount: Decimal,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankTransactionSummary {
pub id: BankTransactionId,
pub status: TxnStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankTransactionRef {
pub id: BankTransactionId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct FxGainLossId(pub Uuid);
impl FxGainLossId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for FxGainLossId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<FxGainLossId> for Uuid {
fn from(id: FxGainLossId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FxGainLossDto {
pub id: FxGainLossId,
pub bank_clearance_id: Option<Uuid>,
pub matched_source_id: Uuid,
pub currency: String,
pub original_rate: Decimal,
pub realised_rate: Decimal,
pub base_amount_delta: Decimal,
pub direction: FxDirection,
pub fx_account_id: Uuid,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FxGainLossSummary {
pub id: FxGainLossId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FxGainLossRef {
pub id: FxGainLossId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ReconcilePresetId(pub Uuid);
impl ReconcilePresetId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for ReconcilePresetId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<ReconcilePresetId> for Uuid {
fn from(id: ReconcilePresetId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReconcilePresetDto {
pub id: ReconcilePresetId,
pub name: String,
pub note: Option<String>,
pub priority: i32,
pub match_on: MatchOn,
pub tolerance_percent: Option<Decimal>,
pub days_window: Option<i32>,
pub status: PresetStatus,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReconcilePresetSummary {
pub id: ReconcilePresetId,
pub name: String,
pub status: PresetStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReconcilePresetRef {
pub id: ReconcilePresetId,
}