librsigstopup 0.1.0

Super safe library untuk simulasi perhitungan top-up dengan JSON API, verbose logging, dan full trace
Documentation
use crate::core::LoanResult;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationRequest {
    pub pinjaman: f64,
    pub angsuran: f64,
    pub sisa_tenor: u32,
    #[serde(default)]
    pub diskon: Option<f64>,
    #[serde(default)]
    pub pajak: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationResponse {
    pub success: bool,
    pub request_id: String,
    pub timestamp: DateTime<Utc>,
    pub data: CalculationData,
    pub metadata: ResponseMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationData {
    pub input: CalculationInputData,
    pub calculations: CalculationComponentsData,
    pub total_didapat: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationInputData {
    pub pinjaman: String,
    pub angsuran: String,
    pub sisa_tenor: u32,
    pub diskon: String,
    pub pajak: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationComponentsData {
    pub sisa_pokok: String,
    pub asuransi: String,
    pub pajak: String,
    pub diskon: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponseMetadata {
    pub calculation_time_ms: u128,
    pub formula_used: String,
    pub warnings: Vec<String>,
}
impl CalculationResponse {
    pub fn from_result(result: LoanResult) -> Self {
        Self {
            success: true,
            request_id: result.request_id,
            timestamp: result.timestamp,
            data: CalculationData {
                input: CalculationInputData {
                    pinjaman: result.calculations.pinjaman.to_string(),
                    angsuran: result.calculations.angsuran.to_string(),
                    sisa_tenor: result.calculations.sisa_tenor,
                    diskon: result.calculations.diskon.to_string(),
                    pajak: result.calculations.pajak.to_string(),
                },
                calculations: CalculationComponentsData {
                    sisa_pokok: result.calculations.sisa_pokok.to_string(),
                    asuransi: result.calculations.asuransi.to_string(),
                    pajak: result.calculations.pajak.to_string(),
                    diskon: result.calculations.diskon.to_string(),
                },
                total_didapat: result.total_didapat.to_string(),
            },
            metadata: ResponseMetadata {
                calculation_time_ms: result.metadata.calculation_time_ms,
                formula_used: result.metadata.formula_used,
                warnings: result.metadata.warnings,
            },
        }
    }
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthResponse {
    pub status: String,
    pub timestamp: String,
    pub version: String,
}