diff --git a/crates/immo-core/src/loan_offer.rs b/crates/immo-core/src/loan_offer.rs index cab9f3e..1e194db 100644 --- a/crates/immo-core/src/loan_offer.rs +++ b/crates/immo-core/src/loan_offer.rs @@ -5,7 +5,7 @@ use crate::euros::Euros; #[derive(Debug, PartialEq, Eq, Error, Clone)] pub enum LoanOfferError { - #[error("loan cannot have a negative interest rate: {0}%")] + #[error("loan cannot have a negative interest rate: {0}")] NegativeInterestRate(Decimal), #[error("loan duration cannot be zero")] ZeroLoanDuration, @@ -16,18 +16,18 @@ pub enum LoanOfferError { #[derive(Debug, PartialEq, Eq)] pub struct LoanOffer { borrowed_capital: Euros, - annual_rate_in_percent: Decimal, + annual_nominal_rate: Decimal, loan_duration_in_months: u64, } impl LoanOffer { pub fn new( borrowed_capital: Euros, - annual_rate_in_percent: Decimal, + annual_nominal_rate: Decimal, loan_duration_in_months: u64, ) -> Result { - if annual_rate_in_percent < Decimal::ZERO { - Err(LoanOfferError::NegativeInterestRate(annual_rate_in_percent)) + if annual_nominal_rate < Decimal::ZERO { + Err(LoanOfferError::NegativeInterestRate(annual_nominal_rate)) } else if loan_duration_in_months == 0 { Err(LoanOfferError::ZeroLoanDuration) } else if borrowed_capital <= Euros::from_cents_as_i64(0) { @@ -35,11 +35,15 @@ impl LoanOffer { } else { Ok(LoanOffer { borrowed_capital, - annual_rate_in_percent, + annual_nominal_rate, loan_duration_in_months, }) } } + + pub fn annual_nominal_rate_in_percent(&self) -> Decimal { + self.annual_nominal_rate * Decimal::ONE_HUNDRED + } } #[cfg(test)] @@ -92,7 +96,7 @@ mod tests { ret, Ok(LoanOffer { borrowed_capital: Euros::from_cents_as_i64(10), - annual_rate_in_percent: Decimal::new(45, 2), + annual_nominal_rate: Decimal::new(45, 2), loan_duration_in_months: 15 }) ); @@ -105,9 +109,20 @@ mod tests { ret, Ok(LoanOffer { borrowed_capital: Euros::from_cents_as_i64(10), - annual_rate_in_percent: Decimal::ZERO, + annual_nominal_rate: Decimal::ZERO, loan_duration_in_months: 15 }) ); } + + #[test] + fn conversion_to_annual_nominal_rate_in_percent_works() { + let offer = LoanOffer::new( + Euros::from_cents_as_i64(150_000_00), + Decimal::new(4, 4), + 300, + ) + .unwrap(); + assert_eq!(offer.annual_nominal_rate_in_percent(), Decimal::new(4, 2)); + } }