use anyhow::Result;
use rust_decimal::Decimal;
use sqlx::PgPool;
use uuid::Uuid;
use backbone_orm::org_scope;
use crate::domain::entity::BankReconciliation;
pub const TABLE_NAME: &str = "banking.bank_reconciliations";
pub struct BankReconciliationRepository(
backbone_orm::GenericCrudRepository<BankReconciliation, backbone_orm::SoftDelete>,
);
impl std::ops::Deref for BankReconciliationRepository {
type Target = backbone_orm::GenericCrudRepository<BankReconciliation, backbone_orm::SoftDelete>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl BankReconciliationRepository {
pub fn new(pool: PgPool) -> Self {
Self(backbone_orm::GenericCrudRepository::new(pool, TABLE_NAME))
}
}
pub struct NewReconciliationRow<'a> {
pub id: Uuid,
pub bank_account_id: Uuid,
pub from_date: chrono::NaiveDate,
pub to_date: chrono::NaiveDate,
pub statement_closing_balance: Decimal,
pub ledger_balance: Decimal,
pub computed_difference: Decimal,
pub unreconciled_count: i32,
pub status: &'a str,
}
impl BankReconciliationRepository {
pub async fn insert_reconciliation(
&self,
pool: &PgPool,
r: &NewReconciliationRow<'_>,
) -> Result<(), sqlx::Error> {
org_scope::execute_scoped(
pool,
sqlx::query(
r#"INSERT INTO banking.bank_reconciliations
(id, bank_account_id, from_date, to_date, statement_closing_balance,
ledger_balance, computed_difference, unreconciled_count, status)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::recon_status)"#,
)
.bind(r.id)
.bind(r.bank_account_id)
.bind(r.from_date)
.bind(r.to_date)
.bind(r.statement_closing_balance)
.bind(r.ledger_balance)
.bind(r.computed_difference)
.bind(r.unreconciled_count)
.bind(r.status),
)
.await?;
Ok(())
}
}
backbone_core::impl_crud_repository!(
BankReconciliationRepository,
BankReconciliation,
soft_delete
);