PIbd-22_Karamushko_M_K_Pizz.../Pizzeria/PizzeriaBusinessLogic/OrderLogic.cs

168 lines
5.8 KiB
C#
Raw Permalink Normal View History

2023-02-13 20:46:14 +04:00
using PizzeriaContracts.BindingModels;
using PizzeriaContracts.BusinessLogicsContracts;
using PizzeriaContracts.SearchModels;
using PizzeriaContracts.StoragesContracts;
using PizzeriaContracts.ViewModels;
using PizzeriaDataModels;
using Microsoft.Extensions.Logging;
2023-05-02 22:25:20 +04:00
using PizzeriaBusinessLogic.MailWorker;
using DocumentFormat.OpenXml.Validation;
2023-02-13 20:46:14 +04:00
namespace PizzeriaBusinessLogic
{
public class OrderLogic : IOrderLogic
{
private readonly ILogger _logger;
private readonly IOrderStorage _orderStorage;
2023-05-02 22:25:20 +04:00
private readonly IClientStorage _clientStorage;
private readonly AbstractMailWorker _mailWorker;
public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage, IClientStorage clientStorage, AbstractMailWorker mailWorker)
2023-02-13 20:46:14 +04:00
{
_logger = logger;
_orderStorage = orderStorage;
2023-05-02 22:25:20 +04:00
_clientStorage = clientStorage;
_mailWorker = mailWorker;
2023-02-13 20:46:14 +04:00
}
public List<OrderViewModel>? ReadList(OrderSearchModel? model)
{
2023-03-28 08:52:39 +04:00
_logger.LogInformation("Id:{Id}", model?.Id);
2023-02-13 20:46:14 +04:00
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;
}
2023-04-11 09:29:12 +04:00
public OrderViewModel? ReadElement(OrderSearchModel model)
{
_logger.LogInformation("Id:{Id}", model?.Id);
OrderViewModel order = _orderStorage.GetElement(model);
if (order == null)
{
_logger.LogWarning("ReadElement return null");
return null;
}
_logger.LogInformation("ReadElement. OrderId:{Id}", order.Id);
return order;
}
2023-02-13 20:46:14 +04:00
public bool CreateOrder(OrderBindingModel model)
{
CheckModel(model);
if (model.Status != OrderStatus.Неизвестен)
{
_logger.LogWarning("Insert operation failed. Incorrect Order status");
return false;
}
model.Status = OrderStatus.Принят;
2023-05-02 22:25:20 +04:00
var result = _orderStorage.Insert(model);
if(result == null)
2023-02-13 20:46:14 +04:00
{
_logger.LogWarning("Insert operation failed");
return false;
}
2023-05-02 22:25:20 +04:00
var client = _clientStorage.GetElement(new ClientSearchModel { Id = model.ClientId });
_mailWorker.MailSendAsync(new MailSendInfoBindingModel()
{
MailAddress = client.Email,
Subject = $"Создан новый заказ {result.Id}",
Text = $"Заказ {result.Id} от {result.DateCreate} на сумму {result.Sum:0.00} принят"
});
2023-02-13 20:46:14 +04:00
return true;
}
public bool UpdateStatus(OrderBindingModel model, OrderStatus newStatus)
{
2023-04-11 09:29:12 +04:00
CheckModel(model, false);
OrderViewModel? order = _orderStorage.GetElement(new OrderSearchModel {
Id = model.Id
});
if(order == null)
{
_logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Order not found.");
return false;
}
model.Status = order.Status;
2023-05-02 22:25:20 +04:00
model.ClientId = order.ClientId;
2023-04-11 09:29:12 +04:00
if(!model.ImplementerId.HasValue) model.ImplementerId = order.ImplementerId;
2023-02-13 20:46:14 +04:00
if(model.Status + 1 != newStatus)
{
_logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Incorrect Order status.");
return false;
}
model.Status = newStatus;
2023-04-11 09:29:12 +04:00
if(newStatus == OrderStatus.Готов)
2023-02-13 20:46:14 +04:00
{
2023-03-14 08:45:31 +04:00
model.DateImplement = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc);
2023-02-13 20:46:14 +04:00
}
if (_orderStorage.Update(model) == null)
{
_logger.LogWarning("Update operation failed");
return false;
}
2023-05-02 22:25:20 +04:00
var client = _clientStorage.GetElement(new ClientSearchModel { Id = model.ClientId });
_mailWorker.MailSendAsync(new MailSendInfoBindingModel()
{
MailAddress = client.Email,
Subject = $"Изменен статус заказа {model.Id}",
Text = $"Статус заказа {model.Id} изменен на {newStatus}"
});
2023-02-13 20:46:14 +04:00
return true;
}
public bool TakeOrderInWork(OrderBindingModel model)
{
return UpdateStatus(model, OrderStatus.Выполняется);
}
public bool FinishOrder(OrderBindingModel model)
{
return UpdateStatus(model, OrderStatus.Готов);
}
public bool DeliveryOrder(OrderBindingModel model)
{
return UpdateStatus(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));
}
_logger.LogInformation("Sum:{ Sum}. Id: { Id}", model.Sum, model.Id);
}
}
}