use async_trait::async_trait;
use chrono::{DateTime, Utc};
use uuid::Uuid;
#[derive(Debug, Clone)]
pub struct JournalStatusRow {
pub status: String,
pub currency: String,
}
#[async_trait]
pub trait JournalWorkflowRepository: Send + Sync {
async fn find_status(
&self,
journal_id: Uuid,
) -> anyhow::Result<Option<JournalStatusRow>>;
async fn current_status(
&self,
journal_id: Uuid,
) -> anyhow::Result<Option<String>>;
async fn submit(&self, journal_id: Uuid,) -> anyhow::Result<bool>;
async fn approve(
&self,
journal_id: Uuid,
approved_by: Option<Uuid>,
at: DateTime<Utc>,
) -> anyhow::Result<bool>;
async fn reject(
&self,
journal_id: Uuid,
reason: &str,
rejected_by: Option<Uuid>,
at: DateTime<Utc>,
) -> anyhow::Result<bool>;
async fn mark_voided(
&self,
journal_id: Uuid,
voided_by: Option<Uuid>,
reason: &str,
at: DateTime<Utc>,
) -> anyhow::Result<()>;
async fn original_post(
&self,
journal_id: Uuid,
) -> anyhow::Result<Option<Uuid>>;
}