diff --git a/IceCreamShop/IceCreamShopBusinessLogic/BusinessLogic/OrderLogic.cs b/IceCreamShop/IceCreamShopBusinessLogic/BusinessLogic/OrderLogic.cs index 4840b1e..064b9e8 100644 --- a/IceCreamShop/IceCreamShopBusinessLogic/BusinessLogic/OrderLogic.cs +++ b/IceCreamShop/IceCreamShopBusinessLogic/BusinessLogic/OrderLogic.cs @@ -15,23 +15,23 @@ using System.Threading.Tasks; namespace IceCreamShopBusinessLogic.BusinessLogic { - public class OrderLogic : IOrderLogic - { - private readonly ILogger _logger; - private readonly IOrderStorage _orderStorage; - private readonly IShopStorage _shopStorage; - private readonly IShopLogic _shopLogic; - private readonly IIceCreamStorage _iceCreamStorage; - static readonly object locker = new object(); + public class OrderLogic : IOrderLogic + { + private readonly ILogger _logger; + private readonly IOrderStorage _orderStorage; + private readonly IShopStorage _shopStorage; + private readonly IShopLogic _shopLogic; + private readonly IIceCreamStorage _iceCreamStorage; + static readonly object locker = new object(); - public OrderLogic(IOrderStorage orderStorage, IShopStorage shopStorage, IShopLogic shopLogic, IIceCreamStorage iceCreamStorage, ILogger logger) - { - _orderStorage = orderStorage; - _shopStorage = shopStorage; - _logger = logger; - _shopLogic = shopLogic; - _iceCreamStorage = iceCreamStorage; - } + public OrderLogic(IOrderStorage orderStorage, IShopStorage shopStorage, IShopLogic shopLogic, IIceCreamStorage iceCreamStorage, ILogger logger) + { + _orderStorage = orderStorage; + _shopStorage = shopStorage; + _logger = logger; + _shopLogic = shopLogic; + _iceCreamStorage = iceCreamStorage; + } public OrderViewModel? ReadElement(OrderSearchModel model) { if (model == null) @@ -50,148 +50,160 @@ namespace IceCreamShopBusinessLogic.BusinessLogic } public List? ReadList(OrderSearchModel? model) - { - _logger.LogInformation("ReadList. Id:{ Id}", model?.Id); - 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; - } + { + _logger.LogInformation("ReadList. Id:{ Id}", model?.Id); + 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.Неизвестен) return false; - model.Status = OrderStatus.Принят; - if (_orderStorage.Insert(model) == null) - { - _logger.LogWarning("Insert operation failed"); - return false; - } - return true; - } + public bool CreateOrder(OrderBindingModel model) + { + CheckModel(model); + if (model.Status != OrderStatus.Неизвестен) return false; + model.Status = OrderStatus.Принят; + if (_orderStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } - public bool CheckSupply(IIceCreamModel iceCream, int count) - { - if (count <= 0) - { - _logger.LogWarning("Check then supply operation error. IceCream count < 0."); - return false; - } + public bool CheckSupply(IIceCreamModel iceCream, int count) + { + if (count <= 0) + { + _logger.LogWarning("Check then supply operation error. IceCream count < 0."); + return false; + } - int sumCapacity = 0; - int sumCount = 0; - sumCapacity = _shopStorage.GetFullList().Select(x => x.MaxCapacity).Sum(); - sumCount = _shopStorage.GetFullList().Select(x => x.ShopIceCreams.Select(y => y.Value.Item2).Sum()).Sum(); - int freeSpace = sumCapacity - sumCount; + int sumCapacity = 0; + int sumCount = 0; + sumCapacity = _shopStorage.GetFullList().Select(x => x.MaxCapacity).Sum(); + sumCount = _shopStorage.GetFullList().Select(x => x.ShopIceCreams.Select(y => y.Value.Item2).Sum()).Sum(); + int freeSpace = sumCapacity - sumCount; - if (freeSpace - count < 0) - { - _logger.LogWarning("Check then supply operation error. There's no place for new IceCream in shops."); - return false; - } + if (freeSpace - count < 0) + { + _logger.LogWarning("Check then supply operation error. There's no place for new IceCream in shops."); + return false; + } - foreach (var shop in _shopStorage.GetFullList()) - { - freeSpace = shop.MaxCapacity; - foreach (var doc in shop.ShopIceCreams) - { - freeSpace -= doc.Value.Item2; - } - if (freeSpace == 0) - { - continue; - } - if (freeSpace - count >= 0) - { - if (_shopLogic.MakeSupply(new() { Id = shop.Id }, iceCream, count)) - count = 0; - else - { - _logger.LogWarning("Supply error"); - return false; - } - } - if (freeSpace - count < 0) - { - if (_shopLogic.MakeSupply(new() { Id = shop.Id }, iceCream, freeSpace)) - count -= freeSpace; - else - { - _logger.LogWarning("Supply error"); - return false; - } - } - if (count <= 0) - { - return true; - } - } - return false; - } + foreach (var shop in _shopStorage.GetFullList()) + { + freeSpace = shop.MaxCapacity; + foreach (var doc in shop.ShopIceCreams) + { + freeSpace -= doc.Value.Item2; + } + if (freeSpace == 0) + { + continue; + } + if (freeSpace - count >= 0) + { + if (_shopLogic.MakeSupply(new() { Id = shop.Id }, iceCream, count)) + count = 0; + else + { + _logger.LogWarning("Supply error"); + return false; + } + } + if (freeSpace - count < 0) + { + if (_shopLogic.MakeSupply(new() { Id = shop.Id }, iceCream, freeSpace)) + count -= freeSpace; + else + { + _logger.LogWarning("Supply error"); + return false; + } + } + if (count <= 0) + { + return true; + } + } + return false; + } - public bool ChangeStatus(OrderBindingModel model, OrderStatus status) - { - CheckModel(model, false); - var element = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id }); - if (element == null) - { - _logger.LogWarning("Read operation failed"); - return false; - } - if (element.Status != status - 1 && status != OrderStatus.Ожидается && element.Status != OrderStatus.Ожидается) - { - _logger.LogWarning("Status change operation failed"); - throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный"); - } - model.Sum = element.Sum; - model.Count = element.Count; - model.IceCreamId = element.IceCreamId; - model.DateCreate = element.DateCreate; - model.DateImplement = element.DateImplement; + public bool ChangeStatus(OrderBindingModel model, OrderStatus status) + { + CheckModel(model, false); + var element = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id }); + if (element == null) + { + _logger.LogWarning("Read operation failed"); + return false; + } + if(element.Status == OrderStatus.Ожидается) { + if (status != OrderStatus.Готов) + { + _logger.LogWarning("Status change operation failed"); + throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный"); + } + } + else if(status == OrderStatus.Ожидается) + { + if (status != OrderStatus.Выполняется) + { + _logger.LogWarning("Status change operation failed"); + throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный"); + } + } + else if (element.Status != status - 1) + { + _logger.LogWarning("Status change operation failed"); + throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный"); + } + model.Sum = element.Sum; + model.Count = element.Count; + model.IceCreamId = element.IceCreamId; + model.DateCreate = element.DateCreate; + model.DateImplement = element.DateImplement; if (element.ImplementerId.HasValue && element.ImplementerId != 0) model.ImplementerId = element.ImplementerId; if (status == OrderStatus.Готов) - { - var icecream = _iceCreamStorage.GetElement(new IceCreamSearchModel() { Id = model.IceCreamId }); - if (icecream == null) - { - _logger.LogWarning("Status update to " + status.ToString() + " operation failed. Document not found."); - return false; - } - if (CheckSupply(icecream, model.Count) == false) - { + { + var icecream = _iceCreamStorage.GetElement(new IceCreamSearchModel() { Id = model.IceCreamId }); + if (icecream == null) + { + _logger.LogWarning("Status update to " + status.ToString() + " operation failed. Document not found."); + return false; + } + if (!CheckSupply(icecream, model.Count)) + { model.Status = OrderStatus.Ожидается; _orderStorage.Update(model); return false; - } - } - model.Status = status; - if (model.Status == OrderStatus.Выдан) model.DateImplement = DateTime.Now; - _orderStorage.Update(model); - return true; - } + } + } + model.Status = status; + if (model.Status == OrderStatus.Выдан) model.DateImplement = DateTime.Now; + _orderStorage.Update(model); + return true; + } - public bool TakeOrderInWork(OrderBindingModel model) - { - lock (locker) - { - return ChangeStatus(model, OrderStatus.Выполняется); - } - } + public bool TakeOrderInWork(OrderBindingModel model) + { + lock (locker) + { + return ChangeStatus(model, OrderStatus.Выполняется); + } + } - public bool FinishOrder(OrderBindingModel model) - { - lock (locker) - { - return ChangeStatus(model, OrderStatus.Готов); + public bool FinishOrder(OrderBindingModel model) + { + return ChangeStatus(model, OrderStatus.Готов); - } } public bool TakeOrderInWaiting(OrderBindingModel model) { @@ -199,30 +211,30 @@ namespace IceCreamShopBusinessLogic.BusinessLogic } public bool DeliveryOrder(OrderBindingModel model) - { - return ChangeStatus(model, OrderStatus.Выдан); - } + { + return ChangeStatus(model, OrderStatus.Выдан); + } - private void CheckModel(OrderBindingModel model, bool withParams = + private void CheckModel(OrderBindingModel model, bool withParams = true) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - if (!withParams) - { - return; - } - if (model.Sum <= 0) - { - throw new ArgumentNullException("Цена заказа должна быть больше 0", nameof(model.Sum)); - } - if (model.Count <= 0) - { - throw new ArgumentNullException("Количество элементов в заказе должно быть больше 0", nameof(model.Count)); - } - _logger.LogInformation("Order. Sum:{ Cost}. Id: { Id}", model.Sum, model.Id); - } - } + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (model.Sum <= 0) + { + throw new ArgumentNullException("Цена заказа должна быть больше 0", nameof(model.Sum)); + } + if (model.Count <= 0) + { + throw new ArgumentNullException("Количество элементов в заказе должно быть больше 0", nameof(model.Count)); + } + _logger.LogInformation("Order. Sum:{ Cost}. Id: { Id}", model.Sum, model.Id); + } + } } diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Implements/OrderStorage.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Implements/OrderStorage.cs index 90256fb..5031764 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Implements/OrderStorage.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Implements/OrderStorage.cs @@ -35,7 +35,9 @@ namespace IceCreamShopDatabaseImplement.Implements (!model.ClientId.HasValue || x.ClientId == model.ClientId) && (!model.Status.HasValue || x.Status == model.Status) - ) + && + (!model.ImplementerId.HasValue || x.ImplementerId == model.ImplementerId) + ) ) .Select(x => x.GetViewModel) .ToList(); diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll new file mode 100644 index 0000000..a3a2f94 Binary files /dev/null and b/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll differ diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll new file mode 100644 index 0000000..2a89d8a Binary files /dev/null and b/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll differ diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopDatabaseImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopDatabaseImplement.dll new file mode 100644 index 0000000..d216ca0 Binary files /dev/null and b/IceCreamShop/ImplementationExtensions/IceCreamShopDatabaseImplement.dll differ diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopFileImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopFileImplement.dll new file mode 100644 index 0000000..4c74969 Binary files /dev/null and b/IceCreamShop/ImplementationExtensions/IceCreamShopFileImplement.dll differ diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll new file mode 100644 index 0000000..a4762ba Binary files /dev/null and b/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll differ