using Microsoft.Extensions.Logging; using BankYouBankruptContracts.BindingModels; using BankYouBankruptContracts.BusinessLogicsContracts; using BankYouBankruptContracts.SearchModels; using BankYouBankruptContracts.StoragesContracts; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using BankYouBankruptContracts.ViewModels.Client.Default; using BankYouBankruptContracts.ViewModels.Client.Diagram; using BankYouBankruptDataModels.Enums; using DocumentFormat.OpenXml.Drawing; namespace BankYouBankruptBusinessLogic.BusinessLogics { public class CardLogic : ICardLogic { private readonly ILogger _logger; private readonly ICardStorage _cardStorage; private readonly IAccountStorage _accountStorage; private readonly IDebitingLogic _debitingLogic; private readonly ICreditingLogic _creditingLogic; public CardLogic(ILogger logger, ICardStorage cardStorage, IAccountStorage accountStorage, IDebitingLogic debitingLogic, ICreditingLogic creditingLogic) { _logger = logger; _cardStorage = cardStorage; _accountStorage = accountStorage; _debitingLogic = debitingLogic; _creditingLogic = creditingLogic; } public bool Create(CardBindingModel model) { CheckModel(model); if (_cardStorage.Insert(model) == null) { _logger.LogWarning("Insert operation failed"); return false; } return true; } public bool Delete(CardBindingModel model) { CheckModel(model, false); _logger.LogInformation("Delete. Id:{Id}", model.Id); if (_cardStorage.Delete(model) == null) { _logger.LogWarning("Delete operation failed"); return false; } return true; } public CardViewModel? ReadElement(CardSearchModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } _logger.LogInformation("ReadElement. CardNumber:{Number}.Id:{ Id}", model.Number, model.Id); var element = _cardStorage.GetElement(model); if (element == null) { _logger.LogWarning("ReadElement element not found"); return null; } _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); return element; } public List? ReadList(CardSearchModel? model) { _logger.LogInformation("ReadList. CardId:{Id}", model?.Id); var list = model == null ? _cardStorage.GetFullList() : _cardStorage.GetFilteredList(model); if (list == null) { _logger.LogWarning("ReadList return null list"); return null; } _logger.LogInformation("ReadList. Count:{Count}", list.Count); return list; } public bool Update(CardBindingModel model) { CheckModel(model); if (_cardStorage.Update(model) == null) { _logger.LogWarning("Update operation failed"); return false; } return true; } public List GetMonthInfo(int CardId) { Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel() { CardId = CardId, Status = StatusEnum.Закрыта }).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year }) .Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum()}).ToDictionary(x => (x.Month, x.Year), x => (x.Sum)); Dictionary<(int?, int?), int> creditings = _creditingLogic.ReadList(new CreditingSearchModel() { CardId = CardId, Status = StatusEnum.Закрыта }).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year }) .Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum)); List result = new(); foreach (var key in debitings.Keys.Union(creditings.Keys)) { int sum = 0; if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key); if (creditings.ContainsKey(key)) sum += creditings.GetValueOrDefault(key); result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum}); } return result; } private void CheckModel(CardBindingModel model, bool withParams = true) { if (model == null) { throw new ArgumentNullException(nameof(model)); } if (!withParams) { return; } if (string.IsNullOrEmpty(model.Number)) { throw new ArgumentNullException("Нет номера карты", nameof(model.Number)); } if (string.IsNullOrEmpty(model.CVC)) { throw new ArgumentNullException("Нет СVC карты", nameof(model.CVC)); } if (model.Period < DateTime.Now) { throw new ArgumentNullException("Нет периода действия", nameof(model.Period)); } var cardElement = _cardStorage.GetElement(new CardSearchModel { Number = model.Number, }); if (cardElement != null && cardElement.Id != model.Id) { throw new InvalidOperationException("Карта с таким ноиером уже есть"); } var accountElement = _accountStorage.GetElement(new AccountSearchModel { Id = model.AccountId, ClientId = model.ClientID }); if (accountElement != null && accountElement.ClientId != model.ClientID) { throw new InvalidOperationException("Это не счёт данного клиента"); } _logger.LogInformation("Card. Number:{Number}.CVC:{CVC}.ClientId:{ClientID}.Patronymic:{Period}.Id:{Id}", model.Number, model.CVC, model.Period.ToString(), model.ClientID, model.Id); } } }