Skip to main content

koprogo_api/application/ports/
charge_distribution_repository.rs

1use crate::domain::entities::ChargeDistribution;
2use async_trait::async_trait;
3use rust_decimal::Decimal;
4use uuid::Uuid;
5
6#[async_trait]
7pub trait ChargeDistributionRepository: Send + Sync {
8    /// Create a single charge distribution
9    async fn create(&self, distribution: &ChargeDistribution)
10        -> Result<ChargeDistribution, String>;
11
12    /// Create multiple charge distributions in bulk (for performance)
13    async fn create_bulk(
14        &self,
15        distributions: &[ChargeDistribution],
16    ) -> Result<Vec<ChargeDistribution>, String>;
17
18    /// Find charge distribution by ID
19    async fn find_by_id(&self, id: Uuid) -> Result<Option<ChargeDistribution>, String>;
20
21    /// Find all charge distributions for an expense/invoice
22    async fn find_by_expense(&self, expense_id: Uuid) -> Result<Vec<ChargeDistribution>, String>;
23
24    /// Find all charge distributions for a unit
25    async fn find_by_unit(&self, unit_id: Uuid) -> Result<Vec<ChargeDistribution>, String>;
26
27    /// Find all charge distributions for an owner
28    async fn find_by_owner(&self, owner_id: Uuid) -> Result<Vec<ChargeDistribution>, String>;
29
30    /// Delete all distributions for an expense (e.g., if invoice is cancelled)
31    async fn delete_by_expense(&self, expense_id: Uuid) -> Result<(), String>;
32
33    /// Get total amount due for an owner across all pending distributions
34    async fn get_total_due_by_owner(&self, owner_id: Uuid) -> Result<Decimal, String>;
35}