using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using LCU.API.Collections.CollectionsApiLib.Models; using LCU.API.Collections.RepoApi.DataAccess; using LCU.API.Collections.RepoApi.Exceptions; using LCU.Shared.Collections.RepoApiLib.Models; using LCU.Shared.Collections.RepoApiLib.Repositories; using Serilog; namespace LCU.API.Collections.RepoApi.Services { public class RepoLetterService : IRepoLetterService { private readonly ILetterRepository _letterRepository; private readonly ICollectionsDao _collectionsDao; public RepoLetterService(ILetterRepository letterRepository, ICollectionsDao collectionsDao) { _letterRepository = letterRepository; _collectionsDao = collectionsDao; } public async Task> ListByAccountIdAsync(int accountId) { try { var collectionsHistory = await _collectionsDao.RetrieveHistoryAsync(accountId); var collectionsLetters = collectionsHistory.Where(history => history.Type == HistoryType.Letter).ToList(); if (!collectionsLetters.Any()) { return new List(); } var letters = await _letterRepository.ListAsync(); return ProcessLetters(collectionsLetters, letters.ToList()); } catch (MissingRequirementException ex) { throw; } catch (Exception ex) { Log.Error(ex, "Failure retrieving Letter List"); throw new ServerErrorException(); } } public static IReadOnlyCollection ProcessLetters(List collectionsLetters, List letters) { // GJF: Are you here to fix a bug? Probably. These don't match up, who wrote this?!?! This code is fueled by hope. // Ok, so you really need to fix it. Go out to Temenos, go to System Management (the button is labelled 'tools'!) // Find the Communication section, expand it and choose 'letters & forms'. Now find the right Letter and // update the LetterDescription column in the Letters table of RepoDb for the correct letter. var resultList = new List(); foreach (var letter in letters) { foreach (var collectionsLetter in collectionsLetters) { if (string.IsNullOrWhiteSpace(letter.LetterDescription)) { // If this exception is happening, see LetterUpdate.sql. Also See Above. throw new MissingRequirementException("LetterDescription", "Letter table requires LetterDescription Column entry."); } if (collectionsLetter.Message.Trim().ToUpper() .Contains(letter.LetterDescription.Trim().ToUpper())) { resultList.Add(new RepoLetter { NoticeType = collectionsLetter.Message, DateSent = collectionsLetter.Created, DateExpired = collectionsLetter.Created.AddDays(letter.DaysToWait ?? 0), DaysToRedeem = letter.DaysToWait ?? 0, ActionCode = letter.ActionCode.Trim() }); } } } return resultList .GroupBy(x => x.NoticeType.Trim(), (key, g) => g.OrderByDescending(x => x.DateSent).FirstOrDefault()) .OrderByDescending(x => x.DateSent).ToList(); } } }