diff --git a/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BlacksmithWorkshopBusinessLogic.csproj b/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BlacksmithWorkshopBusinessLogic.csproj index 132c02c..82a5881 100644 --- a/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BlacksmithWorkshopBusinessLogic.csproj +++ b/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BlacksmithWorkshopBusinessLogic.csproj @@ -6,4 +6,12 @@ enable + + + + + + + + diff --git a/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/OrderLogic.cs b/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/OrderLogic.cs index dd3a9a0..cb24790 100644 --- a/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/OrderLogic.cs +++ b/BlacksmithWorkshop/BlacksmithWorkshopBusinessLogic/BusinessLogic/OrderLogic.cs @@ -1,12 +1,160 @@ -using System; +using BlacksmithWorkshopContracts.BindingModels; +using BlacksmithWorkshopContracts.BusinessLogicsContracts; +using BlacksmithWorkshopContracts.SearchModels; +using BlacksmithWorkshopContracts.StoragesContracts; +using BlacksmithWorkshopContracts.ViewModels; +using BlacksmithWorkshopDataModels.Enums; +using Microsoft.Extensions.Logging; +using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BlacksmithWorkshopBusinessLogic.BusinessLogic { - internal class OrderLogic + public class OrderLogic : IOrderLogic { + private readonly ILogger _logger; + + private readonly IOrderStorage _orderStorage; + + public OrderLogic(ILogger logger, IOrderStorage orderStorage) + { + _logger = logger; + _orderStorage = orderStorage; + } + + //вывод отфильтрованного списка компонентов + public List? ReadList(OrderSearchModel? model) + { + _logger.LogInformation("ReadList. Id:{Id}", model?.Id); + + //list хранит весь список в случае, если model пришло со значением null на вход метода + var list = model == null ? _orderStorage.GetFullList() : _orderStorage.GetFilteredList(model); + + if(list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + + return list; + } + + //создание чека + public bool CreateOrder(OrderBindingModel model) + { + CheckModel(model); + + if(model.Status != OrderStatus.Неизвестен) + { + _logger.LogWarning("Insert operation failed, incorrect order status"); + return false; + } + + model.Status = OrderStatus.Принят; + + if(_orderStorage.Insert(model) == null) + { + model.Status = OrderStatus.Неизвестен; + _logger.LogWarning("Insert operation failed"); + return false; + } + + return true; + } + + public bool TakeOrderInWork(OrderBindingModel model) + { + return StatusUpdate(model, OrderStatus.Выполняется); + } + + public bool FinishOrder(OrderBindingModel model) + { + return StatusUpdate(model, OrderStatus.Готов); + } + + public bool DeliveryOrder(OrderBindingModel model) + { + return StatusUpdate(model, OrderStatus.Выдан); + } + + //проверка на пустоту входного параметра + private void CheckModel(OrderBindingModel model, bool withParams = true) + { + if(model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + //если без параметров? + if(!withParams) + { + return; + } + + //проверка на наличие товаров в заказе + if(model.Count <= 0) + { + throw new ArgumentNullException("В заказе не может быть 0 продуктов", nameof(model.Count)); + } + + //проверка на наличие нормальной суммарной стоимости чека + if(model.Sum <= 0) + { + throw new ArgumentNullException("Суммарная стоимость заказа должна быть больше 0", nameof(model.Sum)); + } + + //проверка корректности id у продуктов + if (model.ProductId < 0) + { + throw new ArgumentNullException("Некорректный id у продукта", nameof(model.ProductId)); + } + + //проверка корректности дат + if(model.DateCreate > model.DateImplement) + { + throw new InvalidOperationException("Дата создания должна быть более ранней, нежели дата завершения"); + } + + _logger.LogInformation("Order. OrderId:{Id}. Sun:{Sum}. ProductId:{Id}", model.Id, model.Sum, model.ProductId); + } + + //обновление статуса заказа + public bool StatusUpdate(OrderBindingModel model, OrderStatus newOrderStatus) + { + CheckModel(model); + + //проверка на возможность обновления статуса на следующий + if(model.Status + 1 != newOrderStatus) + { + _logger.LogWarning("Status update operation failed. New status " + newOrderStatus.ToString() + " incorrect"); + return false; + } + + model.Status = newOrderStatus; + + //проверка на выдачу + if(model.Status == OrderStatus.Выдан) + { + model.DateImplement = DateTime.Now; + } + + //финальная проверка на возможность обновления + if(_orderStorage.Update(model) == null) + { + model.Status--; + + _logger.LogWarning("Update operation failed"); + + return false; + } + + return true; + } } } diff --git a/BlacksmithWorkshop/BlacksmithWorkshopContracts/BlacksmithWorkshopContracts.csproj b/BlacksmithWorkshop/BlacksmithWorkshopContracts/BlacksmithWorkshopContracts.csproj index 132c02c..f685e06 100644 --- a/BlacksmithWorkshop/BlacksmithWorkshopContracts/BlacksmithWorkshopContracts.csproj +++ b/BlacksmithWorkshop/BlacksmithWorkshopContracts/BlacksmithWorkshopContracts.csproj @@ -6,4 +6,8 @@ enable + + + +