//! JournalLine 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};
use rust_decimal::Decimal;
#[cfg(feature = "openapi")]
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
use crate::domain::entity::JournalLine;
use crate::domain::entity::PartyType;
// =============================================================================
// Create DTO
// =============================================================================
/// Request DTO for creating a new JournalLine
///
/// 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 CreateJournalLineDto {
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
#[serde(alias = "journal_id")]
pub journal_id: Uuid,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "branch_id")]
pub branch_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "party_type")]
pub party_type: Option<PartyType>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "party_id")]
pub party_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(alias = "line_number")]
pub line_number: i32,
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
#[serde(alias = "account_id")]
pub account_id: Uuid,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(alias = "account_number")]
pub account_number: String,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(alias = "account_name")]
pub account_name: String,
#[serde(alias = "debit_amount")]
pub debit_amount: Decimal,
#[serde(alias = "credit_amount")]
pub credit_amount: Decimal,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub currency: String,
#[serde(alias = "exchange_rate")]
pub exchange_rate: Decimal,
#[serde(alias = "base_debit_amount")]
pub base_debit_amount: Decimal,
#[serde(alias = "base_credit_amount")]
pub base_credit_amount: Decimal,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "cost_center_id")]
pub cost_center_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "project_id")]
pub project_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "department_id")]
pub department_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dimensions: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "source_type")]
pub source_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "source_id")]
pub source_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "source_reference")]
pub source_reference: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_tax_line")]
pub is_tax_line: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "tax_rate")]
pub tax_rate: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "tax_base_amount")]
pub tax_base_amount: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "related_line_id")]
pub related_line_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "has_quantity")]
pub has_quantity: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub quantity: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "unit_price")]
pub unit_price: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_reconciled")]
pub is_reconciled: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "reconciliation_id")]
pub reconciliation_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "reconciled_at")]
pub reconciled_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "full_reconcile_id")]
pub full_reconcile_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_posted")]
pub is_posted: bool,
#[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 = "posted_at")]
pub posted_at: Option<DateTime<Utc>>,
pub tags: serde_json::Value,
pub data: serde_json::Value,
}
// =============================================================================
// Update DTO
// =============================================================================
/// Request DTO for full update of a JournalLine
///
/// 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 UpdateJournalLineDto {
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
#[serde(alias = "journal_id")]
pub journal_id: Uuid,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "branch_id")]
pub branch_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "party_type")]
pub party_type: Option<PartyType>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "party_id")]
pub party_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(alias = "line_number")]
pub line_number: i32,
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
#[serde(alias = "account_id")]
pub account_id: Uuid,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(alias = "account_number")]
pub account_number: String,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(alias = "account_name")]
pub account_name: String,
#[serde(alias = "debit_amount")]
pub debit_amount: Decimal,
#[serde(alias = "credit_amount")]
pub credit_amount: Decimal,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub currency: String,
#[serde(alias = "exchange_rate")]
pub exchange_rate: Decimal,
#[serde(alias = "base_debit_amount")]
pub base_debit_amount: Decimal,
#[serde(alias = "base_credit_amount")]
pub base_credit_amount: Decimal,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "cost_center_id")]
pub cost_center_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "project_id")]
pub project_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "department_id")]
pub department_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dimensions: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "source_type")]
pub source_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "source_id")]
pub source_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "source_reference")]
pub source_reference: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_tax_line")]
pub is_tax_line: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "tax_rate")]
pub tax_rate: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "tax_base_amount")]
pub tax_base_amount: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "related_line_id")]
pub related_line_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "has_quantity")]
pub has_quantity: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub quantity: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "unit_price")]
pub unit_price: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_reconciled")]
pub is_reconciled: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "reconciliation_id")]
pub reconciliation_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "reconciled_at")]
pub reconciled_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "full_reconcile_id")]
pub full_reconcile_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_posted")]
pub is_posted: bool,
#[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 = "posted_at")]
pub posted_at: Option<DateTime<Utc>>,
pub tags: serde_json::Value,
pub data: serde_json::Value,
}
// =============================================================================
// Patch DTO
// =============================================================================
/// Request DTO for partial update of a JournalLine
///
/// 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 PatchJournalLineDto {
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
#[serde(skip_serializing_if = "Option::is_none", alias = "journal_id")]
pub journal_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "branch_id")]
pub branch_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "party_type")]
pub party_type: Option<PartyType>,
#[serde(skip_serializing_if = "Option::is_none", alias = "party_id")]
pub party_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(skip_serializing_if = "Option::is_none", alias = "line_number")]
pub line_number: Option<i32>,
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
#[serde(skip_serializing_if = "Option::is_none", alias = "account_id")]
pub account_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(skip_serializing_if = "Option::is_none", alias = "account_number")]
pub account_number: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(skip_serializing_if = "Option::is_none", alias = "account_name")]
pub account_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "debit_amount")]
pub debit_amount: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "credit_amount")]
pub credit_amount: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "exchange_rate")]
pub exchange_rate: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "base_debit_amount")]
pub base_debit_amount: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "base_credit_amount")]
pub base_credit_amount: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "cost_center_id")]
pub cost_center_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "project_id")]
pub project_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "department_id")]
pub department_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dimensions: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none", alias = "source_type")]
pub source_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "source_id")]
pub source_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "source_reference")]
pub source_reference: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "is_tax_line")]
pub is_tax_line: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "tax_rate")]
pub tax_rate: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "tax_base_amount")]
pub tax_base_amount: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "related_line_id")]
pub related_line_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "has_quantity")]
pub has_quantity: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "unit_price")]
pub unit_price: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "is_reconciled")]
pub is_reconciled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "reconciliation_id")]
pub reconciliation_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "reconciled_at")]
pub reconciled_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none", alias = "full_reconcile_id")]
pub full_reconcile_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "is_posted")]
pub is_posted: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "ledger_id")]
pub ledger_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "posted_at")]
pub posted_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}
impl PatchJournalLineDto {
/// Check if any field is set
pub fn has_changes(&self) -> bool {
self.journal_id.is_some() || self.branch_id.is_some() || self.party_type.is_some() || self.party_id.is_some() || self.line_number.is_some() || self.account_id.is_some() || self.account_number.is_some() || self.account_name.is_some() || self.debit_amount.is_some() || self.credit_amount.is_some() || self.currency.is_some() || self.exchange_rate.is_some() || self.base_debit_amount.is_some() || self.base_credit_amount.is_some() || self.description.is_some() || self.cost_center_id.is_some() || self.project_id.is_some() || self.department_id.is_some() || self.dimensions.is_some() || self.source_type.is_some() || self.source_id.is_some() || self.source_reference.is_some() || self.is_tax_line.is_some() || self.tax_rate.is_some() || self.tax_base_amount.is_some() || self.related_line_id.is_some() || self.has_quantity.is_some() || self.quantity.is_some() || self.unit.is_some() || self.unit_price.is_some() || self.is_reconciled.is_some() || self.reconciliation_id.is_some() || self.reconciled_at.is_some() || self.full_reconcile_id.is_some() || self.is_posted.is_some() || self.ledger_id.is_some() || self.posted_at.is_some() || self.tags.is_some() || self.data.is_some()
}
}
// =============================================================================
// Response DTO
// =============================================================================
/// Response DTO for JournalLine 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 JournalLineResponseDto {
#[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 journal_id: Uuid,
pub branch_id: Option<Uuid>,
pub party_type: Option<PartyType>,
pub party_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
pub line_number: i32,
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
pub account_id: Uuid,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub account_number: String,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub account_name: String,
pub debit_amount: Decimal,
pub credit_amount: Decimal,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub currency: String,
pub exchange_rate: Decimal,
pub base_debit_amount: Decimal,
pub base_credit_amount: Decimal,
pub description: Option<String>,
pub cost_center_id: Option<Uuid>,
pub project_id: Option<Uuid>,
pub department_id: Option<Uuid>,
pub dimensions: Option<serde_json::Value>,
pub source_type: Option<String>,
pub source_id: Option<Uuid>,
pub source_reference: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub is_tax_line: bool,
pub tax_rate: Option<Decimal>,
pub tax_base_amount: Option<Decimal>,
pub related_line_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub has_quantity: bool,
pub quantity: Option<Decimal>,
pub unit: Option<String>,
pub unit_price: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub is_reconciled: bool,
pub reconciliation_id: Option<Uuid>,
pub reconciled_at: Option<DateTime<Utc>>,
pub full_reconcile_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub is_posted: bool,
pub ledger_id: Option<Uuid>,
pub posted_at: Option<DateTime<Utc>>,
pub tags: serde_json::Value,
pub data: serde_json::Value,
}
// =============================================================================
// List Response DTO
// =============================================================================
/// Paginated list response for JournalLine 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 JournalLineListResponseDto {
/// List of items
pub items: Vec<JournalLineResponseDto>,
/// 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 JournalLineListResponseDto {
/// Create a new list response from items and pagination info
pub fn new(items: Vec<JournalLineResponseDto>, 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 JournalLineSummaryDto {
pub id: Uuid,
pub journal_id: Uuid,
pub branch_id: Option<Uuid>,
pub party_type: Option<PartyType>,
pub created_at: Option<DateTime<Utc>>,
}
// =============================================================================
// Conversions
// =============================================================================
impl From<JournalLine> for JournalLineResponseDto {
fn from(entity: JournalLine) -> Self {
Self {
id: entity.id,
journal_id: entity.journal_id,
branch_id: entity.branch_id,
party_type: entity.party_type,
party_id: entity.party_id,
line_number: entity.line_number,
account_id: entity.account_id,
account_number: entity.account_number,
account_name: entity.account_name,
debit_amount: entity.debit_amount,
credit_amount: entity.credit_amount,
currency: entity.currency,
exchange_rate: entity.exchange_rate,
base_debit_amount: entity.base_debit_amount,
base_credit_amount: entity.base_credit_amount,
description: entity.description,
cost_center_id: entity.cost_center_id,
project_id: entity.project_id,
department_id: entity.department_id,
dimensions: entity.dimensions,
source_type: entity.source_type,
source_id: entity.source_id,
source_reference: entity.source_reference,
is_tax_line: entity.is_tax_line,
tax_rate: entity.tax_rate,
tax_base_amount: entity.tax_base_amount,
related_line_id: entity.related_line_id,
has_quantity: entity.has_quantity,
quantity: entity.quantity,
unit: entity.unit,
unit_price: entity.unit_price,
is_reconciled: entity.is_reconciled,
reconciliation_id: entity.reconciliation_id,
reconciled_at: entity.reconciled_at,
full_reconcile_id: entity.full_reconcile_id,
is_posted: entity.is_posted,
ledger_id: entity.ledger_id,
posted_at: entity.posted_at,
tags: entity.tags,
data: entity.data,
}
}
}
impl From<JournalLine> for JournalLineSummaryDto {
fn from(entity: JournalLine) -> Self {
let created_at = backbone_core::PersistentEntity::created_at(&entity);
Self {
id: entity.id,
journal_id: entity.journal_id,
branch_id: entity.branch_id,
party_type: entity.party_type,
created_at,
}
}
}
impl From<CreateJournalLineDto> for JournalLine {
fn from(dto: CreateJournalLineDto) -> Self {
Self {
id: Uuid::new_v4(),
journal_id: dto.journal_id,
branch_id: dto.branch_id,
party_type: dto.party_type,
party_id: dto.party_id,
line_number: dto.line_number,
account_id: dto.account_id,
account_number: dto.account_number,
account_name: dto.account_name,
debit_amount: dto.debit_amount,
credit_amount: dto.credit_amount,
currency: dto.currency,
exchange_rate: dto.exchange_rate,
base_debit_amount: dto.base_debit_amount,
base_credit_amount: dto.base_credit_amount,
description: dto.description,
cost_center_id: dto.cost_center_id,
project_id: dto.project_id,
department_id: dto.department_id,
dimensions: dto.dimensions,
source_type: dto.source_type,
source_id: dto.source_id,
source_reference: dto.source_reference,
is_tax_line: dto.is_tax_line,
tax_rate: dto.tax_rate,
tax_base_amount: dto.tax_base_amount,
related_line_id: dto.related_line_id,
has_quantity: dto.has_quantity,
quantity: dto.quantity,
unit: dto.unit,
unit_price: dto.unit_price,
is_reconciled: dto.is_reconciled,
reconciliation_id: dto.reconciliation_id,
reconciled_at: dto.reconciled_at,
full_reconcile_id: dto.full_reconcile_id,
is_posted: dto.is_posted,
ledger_id: dto.ledger_id,
posted_at: dto.posted_at,
tags: dto.tags,
data: dto.data,
}
}
}
impl From<&JournalLine> for JournalLineResponseDto {
fn from(entity: &JournalLine) -> Self {
Self {
id: entity.id.clone(),
journal_id: entity.journal_id.clone(),
branch_id: entity.branch_id.clone(),
party_type: entity.party_type.clone(),
party_id: entity.party_id.clone(),
line_number: entity.line_number.clone(),
account_id: entity.account_id.clone(),
account_number: entity.account_number.clone(),
account_name: entity.account_name.clone(),
debit_amount: entity.debit_amount.clone(),
credit_amount: entity.credit_amount.clone(),
currency: entity.currency.clone(),
exchange_rate: entity.exchange_rate.clone(),
base_debit_amount: entity.base_debit_amount.clone(),
base_credit_amount: entity.base_credit_amount.clone(),
description: entity.description.clone(),
cost_center_id: entity.cost_center_id.clone(),
project_id: entity.project_id.clone(),
department_id: entity.department_id.clone(),
dimensions: entity.dimensions.clone(),
source_type: entity.source_type.clone(),
source_id: entity.source_id.clone(),
source_reference: entity.source_reference.clone(),
is_tax_line: entity.is_tax_line.clone(),
tax_rate: entity.tax_rate.clone(),
tax_base_amount: entity.tax_base_amount.clone(),
related_line_id: entity.related_line_id.clone(),
has_quantity: entity.has_quantity.clone(),
quantity: entity.quantity.clone(),
unit: entity.unit.clone(),
unit_price: entity.unit_price.clone(),
is_reconciled: entity.is_reconciled.clone(),
reconciliation_id: entity.reconciliation_id.clone(),
reconciled_at: entity.reconciled_at.clone(),
full_reconcile_id: entity.full_reconcile_id.clone(),
is_posted: entity.is_posted.clone(),
ledger_id: entity.ledger_id.clone(),
posted_at: entity.posted_at.clone(),
tags: entity.tags.clone(),
data: entity.data.clone(),
}
}
}
impl backbone_core::FromCreateDto<CreateJournalLineDto> for JournalLine {
fn from_create_dto(dto: CreateJournalLineDto) -> backbone_core::ServiceResult<Self> {
Ok(JournalLine::from(dto))
}
}
impl backbone_core::ApplyUpdateDto<UpdateJournalLineDto> for JournalLine {
fn apply_update(mut self, dto: UpdateJournalLineDto) -> backbone_core::ServiceResult<Self> {
self.journal_id = dto.journal_id;
self.branch_id = dto.branch_id;
self.party_type = dto.party_type;
self.party_id = dto.party_id;
self.line_number = dto.line_number;
self.account_id = dto.account_id;
self.account_number = dto.account_number;
self.account_name = dto.account_name;
self.debit_amount = dto.debit_amount;
self.credit_amount = dto.credit_amount;
self.currency = dto.currency;
self.exchange_rate = dto.exchange_rate;
self.base_debit_amount = dto.base_debit_amount;
self.base_credit_amount = dto.base_credit_amount;
self.description = dto.description;
self.cost_center_id = dto.cost_center_id;
self.project_id = dto.project_id;
self.department_id = dto.department_id;
self.dimensions = dto.dimensions;
self.source_type = dto.source_type;
self.source_id = dto.source_id;
self.source_reference = dto.source_reference;
self.is_tax_line = dto.is_tax_line;
self.tax_rate = dto.tax_rate;
self.tax_base_amount = dto.tax_base_amount;
self.related_line_id = dto.related_line_id;
self.has_quantity = dto.has_quantity;
self.quantity = dto.quantity;
self.unit = dto.unit;
self.unit_price = dto.unit_price;
self.is_reconciled = dto.is_reconciled;
self.reconciliation_id = dto.reconciliation_id;
self.reconciled_at = dto.reconciled_at;
self.full_reconcile_id = dto.full_reconcile_id;
self.is_posted = dto.is_posted;
self.ledger_id = dto.ledger_id;
self.posted_at = dto.posted_at;
self.tags = dto.tags;
self.data = dto.data;
Ok(self)
}
}
// =============================================================================
// Custom DTOs
// =============================================================================
// Add custom DTOs specific to JournalLine here.
// This section will be preserved during regeneration.
// >>> END CUSTOM DTOs