//! ReconciliationItem DTOs (Data Transfer Objects)
//!
//! Generated by metaphor-schema. Do not edit manually.
//!
//! DTOs provide a clean separation between domain entities and API
//! representations, with OpenAPI documentation support.
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use chrono::{DateTime, Utc, NaiveDate};
use rust_decimal::Decimal;
#[cfg(feature = "openapi")]
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
use crate::domain::entity::ReconciliationItem;
use crate::domain::entity::ReconciliationItemStatus;
// =============================================================================
// Create DTO
// =============================================================================
/// Request DTO for creating a new ReconciliationItem
///
/// Used in POST requests to create new entities.
/// Excludes auto-generated fields (id, created_at, updated_at, deleted_at).
#[derive(Debug, Clone, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "camelCase")]
pub struct CreateReconciliationItemDto {
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
#[serde(alias = "reconciliation_id")]
pub reconciliation_id: Uuid,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(alias = "item_number")]
pub item_number: i32,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub source: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "ledger_id")]
pub ledger_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "journal_id")]
pub journal_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "book_date")]
pub book_date: Option<NaiveDate>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "book_reference")]
pub book_reference: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "book_description")]
pub book_description: Option<String>,
#[serde(alias = "book_debit")]
pub book_debit: Decimal,
#[serde(alias = "book_credit")]
pub book_credit: Decimal,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "statement_date")]
pub statement_date: Option<NaiveDate>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "statement_reference")]
pub statement_reference: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "statement_description")]
pub statement_description: Option<String>,
#[serde(alias = "statement_debit")]
pub statement_debit: Decimal,
#[serde(alias = "statement_credit")]
pub statement_credit: Decimal,
pub status: ReconciliationItemStatus,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "matched_with_id")]
pub matched_with_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "match_date")]
pub match_date: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "match_method")]
pub match_method: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "match_confidence")]
pub match_confidence: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "has_difference")]
pub has_difference: bool,
#[serde(alias = "difference_amount")]
pub difference_amount: Decimal,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "difference_reason")]
pub difference_reason: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "requires_adjustment")]
pub requires_adjustment: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "adjustment_type")]
pub adjustment_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "adjustment_journal_id")]
pub adjustment_journal_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "adjusted_at")]
pub adjusted_at: Option<DateTime<Utc>>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_written_off")]
pub is_written_off: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "write_off_reason")]
pub write_off_reason: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "write_off_approved_by")]
pub write_off_approved_by: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_outstanding")]
pub is_outstanding: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "outstanding_type")]
pub outstanding_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "expected_clear_date")]
pub expected_clear_date: Option<NaiveDate>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
pub data: serde_json::Value,
}
// =============================================================================
// Update DTO
// =============================================================================
/// Request DTO for full update of a ReconciliationItem
///
/// Used in PUT requests for full entity replacement.
/// All fields are required (except auto-generated ones).
#[derive(Debug, Clone, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "camelCase")]
pub struct UpdateReconciliationItemDto {
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
#[serde(alias = "reconciliation_id")]
pub reconciliation_id: Uuid,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(alias = "item_number")]
pub item_number: i32,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub source: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "ledger_id")]
pub ledger_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "journal_id")]
pub journal_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "book_date")]
pub book_date: Option<NaiveDate>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "book_reference")]
pub book_reference: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "book_description")]
pub book_description: Option<String>,
#[serde(alias = "book_debit")]
pub book_debit: Decimal,
#[serde(alias = "book_credit")]
pub book_credit: Decimal,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "statement_date")]
pub statement_date: Option<NaiveDate>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "statement_reference")]
pub statement_reference: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "statement_description")]
pub statement_description: Option<String>,
#[serde(alias = "statement_debit")]
pub statement_debit: Decimal,
#[serde(alias = "statement_credit")]
pub statement_credit: Decimal,
pub status: ReconciliationItemStatus,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "matched_with_id")]
pub matched_with_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "match_date")]
pub match_date: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "match_method")]
pub match_method: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "match_confidence")]
pub match_confidence: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "has_difference")]
pub has_difference: bool,
#[serde(alias = "difference_amount")]
pub difference_amount: Decimal,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "difference_reason")]
pub difference_reason: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "requires_adjustment")]
pub requires_adjustment: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "adjustment_type")]
pub adjustment_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "adjustment_journal_id")]
pub adjustment_journal_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "adjusted_at")]
pub adjusted_at: Option<DateTime<Utc>>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_written_off")]
pub is_written_off: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "write_off_reason")]
pub write_off_reason: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "write_off_approved_by")]
pub write_off_approved_by: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_outstanding")]
pub is_outstanding: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "outstanding_type")]
pub outstanding_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "expected_clear_date")]
pub expected_clear_date: Option<NaiveDate>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
pub data: serde_json::Value,
}
// =============================================================================
// Patch DTO
// =============================================================================
/// Request DTO for partial update of a ReconciliationItem
///
/// Used in PATCH requests for partial updates.
/// All fields are optional - only provided fields will be updated.
#[derive(Debug, Clone, Default, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "camelCase")]
pub struct PatchReconciliationItemDto {
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
#[serde(skip_serializing_if = "Option::is_none", alias = "reconciliation_id")]
pub reconciliation_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(skip_serializing_if = "Option::is_none", alias = "item_number")]
pub item_number: Option<i32>,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "ledger_id")]
pub ledger_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "journal_id")]
pub journal_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "book_date")]
pub book_date: Option<NaiveDate>,
#[serde(skip_serializing_if = "Option::is_none", alias = "book_reference")]
pub book_reference: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "book_description")]
pub book_description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "book_debit")]
pub book_debit: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "book_credit")]
pub book_credit: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "statement_date")]
pub statement_date: Option<NaiveDate>,
#[serde(skip_serializing_if = "Option::is_none", alias = "statement_reference")]
pub statement_reference: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "statement_description")]
pub statement_description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "statement_debit")]
pub statement_debit: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "statement_credit")]
pub statement_credit: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<ReconciliationItemStatus>,
#[serde(skip_serializing_if = "Option::is_none", alias = "matched_with_id")]
pub matched_with_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "match_date")]
pub match_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none", alias = "match_method")]
pub match_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "match_confidence")]
pub match_confidence: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "has_difference")]
pub has_difference: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "difference_amount")]
pub difference_amount: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "difference_reason")]
pub difference_reason: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "requires_adjustment")]
pub requires_adjustment: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "adjustment_type")]
pub adjustment_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "adjustment_journal_id")]
pub adjustment_journal_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "adjusted_at")]
pub adjusted_at: Option<DateTime<Utc>>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "is_written_off")]
pub is_written_off: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "write_off_reason")]
pub write_off_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "write_off_approved_by")]
pub write_off_approved_by: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "is_outstanding")]
pub is_outstanding: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "outstanding_type")]
pub outstanding_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "expected_clear_date")]
pub expected_clear_date: Option<NaiveDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}
impl PatchReconciliationItemDto {
/// Check if any field is set
pub fn has_changes(&self) -> bool {
self.reconciliation_id.is_some() || self.item_number.is_some() || self.source.is_some() || self.ledger_id.is_some() || self.journal_id.is_some() || self.book_date.is_some() || self.book_reference.is_some() || self.book_description.is_some() || self.book_debit.is_some() || self.book_credit.is_some() || self.statement_date.is_some() || self.statement_reference.is_some() || self.statement_description.is_some() || self.statement_debit.is_some() || self.statement_credit.is_some() || self.status.is_some() || self.matched_with_id.is_some() || self.match_date.is_some() || self.match_method.is_some() || self.match_confidence.is_some() || self.has_difference.is_some() || self.difference_amount.is_some() || self.difference_reason.is_some() || self.requires_adjustment.is_some() || self.adjustment_type.is_some() || self.adjustment_journal_id.is_some() || self.adjusted_at.is_some() || self.is_written_off.is_some() || self.write_off_reason.is_some() || self.write_off_approved_by.is_some() || self.is_outstanding.is_some() || self.outstanding_type.is_some() || self.expected_clear_date.is_some() || self.notes.is_some() || self.data.is_some()
}
}
// =============================================================================
// Response DTO
// =============================================================================
/// Response DTO for ReconciliationItem entity
///
/// Used in API responses for single entity.
/// Includes all fields including metadata.
#[derive(Debug, Clone, Serialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "camelCase")]
pub struct ReconciliationItemResponseDto {
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
pub id: Uuid,
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
pub reconciliation_id: Uuid,
#[cfg_attr(feature = "openapi", schema(example = 42))]
pub item_number: i32,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub source: String,
pub ledger_id: Option<Uuid>,
pub journal_id: Option<Uuid>,
pub book_date: Option<NaiveDate>,
pub book_reference: Option<String>,
pub book_description: Option<String>,
pub book_debit: Decimal,
pub book_credit: Decimal,
pub statement_date: Option<NaiveDate>,
pub statement_reference: Option<String>,
pub statement_description: Option<String>,
pub statement_debit: Decimal,
pub statement_credit: Decimal,
pub status: ReconciliationItemStatus,
pub matched_with_id: Option<Uuid>,
pub match_date: Option<DateTime<Utc>>,
pub match_method: Option<String>,
pub match_confidence: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub has_difference: bool,
pub difference_amount: Decimal,
pub difference_reason: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub requires_adjustment: bool,
pub adjustment_type: Option<String>,
pub adjustment_journal_id: Option<Uuid>,
pub adjusted_at: Option<DateTime<Utc>>,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub is_written_off: bool,
pub write_off_reason: Option<String>,
pub write_off_approved_by: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub is_outstanding: bool,
pub outstanding_type: Option<String>,
pub expected_clear_date: Option<NaiveDate>,
pub notes: Option<String>,
pub data: serde_json::Value,
}
// =============================================================================
// List Response DTO
// =============================================================================
/// Paginated list response for ReconciliationItem entities
///
/// Used in API responses for list endpoints.
/// Includes pagination metadata.
#[derive(Debug, Clone, Serialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "camelCase")]
pub struct ReconciliationItemListResponseDto {
/// List of items
pub items: Vec<ReconciliationItemResponseDto>,
/// Total number of items (across all pages)
pub total: u64,
/// Current page number (1-indexed)
pub page: u32,
/// Number of items per page
pub per_page: u32,
/// Total number of pages
pub total_pages: u32,
/// Whether there is a next page
pub has_next: bool,
/// Whether there is a previous page
pub has_prev: bool,
}
impl ReconciliationItemListResponseDto {
/// Create a new list response from items and pagination info
pub fn new(items: Vec<ReconciliationItemResponseDto>, total: u64, page: u32, per_page: u32) -> Self {
let total_pages = if per_page > 0 {
((total as f64) / (per_page as f64)).ceil() as u32
} else {
0
};
Self {
items,
total,
page,
per_page,
total_pages,
has_next: page < total_pages,
has_prev: page > 1,
}
}
}
/// Summary DTO for list views (compact version)
#[derive(Debug, Clone, Serialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "camelCase")]
pub struct ReconciliationItemSummaryDto {
pub id: Uuid,
pub reconciliation_id: Uuid,
pub item_number: i32,
pub source: String,
pub created_at: Option<DateTime<Utc>>,
}
// =============================================================================
// Conversions
// =============================================================================
impl From<ReconciliationItem> for ReconciliationItemResponseDto {
fn from(entity: ReconciliationItem) -> Self {
Self {
id: entity.id,
reconciliation_id: entity.reconciliation_id,
item_number: entity.item_number,
source: entity.source,
ledger_id: entity.ledger_id,
journal_id: entity.journal_id,
book_date: entity.book_date,
book_reference: entity.book_reference,
book_description: entity.book_description,
book_debit: entity.book_debit,
book_credit: entity.book_credit,
statement_date: entity.statement_date,
statement_reference: entity.statement_reference,
statement_description: entity.statement_description,
statement_debit: entity.statement_debit,
statement_credit: entity.statement_credit,
status: entity.status,
matched_with_id: entity.matched_with_id,
match_date: entity.match_date,
match_method: entity.match_method,
match_confidence: entity.match_confidence,
has_difference: entity.has_difference,
difference_amount: entity.difference_amount,
difference_reason: entity.difference_reason,
requires_adjustment: entity.requires_adjustment,
adjustment_type: entity.adjustment_type,
adjustment_journal_id: entity.adjustment_journal_id,
adjusted_at: entity.adjusted_at,
is_written_off: entity.is_written_off,
write_off_reason: entity.write_off_reason,
write_off_approved_by: entity.write_off_approved_by,
is_outstanding: entity.is_outstanding,
outstanding_type: entity.outstanding_type,
expected_clear_date: entity.expected_clear_date,
notes: entity.notes,
data: entity.data,
}
}
}
impl From<ReconciliationItem> for ReconciliationItemSummaryDto {
fn from(entity: ReconciliationItem) -> Self {
let created_at = backbone_core::PersistentEntity::created_at(&entity);
Self {
id: entity.id,
reconciliation_id: entity.reconciliation_id,
item_number: entity.item_number,
source: entity.source,
created_at,
}
}
}
impl From<CreateReconciliationItemDto> for ReconciliationItem {
fn from(dto: CreateReconciliationItemDto) -> Self {
Self {
id: Uuid::new_v4(),
reconciliation_id: dto.reconciliation_id,
item_number: dto.item_number,
source: dto.source,
ledger_id: dto.ledger_id,
journal_id: dto.journal_id,
book_date: dto.book_date,
book_reference: dto.book_reference,
book_description: dto.book_description,
book_debit: dto.book_debit,
book_credit: dto.book_credit,
statement_date: dto.statement_date,
statement_reference: dto.statement_reference,
statement_description: dto.statement_description,
statement_debit: dto.statement_debit,
statement_credit: dto.statement_credit,
status: dto.status,
matched_with_id: dto.matched_with_id,
match_date: dto.match_date,
match_method: dto.match_method,
match_confidence: dto.match_confidence,
has_difference: dto.has_difference,
difference_amount: dto.difference_amount,
difference_reason: dto.difference_reason,
requires_adjustment: dto.requires_adjustment,
adjustment_type: dto.adjustment_type,
adjustment_journal_id: dto.adjustment_journal_id,
adjusted_at: dto.adjusted_at,
is_written_off: dto.is_written_off,
write_off_reason: dto.write_off_reason,
write_off_approved_by: dto.write_off_approved_by,
is_outstanding: dto.is_outstanding,
outstanding_type: dto.outstanding_type,
expected_clear_date: dto.expected_clear_date,
notes: dto.notes,
data: dto.data,
}
}
}
impl From<&ReconciliationItem> for ReconciliationItemResponseDto {
fn from(entity: &ReconciliationItem) -> Self {
Self {
id: entity.id.clone(),
reconciliation_id: entity.reconciliation_id.clone(),
item_number: entity.item_number.clone(),
source: entity.source.clone(),
ledger_id: entity.ledger_id.clone(),
journal_id: entity.journal_id.clone(),
book_date: entity.book_date.clone(),
book_reference: entity.book_reference.clone(),
book_description: entity.book_description.clone(),
book_debit: entity.book_debit.clone(),
book_credit: entity.book_credit.clone(),
statement_date: entity.statement_date.clone(),
statement_reference: entity.statement_reference.clone(),
statement_description: entity.statement_description.clone(),
statement_debit: entity.statement_debit.clone(),
statement_credit: entity.statement_credit.clone(),
status: entity.status.clone(),
matched_with_id: entity.matched_with_id.clone(),
match_date: entity.match_date.clone(),
match_method: entity.match_method.clone(),
match_confidence: entity.match_confidence.clone(),
has_difference: entity.has_difference.clone(),
difference_amount: entity.difference_amount.clone(),
difference_reason: entity.difference_reason.clone(),
requires_adjustment: entity.requires_adjustment.clone(),
adjustment_type: entity.adjustment_type.clone(),
adjustment_journal_id: entity.adjustment_journal_id.clone(),
adjusted_at: entity.adjusted_at.clone(),
is_written_off: entity.is_written_off.clone(),
write_off_reason: entity.write_off_reason.clone(),
write_off_approved_by: entity.write_off_approved_by.clone(),
is_outstanding: entity.is_outstanding.clone(),
outstanding_type: entity.outstanding_type.clone(),
expected_clear_date: entity.expected_clear_date.clone(),
notes: entity.notes.clone(),
data: entity.data.clone(),
}
}
}
impl backbone_core::FromCreateDto<CreateReconciliationItemDto> for ReconciliationItem {
fn from_create_dto(dto: CreateReconciliationItemDto) -> backbone_core::ServiceResult<Self> {
Ok(ReconciliationItem::from(dto))
}
}
impl backbone_core::ApplyUpdateDto<UpdateReconciliationItemDto> for ReconciliationItem {
fn apply_update(mut self, dto: UpdateReconciliationItemDto) -> backbone_core::ServiceResult<Self> {
self.reconciliation_id = dto.reconciliation_id;
self.item_number = dto.item_number;
self.source = dto.source;
self.ledger_id = dto.ledger_id;
self.journal_id = dto.journal_id;
self.book_date = dto.book_date;
self.book_reference = dto.book_reference;
self.book_description = dto.book_description;
self.book_debit = dto.book_debit;
self.book_credit = dto.book_credit;
self.statement_date = dto.statement_date;
self.statement_reference = dto.statement_reference;
self.statement_description = dto.statement_description;
self.statement_debit = dto.statement_debit;
self.statement_credit = dto.statement_credit;
self.status = dto.status;
self.matched_with_id = dto.matched_with_id;
self.match_date = dto.match_date;
self.match_method = dto.match_method;
self.match_confidence = dto.match_confidence;
self.has_difference = dto.has_difference;
self.difference_amount = dto.difference_amount;
self.difference_reason = dto.difference_reason;
self.requires_adjustment = dto.requires_adjustment;
self.adjustment_type = dto.adjustment_type;
self.adjustment_journal_id = dto.adjustment_journal_id;
self.adjusted_at = dto.adjusted_at;
self.is_written_off = dto.is_written_off;
self.write_off_reason = dto.write_off_reason;
self.write_off_approved_by = dto.write_off_approved_by;
self.is_outstanding = dto.is_outstanding;
self.outstanding_type = dto.outstanding_type;
self.expected_clear_date = dto.expected_clear_date;
self.notes = dto.notes;
self.data = dto.data;
Ok(self)
}
}
// =============================================================================
// Custom DTOs
// =============================================================================
// Add custom DTOs specific to ReconciliationItem here.
// This section will be preserved during regeneration.
// >>> END CUSTOM DTOs