2024-05-08 09:27:00 +04:00
using SecuritySystemBusinessLogic.MailWorker ;
using SecuritySystemContracts.BindingModels ;
2024-05-07 15:10:34 +04:00
using SecuritySystemContracts.BusinessLogicsContracts ;
using SecuritySystemContracts.SearchModels ;
using SecuritySystemContracts.StoragesContracts ;
using SecuritySystemContracts.ViewModels ;
using SecuritySystemDataModels.Enums ;
using Microsoft.Extensions.Logging ;
using System ;
using System.Collections.Generic ;
using System.Data ;
using System.Linq ;
using System.Text ;
using System.Threading.Tasks ;
namespace SecuritySystemBusinessLogic.BusinessLogic
{
public class OrderLogic : IOrderLogic
{
private readonly ILogger _logger ;
private readonly IOrderStorage _orderStorage ;
2024-05-08 09:27:00 +04:00
private readonly AbstractMailWorker _mailWorker ;
private readonly IClientLogic _clientLogic ;
public OrderLogic ( ILogger < OrderLogic > logger , IOrderStorage orderStorage , AbstractMailWorker mailWorker , IClientLogic clientLogic )
2024-05-07 15:10:34 +04:00
{
_logger = logger ;
_orderStorage = orderStorage ;
2024-05-08 09:27:00 +04:00
_mailWorker = mailWorker ;
_clientLogic = clientLogic ;
2024-05-07 15:10:34 +04:00
}
//вывод отфильтрованного списка компонентов
public List < OrderViewModel > ? ReadList ( OrderSearchModel ? model )
{
_logger . LogInformation ( "ReadList. Id:{Id}" , model ? . Id ) ;
//list хранит весь список в случае, если model пришло с о значением null на вход метода
var list = model = = null ? _orderStorage . GetFullList ( ) : _orderStorage . GetFilteredList ( model ) ;
2024-05-08 08:03:51 +04:00
if ( list = = null )
2024-05-07 15:10:34 +04:00
{
_logger . LogWarning ( "ReadList return null list" ) ;
return null ;
}
_logger . LogInformation ( "ReadList. Count:{Count}" , list . Count ) ;
return list ;
}
2024-05-08 08:37:10 +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 ;
}
2024-05-07 15:10:34 +04:00
//создание чека
public bool CreateOrder ( OrderBindingModel model )
{
CheckModel ( model ) ;
2024-05-08 08:03:51 +04:00
if ( model . Status ! = OrderStatus . Н е и з в е с т е н )
2024-05-07 15:10:34 +04:00
{
_logger . LogWarning ( "Insert operation failed, incorrect order status" ) ;
return false ;
}
model . Status = OrderStatus . П р и н я т ;
2024-05-08 09:27:00 +04:00
var result = _orderStorage . Insert ( model ) ;
if ( result = = null )
2024-05-07 15:10:34 +04:00
{
model . Status = OrderStatus . Н е и з в е с т е н ;
_logger . LogWarning ( "Insert operation failed" ) ;
return false ;
}
2024-05-08 09:27:00 +04:00
SendOrderMessage ( result . ClientId , $"Кузнечная мастерская, Заказ №{result.Id}" , $"Заказ №{result.Id} от {result.DateCreate} на сумму {result.Sum:0.00} принят" ) ;
2024-05-07 15:10:34 +04:00
return true ;
}
2024-05-08 08:03:51 +04:00
2024-05-07 15:10:34 +04:00
public bool TakeOrderInWork ( OrderBindingModel model )
{
return StatusUpdate ( model , OrderStatus . В ы п о л н я е т с я ) ;
}
public bool FinishOrder ( OrderBindingModel model )
{
return StatusUpdate ( model , OrderStatus . Г о т о в ) ;
}
public bool DeliveryOrder ( OrderBindingModel model )
{
return StatusUpdate ( model , OrderStatus . В ы д а н ) ;
}
//проверка на пустоту входного параметра
private void CheckModel ( OrderBindingModel model , bool withParams = true )
{
2024-05-08 08:03:51 +04:00
if ( model = = null )
2024-05-07 15:10:34 +04:00
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
//так как при удалении параметром withParams передаём false
if ( ! withParams )
{
return ;
}
//проверка на наличие товаров в заказе
2024-05-08 08:03:51 +04:00
if ( model . Count < = 0 )
2024-05-07 15:10:34 +04:00
{
throw new ArgumentNullException ( "В заказе не может быть 0 изделий" , nameof ( model . Count ) ) ;
}
//проверка на наличие нормальной суммарной стоимости чека
2024-05-08 08:03:51 +04:00
if ( model . Sum < = 0 )
2024-05-07 15:10:34 +04:00
{
throw new ArgumentNullException ( "Суммарная стоимость заказа должна быть больше 0" , nameof ( model . Sum ) ) ;
}
//проверка корректности id у изделий
if ( model . SecureId < 0 )
{
throw new ArgumentNullException ( "Некорректный id у изделия" , nameof ( model . SecureId ) ) ;
}
//проверка корректности дат
2024-05-08 08:03:51 +04:00
if ( model . DateCreate > model . DateImplement )
2024-05-07 15:10:34 +04:00
{
throw new InvalidOperationException ( "Дата создания должна быть более ранней, нежели дата завершения" ) ;
}
2024-05-08 08:03:51 +04:00
if ( model . ClientId < 0 )
{
throw new ArgumentNullException ( "Некорректный идентификатор у клиента" , nameof ( model . ClientId ) ) ;
}
_logger . LogInformation ( "Order. OrderId:{Id}. Sum:{Sum}. ClientId:{ClientId}. SecureId:{Id}" , model . Id , model . Sum , model . ClientId , model . SecureId ) ;
2024-05-07 15:10:34 +04:00
}
//обновление статуса заказа
public bool StatusUpdate ( OrderBindingModel model , OrderStatus newOrderStatus )
{
var viewModel = _orderStorage . GetElement ( new OrderSearchModel { Id = model . Id } ) ;
//если не смогли найти указанный заказ по е г о Id
2024-05-08 08:03:51 +04:00
if ( viewModel = = null )
2024-05-07 15:10:34 +04:00
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
//проверка на возможность обновления статуса на следующий
if ( viewModel . Status + 1 ! = newOrderStatus )
{
_logger . LogWarning ( "Status update operation failed. New status " + newOrderStatus . ToString ( ) + " incorrect" ) ;
return false ;
}
model . Status = newOrderStatus ;
2024-05-08 08:37:10 +04:00
//не забываем положить id работника
if ( viewModel . ImplementerId . HasValue )
{
model . ImplementerId = viewModel . ImplementerId ;
}
2024-05-07 15:10:34 +04:00
//проверка на выдачу
2024-05-08 08:03:51 +04:00
if ( model . Status = = OrderStatus . В ы д а н )
2024-05-07 15:10:34 +04:00
{
model . DateImplement = DateTime . Now ;
}
else
{
model . DateImplement = viewModel . DateImplement ;
}
CheckModel ( model , false ) ;
2024-05-08 09:27:00 +04:00
var result = _orderStorage . Update ( model ) ;
2024-05-07 15:10:34 +04:00
//финальная проверка на возможность обновления
2024-05-08 09:27:00 +04:00
if ( result = = null )
2024-05-07 15:10:34 +04:00
{
model . Status - - ;
_logger . LogWarning ( "Update operation failed" ) ;
return false ;
}
2024-05-08 09:27:00 +04:00
SendOrderMessage ( result . ClientId , $"Кузнечаня мастерская, Заказ №{result.Id}" , $"Заказ №{model.Id} изменен статус на {result.Status}" ) ;
return true ;
}
private bool SendOrderMessage ( 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
} ) ;
2024-05-07 15:10:34 +04:00
return true ;
}
}
2024-05-08 08:03:51 +04:00
}