use super::Currency;
#[derive(Debug, Clone, Default, issun_macros::Service)]
#[service(name = "accounting_service")]
pub struct AccountingService;
impl AccountingService {
pub fn new() -> Self {
Self
}
pub fn calculate_settlement_net(&self, income: Currency, expenses: Currency) -> Currency {
income - expenses
}
pub fn calculate_reserve_bonus(&self, net_income: Currency, reserve_rate: f32) -> Currency {
if net_income.is_negative() {
return Currency::ZERO;
}
Currency::new((net_income.amount() as f32 * reserve_rate) as i64)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::service::Service;
#[test]
fn test_calculate_settlement_net_positive() {
let service = AccountingService::new();
let income = Currency::new(1000);
let expenses = Currency::new(400);
let net = service.calculate_settlement_net(income, expenses);
assert_eq!(net.amount(), 600);
}
#[test]
fn test_calculate_settlement_net_negative() {
let service = AccountingService::new();
let income = Currency::new(300);
let expenses = Currency::new(500);
let net = service.calculate_settlement_net(income, expenses);
assert_eq!(net.amount(), -200);
}
#[test]
fn test_calculate_reserve_bonus_positive() {
let service = AccountingService::new();
let net_income = Currency::new(1000);
let bonus = service.calculate_reserve_bonus(net_income, 0.1);
assert_eq!(bonus.amount(), 100);
}
#[test]
fn test_calculate_reserve_bonus_negative_income() {
let service = AccountingService::new();
let net_income = Currency::new(-500);
let bonus = service.calculate_reserve_bonus(net_income, 0.1);
assert_eq!(bonus.amount(), 0);
}
#[test]
fn test_service_default() {
let service = AccountingService;
assert_eq!(service.name(), "accounting_service");
}
}