librsigstopup 0.1.0

Super safe library untuk simulasi perhitungan top-up dengan JSON API, verbose logging, dan full trace
Documentation
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);
    }
}