using ReserveManagementSystemLib.Models; using ReserveManagementSystemLib.Repositories; namespace ReserveManagementSystemApi.Services { public class DealerService: IDealerService { private readonly IDealerRepository _dealerRepository; public DealerService(IDealerRepository dealerRepository) { _dealerRepository = dealerRepository; } public async Task> Search(string dealerSearchText) { try { return await _dealerRepository.GetAll().Where(d => d.DealerCode.Contains(dealerSearchText) || d.Name.Contains(dealerSearchText)).OrderBy(x => x.DealerCode).ToListAsync(); } catch (Exception ex) { Log.Error(ex, "Failure retrieving dealers."); throw; } } public async Task GetDealerByCodeAsync(string dealerCode) { try { return await _dealerRepository.FindByCodeAsync(dealerCode); } catch (Exception ex) { Log.Error(ex, "Failure retrieving dealer by code."); throw; } } public async Task> GetAllDealersAsync() { return await _dealerRepository.GetAll().ToListAsync(); } public async Task UpdateDealersAsync(List dealers) { try { var allDealers = await GetAllDealersAsync(); var dealersToAdd = new List(); var dealersToUpdate = new List(); dealers.ForEach(d => { var currentDealer = allDealers.FirstOrDefault(a => a.DealerOrganizationNumber == d.DealerOrganizationNumber); if (currentDealer != null && !currentDealer.Equals(d)) { currentDealer.Name = d.Name ?? currentDealer.Name; currentDealer.DealerCode = d.DealerCode?.ToUpper() ?? currentDealer.DealerCode; currentDealer.DealerAccountNumber = d.DealerAccountNumber ?? currentDealer.DealerAccountNumber; currentDealer.DealerOrganizationNumber = d.DealerOrganizationNumber ?? currentDealer.DealerOrganizationNumber; dealersToUpdate.Add(currentDealer); } else if (currentDealer == null) { //write the new dealer record to set Action required to true if invalid dealersToAdd.Add(d); } }); if (dealersToUpdate.Any()) { await _dealerRepository.UpdateDealersAsync(dealersToUpdate); } if (dealersToAdd.Any()) { await _dealerRepository.AddDealersAsync(dealersToAdd); } } catch (Exception ex) { Log.Error(ex, "Failure updating dealers."); throw; } } public async Task UpdateDealersAsync(List loans) { var dealers = loans.Select(l => new Dealer { DealerCode = l.Dealer.DealerCode, Name = l.Dealer.Name, DealerOrganizationNumber = l.DealerOrganizationNumber, DealerAccountNumber = l.Dealer.DealerAccountNumber }) .GroupBy(d => d.DealerOrganizationNumber).Select(g => g.First()).ToList(); await UpdateDealersAsync(dealers); } } }