Skip to main content

koprogo_api/application/dto/
owner_contribution_dto.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use uuid::Uuid;
4
5use crate::domain::entities::{
6    ContributionPaymentMethod, ContributionPaymentStatus, ContributionType, OwnerContribution,
7};
8
9/// DTO for creating a new owner contribution
10#[derive(Debug, Deserialize, utoipa::ToSchema)]
11#[serde(deny_unknown_fields)]
12pub struct CreateOwnerContributionRequest {
13    pub owner_id: Uuid,
14    /// Obligatoire : c'est le lot qui porte l'ACP créancière (Story H15,
15    /// ADR-0045). `resoudre_lacp_creanciere` refuse déjà `None` en use case —
16    /// Issue #852 aligne la signature sur ce que le code a toujours exigé,
17    /// pour qu'un client suivant le contrat n'essuie plus un 400 opaque.
18    pub unit_id: Uuid,
19    pub description: String,
20    pub amount: rust_decimal::Decimal,
21    pub contribution_type: ContributionType,
22    pub contribution_date: DateTime<Utc>,
23    pub account_code: Option<String>,
24}
25
26/// DTO for recording a payment
27#[derive(Debug, Deserialize, utoipa::ToSchema)]
28#[serde(deny_unknown_fields)]
29pub struct RecordPaymentRequest {
30    pub payment_date: DateTime<Utc>,
31    pub payment_method: ContributionPaymentMethod,
32    pub payment_reference: Option<String>,
33}
34
35/// DTO for owner contribution response
36#[derive(Debug, Serialize, utoipa::ToSchema)]
37pub struct OwnerContributionResponse {
38    pub id: Uuid,
39    /// L'ACP propriétaire de la pièce (ADR-0045).
40    pub acp_id: Uuid,
41    pub organization_id: Uuid,
42    pub owner_id: Uuid,
43    pub unit_id: Option<Uuid>,
44    pub description: String,
45    pub amount: rust_decimal::Decimal,
46    pub account_code: Option<String>,
47    pub contribution_type: ContributionType,
48    pub contribution_date: DateTime<Utc>,
49    pub payment_date: Option<DateTime<Utc>>,
50    pub payment_method: Option<ContributionPaymentMethod>,
51    pub payment_reference: Option<String>,
52    pub payment_status: ContributionPaymentStatus,
53    pub notes: Option<String>,
54    pub created_at: DateTime<Utc>,
55    pub updated_at: DateTime<Utc>,
56}
57
58impl From<OwnerContribution> for OwnerContributionResponse {
59    fn from(contribution: OwnerContribution) -> Self {
60        Self {
61            id: contribution.id,
62            acp_id: contribution.acp_id,
63            organization_id: contribution.organization_id,
64            owner_id: contribution.owner_id,
65            unit_id: contribution.unit_id,
66            description: contribution.description,
67            amount: contribution.amount,
68            account_code: contribution.account_code,
69            contribution_type: contribution.contribution_type,
70            contribution_date: contribution.contribution_date,
71            payment_date: contribution.payment_date,
72            payment_method: contribution.payment_method,
73            payment_reference: contribution.payment_reference,
74            payment_status: contribution.payment_status,
75            notes: contribution.notes,
76            created_at: contribution.created_at,
77            updated_at: contribution.updated_at,
78        }
79    }
80}