2024-02-09 15:31:49 +04:00
using Microsoft.Extensions.Logging ;
2024-05-13 13:16:59 +04:00
using SushiBarBusinessLogic.MailWorker ;
2024-02-09 15:31:49 +04:00
using SushiBarContracts.BindingModels ;
using SushiBarContracts.BusinessLogicsContracts ;
using SushiBarContracts.SearchModels ;
using SushiBarContracts.StoragesContracts ;
using SushiBarContracts.ViewModels ;
using SushiBarDataModels.Enums ;
namespace SushiBarBusinessLogic.BusinessLogics
{
public class OrderLogic : IOrderLogic
{
2024-05-16 18:55:15 +04:00
private readonly ILogger _logger ;
private readonly IOrderStorage _orderStorage ;
private readonly AbstractMailWorker _mailWorker ;
private readonly IClientLogic _clientLogic ;
public OrderLogic ( ILogger < OrderLogic > logger , IOrderStorage orderStorage , AbstractMailWorker mailWorker , IClientLogic clientLogic )
{
_logger = logger ;
_orderStorage = orderStorage ;
_mailWorker = mailWorker ;
_clientLogic = clientLogic ;
}
public List < OrderViewModel > ? ReadList ( OrderSearchModel ? model )
2024-02-09 15:31:49 +04:00
{
2024-05-12 19:04:40 +04:00
_logger . LogInformation ( "ReadList. ClientId:{ClientId}.Status:{Status}.ImplementerId:{ImplementerId}.DateFrom:{DateFrom}.DateTo:{DateTo}OrderId:{Id}" ,
model ? . ClientId , model ? . Status , model ? . ImplementerId , model ? . DateFrom , model ? . DateTo , model ? . Id ) ;
2024-02-09 15:31:49 +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 ;
}
public bool CreateOrder ( OrderBindingModel model )
{
CheckModel ( model ) ;
if ( model . Status ! = OrderStatus . Н е и з в е с т е н )
return false ;
model . Status = OrderStatus . П р и н я т ;
2024-05-13 13:16:59 +04:00
var element = _orderStorage . Insert ( model ) ;
if ( element = = null )
2024-02-09 15:31:49 +04:00
{
_logger . LogWarning ( "Insert operation failed" ) ;
return false ;
}
2024-05-13 13:16:59 +04:00
Task . Run ( ( ) = > _mailWorker . MailSendAsync ( new MailSendInfoBindingModel
{
MailAddress = element . ClientEmail ,
Subject = $"Изменение статуса заказа номер {element.Id}" ,
Text = $"Ваш заказ номер {element.Id} на суши {element.SushiName} от {element.DateCreate} на сумму {element.Sum} принят."
} ) ) ;
2024-05-16 18:55:15 +04:00
SendOrderStatusMail ( element . ClientId , $"Новый заказ создан. Номер заказа #{element.Id}" , $"Заказ #{element.Id} от {element.DateCreate} на сумму {element.Sum:0.00} принят" ) ;
return true ;
2024-02-09 15:31:49 +04:00
}
2024-05-12 19:04:40 +04:00
public bool TakeOrderInWork ( OrderBindingModel model )
{
2024-05-16 18:55:15 +04:00
return StatusUpdate ( model , OrderStatus . В ы п о л н я е т с я ) ;
}
2024-05-12 19:04:40 +04:00
public bool FinishOrder ( OrderBindingModel model )
{
2024-05-16 18:55:15 +04:00
return StatusUpdate ( model , OrderStatus . Г о т о в ) ;
2024-05-12 19:04:40 +04:00
}
public bool DeliveryOrder ( OrderBindingModel model )
{
2024-05-16 18:55:15 +04:00
return StatusUpdate ( model , OrderStatus . В ы д а н ) ;
2024-05-12 19:04:40 +04:00
}
2024-02-09 15:31:49 +04:00
private void CheckModel ( OrderBindingModel model , bool withParams = true )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
if ( ! withParams )
{
return ;
}
if ( model . Count < = 0 )
{
2024-05-12 19:04:40 +04:00
throw new ArgumentException ( "Колличество пиццы в заказе не может быть меньше 1" , nameof ( model . Count ) ) ;
2024-02-09 15:31:49 +04:00
}
if ( model . Sum < = 0 )
{
2024-05-12 19:04:40 +04:00
throw new ArgumentException ( "Стоимость заказа на может быть меньше 1" , nameof ( model . Sum ) ) ;
}
if ( model . DateImplement . HasValue & & model . DateImplement < model . DateCreate )
{
throw new ArithmeticException ( $"Дата выдачи заказа {model.DateImplement} не может быть раньше даты е г о создания {model.DateCreate}" ) ;
2024-02-09 15:31:49 +04:00
}
2024-05-12 19:04:40 +04:00
_logger . LogInformation ( "Sushi. SushiId:{SushiId}.Count:{Count}.Sum:{Sum}Id:{Id}" ,
model . SushiId , model . Count , model . Sum , model . Id ) ;
2024-02-09 15:31:49 +04:00
}
2024-05-16 18:55:15 +04:00
private bool StatusUpdate ( OrderBindingModel model , OrderStatus newStatus )
{
var viewModel = _orderStorage . GetElement ( new OrderSearchModel { Id = model . Id } ) ;
if ( viewModel = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
if ( viewModel . Status + 1 ! = newStatus )
{
_logger . LogWarning ( "Change status operation failed" ) ;
throw new InvalidOperationException ( ) ;
}
model . Status = newStatus ;
if ( model . Status = = OrderStatus . Г о т о в )
{
model . DateImplement = DateTime . Now ;
}
else
{
model . DateImplement = viewModel . DateImplement ;
}
if ( viewModel . ImplementerId . HasValue )
{
model . ImplementerId = viewModel . ImplementerId . Value ;
}
CheckModel ( model , false ) ;
var result = _orderStorage . Update ( model ) ;
if ( result = = null )
{
_logger . LogWarning ( "Update operation failed" ) ;
return false ;
}
SendOrderStatusMail ( result . ClientId , $"Изменен статус заказа #{result.Id}" , $"Заказ #{model.Id} изменен статус на {result.Status}" ) ;
return true ;
}
2024-02-09 15:31:49 +04:00
2024-05-16 18:55:15 +04:00
public OrderViewModel ? ReadElement ( OrderSearchModel model )
2024-02-09 15:31:49 +04:00
{
2024-05-12 19:04:40 +04:00
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
_logger . LogInformation ( "ReadElement. ClientId:{ClientId}.Status:{Status}.ImplementerId:{ImplementerId}.DateFrom:{DateFrom}.DateTo:{DateTo}OrderId:{Id}" ,
model . ClientId , model . Status , model . ImplementerId , model . DateFrom , model . DateTo , model . Id ) ;
var element = _orderStorage . GetElement ( model ) ;
if ( element = = null )
{
_logger . LogWarning ( "ReadElement element not found" ) ;
return null ;
}
_logger . LogInformation ( "ReadElement find. Id:{Id}" , element . Id ) ;
return element ;
2024-02-09 15:31:49 +04:00
}
2024-05-16 18:55:15 +04:00
private bool SendOrderStatusMail ( int clientId , string subject , string text )
{
var client = _clientLogic . ReadElement ( new ( ) { Id = clientId } ) ;
if ( client = = null )
{
return false ;
}
_mailWorker . MailSendAsync ( new ( )
{
MailAddress = client . Email ,
Subject = subject ,
Text = text
} ) ;
return true ;
}
}
2024-02-09 15:31:49 +04:00
}