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
+
+
+
+