2023-04-21 01:09:51 +04:00
using FlowerShopBusinessLogic.MailWorker ;
using FlowerShopContracts.BindingModels ;
2023-01-29 22:10:01 +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 ;
2023-04-21 01:09:51 +04:00
private readonly AbstractMailWorker _mailWorker ;
private readonly IClientLogic _clientLogic ;
2023-01-29 22:10:01 +04:00
2023-04-21 01:09:51 +04:00
public OrderLogic ( ILogger < OrderLogic > logger , IOrderStorage orderStorage , AbstractMailWorker mailWorker , IClientLogic clientLogic )
2023-01-29 22:10:01 +04:00
{
_logger = logger ;
_orderStorage = orderStorage ;
2023-04-21 01:09:51 +04:00
_mailWorker = mailWorker ;
_clientLogic = clientLogic ;
2023-01-29 22:10:01 +04:00
}
public List < OrderViewModel > ? 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 ;
}
2023-04-10 01:13:25 +04:00
public OrderViewModel ? ReadElement ( OrderSearchModel model )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
_logger . LogInformation ( "ReadElement. Id:{ Id}" , 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 ;
}
2023-01-29 22:10:01 +04:00
public bool CreateOrder ( OrderBindingModel model )
{
CheckModel ( model ) ;
2023-02-12 23:20:34 +04:00
if ( model . Status ! = OrderStatus . Н е и з в е с т е н )
2023-01-29 22:10:01 +04:00
{
_logger . LogWarning ( "Invalid order status" ) ;
return false ;
}
2023-02-12 23:20:34 +04:00
model . Status = OrderStatus . П р и н я т ;
2023-01-29 22:10:01 +04:00
2023-04-21 01:09:51 +04:00
var result = _orderStorage . Insert ( model ) ;
if ( result = = null )
2023-01-29 22:10:01 +04:00
{
_logger . LogWarning ( "Insert operation failed" ) ;
return false ;
}
2023-04-21 01:09:51 +04:00
SendOrderStatusMail ( result . ClientId , $"Новый заказ создан. Номер заказа #{result.Id}" , $"Заказ #{result.Id} от {result.DateCreate} на сумму {result.Sum:0.00} принят" ) ;
2023-01-29 22:10:01 +04:00
return true ;
}
public bool TakeOrderInWork ( OrderBindingModel model )
{
2023-02-12 18:21:48 +04:00
CheckModel ( model , false ) ;
2023-02-27 03:19:29 +04:00
if ( _orderStorage . GetElement ( new OrderSearchModel { Id = model . Id } ) ? . Status ! = OrderStatus . П р и н я т )
2023-02-12 18:21:48 +04:00
{
_logger . LogWarning ( "Invalid order status" ) ;
return false ;
}
2023-02-12 23:20:34 +04:00
model . Status = OrderStatus . В ы п о л н я е т с я ;
2023-02-12 18:21:48 +04:00
2023-04-10 01:13:25 +04:00
if ( ! model . ImplementerId . HasValue )
{
_logger . LogWarning ( "There must be implementer to take order in work" ) ;
return false ;
}
2023-04-21 01:09:51 +04:00
var result = _orderStorage . Update ( model ) ;
if ( result = = null )
2023-02-12 18:21:48 +04:00
{
2023-02-12 23:20:34 +04:00
_logger . LogWarning ( "Update operation failed" ) ;
2023-04-21 01:09:51 +04:00
return false ;
2023-02-12 18:21:48 +04:00
}
2023-04-21 01:09:51 +04:00
SendOrderStatusMail ( result . ClientId , $"Изменен статус заказа #{result.Id}" , $"Заказ #{result.Id} изменен статус на {result.Status}" ) ;
2023-02-12 18:21:48 +04:00
return true ;
2023-01-29 22:10:01 +04:00
}
public bool FinishOrder ( OrderBindingModel model )
{
2023-02-12 18:21:48 +04:00
CheckModel ( model , false ) ;
2023-02-27 03:19:29 +04:00
if ( _orderStorage . GetElement ( new OrderSearchModel { Id = model . Id } ) ? . Status ! = OrderStatus . В ы п о л н я е т с я )
2023-02-12 18:21:48 +04:00
{
_logger . LogWarning ( "Invalid order status" ) ;
return false ;
}
2023-02-12 23:20:34 +04:00
model . Status = OrderStatus . Г о т о в ;
2023-02-27 03:19:29 +04:00
model . DateImplement = DateTime . Now ;
2023-02-12 18:21:48 +04:00
2023-04-21 01:09:51 +04:00
var result = _orderStorage . Update ( model ) ;
if ( result = = null )
2023-02-12 18:21:48 +04:00
{
2023-02-12 23:20:34 +04:00
_logger . LogWarning ( "Update operation failed" ) ;
2023-04-21 01:09:51 +04:00
return false ;
2023-02-12 18:21:48 +04:00
}
2023-04-21 01:09:51 +04:00
SendOrderStatusMail ( result . ClientId , $"Изменен статус заказа #{result.Id}" , $"Заказ #{result.Id} изменен статус на {result.Status}" ) ;
2023-02-12 18:21:48 +04:00
return true ;
2023-01-29 22:10:01 +04:00
}
public bool DeliveryOrder ( OrderBindingModel model )
{
2023-02-12 18:21:48 +04:00
CheckModel ( model , false ) ;
2023-02-27 03:19:29 +04:00
var order = _orderStorage . GetElement ( new OrderSearchModel { Id = model . Id } ) ;
if ( order ? . Status ! = OrderStatus . Г о т о в )
2023-02-12 18:21:48 +04:00
{
_logger . LogWarning ( "Invalid order status" ) ;
return false ;
}
2023-02-12 23:20:34 +04:00
model . Status = OrderStatus . В ы д а н ;
2023-02-27 03:19:29 +04:00
model . DateImplement = order . DateImplement ;
2023-02-12 18:21:48 +04:00
2023-04-21 01:09:51 +04:00
var result = _orderStorage . Update ( model ) ;
if ( result = = null )
2023-02-12 18:21:48 +04:00
{
2023-02-12 23:20:34 +04:00
_logger . LogWarning ( "Update operation failed" ) ;
2023-04-21 01:09:51 +04:00
return false ;
}
SendOrderStatusMail ( result . ClientId , $"Изменен статус заказа #{result.Id}" , $"Заказ #{result.Id} изменен статус на {result.Status}" ) ;
return true ;
}
private bool SendOrderStatusMail ( int clientId , string subject , string text )
{
var client = _clientLogic . ReadElement ( new ( ) { Id = clientId } ) ;
if ( client = = null )
{
return false ;
2023-02-12 18:21:48 +04:00
}
2023-04-21 01:09:51 +04:00
_mailWorker . MailSendAsync ( new ( )
{
MailAddress = client . Email ,
Subject = subject ,
Text = text
} ) ;
2023-02-12 18:21:48 +04:00
return true ;
2023-01-29 22:10:01 +04:00
}
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 ) ) ;
}
_logger . LogInformation ( "Order. Id: {Id}. Sum: {Sum}. BouquetId: {BouquetId}" , model . Id , model . Sum , model . BouquetId ) ;
var element = _orderStorage . GetElement ( new OrderSearchModel { Id = model . Id } ) ;
if ( element ! = null & & element . Id = = model . Id )
{
throw new InvalidOperationException ( "Заказ с таким идентификатором уже есть" ) ;
}
}
}
}