use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ReconcileLine {
pub source_type: String,
pub source_id: Uuid,
pub account_id: Uuid,
pub reversing: bool,
}
impl ReconcileLine {
pub fn new(source_type: &str, source_id: Uuid, account_id: Uuid) -> Self {
Self { source_type: source_type.to_string(), source_id, account_id, reversing: false }
}
pub fn reversing(mut self) -> Self {
self.reversing = true;
self
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum ReconcileOrigin {
Settlement,
Clearing,
Manual,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ReconcilePairRequest {
pub company_id: Uuid,
pub debit: ReconcileLine,
pub credit: ReconcileLine,
pub amount: Decimal,
pub origin: ReconcileOrigin,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ReconcileEdgeAck {
pub partial_id: Option<Uuid>,
pub applied: Decimal,
pub full_reconcile_id: Option<Uuid>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct UnreconcilePairRequest {
pub company_id: Uuid,
pub debit: ReconcileLine,
pub credit: ReconcileLine,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ReconcileRejected {
pub code: String,
pub message: String,
}
#[async_trait::async_trait]
pub trait ReconcileSink: Send + Sync {
async fn reconcile_pair_on(
&self,
conn: &mut sqlx::PgConnection,
req: &ReconcilePairRequest,
) -> Result<ReconcileEdgeAck, ReconcileRejected>;
async fn unreconcile_pair_on(
&self,
conn: &mut sqlx::PgConnection,
req: &UnreconcilePairRequest,
) -> Result<(), ReconcileRejected>;
}