ISEbd-21_Melnikov_I.O._CarS.../CarService/CarServiceBusinessLogic/BusinessLogics/ItemForRepairLogic.cs

123 lines
4.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using CarServiceContracts.BindingModels;
using CarServiceContracts.BusinessLogicsContracts;
using CarServiceContracts.SearchModels;
using CarServiceContracts.StorageContracts;
using CarServiceContracts.ViewModels;
using Microsoft.Extensions.Logging;
namespace CarServiceBusinessLogic.BusinessLogics
{
public class ItemForRepairLogic : IItemForRepairLogic
{
private readonly ILogger _logger;
private readonly IItemForRepairStorage _itemForRepairStorage;
private readonly IItemStorage _itemStorage;
public ItemForRepairLogic(ILogger<ItemForRepairLogic> logger, IItemForRepairStorage itemForRepairStorage, IItemStorage itemStorage)
{
_logger = logger;
_itemForRepairStorage = itemForRepairStorage;
_itemStorage = itemStorage;
}
public List<ItemForRepairViewModel>? ReadList(ItemForRepairSearchModel? model)
{
_logger.LogInformation("ReadList. Id: {Id}", model?.Id);
var list = model == null ? _itemForRepairStorage.GetFullList() : _itemForRepairStorage.GetFilteredList(model);
if (list == null)
{
_logger.LogWarning("ReadList return null list");
return null;
}
_logger.LogInformation("ReadList. Count: {Count}", list.Count);
return list;
}
public ItemForRepairViewModel? ReadElement(ItemForRepairSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. Id: {Id}", model.Id);
var element = _itemForRepairStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement found. Id: {Id}", element.Id);
return element;
}
public bool Create(ItemForRepairBindingModel model)
{
CheckModel(model);
//При добавлении привязки уменьшаем количество нужной статьи затрат
var item = _itemStorage.GetElement(new() { Id = model.ItemId });
if (_itemStorage.UpdateCount(item, -model.Count) == null)
{
_logger.LogWarning("Insert operation failed while updating count");
return false;
}
if (_itemForRepairStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
public bool Update(ItemForRepairBindingModel model)
{
CheckModel(model);
//Возвращаем нужное количество старых статей затрат на склад
var oldItem = _itemStorage.GetElement(new() { Id = (_itemForRepairStorage.GetElement(new() { Id = model.ItemId })?.ItemId ?? -1) });
if (_itemStorage.UpdateCount(oldItem, model.Count) == null)
{
_logger.LogWarning("Insert operation failed while returning old intem on storage");
return false;
}
//Списываем новую статью затрат со склада в новом количестве
var newItem = _itemStorage.GetElement(new() { Id = model.ItemId });
if (_itemStorage.UpdateCount(newItem, -model.Count) == null)
{
_logger.LogWarning("Insert operation failed while updating count");
return false;
}
if (_itemForRepairStorage.Update(model) == null)
{
_logger.LogWarning("Update operation failed");
return false;
}
return true;
}
public bool Delete(ItemForRepairBindingModel model)
{
CheckModel(model, false);
_logger.LogInformation("Delete. Id:{Id}", model.Id);
if (_itemForRepairStorage.Delete(model) == null)
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
private void CheckModel(ItemForRepairBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (!withParams)
{
return;
}
//Получаем текущее число статей затрат выбранного вида на складе
int currentItemOnStorage = _itemStorage.GetElement(new() { Id = model.ItemId })?.Count ?? -1;
//Если на складе осталось статей затрат выбранного вида меньше, чем нужно на заявку, отменяем добавление привязки
if (currentItemOnStorage < model.Count)
{
_logger.LogWarning("Not enough items {Id} on storage", model.ItemId);
throw new ArgumentException("На складе не хватает запчастей");
}
_logger.LogInformation("ItemForRepair. Id: {Id}", model.Id);
}
}
}