use async_trait::async_trait;
use chrono::{DateTime, NaiveDate, Utc};
use rust_decimal::Decimal;
use uuid::Uuid;
use crate::domain::gl_posting::PostingLine;
use crate::domain::reconcile_graph::{
AccountReconcileFlags, LineLocator, LocatorResolution, MatchingGroup, NewPartial, PartialRow,
PartyResidual, ReconcileLineSnapshot,
};
#[derive(Debug, Clone)]
pub struct JournalReversalMeta {
pub journal_id: Uuid,
pub company_id: Uuid,
pub branch_id: Option<Uuid>,
pub posting_date: NaiveDate,
pub currency: String,
pub source_id: Uuid,
pub reverses_post_id: Option<Uuid>,
pub fiscal_period_id: Option<Uuid>,
pub fiscal_year: i32,
pub fiscal_month: i32,
}
#[async_trait]
pub trait ReconcileGraphRepository: Send + Sync {
async fn lock_line_by_locator(
&self,
conn: &mut sqlx::PgConnection,
locator: &LineLocator,
) -> anyhow::Result<LocatorResolution>;
async fn lock_line(
&self,
conn: &mut sqlx::PgConnection,
line_id: Uuid,
) -> anyhow::Result<Option<ReconcileLineSnapshot>>;
async fn account_flags(
&self,
conn: &mut sqlx::PgConnection,
account_id: Uuid,
) -> anyhow::Result<Option<AccountReconcileFlags>>;
async fn residuals_of(
&self,
conn: &mut sqlx::PgConnection,
line_ids: &[Uuid],
) -> anyhow::Result<Vec<(Uuid, Decimal)>>;
async fn lock_lines(
&self,
conn: &mut sqlx::PgConnection,
line_ids: &[Uuid],
) -> anyhow::Result<()>;
async fn insert_partial(
&self,
conn: &mut sqlx::PgConnection,
p: &NewPartial,
) -> anyhow::Result<Uuid>;
async fn set_exchange_move(
&self,
conn: &mut sqlx::PgConnection,
partial_id: Uuid,
journal_id: Uuid,
) -> anyhow::Result<()>;
async fn component_line_ids(
&self,
conn: &mut sqlx::PgConnection,
seeds: &[Uuid],
) -> anyhow::Result<Vec<Uuid>>;
async fn component_partial_ids(
&self,
conn: &mut sqlx::PgConnection,
line_ids: &[Uuid],
) -> anyhow::Result<Vec<Uuid>>;
async fn distinct_group_stamps(
&self,
conn: &mut sqlx::PgConnection,
line_ids: &[Uuid],
) -> anyhow::Result<Vec<Uuid>>;
async fn create_full_group(
&self,
conn: &mut sqlx::PgConnection,
exchange_total: Decimal,
now: DateTime<Utc>,
) -> anyhow::Result<Uuid>;
async fn attach_group(
&self,
conn: &mut sqlx::PgConnection,
group_id: Uuid,
line_ids: &[Uuid],
partial_ids: &[Uuid],
now: DateTime<Utc>,
) -> anyhow::Result<()>;
async fn clear_line_flags(
&self,
conn: &mut sqlx::PgConnection,
line_ids: &[Uuid],
) -> anyhow::Result<()>;
async fn load_partial(
&self,
conn: &mut sqlx::PgConnection,
partial_id: Uuid,
) -> anyhow::Result<Option<PartialRow>>;
async fn partials_between(
&self,
conn: &mut sqlx::PgConnection,
a_id: Uuid,
b_id: Uuid,
) -> anyhow::Result<Vec<PartialRow>>;
async fn derived_partials(
&self,
conn: &mut sqlx::PgConnection,
parent_partial_id: Uuid,
) -> anyhow::Result<Vec<PartialRow>>;
async fn generated_journal_ids(
&self,
conn: &mut sqlx::PgConnection,
partial_ids: &[Uuid],
) -> anyhow::Result<Vec<Uuid>>;
async fn journal_lines_with_ids(
&self,
conn: &mut sqlx::PgConnection,
journal_id: Uuid,
) -> anyhow::Result<Vec<(Uuid, PostingLine)>>;
async fn journal_reversal_meta(
&self,
conn: &mut sqlx::PgConnection,
journal_id: Uuid,
) -> anyhow::Result<Option<JournalReversalMeta>>;
async fn delete_partials(
&self,
conn: &mut sqlx::PgConnection,
partial_ids: &[Uuid],
) -> anyhow::Result<()>;
async fn group_partial_ids(
&self,
conn: &mut sqlx::PgConnection,
group_id: Uuid,
) -> anyhow::Result<Vec<Uuid>>;
async fn dissolve_group(
&self,
conn: &mut sqlx::PgConnection,
group_id: Uuid,
) -> anyhow::Result<()>;
async fn reversal_counterpart(
&self,
conn: &mut sqlx::PgConnection,
line: &ReconcileLineSnapshot,
) -> anyhow::Result<Option<ReconcileLineSnapshot>>;
async fn residuals_for_party(
&self,
conn: &mut sqlx::PgConnection,
account_id: Uuid,
party_type: &str,
party_id: Uuid,
) -> anyhow::Result<Vec<PartyResidual>>;
async fn matching_group(
&self,
conn: &mut sqlx::PgConnection,
line_id: Uuid,
) -> anyhow::Result<MatchingGroup>;
async fn period_closed(
&self,
conn: &mut sqlx::PgConnection,
date: NaiveDate,
) -> anyhow::Result<bool>;
}