namespace MyOffice.Services.Currency; using Core; using Data.Models.Currencies; using Data.Repositories.Currency; using MyOffice.Services.Currency.Domain; public class CurrencyService { private readonly ICurrencyGlobalRepository _currencyGlobalRepository; private readonly ICurrencyRepository _currencyRepository; private readonly ICurrencyRateRepository _currencyRateRepository; public CurrencyService( ICurrencyGlobalRepository currencyGlobalRepository, ICurrencyRepository currencyRepository, ICurrencyRateRepository currencyRateRepository ) { _currencyGlobalRepository = currencyGlobalRepository; _currencyRepository = currencyRepository; _currencyRateRepository = currencyRateRepository; } public List GetGlobalAll() { return _currencyGlobalRepository.GetAll(); } public List GetAll(Guid userId) { return _currencyRepository.GetAll(userId); } public Dictionary GetAllWithRates(Guid userId) { var list = _currencyRepository.GetAll(userId); return list.ToDictionary( x => x, x => _currencyRateRepository.GetLastRates(x.Id, 1).FirstOrDefault() ); } public Exec CurrencyAdd(Guid userId, Currency currency) { if (currency == null) throw new ArgumentNullException(nameof(currency)); var result = new Exec(CurrencyAddStatus.success); var exists = _currencyRepository.GetByGlobalCurrency(userId, currency.CurrencyGlobalId); if (exists != null) { return result.Set(exists, CurrencyAddStatus.exists); } currency.Id = Guid.NewGuid(); currency.UserId = userId; if (!_currencyRepository.Add(currency)) { return result.Set(CurrencyAddStatus.failed); } return result.Set(currency); } public Exec CurrencyUpdate( Guid userId, Guid currencyId, CurrencyEdit currency ) { if (currency == null) throw new ArgumentNullException(nameof(currency)); var result = new Exec(CurrencyEditStatus.success); var exists = _currencyRepository.Get(userId, currencyId); if (exists == null) { return result.Set(CurrencyEditStatus.not_found); } exists.Name = currency.Name; exists.ShortName = currency.ShortName; if (!_currencyRepository.Update(exists)) { return result.Set(CurrencyEditStatus.failed); } return result.Set(exists); } public Exec CurrencyRateAdd(Guid userId, Guid currencyId, CurrencyRate currencyRate) { if (currencyRate == null) throw new ArgumentNullException(nameof(currencyRate)); var result = new Exec(CurrencyAddRateStatus.success); var exists = _currencyRepository.Get(userId, currencyId); if (exists == null) { return result.Set(CurrencyAddRateStatus.not_found); } currencyRate.CurrencyId = exists.Id; currencyRate.DateTime = currencyRate.DateTime.Date; var rates = _currencyRateRepository.GetAtDate(currencyRate.CurrencyId, currencyRate.DateTime); var rate = rates.Find(x => x.Rate == currencyRate.Rate); if (rate == null) { if (!_currencyRateRepository.AddRate(currencyRate)) { return result.Set(CurrencyAddRateStatus.failed); } rate = currencyRate; } return result.Set(rate); } }