use chrono::{DateTime, NaiveDate, Utc};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use crate::models::account::Account;
use crate::serde::deserialize_flexible_decimal;
use crate::types::{AccountId, ValuationId};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ValuationKind {
Reconciliation,
OpeningAnchor,
CurrentAnchor,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Valuation {
pub id: ValuationId,
pub date: NaiveDate,
#[serde(deserialize_with = "deserialize_flexible_decimal")]
pub amount: Decimal,
pub currency: iso_currency::Currency,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
pub kind: ValuationKind,
pub account: Account,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "strict", serde(deny_unknown_fields))]
pub(crate) struct CreateValuationRequest {
pub valuation: CreateValuationData,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "strict", serde(deny_unknown_fields))]
pub(crate) struct CreateValuationData {
pub account_id: AccountId,
pub amount: Decimal,
pub date: NaiveDate,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "strict", serde(deny_unknown_fields))]
pub(crate) struct UpdateValuationRequest {
pub valuation: UpdateValuationData,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "strict", serde(deny_unknown_fields))]
pub(crate) struct UpdateValuationData {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub amount: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub date: Option<NaiveDate>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
}