//! FiscalPeriod 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::FiscalPeriod;
use crate::domain::entity::AuditMetadata;
use crate::domain::entity::PeriodStatus;
use crate::domain::entity::PeriodType;
// =============================================================================
// Create DTO
// =============================================================================
/// Request DTO for creating a new FiscalPeriod
///
/// 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 CreateFiscalPeriodDto {
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(alias = "period_code")]
pub period_code: String,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub name: String,
#[serde(alias = "period_type")]
pub period_type: PeriodType,
#[cfg_attr(feature = "openapi", schema(example = "2024-01-01"))]
#[serde(alias = "start_date")]
pub start_date: NaiveDate,
#[cfg_attr(feature = "openapi", schema(example = "2024-01-01"))]
#[serde(alias = "end_date")]
pub end_date: NaiveDate,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(alias = "fiscal_year")]
pub fiscal_year: i32,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "fiscal_quarter")]
pub fiscal_quarter: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "fiscal_month")]
pub fiscal_month: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "parent_id")]
pub parent_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
pub level: i32,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_current")]
pub is_current: bool,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "opening_balance_set")]
pub opening_balance_set: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "opening_balance_date")]
pub opening_balance_date: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "opening_balance_by")]
pub opening_balance_by: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "allow_adjustments")]
pub allow_adjustments: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "adjustment_deadline")]
pub adjustment_deadline: Option<NaiveDate>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "balance_sheet_generated")]
pub balance_sheet_generated: bool,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "income_statement_generated")]
pub income_statement_generated: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "statements_generated_at")]
pub statements_generated_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
}
// =============================================================================
// Update DTO
// =============================================================================
/// Request DTO for full update of a FiscalPeriod
///
/// 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 UpdateFiscalPeriodDto {
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(alias = "period_code")]
pub period_code: String,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub name: String,
#[serde(alias = "period_type")]
pub period_type: PeriodType,
#[cfg_attr(feature = "openapi", schema(example = "2024-01-01"))]
#[serde(alias = "start_date")]
pub start_date: NaiveDate,
#[cfg_attr(feature = "openapi", schema(example = "2024-01-01"))]
#[serde(alias = "end_date")]
pub end_date: NaiveDate,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(alias = "fiscal_year")]
pub fiscal_year: i32,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "fiscal_quarter")]
pub fiscal_quarter: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "fiscal_month")]
pub fiscal_month: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "parent_id")]
pub parent_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
pub level: i32,
pub status: PeriodStatus,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "is_current")]
pub is_current: bool,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "opening_balance_set")]
pub opening_balance_set: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "opening_balance_date")]
pub opening_balance_date: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "opening_balance_by")]
pub opening_balance_by: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "closing_started_at")]
pub closing_started_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "closing_started_by")]
pub closing_started_by: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "closed_at")]
pub closed_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "closed_by")]
pub closed_by: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "locked_at")]
pub locked_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "locked_by")]
pub locked_by: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "lock_reason")]
pub lock_reason: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "reopened_at")]
pub reopened_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "reopened_by")]
pub reopened_by: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "reopen_reason")]
pub reopen_reason: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "allow_adjustments")]
pub allow_adjustments: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "adjustment_deadline")]
pub adjustment_deadline: Option<NaiveDate>,
#[serde(alias = "total_debits")]
pub total_debits: Decimal,
#[serde(alias = "total_credits")]
pub total_credits: Decimal,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(alias = "journal_count")]
pub journal_count: i32,
#[serde(alias = "total_revenue")]
pub total_revenue: Decimal,
#[serde(alias = "total_expenses")]
pub total_expenses: Decimal,
#[serde(alias = "net_income")]
pub net_income: Decimal,
#[serde(alias = "total_assets")]
pub total_assets: Decimal,
#[serde(alias = "total_liabilities")]
pub total_liabilities: Decimal,
#[serde(alias = "total_equity")]
pub total_equity: Decimal,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "balance_sheet_generated")]
pub balance_sheet_generated: bool,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(alias = "income_statement_generated")]
pub income_statement_generated: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "statements_generated_at")]
pub statements_generated_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
}
// =============================================================================
// Patch DTO
// =============================================================================
/// Request DTO for partial update of a FiscalPeriod
///
/// 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 PatchFiscalPeriodDto {
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(skip_serializing_if = "Option::is_none", alias = "period_code")]
pub period_code: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "period_type")]
pub period_type: Option<PeriodType>,
#[cfg_attr(feature = "openapi", schema(example = "2024-01-01"))]
#[serde(skip_serializing_if = "Option::is_none", alias = "start_date")]
pub start_date: Option<NaiveDate>,
#[cfg_attr(feature = "openapi", schema(example = "2024-01-01"))]
#[serde(skip_serializing_if = "Option::is_none", alias = "end_date")]
pub end_date: Option<NaiveDate>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(skip_serializing_if = "Option::is_none", alias = "fiscal_year")]
pub fiscal_year: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none", alias = "fiscal_quarter")]
pub fiscal_quarter: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none", alias = "fiscal_month")]
pub fiscal_month: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none", alias = "parent_id")]
pub parent_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(skip_serializing_if = "Option::is_none")]
pub level: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<PeriodStatus>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "is_current")]
pub is_current: Option<bool>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "opening_balance_set")]
pub opening_balance_set: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "opening_balance_date")]
pub opening_balance_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none", alias = "opening_balance_by")]
pub opening_balance_by: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "closing_started_at")]
pub closing_started_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none", alias = "closing_started_by")]
pub closing_started_by: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "closed_at")]
pub closed_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none", alias = "closed_by")]
pub closed_by: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "locked_at")]
pub locked_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none", alias = "locked_by")]
pub locked_by: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "lock_reason")]
pub lock_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "reopened_at")]
pub reopened_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none", alias = "reopened_by")]
pub reopened_by: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", alias = "reopen_reason")]
pub reopen_reason: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "allow_adjustments")]
pub allow_adjustments: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "adjustment_deadline")]
pub adjustment_deadline: Option<NaiveDate>,
#[serde(skip_serializing_if = "Option::is_none", alias = "total_debits")]
pub total_debits: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "total_credits")]
pub total_credits: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
#[serde(skip_serializing_if = "Option::is_none", alias = "journal_count")]
pub journal_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none", alias = "total_revenue")]
pub total_revenue: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "total_expenses")]
pub total_expenses: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "net_income")]
pub net_income: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "total_assets")]
pub total_assets: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "total_liabilities")]
pub total_liabilities: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none", alias = "total_equity")]
pub total_equity: Option<Decimal>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "balance_sheet_generated")]
pub balance_sheet_generated: Option<bool>,
#[cfg_attr(feature = "openapi", schema(example = true))]
#[serde(skip_serializing_if = "Option::is_none", alias = "income_statement_generated")]
pub income_statement_generated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "statements_generated_at")]
pub statements_generated_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
}
impl PatchFiscalPeriodDto {
/// Check if any field is set
pub fn has_changes(&self) -> bool {
self.period_code.is_some() || self.name.is_some() || self.period_type.is_some() || self.start_date.is_some() || self.end_date.is_some() || self.fiscal_year.is_some() || self.fiscal_quarter.is_some() || self.fiscal_month.is_some() || self.parent_id.is_some() || self.level.is_some() || self.status.is_some() || self.is_current.is_some() || self.opening_balance_set.is_some() || self.opening_balance_date.is_some() || self.opening_balance_by.is_some() || self.closing_started_at.is_some() || self.closing_started_by.is_some() || self.closed_at.is_some() || self.closed_by.is_some() || self.locked_at.is_some() || self.locked_by.is_some() || self.lock_reason.is_some() || self.reopened_at.is_some() || self.reopened_by.is_some() || self.reopen_reason.is_some() || self.allow_adjustments.is_some() || self.adjustment_deadline.is_some() || self.total_debits.is_some() || self.total_credits.is_some() || self.journal_count.is_some() || self.total_revenue.is_some() || self.total_expenses.is_some() || self.net_income.is_some() || self.total_assets.is_some() || self.total_liabilities.is_some() || self.total_equity.is_some() || self.balance_sheet_generated.is_some() || self.income_statement_generated.is_some() || self.statements_generated_at.is_some() || self.notes.is_some()
}
}
// =============================================================================
// Response DTO
// =============================================================================
/// Response DTO for FiscalPeriod 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 FiscalPeriodResponseDto {
#[cfg_attr(feature = "openapi", schema(example = "550e8400-e29b-41d4-a716-446655440000"))]
pub id: Uuid,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub period_code: String,
#[cfg_attr(feature = "openapi", schema(example = "example"))]
pub name: String,
pub period_type: PeriodType,
#[cfg_attr(feature = "openapi", schema(example = "2024-01-01"))]
pub start_date: NaiveDate,
#[cfg_attr(feature = "openapi", schema(example = "2024-01-01"))]
pub end_date: NaiveDate,
#[cfg_attr(feature = "openapi", schema(example = 42))]
pub fiscal_year: i32,
pub fiscal_quarter: Option<i32>,
pub fiscal_month: Option<i32>,
pub parent_id: Option<Uuid>,
#[cfg_attr(feature = "openapi", schema(example = 42))]
pub level: i32,
pub status: PeriodStatus,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub is_current: bool,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub opening_balance_set: bool,
pub opening_balance_date: Option<DateTime<Utc>>,
pub opening_balance_by: Option<Uuid>,
pub closing_started_at: Option<DateTime<Utc>>,
pub closing_started_by: Option<Uuid>,
pub closed_at: Option<DateTime<Utc>>,
pub closed_by: Option<Uuid>,
pub locked_at: Option<DateTime<Utc>>,
pub locked_by: Option<Uuid>,
pub lock_reason: Option<String>,
pub reopened_at: Option<DateTime<Utc>>,
pub reopened_by: Option<Uuid>,
pub reopen_reason: Option<String>,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub allow_adjustments: bool,
pub adjustment_deadline: Option<NaiveDate>,
pub total_debits: Decimal,
pub total_credits: Decimal,
#[cfg_attr(feature = "openapi", schema(example = 42))]
pub journal_count: i32,
pub total_revenue: Decimal,
pub total_expenses: Decimal,
pub net_income: Decimal,
pub total_assets: Decimal,
pub total_liabilities: Decimal,
pub total_equity: Decimal,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub balance_sheet_generated: bool,
#[cfg_attr(feature = "openapi", schema(example = true))]
pub income_statement_generated: bool,
pub statements_generated_at: Option<DateTime<Utc>>,
pub notes: Option<String>,
pub metadata: AuditMetadata,
}
// =============================================================================
// List Response DTO
// =============================================================================
/// Paginated list response for FiscalPeriod 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 FiscalPeriodListResponseDto {
/// List of items
pub items: Vec<FiscalPeriodResponseDto>,
/// 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 FiscalPeriodListResponseDto {
/// Create a new list response from items and pagination info
pub fn new(items: Vec<FiscalPeriodResponseDto>, 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 FiscalPeriodSummaryDto {
pub id: Uuid,
pub period_code: String,
pub name: String,
pub period_type: PeriodType,
pub created_at: Option<DateTime<Utc>>,
}
// =============================================================================
// Conversions
// =============================================================================
impl From<FiscalPeriod> for FiscalPeriodResponseDto {
fn from(entity: FiscalPeriod) -> Self {
Self {
id: entity.id,
period_code: entity.period_code,
name: entity.name,
period_type: entity.period_type,
start_date: entity.start_date,
end_date: entity.end_date,
fiscal_year: entity.fiscal_year,
fiscal_quarter: entity.fiscal_quarter,
fiscal_month: entity.fiscal_month,
parent_id: entity.parent_id,
level: entity.level,
status: entity.status,
is_current: entity.is_current,
opening_balance_set: entity.opening_balance_set,
opening_balance_date: entity.opening_balance_date,
opening_balance_by: entity.opening_balance_by,
closing_started_at: entity.closing_started_at,
closing_started_by: entity.closing_started_by,
closed_at: entity.closed_at,
closed_by: entity.closed_by,
locked_at: entity.locked_at,
locked_by: entity.locked_by,
lock_reason: entity.lock_reason,
reopened_at: entity.reopened_at,
reopened_by: entity.reopened_by,
reopen_reason: entity.reopen_reason,
allow_adjustments: entity.allow_adjustments,
adjustment_deadline: entity.adjustment_deadline,
total_debits: entity.total_debits,
total_credits: entity.total_credits,
journal_count: entity.journal_count,
total_revenue: entity.total_revenue,
total_expenses: entity.total_expenses,
net_income: entity.net_income,
total_assets: entity.total_assets,
total_liabilities: entity.total_liabilities,
total_equity: entity.total_equity,
balance_sheet_generated: entity.balance_sheet_generated,
income_statement_generated: entity.income_statement_generated,
statements_generated_at: entity.statements_generated_at,
notes: entity.notes,
metadata: entity.metadata,
}
}
}
impl From<FiscalPeriod> for FiscalPeriodSummaryDto {
fn from(entity: FiscalPeriod) -> Self {
let created_at = backbone_core::PersistentEntity::created_at(&entity);
Self {
id: entity.id,
period_code: entity.period_code,
name: entity.name,
period_type: entity.period_type,
created_at,
}
}
}
impl From<CreateFiscalPeriodDto> for FiscalPeriod {
fn from(dto: CreateFiscalPeriodDto) -> Self {
Self {
id: Uuid::new_v4(),
period_code: dto.period_code,
name: dto.name,
period_type: dto.period_type,
start_date: dto.start_date,
end_date: dto.end_date,
fiscal_year: dto.fiscal_year,
fiscal_quarter: dto.fiscal_quarter,
fiscal_month: dto.fiscal_month,
parent_id: dto.parent_id,
level: dto.level,
status: PeriodStatus::Open,
is_current: dto.is_current,
opening_balance_set: dto.opening_balance_set,
opening_balance_date: dto.opening_balance_date,
opening_balance_by: dto.opening_balance_by,
closing_started_at: None,
closing_started_by: None,
closed_at: None,
closed_by: None,
locked_at: None,
locked_by: None,
lock_reason: None,
reopened_at: None,
reopened_by: None,
reopen_reason: None,
allow_adjustments: dto.allow_adjustments,
adjustment_deadline: dto.adjustment_deadline,
total_debits: Decimal::from(0_i64),
total_credits: Decimal::from(0_i64),
journal_count: 0,
total_revenue: Decimal::from(0_i64),
total_expenses: Decimal::from(0_i64),
net_income: Decimal::from(0_i64),
total_assets: Decimal::from(0_i64),
total_liabilities: Decimal::from(0_i64),
total_equity: Decimal::from(0_i64),
balance_sheet_generated: dto.balance_sheet_generated,
income_statement_generated: dto.income_statement_generated,
statements_generated_at: dto.statements_generated_at,
notes: dto.notes,
metadata: AuditMetadata::default(),
}
}
}
impl From<&FiscalPeriod> for FiscalPeriodResponseDto {
fn from(entity: &FiscalPeriod) -> Self {
Self {
id: entity.id.clone(),
period_code: entity.period_code.clone(),
name: entity.name.clone(),
period_type: entity.period_type.clone(),
start_date: entity.start_date.clone(),
end_date: entity.end_date.clone(),
fiscal_year: entity.fiscal_year.clone(),
fiscal_quarter: entity.fiscal_quarter.clone(),
fiscal_month: entity.fiscal_month.clone(),
parent_id: entity.parent_id.clone(),
level: entity.level.clone(),
status: entity.status.clone(),
is_current: entity.is_current.clone(),
opening_balance_set: entity.opening_balance_set.clone(),
opening_balance_date: entity.opening_balance_date.clone(),
opening_balance_by: entity.opening_balance_by.clone(),
closing_started_at: entity.closing_started_at.clone(),
closing_started_by: entity.closing_started_by.clone(),
closed_at: entity.closed_at.clone(),
closed_by: entity.closed_by.clone(),
locked_at: entity.locked_at.clone(),
locked_by: entity.locked_by.clone(),
lock_reason: entity.lock_reason.clone(),
reopened_at: entity.reopened_at.clone(),
reopened_by: entity.reopened_by.clone(),
reopen_reason: entity.reopen_reason.clone(),
allow_adjustments: entity.allow_adjustments.clone(),
adjustment_deadline: entity.adjustment_deadline.clone(),
total_debits: entity.total_debits.clone(),
total_credits: entity.total_credits.clone(),
journal_count: entity.journal_count.clone(),
total_revenue: entity.total_revenue.clone(),
total_expenses: entity.total_expenses.clone(),
net_income: entity.net_income.clone(),
total_assets: entity.total_assets.clone(),
total_liabilities: entity.total_liabilities.clone(),
total_equity: entity.total_equity.clone(),
balance_sheet_generated: entity.balance_sheet_generated.clone(),
income_statement_generated: entity.income_statement_generated.clone(),
statements_generated_at: entity.statements_generated_at.clone(),
notes: entity.notes.clone(),
metadata: entity.metadata.clone(),
}
}
}
impl backbone_core::FromCreateDto<CreateFiscalPeriodDto> for FiscalPeriod {
fn from_create_dto(dto: CreateFiscalPeriodDto) -> backbone_core::ServiceResult<Self> {
Ok(FiscalPeriod::from(dto))
}
}
impl backbone_core::ApplyUpdateDto<UpdateFiscalPeriodDto> for FiscalPeriod {
fn apply_update(mut self, dto: UpdateFiscalPeriodDto) -> backbone_core::ServiceResult<Self> {
self.period_code = dto.period_code;
self.name = dto.name;
self.period_type = dto.period_type;
self.start_date = dto.start_date;
self.end_date = dto.end_date;
self.fiscal_year = dto.fiscal_year;
self.fiscal_quarter = dto.fiscal_quarter;
self.fiscal_month = dto.fiscal_month;
self.parent_id = dto.parent_id;
self.level = dto.level;
self.status = dto.status;
self.is_current = dto.is_current;
self.opening_balance_set = dto.opening_balance_set;
self.opening_balance_date = dto.opening_balance_date;
self.opening_balance_by = dto.opening_balance_by;
self.closing_started_at = dto.closing_started_at;
self.closing_started_by = dto.closing_started_by;
self.closed_at = dto.closed_at;
self.closed_by = dto.closed_by;
self.locked_at = dto.locked_at;
self.locked_by = dto.locked_by;
self.lock_reason = dto.lock_reason;
self.reopened_at = dto.reopened_at;
self.reopened_by = dto.reopened_by;
self.reopen_reason = dto.reopen_reason;
self.allow_adjustments = dto.allow_adjustments;
self.adjustment_deadline = dto.adjustment_deadline;
self.total_debits = dto.total_debits;
self.total_credits = dto.total_credits;
self.journal_count = dto.journal_count;
self.total_revenue = dto.total_revenue;
self.total_expenses = dto.total_expenses;
self.net_income = dto.net_income;
self.total_assets = dto.total_assets;
self.total_liabilities = dto.total_liabilities;
self.total_equity = dto.total_equity;
self.balance_sheet_generated = dto.balance_sheet_generated;
self.income_statement_generated = dto.income_statement_generated;
self.statements_generated_at = dto.statements_generated_at;
self.notes = dto.notes;
Ok(self)
}
}
// =============================================================================
// Custom DTOs
// =============================================================================
// Add custom DTOs specific to FiscalPeriod here.
// This section will be preserved during regeneration.
// >>> END CUSTOM DTOs