pub mod bank;
pub mod bank_account;
pub mod bank_clearance;
pub mod bank_reconciliation;
pub mod bank_statement_import;
pub mod bank_transaction;
pub mod fx_gain_loss;
pub mod reconcile_preset;
pub mod bank_status;
pub mod bank_account_status;
pub mod bank_account_type;
pub mod matched_source_type;
pub mod match_method;
pub mod recon_status;
pub mod source_format;
pub mod import_status;
pub mod txn_status;
pub mod fx_direction;
pub mod match_on;
pub mod preset_status;
pub use bank::Bank;
pub use bank::BankBuilder;
pub use bank::BankId;
pub use bank_account::BankAccount;
pub use bank_account::BankAccountBuilder;
pub use bank_account::BankAccountId;
pub use bank_clearance::BankClearance;
pub use bank_clearance::BankClearanceBuilder;
pub use bank_clearance::BankClearanceId;
pub use bank_reconciliation::BankReconciliation;
pub use bank_reconciliation::BankReconciliationBuilder;
pub use bank_reconciliation::BankReconciliationId;
pub use bank_statement_import::BankStatementImport;
pub use bank_statement_import::BankStatementImportBuilder;
pub use bank_statement_import::BankStatementImportId;
pub use bank_transaction::BankTransaction;
pub use bank_transaction::BankTransactionBuilder;
pub use bank_transaction::BankTransactionId;
pub use fx_gain_loss::FxGainLoss;
pub use fx_gain_loss::FxGainLossBuilder;
pub use fx_gain_loss::FxGainLossId;
pub use reconcile_preset::ReconcilePreset;
pub use reconcile_preset::ReconcilePresetBuilder;
pub use reconcile_preset::ReconcilePresetId;
pub use bank_status::BankStatus;
pub use bank_account_status::BankAccountStatus;
pub use bank_account_type::BankAccountType;
pub use matched_source_type::MatchedSourceType;
pub use match_method::MatchMethod;
pub use recon_status::ReconStatus;
pub use source_format::SourceFormat;
pub use import_status::ImportStatus;
pub use txn_status::TxnStatus;
pub use fx_direction::FxDirection;
pub use match_on::MatchOn;
pub use preset_status::PresetStatus;
use std::fmt::Debug;
pub trait Entity: Debug + Clone {
type Id: Debug + Clone + PartialEq;
fn entity_id(&self) -> &Self::Id;
fn entity_type() -> &'static str;
}
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct AuditMetadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_by: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_by: Option<Uuid>,
}
impl AuditMetadata {
pub fn new() -> Self {
Self {
created_at: Some(Utc::now()),
..Default::default()
}
}
pub fn with_creator(creator_id: Uuid) -> Self {
Self {
created_at: Some(Utc::now()),
created_by: Some(creator_id),
..Default::default()
}
}
pub fn touch(&mut self) {
self.updated_at = Some(Utc::now());
}
pub fn touch_by(&mut self, updater_id: Uuid) {
self.updated_at = Some(Utc::now());
self.updated_by = Some(updater_id);
}
pub fn soft_delete(&mut self) {
self.deleted_at = Some(Utc::now());
}
pub fn soft_delete_by(&mut self, deleter_id: Uuid) {
self.deleted_at = Some(Utc::now());
self.deleted_by = Some(deleter_id);
}
pub fn restore(&mut self) {
self.deleted_at = None;
self.deleted_by = None;
}
pub fn is_deleted(&self) -> bool {
self.deleted_at.is_some()
}
pub fn is_active(&self) -> bool {
self.deleted_at.is_none()
}
}