Merge branch 'master' into Dozorova

This commit is contained in:
DozorovaA.A 2023-05-17 22:46:52 +04:00
commit ba9e854c9e
31 changed files with 1112 additions and 53 deletions

View File

@ -49,15 +49,16 @@ namespace FurnitureAssemblyBusinessLogic.BusinessLogics
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id); _logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element; return element;
} }
public bool Create(OrderInfoBindingModel model) public OrderInfoViewModel? Create(OrderInfoBindingModel model)
{ {
CheckModel(model); CheckModel(model);
if (_orderInfoStorage.Insert(model) == null) var order = _orderInfoStorage.Insert(model);
if (order == null)
{ {
_logger.LogWarning("Insert operation failed"); _logger.LogWarning("Insert operation failed");
return false; return null;
} }
return true; return order;
} }
public bool Update(OrderInfoBindingModel model) public bool Update(OrderInfoBindingModel model)
{ {

View File

@ -16,10 +16,14 @@ namespace FurnitureAssemblyBusinessLogic.BusinessLogics
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IOrderStorage _orderStorage; private readonly IOrderStorage _orderStorage;
public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage) private readonly IOrderInfoStorage _orderInfoStorage;
private readonly ISetStorage _setStorage;
public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage, IOrderInfoStorage orderInfoStorage, ISetStorage setStorage)
{ {
_logger = logger; _logger = logger;
_orderStorage = orderStorage; _orderStorage = orderStorage;
_orderInfoStorage = orderInfoStorage;
_setStorage = setStorage;
} }
public List<OrderViewModel>? ReadList(OrderSearchModel? model) public List<OrderViewModel>? ReadList(OrderSearchModel? model)
{ {
@ -52,7 +56,41 @@ namespace FurnitureAssemblyBusinessLogic.BusinessLogics
public bool Create(OrderBindingModel model) public bool Create(OrderBindingModel model)
{ {
CheckModel(model); CheckModel(model);
if (_orderStorage.Insert(model) == null) var orderInfo = _orderInfoStorage.GetElement(new OrderInfoSearchModel { Id = model.OrderInfoId });
var set = _setStorage.GetElement(new SetSearchModel { Id = model.SetId });
if (orderInfo == null || set == null)
{
return false;
}
_orderInfoStorage.Update(new OrderInfoBindingModel
{
Id = orderInfo.Id,
CustomerName = orderInfo.CustomerName,
Sum = orderInfo.Sum + (set.Cost * model.Count),
DateCreate = orderInfo.DateCreate,
PaymentType = orderInfo.PaymentType,
UserId = orderInfo.UserId
});
var order = _orderStorage.GetElement(new OrderSearchModel
{
OrderInfoId = new List<int> { model.OrderInfoId },
SetId = model.SetId
});
if (order != null)
{
if (_orderStorage.Update(new OrderBindingModel
{
Id = order.Id,
OrderInfoId = order.OrderInfoId,
SetId = order.SetId,
Count = order.Count + model.Count
}) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
}
else if (_orderStorage.Insert(model) == null)
{ {
_logger.LogWarning("Insert operation failed"); _logger.LogWarning("Insert operation failed");
return false; return false;
@ -72,7 +110,23 @@ namespace FurnitureAssemblyBusinessLogic.BusinessLogics
public bool Delete(OrderBindingModel model) public bool Delete(OrderBindingModel model)
{ {
CheckModel(model, false); CheckModel(model, false);
_logger.LogInformation("Delete. Id:{Id}", model.Id); var order = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id });
var orderInfo = _orderInfoStorage.GetElement(new OrderInfoSearchModel { Id = order.OrderInfoId });
var set = _setStorage.GetElement(new SetSearchModel { Id = order.SetId });
if (orderInfo == null || set == null)
{
return false;
}
_orderInfoStorage.Update(new OrderInfoBindingModel
{
Id = orderInfo.Id,
CustomerName = orderInfo.CustomerName,
Sum = orderInfo.Sum - (set.Cost * order.Count),
DateCreate = orderInfo.DateCreate,
PaymentType = orderInfo.PaymentType,
UserId = orderInfo.UserId
});
_logger.LogInformation("Delete. Id:{Id}", model.Id);
if (_orderStorage.Delete(model) == null) if (_orderStorage.Delete(model) == null)
{ {
_logger.LogWarning("Delete operation failed"); _logger.LogWarning("Delete operation failed");

View File

@ -19,11 +19,11 @@ namespace FurnitureAssemblyBusinessLogic.BusinessLogics
private readonly ISetStorage _setStorage; private readonly ISetStorage _setStorage;
private readonly IOrderInfoStorage _orderInfoStorage; private readonly IOrderInfoStorage _orderInfoStorage;
private readonly IOrderStorage _orderStorage; private readonly IOrderStorage _orderStorage;
private readonly AbstractSaveToExcel _saveToExcel; private readonly AbstractWorkerSaveToExcel _saveToExcel;
private readonly AbstractSaveToWord _saveToWord; private readonly AbstractWorkerSaveToWord _saveToWord;
private readonly AbstractSaveToPdf _saveToPdf; private readonly AbstractWorkerSaveToPdf _saveToPdf;
public ReportWorkerLogic(ISetStorage setStorage, IFurnitureModuleStorage furnitureModuleStorage, IOrderInfoStorage orderInfoStorage, public ReportWorkerLogic(ISetStorage setStorage, IFurnitureModuleStorage furnitureModuleStorage, IOrderInfoStorage orderInfoStorage,
IOrderStorage orderStorage, AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf) IOrderStorage orderStorage, AbstractWorkerSaveToExcel saveToExcel, AbstractWorkerSaveToWord saveToWord, AbstractWorkerSaveToPdf saveToPdf)
{ {
_setStorage = setStorage; _setStorage = setStorage;
_furnitureModuleStorage = furnitureModuleStorage; _furnitureModuleStorage = furnitureModuleStorage;

View File

@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace FurnitureAssemblyBusinessLogic.OfficePackage namespace FurnitureAssemblyBusinessLogic.OfficePackage
{ {
public abstract class AbstractSaveToExcel public abstract class AbstractWorkerSaveToExcel
{ {
/// <summary> /// <summary>
/// Создание отчета /// Создание отчета

View File

@ -10,7 +10,7 @@ using System.Threading.Tasks;
namespace FurnitureAssemblyBusinessLogic.OfficePackage namespace FurnitureAssemblyBusinessLogic.OfficePackage
{ {
public abstract class AbstractSaveToPdf public abstract class AbstractWorkerSaveToPdf
{ {
public void CreateDoc(PdfInfo info) public void CreateDoc(PdfInfo info)
{ {

View File

@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace FurnitureAssemblyBusinessLogic.OfficePackage namespace FurnitureAssemblyBusinessLogic.OfficePackage
{ {
public abstract class AbstractSaveToWord public abstract class AbstractWorkerSaveToWord
{ {
public void CreateDoc(WordInfo info) public void CreateDoc(WordInfo info)
{ {

View File

@ -13,7 +13,7 @@ using System.Threading.Tasks;
namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
{ {
public class SaveToExcel : AbstractSaveToExcel public class SaveToExcel : AbstractWorkerSaveToExcel
{ {
private SpreadsheetDocument? _spreadsheetDocument; private SpreadsheetDocument? _spreadsheetDocument;
private SharedStringTablePart? _shareStringPart; private SharedStringTablePart? _shareStringPart;

View File

@ -11,7 +11,7 @@ using System.Threading.Tasks;
namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
{ {
public class SaveToPdf : AbstractSaveToPdf public class SaveToPdf : AbstractWorkerSaveToPdf
{ {
private Document? _document; private Document? _document;
private Section? _section; private Section? _section;

View File

@ -11,7 +11,7 @@ using System.Threading.Tasks;
namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
{ {
public class SaveToWord : AbstractSaveToWord public class SaveToWord : AbstractWorkerSaveToWord
{ {
private WordprocessingDocument? _wordDocument; private WordprocessingDocument? _wordDocument;
private Body? _docBody; private Body? _docBody;

View File

@ -13,7 +13,7 @@ namespace FurnitureAssemblyContracts.BusinessLogicContracts
{ {
List<OrderInfoViewModel>? ReadList(OrderInfoSearchModel? model); List<OrderInfoViewModel>? ReadList(OrderInfoSearchModel? model);
OrderInfoViewModel? ReadElement(OrderInfoSearchModel model); OrderInfoViewModel? ReadElement(OrderInfoSearchModel model);
bool Create(OrderInfoBindingModel model); OrderInfoViewModel? Create(OrderInfoBindingModel model);
bool Update(OrderInfoBindingModel model); bool Update(OrderInfoBindingModel model);
bool Delete(OrderInfoBindingModel model); bool Delete(OrderInfoBindingModel model);
} }

View File

@ -33,16 +33,27 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
} }
public OrderViewModel? GetElement(OrderSearchModel model) public OrderViewModel? GetElement(OrderSearchModel model)
{ {
if (!model.Id.HasValue) using var context = new FurnitureAssemblyDatabase();
if (model.Id.HasValue)
{ {
return null; return context.Orders
} .Include(x => x.Set)
using var context = new FurnitureAssemblyDatabase();
return context.Orders
.Include(x => x.Set)
.Include(x => x.OrderInfo) .Include(x => x.OrderInfo)
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)
?.GetViewModel; ?.GetViewModel;
}
else if (model.OrderInfoId != null && model.OrderInfoId.Count == 1 && model.SetId.HasValue)
{
return context.Orders
.Include(x => x.Set)
.Include(x => x.OrderInfo)
.FirstOrDefault(x => model.OrderInfoId.Contains(x.OrderInfoId) && x.SetId == model.SetId)
?.GetViewModel;
}
else
{
return null;
}
} }
public List<OrderViewModel> GetFilteredList(OrderSearchModel model) public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
{ {

View File

@ -58,8 +58,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models
PaymentType = OrderInfo.PaymentType, PaymentType = OrderInfo.PaymentType,
DateCreate = OrderInfo.DateCreate, DateCreate = OrderInfo.DateCreate,
Sum = OrderInfo.Sum, Sum = OrderInfo.Sum,
UserId = OrderInfo.UserId, UserId = OrderInfo.UserId
UserName = OrderInfo.User.Name
}; };
} }

View File

@ -36,7 +36,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models
Id = model.Id, Id = model.Id,
CustomerName = model.CustomerName, CustomerName = model.CustomerName,
PaymentType = model.PaymentType, PaymentType = model.PaymentType,
Sum = model.Sum, Sum = 0,
DateCreate = DateTime.Now.ToUniversalTime(), DateCreate = DateTime.Now.ToUniversalTime(),
UserId = model.UserId UserId = model.UserId
}; };
@ -50,6 +50,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models
CustomerName = model.CustomerName; CustomerName = model.CustomerName;
PaymentType = model.PaymentType; PaymentType = model.PaymentType;
UserId = model.UserId; UserId = model.UserId;
Sum = model.Sum;
} }
public OrderInfoViewModel GetViewModel => new() public OrderInfoViewModel GetViewModel => new()
{ {

View File

@ -47,6 +47,19 @@ namespace FurnitureAssemblyRestApi.Controllers
throw; throw;
} }
} }
[HttpGet]
public List<FurnitureModuleViewModel>? GetFurnitureModuleListByUser(int userId)
{
try
{
return _furnitureModule.ReadList(new FurnitureModuleSearchModel { UserId = userId });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения списка гарнитуров у пользователя по id={userId}", userId);
throw;
}
}
[HttpPost] [HttpPost]
public void AddFurnitureModule(FurnitureModuleBindingModel model) public void AddFurnitureModule(FurnitureModuleBindingModel model)
{ {

View File

@ -17,11 +17,16 @@ namespace FurnitureAssemblyRestApi.Controllers
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IOrderLogic _order; private readonly IOrderLogic _order;
private readonly IOrderInfoLogic _orderInfo; private readonly IOrderInfoLogic _orderInfo;
public OrderController(ILogger<OrderController> logger, IOrderLogic order, IOrderInfoLogic orderInfo) private readonly ISetLogic _set;
public OrderController(ILogger<OrderController> logger,
IOrderLogic order,
IOrderInfoLogic orderInfo,
ISetLogic set)
{ {
_logger = logger; _logger = logger;
_order = order; _order = order;
_orderInfo = orderInfo; _orderInfo = orderInfo;
_set = set;
} }
[HttpGet] [HttpGet]
@ -73,7 +78,45 @@ namespace FurnitureAssemblyRestApi.Controllers
throw; throw;
} }
} }
[HttpPost] [HttpGet]
public Tuple<OrderInfoViewModel, List<SetViewModel>, List<int>>? GetOrderWithSets(int orderId)
{
try
{
var orderInfo = _orderInfo.ReadElement(new() { Id = orderId });
if (orderInfo == null)
{
return null;
}
var orders = _order.ReadList(new OrderSearchModel { OrderInfoId = new List<int>() { orderInfo.Id } });
var sets = new List<SetViewModel>();
var counts = new List<int>();
if (orders == null)
{
sets = null;
counts = null;
}
else
{
foreach (var order in orders)
{
var el = _set.ReadElement(new SetSearchModel { Id = order.SetId });
sets.Add(el);
counts.Add(order.Count);
}
}
var tuple = System.Tuple.Create(orderInfo,
sets,
counts);
return tuple;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка гарнитура с мебельными модулями");
throw;
}
}
[HttpPost]
public void AddOrder(OrderBindingModel model) public void AddOrder(OrderBindingModel model)
{ {
try try
@ -112,5 +155,25 @@ namespace FurnitureAssemblyRestApi.Controllers
throw; throw;
} }
} }
} [HttpPost]
public void AddSetInOrder(Tuple<OrderInfoSearchModel, SetSearchModel, int> orderSetWithCount)
{
try
{
var orderInfo = _orderInfo.ReadElement(orderSetWithCount.Item1);
var set = _set.ReadElement(orderSetWithCount.Item2);
_order.Create(new OrderBindingModel
{
OrderInfoId = orderInfo.Id,
SetId = set.Id,
Count = orderSetWithCount.Item3
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка добавления поездки в магазин");
throw;
}
}
}
} }

View File

@ -47,12 +47,25 @@ namespace FurnitureAssemblyRestApi.Controllers
throw; throw;
} }
} }
[HttpPost] [HttpGet]
public void AddOrderInfo(OrderInfoBindingModel model) public List<OrderInfoViewModel>? GetOrderInfoListByUser(int userId)
{ {
try try
{ {
_orderInfo.Create(model); return _orderInfo.ReadList(new OrderInfoSearchModel { UserId = userId });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения списка гарнитуров у пользователя по id={userId}", userId);
throw;
}
}
[HttpPost]
public OrderInfoViewModel? AddOrderInfo(OrderInfoBindingModel model)
{
try
{
return _orderInfo.Create(model);
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@ -33,9 +33,9 @@ builder.Services.AddTransient<ISetLogic, SetLogic>();
builder.Services.AddTransient<IUserLogic, UserLogic>(); builder.Services.AddTransient<IUserLogic, UserLogic>();
builder.Services.AddTransient<IReportWorkerLogic, ReportWorkerLogic>(); builder.Services.AddTransient<IReportWorkerLogic, ReportWorkerLogic>();
builder.Services.AddTransient<AbstractSaveToExcel, SaveToExcel>(); builder.Services.AddTransient<AbstractWorkerSaveToExcel, SaveToExcel>();
builder.Services.AddTransient<AbstractSaveToWord, SaveToWord>(); builder.Services.AddTransient<AbstractWorkerSaveToWord, SaveToWord>();
builder.Services.AddTransient<AbstractSaveToPdf, SaveToPdf>(); builder.Services.AddTransient<AbstractWorkerSaveToPdf, SaveToPdf>();
builder.Services.AddControllers(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle

View File

@ -29,11 +29,7 @@ namespace FurnitureAssemblyWorkerClientApp
throw new Exception(result); throw new Exception(result);
} }
} }
public static void GetBaseRequest(string requestUrl) public static T? PostRequest<T>(string requestUrl, T model)
{
var response = _client.GetAsync(requestUrl);
}
public static void PostRequest<T>(string requestUrl, T model)
{ {
var json = JsonConvert.SerializeObject(model); var json = JsonConvert.SerializeObject(model);
var data = new StringContent(json, Encoding.UTF8, "application/json"); var data = new StringContent(json, Encoding.UTF8, "application/json");
@ -41,7 +37,10 @@ namespace FurnitureAssemblyWorkerClientApp
var response = _client.PostAsync(requestUrl, data); var response = _client.PostAsync(requestUrl, data);
var result = response.Result.Content.ReadAsStringAsync().Result; var result = response.Result.Content.ReadAsStringAsync().Result;
if (!response.Result.IsSuccessStatusCode) if (response.Result.IsSuccessStatusCode)
{
return JsonConvert.DeserializeObject<T>(result);
} else
{ {
throw new Exception(result); throw new Exception(result);
} }

View File

@ -6,6 +6,7 @@ using System.Diagnostics;
using FurnitureAssemblyDataModels.Models; using FurnitureAssemblyDataModels.Models;
using System; using System;
using FurnitureAssemblyContracts.SearchModels; using FurnitureAssemblyContracts.SearchModels;
using FurnitureAssemblyDataModels.Enums;
namespace FurnitureAssemblyWorkerClientApp.Controllers namespace FurnitureAssemblyWorkerClientApp.Controllers
{ {
@ -160,7 +161,7 @@ namespace FurnitureAssemblyWorkerClientApp.Controllers
furnitureModuleTable += "<tr>"; furnitureModuleTable += "<tr>";
furnitureModuleTable += $"<td>{furnitureModule.Name}</td>"; furnitureModuleTable += $"<td>{furnitureModule.Name}</td>";
furnitureModuleTable += $"<td>{furnitureModule.Cost}</td>"; furnitureModuleTable += $"<td>{furnitureModule.Cost}</td>";
furnitureModuleTable += $"<td>{furnitureModule.DateCreate}</td>"; furnitureModuleTable += $"<td>{furnitureModule.DateCreate.Date}</td>";
furnitureModuleTable += $"<td>{count}</td>"; furnitureModuleTable += $"<td>{count}</td>";
furnitureModuleTable += "</tr>"; furnitureModuleTable += "</tr>";
} }
@ -173,7 +174,7 @@ namespace FurnitureAssemblyWorkerClientApp.Controllers
{ {
return Redirect("~/Home/Enter"); return Redirect("~/Home/Enter");
} }
return View(APIClient.GetRequest<List<SetViewModel>>($"api/set/getsetlist")); return View(APIClient.GetRequest<List<SetViewModel>>($"api/set/getsetlistbyuser?userId={APIClient.User.Id}"));
} }
[HttpPost] [HttpPost]
public void UpdateSet(int set, string name, double cost, DateTime dateCreate) public void UpdateSet(int set, string name, double cost, DateTime dateCreate)
@ -208,7 +209,7 @@ namespace FurnitureAssemblyWorkerClientApp.Controllers
{ {
return Redirect("~/Home/Enter"); return Redirect("~/Home/Enter");
} }
return View(APIClient.GetRequest<List<SetViewModel>>($"api/set/getsetlist")); return View(APIClient.GetRequest<List<SetViewModel>>($"api/set/getsetlistbyuser?userId={APIClient.User.Id}"));
} }
[HttpPost] [HttpPost]
public void DeleteSet(int set) public void DeleteSet(int set)
@ -230,7 +231,7 @@ namespace FurnitureAssemblyWorkerClientApp.Controllers
{ {
return Redirect("~/Home/Enter"); return Redirect("~/Home/Enter");
} }
return View(Tuple.Create(APIClient.GetRequest<List<SetViewModel>>("api/set/getsetlist"), APIClient.GetRequest<List<FurnitureModuleViewModel>>("api/furnituremodule/getfurnituremodulelist"))); return View(Tuple.Create(APIClient.GetRequest<List<SetViewModel>>($"api/set/getsetlistbyuser?userId={APIClient.User.Id}"), APIClient.GetRequest<List<FurnitureModuleViewModel>>($"api/furnituremodule/getfurnituremodulelistbyuser?userId={APIClient.User.Id}")));
} }
[HttpPost] [HttpPost]
public void AddFurnitureModuleInSet(int set, int furnitureModule, int count) public void AddFurnitureModuleInSet(int set, int furnitureModule, int count)
@ -257,7 +258,7 @@ namespace FurnitureAssemblyWorkerClientApp.Controllers
{ {
return Redirect("~/Home/Enter"); return Redirect("~/Home/Enter");
} }
return View(APIClient.GetRequest<List<SetViewModel>>($"api/set/getsetlist")); return View(APIClient.GetRequest<List<SetViewModel>>($"api/set/getsetlistbyuser?userId={APIClient.User.Id}"));
} }
[HttpPost] [HttpPost]
public void ListSetsFurnitureModulesToFile(int[] setIds, string type) public void ListSetsFurnitureModulesToFile(int[] setIds, string type)
@ -306,5 +307,301 @@ namespace FurnitureAssemblyWorkerClientApp.Controllers
{ {
return new PhysicalFileResult("C:\\temp\\excel_worker.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); return new PhysicalFileResult("C:\\temp\\excel_worker.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
} }
} [HttpGet]
public IActionResult FurnitureModules()
{
if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<FurnitureModuleViewModel>>($"api/furnituremodule/getfurnituremodulelistbyuser?userId={APIClient.User.Id}"));
}
[HttpGet]
public IActionResult CreateFurnitureModule()
{
return View();
}
[HttpPost]
public void CreateFurnitureModule(string name, double cost)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
if (string.IsNullOrEmpty(name))
{
throw new Exception("Название мебельного модуля не указано");
}
if (cost <= 0)
{
throw new Exception("Стоимость мебельного модуля не корректна");
}
APIClient.PostRequest("api/furnituremodule/addfurnituremodule", new FurnitureModuleBindingModel
{
Name = name,
Cost = cost,
UserId = APIClient.User.Id
});
Response.Redirect("FurnitureModules");
}
[HttpGet]
public IActionResult UpdateFurnitureModule()
{
if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<FurnitureModuleViewModel>>($"api/furnituremodule/getfurnituremodulelistbyuser?userId={APIClient.User.Id}"));
}
[HttpPost]
public void UpdateFurnitureModule(int furnitureModule, string name, double cost, DateTime dateCreate)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
if (string.IsNullOrEmpty(name))
{
throw new Exception("Название мебельного модуля не указано");
}
if (cost <= 0)
{
throw new Exception("Стоимость мебельного модуля не корректна");
}
APIClient.PostRequest("api/furnituremodule/updatefurnituremodule", new FurnitureModuleBindingModel
{
Id = furnitureModule,
Name = name,
Cost = cost,
DateCreate = dateCreate.Date
});
Response.Redirect("FurnitureModules");
}
[HttpGet]
public IActionResult DeleteFurnitureModule()
{
if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<FurnitureModuleViewModel>>($"api/furnituremodule/getfurnituremodulelistbyuser?userId={APIClient.User.Id}"));
}
[HttpPost]
public void DeleteFurnitureModule(int furnitureModule)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
APIClient.PostRequest("api/furnituremodule/deletefurnituremodule", new FurnitureModuleBindingModel
{
Id = furnitureModule,
});
Response.Redirect("FurnitureModules");
}
[HttpGet]
public FurnitureModuleViewModel? GetFurnitureModule(int furnitureModuleId)
{
var result = APIClient.GetRequest<FurnitureModuleViewModel>
($"api/furnitureModule/getfurnituremodule?Id={furnitureModuleId}");
if (result == null)
{
return default;
}
return result;
}
[HttpGet]
public IActionResult AddFurnitureModulesInSet()
{
if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
return View(Tuple.Create(APIClient.GetRequest<List<SetViewModel>>($"api/set/getsetlistbyuser?userId={APIClient.User.Id}"), APIClient.GetRequest<List<FurnitureModuleViewModel>>($"api/furnituremodule/getfurnituremodulelistbyuser?userId={APIClient.User.Id}")));
}
[HttpPost]
public void AddFurnitureModulesInSet(int set, int[] furnitureModuleIds, int[] counts)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
if (furnitureModuleIds.Length != counts.Length)
{
throw new Exception("Массивы не совпадают");
}
for (int i = 0; i < furnitureModuleIds.Length; i++)
{
APIClient.PostRequest("api/set/addfurnituremoduleinset", Tuple.Create(
new SetSearchModel() { Id = set },
new FurnitureModuleViewModel() { Id = furnitureModuleIds[i] },
counts[i]
));
}
Response.Redirect("Index");
}
[HttpGet]
public IActionResult Orders()
{
if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<OrderInfoViewModel>>($"api/orderinfo/getorderinfolistbyuser?userId={APIClient.User.Id}"));
}
[HttpGet]
public IActionResult CreateOrder()
{
if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<SetViewModel>>($"api/set/getsetlistbyuser?userId={APIClient.User.Id}"));
}
[HttpPost]
public void CreateOrder(string name, PaymentType paymentType, int[] setIds, int[] counts)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
if (string.IsNullOrEmpty(name))
{
throw new Exception("Имя не должно быть пустым");
}
var orderInfo = APIClient.PostRequest("api/orderinfo/addorderinfo", new OrderInfoBindingModel
{
CustomerName = name,
PaymentType = paymentType,
UserId = APIClient.User.Id
});
if (orderInfo == null)
{
throw new Exception("Ошибка создания заказа");
}
if (setIds != null && setIds.Length > 0 && counts != null && setIds.Length == counts.Length)
{
for (int i = 0; i < counts.Length; i++)
{
APIClient.PostRequest("api/order/addorder", new OrderBindingModel
{
OrderInfoId = orderInfo.Id,
SetId = setIds[i],
Count = counts[i]
});
}
}
Response.Redirect("Orders");
}
[HttpGet]
public Tuple<OrderInfoViewModel, string>? GetOrderWithSets(int orderId)
{
var result = APIClient.GetRequest<Tuple<OrderInfoViewModel, List<SetViewModel>, List<int>>>
($"api/order/getorderwithsets?orderId={orderId}");
if (result == null)
{
return default;
}
string setTable = "";
for (int i = 0; i < result.Item2.Count; i++)
{
var set = result.Item2[i];
var count = result.Item3[i];
setTable += "<tr>";
setTable += $"<td>{set.Name}</td>";
setTable += $"<td>{set.Cost}</td>";
setTable += $"<td>{set.DateCreate.Date}</td>";
setTable += $"<td>{count}</td>";
setTable += "</tr>";
}
return Tuple.Create(result.Item1, setTable);
}
[HttpGet]
public IActionResult UpdateOrder()
{
if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<OrderInfoViewModel>>($"api/orderinfo/getorderinfolistbyuser?userId={APIClient.User.Id}"));
}
[HttpPost]
public void UpdateOrder(int order, string name, DateTime dateCreate, PaymentType paymentType, double sum)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
if (string.IsNullOrEmpty(name))
{
throw new Exception("Название гарнитура не указано");
}
APIClient.PostRequest("api/orderinfo/updateorderinfo", new OrderInfoBindingModel
{
Id = order,
CustomerName = name,
DateCreate = dateCreate.Date,
PaymentType = paymentType,
UserId = APIClient.User.Id,
Sum = sum
});
Response.Redirect("Orders");
}
[HttpGet]
public IActionResult DeleteOrder()
{
if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<OrderInfoViewModel>>($"api/orderinfo/getorderinfolistbyuser?userId={APIClient.User.Id}"));
}
[HttpPost]
public void DeleteOrder(int order)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
APIClient.PostRequest("api/orderinfo/deleteorderinfo", new OrderInfoBindingModel
{
Id = order,
});
Response.Redirect("Orders");
}
[HttpGet]
public IActionResult AddSetInOrder()
{
if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
return View(Tuple.Create(APIClient.GetRequest<List<OrderInfoViewModel>>($"api/orderinfo/getorderinfolistbyuser?userId={APIClient.User.Id}"), APIClient.GetRequest<List<SetViewModel>>($"api/set/getsetlistbyuser?userId={APIClient.User.Id}")));
}
[HttpPost]
public void AddSetInOrder(int order, int[] setIds, int[] counts)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
if (setIds != null && counts != null && counts.Length > 0 && counts.Length == setIds.Length)
{
for (int i = 0; i < counts.Length; i++)
{
if (counts[i] <= 0)
{
throw new Exception("Количество должно быть больше 0");
}
APIClient.PostRequest("api/order/addsetinorder", Tuple.Create(
new OrderInfoSearchModel() { Id = order },
new SetSearchModel() { Id = setIds[i] },
counts[i]
));
}
}
Response.Redirect("Orders");
}
}
} }

View File

@ -0,0 +1,79 @@
@using FurnitureAssemblyContracts.ViewModels;
@using FurnitureAssemblyDataModels.Models;
@model Tuple<List<SetViewModel>, List<FurnitureModuleViewModel>>
@{
ViewData["Title"] = "Добавление мебельных модулей в гарнитур";
}
<div class="text-center">
<h2 class="display-4">Добавление мебельных модулей в гарнитур</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Гарнитур:</div>
<div class="col-8">
<select id="set" name="set" class="form-control">
@foreach (var set in Model.Item1)
{
<option value="@set.Id">
@Html.DisplayFor(modelItem => set.Name)
</option>
}
</select>
</div>
</div>
<div class="row">
<div class="col-4">Мебельные модули:</div>
<div class="col-8">
<table class="table">
<thead>
<tr>
<th>
</th>
<th>
Название
</th>
<th>
Стоимость
</th>
<th>
Дата создания
</th>
<th>
Количество
</th>
</tr>
</thead>
<tbody>
@foreach (var furnitureModule in Model.Item2)
{
<tr>
<td>
<input type="checkbox" class="form-check-input" name="furnitureModuleIds[]" value="@furnitureModule.Id" id="@furnitureModule.Id">
</td>
<td>
@Html.DisplayFor(modelItem => furnitureModule.Name)
</td>
<td>
@Html.DisplayFor(modelItem => furnitureModule.Cost)
</td>
<td>
@Html.DisplayFor(modelItem => furnitureModule.DateCreate)
</td>
<td>
<input type="text" id="@furnitureModule.Id:count" name="counts[]" />
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Добавить" class="btn btn-primary" /></div>
</div>
</form>

View File

@ -0,0 +1,79 @@
@using FurnitureAssemblyContracts.ViewModels;
@using FurnitureAssemblyDataModels.Models;
@model Tuple<List<OrderInfoViewModel>, List<SetViewModel>>
@{
ViewData["Title"] = "Добавление гарнитур в заказ";
}
<div class="text-center">
<h2 class="display-4">Добавление гарнитур в заказ</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Заказ:</div>
<div class="col-8">
<select id="order" name="order" class="form-control">
@foreach (var order in Model.Item1)
{
<option value="@order.Id">
@Html.DisplayFor(modelItem => order.Id)
</option>
}
</select>
</div>
</div>
<div class="row">
<div class="col-4">Гарнитуры:</div>
<div class="col-8">
<table class="table">
<thead>
<tr>
<th>
</th>
<th>
Название
</th>
<th>
Стоимость
</th>
<th>
Дата создания
</th>
<th>
Количество
</th>
</tr>
</thead>
<tbody>
@foreach (var set in Model.Item2)
{
<tr>
<td>
<input type="checkbox" class="form-check-input" name="setIds[]" value="@set.Id" id="@set.Id">
</td>
<td>
@Html.DisplayFor(modelItem => set.Name)
</td>
<td>
@Html.DisplayFor(modelItem => set.Cost)
</td>
<td>
@Html.DisplayFor(modelItem => set.DateCreate)
</td>
<td>
<input type="text" id="@set.Id:count" name="counts[]" />
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Добавить" class="btn btn-primary" /></div>
</div>
</form>

View File

@ -0,0 +1,20 @@
@{
ViewData["Title"] = "Создание мебельного модуля";
}
<div class="text-center">
<h2 class="display-4">Создание мебельного модуля</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Название:</div>
<div class="col-8"><input type="text" name="name" id="name" /></div>
</div>
<div class="row">
<div class="col-4">Стоимость:</div>
<div class="col-8"><input type="text" name="cost" id="cost" /></div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Создать" class="btn btn-primary" /></div>
</div>
</form>

View File

@ -0,0 +1,74 @@
@using FurnitureAssemblyContracts.ViewModels;
@using FurnitureAssemblyDataModels.Enums;
@model List<SetViewModel>
@{
ViewData["Title"] = "Создание заказа";
}
<div class="text-center">
<h2 class="display-4">Создание заказа</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Имя заказчика:</div>
<div class="col-8"><input type="text" name="name" id="name" /></div>
</div>
<div class="row">
<div class="col-4">Тип оплаты:</div>
<div class="col-8">
<select name="paymentType">
<option id="@PaymentType.Картой" selected value="@PaymentType.Картой">Картой</option>
<option id="@PaymentType.Наличными" value="@PaymentType.Наличными">Наличными</option>
<option id="@PaymentType.Смешанный" value="@PaymentType.Смешанный">Смешанный</option>
</select>
</div>
</div>
<table class="table">
<thead>
<tr>
<th>
</th>
<th>
Название
</th>
<th>
Стоимость
</th>
<th>
Дата создания
</th>
<th>
Количество
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
<input type="checkbox" class="form-check-input" name="setIds[]" value="@item.Id" id="@item.Id">
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Cost)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateCreate)
</td>
<td>
<input type="text" id="@item.Id:count" name="counts[]" />
</td>
</tr>
}
</tbody>
</table>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Создать" class="btn btn-primary" /></div>
</div>
</form>

View File

@ -0,0 +1,27 @@
@using FurnitureAssemblyContracts.ViewModels;
@{
ViewData["Title"] = "Удаление мебельного модуля";
}
@model List<FurnitureModuleViewModel>
<div class="text-center">
<h2 class="display-4">Удаление мебельного модуля</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Выбранный мебельного модуля:</div>
<div class="col-8">
<select id="furnitureModule" name="furnitureModule" class="form-control">
@foreach (var item in Model)
{
<option value="@item.Id">
@Html.DisplayFor(modelItem => item.Name)
</option>
}
</select>
</div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Удалить" class="btn btn-primary" /></div>
</div>
</form>

View File

@ -0,0 +1,27 @@
@using FurnitureAssemblyContracts.ViewModels;
@{
ViewData["Title"] = "Удаление заказа";
}
@model List<OrderInfoViewModel>
<div class="text-center">
<h2 class="display-4">Удаление заказа</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Выбранный заказ:</div>
<div class="col-8">
<select id="order" name="order" class="form-control">
@foreach (var item in Model)
{
<option value="@item.Id">
@Html.DisplayFor(modelItem => item.Id)
</option>
}
</select>
</div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Удалить" class="btn btn-primary" /></div>
</div>
</form>

View File

@ -0,0 +1,64 @@
@using FurnitureAssemblyContracts.ViewModels
@model List<FurnitureModuleViewModel>
@{
ViewData["Title"] = "Формирование мебельнго модуля";
}
<div class="text-center">
<h1 class="display-4">Мебельные модули</h1>
</div>
<div class="text-center">
@{
if (Model == null)
{
<h3 class="display-4">Авторизируйтесь</h3>
return;
}
<div>
<a asp-action="CreateFurnitureModule">Создать мебельный модуль</a>
<a asp-action="UpdateFurnitureModule">Обновить мебельный модуль</a>
<a asp-action="DeleteFurnitureModule">Удалить мебельный модуль</a>
</div>
<table class="table">
<thead>
<tr>
<th>
Номер
</th>
<th>
Название
</th>
<th>
Стоимость
</th>
<th>
Дата создания
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Cost)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateCreate)
</td>
</tr>
}
</tbody>
</table>
}
</div>

View File

@ -0,0 +1,71 @@
@using FurnitureAssemblyContracts.ViewModels
@model List<OrderInfoViewModel>
@{
ViewData["Title"] = "Формирование заказов";
}
<div class="text-center">
<h1 class="display-4">Заказы</h1>
</div>
<div class="text-center">
@{
if (Model == null)
{
<h3 class="display-4">Авторизируйтесь</h3>
return;
}
<div>
<a asp-action="CreateOrder">Создать заказ</a>
<a asp-action="UpdateOrder">Обновить заказ</a>
<a asp-action="DeleteOrder">Удалить заказ</a>
<a asp-action="AddSetInOrder">Добавить гарнитур в заказ</a>
</div>
<table class="table">
<thead>
<tr>
<th>
Номер
</th>
<th>
Имя заказчика
</th>
<th>
Дата создания
</th>
<th>
Тип оплаты
</th>
<th>
Сумма
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.CustomerName)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateCreate)
</td>
<td>
@Html.DisplayFor(modelItem => item.PaymentType)
</td>
<td>
@Html.DisplayFor(modelItem => item.Sum)
</td>
</tr>
}
</tbody>
</table>
}
</div>

View File

@ -0,0 +1,65 @@
@using FurnitureAssemblyContracts.ViewModels
@model List<FurnitureModuleViewModel>
@{
ViewData["Title"] = "Изменение мебельного модуля";
}
<div class="text-center">
<h2 class="display-4">Изменение мебельного модуля</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Мебельный модуль:</div>
<div class="col-8">
<select id="furnitureModule" name="furnitureModule" class="form-control">
@foreach (var item in Model)
{
<option value="@item.Id">
@Html.DisplayFor(modelItem => item.Name)
</option>
}
</select>
</div>
</div>
<div class="row">
<div class="col-4">Название:</div>
<div class="col-8"><input type="text" name="name" id="name" /></div>
</div>
<div class="row">
<div class="col-4">Стоимость:</div>
<div class="col-8"><input type="text" name="cost" id="cost" /></div>
</div>
<div class="row">
<div class="col-4">Дата создания:</div>
<div class="col-8"><input type="datetime-local" id="dateCreate" name="dateCreate" /></div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Изменить" class="btn btn-primary" /></div>
</div>
</form>
@section Scripts {
<script>
function check() {
var furnitureModule = $('#furnitureModule').val();
if (furnitureModule) {
$.ajax({
method: "GET",
url: "/Home/GetFurnitureModule",
data: { furnitureModuleId: furnitureModule },
success: function (result) {
if (result != null) {
$('#name').val(result.name);
$('#cost').val(result.cost);
$('#dateCreate').val(new Date(result.dateCreate).toISOString().split(".")[0].substr(0, 16));
}
}
});
};
}
check();
$('#furnitureModule').on('change', (e) => check());
</script>
}

View File

@ -0,0 +1,93 @@
@using FurnitureAssemblyContracts.ViewModels
@using FurnitureAssemblyDataModels.Enums;
@model List<OrderInfoViewModel>
@{
ViewData["Title"] = "Изменение заказа";
}
<div class="text-center">
<h2 class="display-4">Изменение заказа</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Заказ:</div>
<div class="col-8">
<select id="order" name="order" class="form-control">
@foreach (var item in Model)
{
<option value="@item.Id">
@Html.DisplayFor(modelItem => item.Id)
</option>
}
</select>
</div>
</div>
<div class="row">
<div class="col-4">Имя клиента:</div>
<div class="col-8"><input type="text" name="name" id="name" /></div>
</div>
<div class="row">
<div class="col-4">Тип оплаты:</div>
<div class="col-8">
<select name="paymentType" id="paymentType">
<option id="1" value="1">Картой</option>
<option id="0" value="0">Наличными</option>
<option id="2" value="2">Смешанный</option>
</select>
</div>
</div>
<div class="row">
<div class="col-4">Дата создания:</div>
<div class="col-8"><input type="datetime-local" id="dateCreate" name="dateCreate" /></div>
</div>
<input type="text" id="sum" name="sum" style="visibility: hidden;" />
<table class="table">
<thead>
<tr>
<th>
Название гарнитура
</th>
<th>
Стоимость
</th>
<th>
Количество
</th>
</tr>
</thead>
<tbody id="sets-table">
</tbody>
</table>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Изменить" class="btn btn-primary" /></div>
</div>
</form>
@section Scripts {
<script>
function check() {
var order = $('#order').val();
if (order) {
$.ajax({
method: "GET",
url: "/Home/GetOrderWithSets",
data: { orderId: order },
success: function (result) {
if (result != null) {
console.log(result);
$('#name').val(result.item1.customerName);
$('#paymentType').val(result.item1.paymentType).change();
$('#sum').val(result.item1.sum);
$('#dateCreate').val(new Date(result.item1.dateCreate).toISOString().split(".")[0].substr(0, 16));
$('#sets-table').html(result.item2);
}
}
});
};
}
check();
$('#order').on('change', (e) => check());
</script>
}

View File

@ -64,13 +64,13 @@
if (set) { if (set) {
$.ajax({ $.ajax({
method: "GET", method: "GET",
url: "/Home/GetShopWithManufactures", url: "/Home/GetSetWithFurnitureModules",
data: { setId: set }, data: { setId: set },
success: function (result) { success: function (result) {
if (result != null) { if (result != null) {
$('#name').val(result.item1.name); $('#name').val(result.item1.name);
$('#cost').val(result.item1.cost); $('#cost').val(result.item1.cost);
$('#dateCreate').val(result.item1.dateCreate); $('#dateCreate').val(new Date(result.item1.dateCreate).toISOString().split(".")[0].substr(0, 16));
$('#furnitureModules-table').html(result.item2); $('#furnitureModules-table').html(result.item2);
} }
} }

View File

@ -6,10 +6,9 @@
<title>@ViewData["Title"] - FurnitureAssemblyWorkerClientApp</title> <title>@ViewData["Title"] - FurnitureAssemblyWorkerClientApp</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" /> <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/BlacksmithWorkshopClientApp.styles.css" asp-append-version="true" /> <link rel="stylesheet" href="~/FurnitureAssemblyClientApp.styles.css" asp-append-version="true" />
</head> </head>
<body> <body>
@await RenderSectionAsync("Scripts", required: false)
<header> <header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3"> <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container-fluid"> <div class="container-fluid">
@ -35,9 +34,18 @@
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Sets">Гарнитуры</a> <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Sets">Гарнитуры</a>
</li> </li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="FurnitureModules">Мебельные модули</a>
</li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="ListSetsFurnitureModulesToFile">Получение списка</a> <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="ListSetsFurnitureModulesToFile">Получение списка</a>
</li> </li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="AddFurnitureModulesInSet">Добавление мебельных модулей в гарнитуру</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Orders">Заказы</a>
</li>
</ul> </ul>
</div> </div>
</div> </div>
@ -57,5 +65,6 @@
<script src="~/lib/jquery/dist/jquery.min.js"></script> <script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script> <script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body> </body>
</html> </html>