koprogo_api/application/ports/
board_decision_repository.rs

1use crate::domain::entities::{BoardDecision, DecisionStatus};
2use async_trait::async_trait;
3use uuid::Uuid;
4
5/// Port (interface) pour le repository des décisions du conseil
6#[async_trait]
7pub trait BoardDecisionRepository: Send + Sync {
8    /// Crée une nouvelle décision à suivre
9    async fn create(&self, decision: &BoardDecision) -> Result<BoardDecision, String>;
10
11    /// Trouve une décision par son ID
12    async fn find_by_id(&self, id: Uuid) -> Result<Option<BoardDecision>, String>;
13
14    /// Trouve toutes les décisions d'un immeuble
15    async fn find_by_building(&self, building_id: Uuid) -> Result<Vec<BoardDecision>, String>;
16
17    /// Trouve toutes les décisions d'une assemblée générale
18    async fn find_by_meeting(&self, meeting_id: Uuid) -> Result<Vec<BoardDecision>, String>;
19
20    /// Trouve les décisions par statut pour un immeuble
21    async fn find_by_status(
22        &self,
23        building_id: Uuid,
24        status: DecisionStatus,
25    ) -> Result<Vec<BoardDecision>, String>;
26
27    /// Trouve les décisions en retard (deadline dépassée et statut != completed/cancelled)
28    async fn find_overdue(&self, building_id: Uuid) -> Result<Vec<BoardDecision>, String>;
29
30    /// Trouve les décisions avec deadline proche (< N jours)
31    async fn find_deadline_approaching(
32        &self,
33        building_id: Uuid,
34        days_threshold: i32,
35    ) -> Result<Vec<BoardDecision>, String>;
36
37    /// Met à jour une décision (changement de statut, ajout de notes)
38    async fn update(&self, decision: &BoardDecision) -> Result<BoardDecision, String>;
39
40    /// Supprime une décision
41    async fn delete(&self, id: Uuid) -> Result<bool, String>;
42
43    /// Compte les décisions par statut pour un immeuble
44    async fn count_by_status(
45        &self,
46        building_id: Uuid,
47        status: DecisionStatus,
48    ) -> Result<i64, String>;
49
50    /// Compte le total de décisions en retard pour un immeuble
51    async fn count_overdue(&self, building_id: Uuid) -> Result<i64, String>;
52}