using BankContracts.BindingModels.Cashier; using BankContracts.BindingModels.Client; using BankContracts.BusinessLogicsContracts.Cashier; using BankContracts.SearchModels.Cashier; using BankContracts.StoragesModels.Cashier; using BankContracts.StoragesModels.Client; using BankContracts.ViewModels.Cashier.ViewModels; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BankBusinessLogic.BusinessLogic.Cashier { public class MoneyTransferLogic : IMoneyTransferLogic { private readonly ILogger _logger; private readonly IMoneyTransferStorage _moneyTransferStorage; public readonly ICreditingStorage _creditingStorage; // Конструктор public MoneyTransferLogic(ILogger logger, IMoneyTransferStorage moneyTransferStorage, ICreditingStorage creditingStorage) { _logger = logger; _moneyTransferStorage = moneyTransferStorage; _creditingStorage = creditingStorage; } // Вывод конкретной операции public MoneyTransferViewModel? ReadElement(MoneyTransferSearchModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } _logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}", model.AccountSenderId, model.AccountPayeeId, model.Sum, model?.Id); var element = _moneyTransferStorage.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(MoneyTransferSearchModel? model) { _logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}", model?.AccountSenderId, model?.AccountPayeeId, model?.Sum, model?.Id); // list хранит весь список в случае, если model пришло со значением null на вход метода var list = model == null ? _moneyTransferStorage.GetFullList() : _moneyTransferStorage.GetFilteredList(model); if (list == null) { _logger.LogWarning("ReadList return null list"); return null; } _logger.LogInformation("ReadList. Count:{Count}", list.Count); return list; } // Создание операции на перевод public bool Create(MoneyTransferBindingModel model) { CheckModel(model); if (_moneyTransferStorage.Insert(model) == null) { _logger.LogWarning("Insert operation failed"); return false; } //проверка на то, что это зачисление на карту, а не перевод между счетами if (model.CreditingId.HasValue) { _creditingStorage.Update(new CreditingBindingModel { Id = model.CreditingId.Value, }); } return true; } // Обновление операции на перевод public bool Update(MoneyTransferBindingModel model) { CheckModel(model); if (_moneyTransferStorage.Update(model) == null) { _logger.LogWarning("Update operation failed"); return false; } return true; } // Удаление операции на перевод public bool Delete(MoneyTransferBindingModel model) { CheckModel(model, false); _logger.LogInformation("Delete. Id:{Id}", model.Id); if (_moneyTransferStorage.Delete(model) == null) { _logger.LogWarning("Delete operation failed"); return false; } return true; } // Проверка входного аргумента для методов Insert, Update и Delete private void CheckModel(MoneyTransferBindingModel model, bool withParams = true) { if (model == null) { throw new ArgumentNullException(nameof(model)); } // Так как при удалении передаём как параметр false if (!withParams) { return; } // Проверка корректности Id счёта отправителя if (model.AccountSenderId < 0) { throw new ArgumentNullException("Отсутствие Id у счёта отправителя", nameof(model.AccountSenderId)); } // Проверка корректности Id счёта получателя if (model.AccountPayeeId < 0) { throw new ArgumentNullException("Отсутствие Id у счёта получателя", nameof(model.AccountPayeeId)); } // Проверка на корректную сумму перевода if (model.Sum <= 0) { throw new ArgumentNullException("Сумма перевода не может раняться нулю или быть меньше его", nameof(model.Sum)); } // Проверка на корректную дату открытия счёта if (model.DateTransfer > DateTime.Now) { throw new ArgumentNullException("Дата операции не может быть ранее текущей", nameof(model.DateTransfer)); } _logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. DateTransfer:{DateTransfer}. Id:{Id}", model.AccountSenderId, model.AccountPayeeId, model.Sum, model.DateTransfer, model?.Id); } } }