pub mod discount;
pub mod installments;
pub mod insurance_or_cp;
pub mod loan;
pub mod remaining_installments;
pub mod tax;
pub mod total;
use chrono::{DateTime, Utc};
pub use discount::DiscountCalculator;
pub use installments::InstallmentCalculator;
pub use insurance_or_cp::{InsuranceCalculator, InsuranceConfig};
pub use loan::{LoanInput, LoanInputBuilder};
pub use remaining_installments::RemainingInstallmentCalculator;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
pub use tax::{TaxCalculator, TaxConfig};
pub use total::TotalCalculator;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoanResult {
pub request_id: String,
pub timestamp: DateTime<Utc>,
pub input: LoanInput,
pub calculations: CalculationComponents,
pub total_didapat: Decimal,
pub metadata: CalculationMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationComponents {
pub pinjaman: Decimal,
pub angsuran: Decimal,
pub sisa_tenor: u32,
pub sisa_pokok: Decimal,
pub asuransi: Decimal,
pub pajak: Decimal,
pub diskon: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationMetadata {
pub calculation_time_ms: u128,
pub formula_used: String,
pub validation_passed: bool,
pub warnings: Vec<String>,
}
impl LoanResult {
pub fn new(
input: LoanInput,
calculations: CalculationComponents,
total_didapat: Decimal,
calculation_time_ms: u128,
) -> Self {
Self {
request_id: Uuid::new_v4().to_string(),
timestamp: Utc::now(),
input,
calculations,
total_didapat,
metadata: CalculationMetadata {
calculation_time_ms,
formula_used: "(E4-(E5*E6))-E8-E9+E7".to_string(),
validation_passed: true,
warnings: vec![],
},
}
}
pub fn to_json(&self) -> Result<String, serde_json::Error> {
serde_json::to_string_pretty(self)
}
pub fn add_warning(&mut self, warning: String) {
self.metadata.warnings.push(warning);
}
}