2024-05-02 19:55:52 +04:00
using FlowerShopBusinessLogic.MailWorker ;
using FlowerShopContracts.BindingModels ;
2024-02-24 09:40:58 +04:00
using FlowerShopContracts.BusinessLogicsContracts ;
using FlowerShopContracts.SearchModels ;
using FlowerShopContracts.StoragesContracts ;
using FlowerShopContracts.ViewModels ;
using FlowerShopDataModels.Enums ;
using Microsoft.Extensions.Logging ;
namespace FlowerShopBusinessLogic.BusinessLogics
{
public class OrderLogic : IOrderLogic
{
private readonly ILogger _logger ;
private readonly IOrderStorage _orderStorage ;
2024-05-02 19:55:52 +04:00
private readonly AbstractMailWorker _mailLogic ;
static readonly object _locker = new object ( ) ;
public OrderLogic ( ILogger < OrderLogic > logger , IOrderStorage orderStorage , AbstractMailWorker mailLogic )
2024-02-24 09:40:58 +04:00
{
_logger = logger ;
_orderStorage = orderStorage ;
2024-05-02 19:55:52 +04:00
_mailLogic = mailLogic ;
2024-02-24 09:40:58 +04:00
}
public List < OrderViewModel > ? ReadList ( OrderSearchModel ? model )
{
_logger . LogInformation ( "ReadList/ OrderId:{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 ;
}
2024-04-18 22:03:18 +04:00
public OrderViewModel ? ReadElement ( OrderSearchModel model )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
_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 ) ;
var Order = _orderStorage . GetElement ( model ) ;
if ( Order = = null )
{
_logger . LogWarning ( "ReadElement element not found" ) ;
return null ;
}
_logger . LogInformation ( "ReadElement find. Id: {Id}" , Order . Id ) ;
return Order ;
}
public bool CreateOrder ( OrderBindingModel model )
2024-02-24 09:40:58 +04:00
{
CheckModel ( model ) ;
if ( model . Status ! = OrderStatus . Н е и з в е с т е н )
return false ;
model . Status = OrderStatus . П р и н я т ;
2024-05-02 19:55:52 +04:00
var createdOrder = _orderStorage . Insert ( model ) ;
if ( createdOrder = = null )
2024-02-24 09:40:58 +04:00
{
model . Status = OrderStatus . Н е и з в е с т е н ;
_logger . LogWarning ( "Insert operation failed" ) ;
return false ;
}
2024-05-02 19:55:52 +04:00
Task . Run ( ( ) = > _mailLogic . MailSendAsync ( new MailSendInfoBindingModel
{
MailAddress = createdOrder . ClientEmail ,
Subject = $"Изменение статуса заказа номер {createdOrder.Id}" ,
Text = $"Ваш заказ №{createdOrder.Id} на покупку цветов {createdOrder.FlowerName} от {createdOrder.DateCreate} на сумму {createdOrder.Sum} принят."
} ) ) ;
return true ;
}
2024-02-24 09:40:58 +04:00
public bool TakeOrderInWork ( OrderBindingModel model )
{
2024-04-18 22:03:18 +04:00
lock ( _locker )
{
return ToNextStatus ( model , OrderStatus . В ы п о л н я е т с я ) ;
}
2024-02-24 09:40:58 +04:00
}
public bool FinishOrder ( OrderBindingModel model )
{
return ToNextStatus ( model , OrderStatus . Г о т о в ) ;
}
public bool DeliveryOrder ( OrderBindingModel model )
{
return ToNextStatus ( model , OrderStatus . В ы д а н ) ;
}
public bool ToNextStatus ( OrderBindingModel model , OrderStatus orderStatus )
{
CheckModel ( model , false ) ;
var element = _orderStorage . GetElement ( new OrderSearchModel ( )
{
Id = model . Id
} ) ;
if ( element = = null )
{
throw new ArgumentNullException ( nameof ( element ) ) ;
}
model . FlowerId = element . FlowerId ;
model . DateCreate = element . DateCreate ;
model . DateImplement = element . DateImplement ;
2024-04-18 22:03:18 +04:00
model . ClientId = element . ClientId ;
2024-04-22 20:38:34 +04:00
if ( ! model . ImplementerId . HasValue ) model . ImplementerId = element . ImplementerId ;
model . Status = element . Status ;
2024-02-24 09:40:58 +04:00
model . Count = element . Count ;
model . Sum = element . Sum ;
if ( model . Status ! = orderStatus - 1 )
{
_logger . LogWarning ( "Status update to " + orderStatus + " operation failed" ) ;
return false ;
}
model . Status = orderStatus ;
if ( model . Status = = OrderStatus . В ы д а н )
{
model . DateImplement = DateTime . Now ;
}
if ( _orderStorage . Update ( model ) = = null )
{
model . Status - - ;
_logger . LogWarning ( "Changing status operation faled" ) ;
return false ;
}
2024-05-02 19:55:52 +04:00
string dateInfo = model . DateImplement . HasValue ? $"Дата выполнения: {model.DateImplement}" : "" ;
Task . Run ( ( ) = > _mailLogic . MailSendAsync ( new MailSendInfoBindingModel
{
MailAddress = element . ClientEmail ,
Subject = $"Изменение статуса заказа номер {element.Id}" ,
Text = $"Ваш заказ №{element.Id} на покупку цветов {element.FlowerName} от {element.DateCreate} на сумму {element.Sum}. Статус изменен на {orderStatus}. {dateInfo}"
} ) ) ;
return true ;
2024-02-24 09:40:58 +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 )
{
throw new ArgumentNullException ( "Количество цветов должно быть больше 0" , nameof ( model . Count ) ) ;
}
if ( model . Sum < = 0 )
{
throw new ArgumentNullException ( "Цена заказа должна быть больше 0" , nameof ( model . Sum ) ) ;
}
if ( model . DateImplement . HasValue & & model . DateImplement < model . DateCreate )
{
throw new ArithmeticException ( $"Дата выдачи заказа {model.DateImplement} должна быть позже даты е г о создания {model.DateCreate}" ) ;
}
_logger . LogInformation ( "Order. FlowerId:{EngineId}.Count:{Count}.Sum:{Sum}Id:{Id}" , model . FlowerId , model . Count , model . Sum , model . Id ) ;
}
}
}