use chrono::{DateTime, Utc};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::decimal::{Money, Rate};
pub type FacilityId = Uuid;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum TermLoanType {
Mortgage,
PersonalLoan,
AutoLoan,
StudentLoan,
BusinessLoan,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum OpenTermType {
BitcoinBacked,
AssetBacked,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum RevolvingType {
CreditCard,
LineOfCredit,
HELOC,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FacilityStatus {
Originated,
Active,
GracePeriod,
Delinquent,
Default,
Liquidating,
Liquidated,
Settled,
ChargedOff,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AmortizationMethod {
DecliningPrincipal,
EqualInstallments,
InterestOnly,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum PaymentSchedule {
Monthly { day_of_month: u8 },
Weekly { day_of_week: u8 },
Daily,
OnDemand,
InterestOnly { payment_day: u8 },
None,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum OverpaymentStrategy {
ReduceEmi,
ReduceTerm,
ReducePrincipal,
ReduceLimit,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CollateralPosition {
pub asset_type: String,
pub asset_amount: Decimal,
pub current_value: Money,
pub initial_value: Money,
pub last_valuation: DateTime<Utc>,
pub valuation_source: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct LtvThresholds {
pub initial_ltv: Rate,
pub warning_ltv: Rate,
pub margin_call_ltv: Rate,
pub liquidation_ltv: Rate,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LtvStatus {
Healthy,
Warning,
MarginCall,
Liquidation,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct PaymentApplication {
pub to_fees: Money,
pub to_penalties: Money,
pub to_interest: Money,
pub to_principal: Money,
pub excess: Money,
}
impl PaymentApplication {
pub fn total_applied(&self) -> Money {
self.to_fees + self.to_penalties + self.to_interest + self.to_principal
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DeficiencyBalance {
pub original_loan_id: FacilityId,
pub liquidation_date: DateTime<Utc>,
pub collateral_proceeds: Money,
pub remaining_debt: Money,
pub recovery_status: RecoveryStatus,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum RecoveryStatus {
Pursuing,
PaymentPlan,
LegalAction,
WrittenOff,
}