Done reports

This commit is contained in:
ShabOl 2024-05-29 17:52:23 +04:00
parent ed4f11ab91
commit 5616f0eaa0
23 changed files with 546 additions and 136 deletions

View File

@ -1,6 +1,7 @@
using ComputerShopContracts.BindingModels; using ComputerShopBusinessLogic.OfficePackage;
using ComputerShopBusinessLogic.OfficePackage.HelperModels;
using ComputerShopContracts.BindingModels;
using ComputerShopContracts.BusinessLogicContracts; using ComputerShopContracts.BusinessLogicContracts;
using ComputerShopContracts.SearchModels;
using ComputerShopContracts.StorageContracts; using ComputerShopContracts.StorageContracts;
using ComputerShopContracts.ViewModels; using ComputerShopContracts.ViewModels;
@ -10,35 +11,70 @@ namespace ComputerShopBusinessLogic.BusinessLogics
{ {
private readonly IComponentStorage _componentStorage; private readonly IComponentStorage _componentStorage;
public ReportGuarantorLogic(IComponentStorage ComponentStorage) private readonly AbstractSaveToExcelGuarantor _saveToExcel;
private readonly AbstractSaveToWordGuarantor _saveToWord;
private readonly AbstractSaveToPdfGuarantor _saveToPdf;
public ReportGuarantorLogic(IComponentStorage ComponentStorage,
AbstractSaveToExcelGuarantor SaveToExcel, AbstractSaveToWordGuarantor SaveToWord, AbstractSaveToPdfGuarantor SaveToPdf)
{ {
_componentStorage = ComponentStorage; _componentStorage = ComponentStorage;
_saveToExcel = SaveToExcel;
_saveToWord = SaveToWord;
_saveToPdf = SaveToPdf;
} }
/// <summary> /// <summary>
/// Получение отчёта для Word или Excel /// Получение отчёта для Word или Excel
/// </summary> /// </summary>
public List<ReportComponentWithShipmentViewModel> GetReportComponentsWithShipments(List<ComponentSearchModel> SelectedComponents) public List<ReportComponentWithShipmentViewModel> GetReportComponentsWithShipments(List<int> SelectedComponentIds)
{ {
return _componentStorage.GetComponentsWithShipments(SelectedComponents); return _componentStorage.GetComponentsWithShipments(SelectedComponentIds);
} }
/// <summary> /// <summary>
/// Получение отчёта для отправки на почту /// Получение отчёта для отправки на почту
/// </summary> /// </summary>
public List<ReportComponentByDateViewModel> GetReportComponentsByRequestDate(UserSearchModel CurrentUser, ReportBindingModel Report) public List<ReportComponentByDateViewModel> GetReportComponentsByRequestDate(ReportBindingModel Model)
{ {
return _componentStorage.GetComponentsByShipmentDate(Report, CurrentUser); return _componentStorage.GetComponentsByShipmentDate(Model);
} }
public void SaveReportToWordFile(ReportBindingModel Model) public void SaveReportToWordFile(ReportBindingModel Model)
{ {
throw new NotImplementedException(); _saveToWord.CreateDoc(new WordInfoGuarantor
{
Filename = Model.FileName,
Title = "Список сборок по выбранным заказам",
ShipmentComponents = GetReportComponentsWithShipments(Model.Ids!)
}); ;
} }
public void SaveReportToExcelFile(ReportBindingModel Model) public void SaveReportToExcelFile(ReportBindingModel Model)
{ {
throw new NotImplementedException(); _saveToExcel.CreateReport(new ExcelInfoGuarantor
{
Filename = Model.FileName,
ShipmentComponents = GetReportComponentsWithShipments(Model.Ids!)
});
}
public void SaveReportComponentsByRequestDateToPdfFile(ReportBindingModel Model)
{
if (Model.DateFrom == null)
throw new ArgumentException("Дата начала не задана");
if (Model.DateTo == null)
throw new ArgumentException("Дата окончания не задана");
_saveToPdf.CreateDoc(new PdfInfoGuarantor
{
Filename = Model.FileName,
Title = "Отчёт по комплектующим за период",
DateFrom = Model.DateFrom!.Value,
DateTo = Model.DateTo!.Value,
ComponentsByDate = GetReportComponentsByRequestDate(Model)
});
} }
} }
} }

View File

@ -1,6 +1,5 @@
using ComputerShopBusinessLogic.OfficePackage.HelperModels; using ComputerShopBusinessLogic.OfficePackage.HelperEnums;
using GarmentFactoryBusinessLogic.OfficePackage.HelperEnums; using ComputerShopBusinessLogic.OfficePackage.HelperModels;
using GarmentFactoryBusinessLogic.OfficePackage.HelperModels;
namespace ComputerShopBusinessLogic.OfficePackage namespace ComputerShopBusinessLogic.OfficePackage
{ {
@ -98,20 +97,34 @@ namespace ComputerShopBusinessLogic.OfficePackage
Text = ComponentWithShipments.ComponentCost.ToString(), Text = ComponentWithShipments.ComponentCost.ToString(),
StyleInfo = ExcelStyleInfoType.Text StyleInfo = ExcelStyleInfoType.Text
}); });
InsertCellInWorksheet(new ExcelCellParameters InsertCellInWorksheet(new ExcelCellParameters
{ {
ColumnName = "D", ColumnName = "D",
RowIndex = RowIndex, RowIndex = RowIndex,
Text = Shipment.ProviderName, Text = Shipment.ProviderName,
StyleInfo = ExcelStyleInfoType.Text StyleInfo = ExcelStyleInfoType.Text
}); });
InsertCellInWorksheet(new ExcelCellParameters InsertCellInWorksheet(new ExcelCellParameters
{ {
ColumnName = "E", ColumnName = "E",
RowIndex = RowIndex, RowIndex = RowIndex,
Text = Shipment.ShipmentDate.ToShortDateString(), Text = Shipment.ShipmentDate.ToShortDateString(),
StyleInfo = ExcelStyleInfoType.Text StyleInfo = ExcelStyleInfoType.Text
}); });
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "F",
RowIndex = RowIndex,
Text = Shipment.ProductName,
StyleInfo = ExcelStyleInfoType.Text
});
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "G",
RowIndex = RowIndex,
Text = Shipment.ProductPrice.ToString(),
StyleInfo = ExcelStyleInfoType.Text
});
} }
ShipmentIndex++; ShipmentIndex++;
if (ShipmentIndex < ShipmentsNum && !string.IsNullOrEmpty(Shipment.ProviderName)) if (ShipmentIndex < ShipmentsNum && !string.IsNullOrEmpty(Shipment.ProviderName))

View File

@ -1,6 +1,5 @@
using ComputerShopBusinessLogic.OfficePackage.HelperModels; using ComputerShopBusinessLogic.OfficePackage.HelperEnums;
using GarmentFactoryBusinessLogic.OfficePackage.HelperEnums; using ComputerShopBusinessLogic.OfficePackage.HelperModels;
using GarmentFactoryBusinessLogic.OfficePackage.HelperModels;
namespace ComputerShopBusinessLogic.OfficePackage namespace ComputerShopBusinessLogic.OfficePackage
{ {
@ -37,8 +36,6 @@ namespace ComputerShopBusinessLogic.OfficePackage
ComponentByDate.DateRequest.ToShortDateString(), ComponentByDate.DateRequest.ToShortDateString(),
ComponentByDate.ClientFIO, ComponentByDate.ClientFIO,
}, },
Style = "Normal",
ParagraphAlignment = PdfParagraphAlignmentType.Left
}); });
} }

View File

@ -1,6 +1,5 @@
using ComputerShopBusinessLogic.OfficePackage.HelperModels; using ComputerShopBusinessLogic.OfficePackage.HelperEnums;
using GarmentFactoryBusinessLogic.OfficePackage.HelperEnums; using ComputerShopBusinessLogic.OfficePackage.HelperModels;
using GarmentFactoryBusinessLogic.OfficePackage.HelperModels;
namespace ComputerShopBusinessLogic.OfficePackage namespace ComputerShopBusinessLogic.OfficePackage
{ {
@ -26,9 +25,9 @@ namespace ComputerShopBusinessLogic.OfficePackage
{ {
Texts = new List<(string, WordTextProperties)> Texts = new List<(string, WordTextProperties)>
{ {
("Комплектующая №" + ComponentWithShipments.ComponentId.ToString() + " - " + ("Комплектующая №" + ComponentWithShipments.ComponentId.ToString() + " - " +
ComponentWithShipments.ComponentName.ToString() + " - " + ComponentWithShipments.ComponentName.ToString() + " - " +
ComponentWithShipments.ComponentCost.ToString() + " - ", new WordTextProperties {Size = "24", Bold=true}) ComponentWithShipments.ComponentCost.ToString() + ":", new WordTextProperties {Size = "24", Bold=true})
}, },
TextProperties = new WordTextProperties TextProperties = new WordTextProperties
{ {
@ -45,7 +44,9 @@ namespace ComputerShopBusinessLogic.OfficePackage
{ {
Texts = new List<(string, WordTextProperties)> { Texts = new List<(string, WordTextProperties)> {
(Shipment.ProviderName + " - ", new WordTextProperties { Size = "24" }), (Shipment.ProviderName + " - ", new WordTextProperties { Size = "24" }),
(Shipment.ShipmentDate.ToShortDateString() + " - ", new WordTextProperties { Size = "24" }) (Shipment.ShipmentDate.ToShortDateString() + " - ", new WordTextProperties { Size = "24" }),
(Shipment.ProductName + " - ", new WordTextProperties { Size = "24" }),
(Shipment.ProductPrice.ToString(), new WordTextProperties { Size = "24" }),
}, },
TextProperties = new WordTextProperties TextProperties = new WordTextProperties
{ {
@ -54,7 +55,6 @@ namespace ComputerShopBusinessLogic.OfficePackage
} }
}); });
} }
} }
} }

View File

@ -4,19 +4,19 @@ namespace ComputerShopBusinessLogic.OfficePackage.HelperModels
{ {
public class ExcelInfoGuarantor : DocumentInfo public class ExcelInfoGuarantor : DocumentInfo
{ {
public string Title1 { get; set; } = "ID заказа"; public string Title1 { get; set; } = "ID комплектующей";
public string Title2 { get; set; } = "Дата заказа"; public string Title2 { get; set; } = "Наименование";
public string Title3 { get; set; } = "Стоимость заказа"; public string Title3 { get; set; } = "Стоимость комплектующей";
public string Title4 { get; set; } = "Статус заказа"; public string Title4 { get; set; } = "Поставщик партии";
public string Title5 { get; set; } = "Название сборки"; public string Title5 { get; set; } = "Дата поставки";
public string Title6 { get; set; } = "Категория сборки"; public string Title6 { get; set; } = "Товар";
public string Title7 { get; set; } = "Цена сборки"; public string Title7 { get; set; } = "Цена товара";
public List<ReportComponentWithShipmentViewModel> ShipmentComponents { get; set; } = new(); public List<ReportComponentWithShipmentViewModel> ShipmentComponents { get; set; } = new();
} }

View File

@ -1,11 +1,10 @@
using ComputerShopBusinessLogic.OfficePackage.HelperModels; using ComputerShopBusinessLogic.OfficePackage.HelperEnums;
using ComputerShopBusinessLogic.OfficePackage.HelperModels;
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Office2010.Excel; using DocumentFormat.OpenXml.Office2010.Excel;
using DocumentFormat.OpenXml.Office2013.Excel; using DocumentFormat.OpenXml.Office2013.Excel;
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml.Spreadsheet;
using GarmentFactoryBusinessLogic.OfficePackage.HelperEnums;
using GarmentFactoryBusinessLogic.OfficePackage.HelperModels;
namespace ComputerShopBusinessLogic.OfficePackage.Implements namespace ComputerShopBusinessLogic.OfficePackage.Implements
{ {
@ -171,12 +170,12 @@ namespace ComputerShopBusinessLogic.OfficePackage.Implements
lstColumns = new Columns(); lstColumns = new Columns();
} }
lstColumns.Append(new Column() { Min = 1, Max = 1, Width = 10, CustomWidth = true }); lstColumns.Append(new Column() { Min = 1, Max = 1, Width = 20, CustomWidth = true });
lstColumns.Append(new Column() { Min = 2, Max = 2, Width = 10, CustomWidth = true }); lstColumns.Append(new Column() { Min = 2, Max = 2, Width = 20, CustomWidth = true });
lstColumns.Append(new Column() { Min = 3, Max = 3, Width = 20, CustomWidth = true }); lstColumns.Append(new Column() { Min = 3, Max = 3, Width = 20, CustomWidth = true });
lstColumns.Append(new Column() { Min = 4, Max = 4, Width = 10, CustomWidth = true }); lstColumns.Append(new Column() { Min = 4, Max = 4, Width = 20, CustomWidth = true });
lstColumns.Append(new Column() { Min = 5, Max = 5, Width = 20, CustomWidth = true }); lstColumns.Append(new Column() { Min = 5, Max = 5, Width = 20, CustomWidth = true });
lstColumns.Append(new Column() { Min = 6, Max = 6, Width = 20, CustomWidth = true }); lstColumns.Append(new Column() { Min = 6, Max = 6, Width = 25, CustomWidth = true });
lstColumns.Append(new Column() { Min = 7, Max = 7, Width = 20, CustomWidth = true }); lstColumns.Append(new Column() { Min = 7, Max = 7, Width = 20, CustomWidth = true });
worksheetPart.Worksheet.InsertAt(lstColumns, 0); worksheetPart.Worksheet.InsertAt(lstColumns, 0);

View File

@ -1,6 +1,5 @@
using ComputerShopBusinessLogic.OfficePackage.HelperModels; using ComputerShopBusinessLogic.OfficePackage.HelperEnums;
using GarmentFactoryBusinessLogic.OfficePackage.HelperEnums; using ComputerShopBusinessLogic.OfficePackage.HelperModels;
using GarmentFactoryBusinessLogic.OfficePackage.HelperModels;
using MigraDoc.DocumentObjectModel; using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Tables; using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.Rendering; using MigraDoc.Rendering;
@ -28,7 +27,7 @@ namespace ComputerShopBusinessLogic.OfficePackage.Implements
{ {
var style = document.Styles["Normal"]; var style = document.Styles["Normal"];
style.Font.Name = "Times New Roman"; style.Font.Name = "Times New Roman";
style.Font.Size = 14; style.Font.Size = 10;
style = document.Styles.AddStyle("NormalTitle", "Normal"); style = document.Styles.AddStyle("NormalTitle", "Normal");
style.Font.Bold = true; style.Font.Bold = true;
@ -37,7 +36,8 @@ namespace ComputerShopBusinessLogic.OfficePackage.Implements
protected override void CreatePdf(HelperModels.DocumentInfo Info) protected override void CreatePdf(HelperModels.DocumentInfo Info)
{ {
_document = new Document(); _document = new Document();
DefineStyles(_document); _document.DefaultPageSetup.Orientation = Orientation.Landscape;
DefineStyles(_document);
_section = _document.AddSection(); _section = _document.AddSection();
} }

View File

@ -1,9 +1,8 @@
using ComputerShopBusinessLogic.OfficePackage.HelperModels; using ComputerShopBusinessLogic.OfficePackage.HelperEnums;
using ComputerShopBusinessLogic.OfficePackage.HelperModels;
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing; using DocumentFormat.OpenXml.Wordprocessing;
using GarmentFactoryBusinessLogic.OfficePackage.HelperEnums;
using GarmentFactoryBusinessLogic.OfficePackage.HelperModels;
namespace ComputerShopBusinessLogic.OfficePackage.Implements namespace ComputerShopBusinessLogic.OfficePackage.Implements
{ {

View File

@ -1,5 +1,4 @@
using ComputerShopContracts.BindingModels; using ComputerShopContracts.BindingModels;
using ComputerShopContracts.SearchModels;
using ComputerShopContracts.ViewModels; using ComputerShopContracts.ViewModels;
namespace ComputerShopContracts.BusinessLogicContracts namespace ComputerShopContracts.BusinessLogicContracts
@ -9,15 +8,17 @@ namespace ComputerShopContracts.BusinessLogicContracts
/// <summary> /// <summary>
/// Получение отчёта для Word или Excel /// Получение отчёта для Word или Excel
/// </summary> /// </summary>
List<ReportComponentWithShipmentViewModel> GetReportComponentsWithShipments(List<ComponentSearchModel> SelectedComponents); List<ReportComponentWithShipmentViewModel> GetReportComponentsWithShipments(List<int> SelectedComponentIds);
/// <summary> /// <summary>
/// Получение отчёта для отправки на почту /// Получение отчёта для отправки на почту
/// </summary> /// </summary>
List<ReportComponentByDateViewModel> GetReportComponentsByRequestDate(UserSearchModel CurrentUser, ReportBindingModel Report); List<ReportComponentByDateViewModel> GetReportComponentsByRequestDate(ReportBindingModel Model);
void SaveReportToWordFile(ReportBindingModel Model); void SaveReportToWordFile(ReportBindingModel Model);
void SaveReportToExcelFile(ReportBindingModel Model); void SaveReportToExcelFile(ReportBindingModel Model);
void SaveReportComponentsByRequestDateToPdfFile(ReportBindingModel Model);
} }
} }

View File

@ -18,8 +18,8 @@ namespace ComputerShopContracts.StorageContracts
ComponentViewModel? Delete(ComponentBindingModel Model); ComponentViewModel? Delete(ComponentBindingModel Model);
List<ReportComponentWithShipmentViewModel> GetComponentsWithShipments(List<ComponentSearchModel> Models); List<ReportComponentWithShipmentViewModel> GetComponentsWithShipments(List<int> ComponentIds);
List<ReportComponentByDateViewModel> GetComponentsByShipmentDate(ReportBindingModel ReportModel, UserSearchModel UserModel); List<ReportComponentByDateViewModel> GetComponentsByShipmentDate(ReportBindingModel ReportModel);
} }
} }

View File

@ -88,7 +88,7 @@ namespace ComputerShopDatabaseImplement.Implements
return ExistingComponent.ViewModel; return ExistingComponent.ViewModel;
} }
public List<ReportComponentWithShipmentViewModel> GetComponentsWithShipments(List<ComponentSearchModel> Models) public List<ReportComponentWithShipmentViewModel> GetComponentsWithShipments(List<int> ComponentIds)
{ {
using var Context = new ComputerShopDatabase(); using var Context = new ComputerShopDatabase();
@ -97,7 +97,7 @@ namespace ComputerShopDatabaseImplement.Implements
.ThenInclude(x => x.Product) .ThenInclude(x => x.Product)
.ThenInclude(x => x.Shipment) .ThenInclude(x => x.Shipment)
.Where(x => .Where(x =>
Models.Select(x => x.Id).Contains(x.Id) // Компонент, указанный пользователем, ComponentIds.Contains(x.Id) // Компонент, указанный пользователем,
&& x.ProductComponents.Any(y => y.Product.Shipment != null)) // который содержится в товаре, имеющем партию товаров && x.ProductComponents.Any(y => y.Product.Shipment != null)) // который содержится в товаре, имеющем партию товаров
.ToList() .ToList()
.Select(x => new ReportComponentWithShipmentViewModel .Select(x => new ReportComponentWithShipmentViewModel
@ -106,18 +106,18 @@ namespace ComputerShopDatabaseImplement.Implements
ComponentName = x.ComponentName, ComponentName = x.ComponentName,
ComponentCost = x.Cost, ComponentCost = x.Cost,
Shipments = x.ProductComponents Shipments = x.ProductComponents
.Select(y => (0, y.Product.ProductName, y.Product.Price, y.Product.Shipment!.ProviderName, y.Product.Shipment.DateShipment)) .Select(y => (y.Product.ProductName, y.Product.Price, y.Product.Shipment!.ProviderName, y.Product.Shipment.DateShipment))
.ToList(), .ToList(),
}) })
.ToList(); .ToList();
} }
public List<ReportComponentByDateViewModel> GetComponentsByShipmentDate(ReportBindingModel ReportModel, UserSearchModel UserModel) public List<ReportComponentByDateViewModel> GetComponentsByShipmentDate(ReportBindingModel ReportModel)
{ {
using var Context = new ComputerShopDatabase(); using var Context = new ComputerShopDatabase();
return Context.Components return Context.Components
.Where(c => c.UserId == UserModel.Id) .Where(c => c.UserId == ReportModel.UserId)
.Include(c => c.AssemblyComponents) .Include(c => c.AssemblyComponents)
.ThenInclude(ac => ac.Assembly) .ThenInclude(ac => ac.Assembly)
.ThenInclude(a => a.Requests.Where(r => r.DateRequest >= ReportModel.DateFrom && r.DateRequest <= ReportModel.DateTo)) .ThenInclude(a => a.Requests.Where(r => r.DateRequest >= ReportModel.DateFrom && r.DateRequest <= ReportModel.DateTo))

View File

@ -11,7 +11,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\ComputerShopBusinessLogic\ComputerShopBusinessLogic.csproj" />
<ProjectReference Include="..\ComputerShopContracts\ComputerShopContracts.csproj" /> <ProjectReference Include="..\ComputerShopContracts\ComputerShopContracts.csproj" />
<ProjectReference Include="..\ComputerShopDatabaseImplement\ComputerShopDatabaseImplement.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -1,4 +1,5 @@
using ComputerShopContracts.BindingModels; using ComputerShopContracts.BindingModels;
using ComputerShopContracts.BusinessLogicContracts;
using ComputerShopContracts.ViewModels; using ComputerShopContracts.ViewModels;
using ComputerShopGuarantorApp.Models; using ComputerShopGuarantorApp.Models;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -9,10 +10,12 @@ namespace ComputerShopGuarantorApp.Controllers
public class HomeController : Controller public class HomeController : Controller
{ {
private readonly ILogger<HomeController> _logger; private readonly ILogger<HomeController> _logger;
private readonly IReportGuarantorLogic _reportLogic;
public HomeController(ILogger<HomeController> logger) public HomeController(ILogger<HomeController> logger, IReportGuarantorLogic ReportLogic)
{ {
_logger = logger; _logger = logger;
_reportLogic = ReportLogic;
} }
public IActionResult Index() public IActionResult Index()
@ -89,7 +92,8 @@ namespace ComputerShopGuarantorApp.Controllers
Response.Redirect("../Components"); Response.Redirect("../Components");
} }
public void DeleteComponent(int Id) [HttpPost]
public void DeleteComponent(int Id)
{ {
ApiUser.PostRequest($"api/component/deletecomponent", new ComponentBindingModel { Id = Id }); ApiUser.PostRequest($"api/component/deletecomponent", new ComponentBindingModel { Id = Id });
Response.Redirect("../Components"); Response.Redirect("../Components");
@ -172,6 +176,7 @@ namespace ComputerShopGuarantorApp.Controllers
Response.Redirect("../Assemblies"); Response.Redirect("../Assemblies");
} }
[HttpPost]
public void DeleteAssembly(int Id) public void DeleteAssembly(int Id)
{ {
ApiUser.PostRequest($"api/assembly/deleteassembly", new AssemblyBindingModel { Id = Id }); ApiUser.PostRequest($"api/assembly/deleteassembly", new AssemblyBindingModel { Id = Id });
@ -259,6 +264,7 @@ namespace ComputerShopGuarantorApp.Controllers
Response.Redirect("../Products"); Response.Redirect("../Products");
} }
[HttpPost]
public void DeleteProduct(int Id) public void DeleteProduct(int Id)
{ {
ApiUser.PostRequest($"api/product/deleteproduct", new ProductBindingModel { Id = Id }); ApiUser.PostRequest($"api/product/deleteproduct", new ProductBindingModel { Id = Id });
@ -269,17 +275,180 @@ namespace ComputerShopGuarantorApp.Controllers
* Отчеты * Отчеты
*-----------------------------------------------------*/ *-----------------------------------------------------*/
public IActionResult ReportComponentsWithShipments()
{
if (ApiUser.User == null)
return Redirect("~/Home/Enter");
ViewBag.Components = ApiUser.GetRequest<List<ComponentViewModel>>($"api/component/getcomponents?userId={ApiUser.User.Id}");
return View();
}
// ОСТАЛЬНОЕ ОСТАЛЬНОЕ ОСТАЛЬНОЕ ОСТАЛЬНОЕ ОСТАЛЬНОЕ ОСТАЛЬНОЕ ОСТАЛЬНОЕ public IActionResult GetWordFile()
{
return PhysicalFile("C:\\!КУРСОВАЯ\\Партии товаров по выбранным компонентам.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "Партии товаров по выбранным компонентам.docx");
}
public IActionResult GetExcelFile()
{
return PhysicalFile("C:\\!КУРСОВАЯ\\Партии товаров по выбранным компонентам.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Партии товаров по выбранным компонентам.xlsx");
}
[HttpPost]
public IActionResult ReportComponentsWithShipments(int[] ComponentIds, string Type)
{
if (ApiUser.User == null)
Redirect("Index");
if (ComponentIds.Length > 0 && !string.IsNullOrEmpty(Type))
{
if (Type == "docx")
{
ApiUser.PostRequest("api/component/createreporttowordfile", new ReportBindingModel
{
Ids = ComponentIds.ToList(),
FileName = "C:\\!КУРСОВАЯ\\Партии товаров по выбранным компонентам.docx"
});
return GetWordFile();
}
if (Type == "xlsx")
{
ApiUser.PostRequest("api/component/createreporttoexcelfile", new ReportBindingModel
{
Ids = ComponentIds.ToList(),
FileName = "C:\\!КУРСОВАЯ\\Партии товаров по выбранным компонентам.xlsx"
});
return GetExcelFile();
}
}
return Redirect("Index");
}
public IActionResult ReportComponentsByRequestDate()
{
if (ApiUser.User == null)
return Redirect("~/Home/Enter");
return View();
}
[HttpGet]
public string GetComponentsByRequestDate(DateTime DateFrom, DateTime DateTo)
{
if (ApiUser.User == null)
throw new Exception("Вход только авторизованным");
if (DateFrom != DateTime.MinValue && DateTo != DateTime.MinValue)
{
List<ReportComponentByDateViewModel> Result;
Result = _reportLogic.GetReportComponentsByRequestDate(new ReportBindingModel
{
UserId = ApiUser.User.Id,
DateFrom = DateFrom,
DateTo = DateTo
});
string Table = string.Empty;
Table += $"<table class=\"u-table-entity\">";
Table += "<colgroup>";
// ID комплектующей
Table += "<col width=\"7%\" />";
// Название
Table += "<col width=\"8%\" />";
// Стоимость
Table += "<col width=\"8%\" />";
// ID сборки
Table += "<col width=\"7%\" />";
// Название сборки
Table += "<col width=\"13%\" />";
// Цена сборки
Table += "<col width=\"10%\" />";
// Категория
Table += "<col width=\"8%\" />";
// ID заявки
Table += "<col width=\"8%\" />";
// Дата заявки
Table += "<col width=\"10%\" />";
// ФИО клиента
Table += "<col width=\"12%\" />";
Table += "</colgroup>";
Table += "<thead class=\"u-custom-color-1 u-table-header u-table-header-1\">";
Table += "<tr style=\"height: 31px\">";
Table += $"<th class=\"u-border-1 u-border-grey-50 u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">ID комплектующей</th>";
Table += $"<th class=\"u-border-1 u-border-grey-50 u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">Название</th>";
Table += $"<th class=\"u-border-1 u-border-grey-50 u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">Стоимость</th>";
Table += $"<th class=\"u-border-1 u-border-grey-50 u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">ID сборки</th>";
Table += $"<th class=\"u-border-1 u-border-grey-50 u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">Название сборки</th>";
Table += $"<th class=\"u-border-1 u-border-grey-50 u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">Цена сборки</th>";
Table += $"<th class=\"u-border-1 u-border-grey-50 u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">Категория</th>";
Table += $"<th class=\"u-border-1 u-border-grey-50 u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">ID заявки</th>";
Table += $"<th class=\"u-border-1 u-border-grey-50 u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">Дата заявки</th>";
Table += $"<th class=\"u-border-1 u-border-grey-50 u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">Клиент</th>";
Table += "</tr>";
Table += "</thead>";
Table += "<tbody class=\"u-table-body\">";
foreach (var ComponentByDate in Result)
{
Table += "<tr style=\"height: 75px\">";
Table += $"<td class=\"u-border-1 u-border-grey-40 u-border-no-left u-border-no-right u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">{ComponentByDate.ComponentId}</td>";
Table += $"<td class=\"u-border-1 u-border-grey-40 u-border-no-left u-border-no-right u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">{ComponentByDate.ComponentName}</td>";
Table += $"<td class=\"u-border-1 u-border-grey-40 u-border-no-left u-border-no-right u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">{ComponentByDate.ComponentCost}</td>";
Table += $"<td class=\"u-border-1 u-border-grey-40 u-border-no-left u-border-no-right u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">{ComponentByDate.AssemblyId}</td>";
Table += $"<td class=\"u-border-1 u-border-grey-40 u-border-no-left u-border-no-right u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">{ComponentByDate.AssemblyName}</td>";
Table += $"<td class=\"u-border-1 u-border-grey-40 u-border-no-left u-border-no-right u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">{ComponentByDate.AssemblyPrice}</td>";
Table += $"<td class=\"u-border-1 u-border-grey-40 u-border-no-left u-border-no-right u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">{ComponentByDate.AssemblyCategory}</td>";
Table += $"<td class=\"u-border-1 u-border-grey-40 u-border-no-left u-border-no-right u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">{ComponentByDate.RequestId}</td>";
Table += $"<td class=\"u-border-1 u-border-grey-40 u-border-no-left u-border-no-right u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">{ComponentByDate.DateRequest.ToShortDateString()}</td>";
Table += $"<td class=\"u-border-1 u-border-grey-40 u-border-no-left u-border-no-right u-table-cell\" style=\"text-align:center; border: 1px solid black; border-collapse:collapse\">{ComponentByDate.ClientFIO}</td>";
Table += "</tr>";
}
Table += "</table>";
return Table;
}
return "";
}
[HttpPost]
public void ReportComponentsByRequestDate(DateTime DateFrom, DateTime DateTo)
{
if (ApiUser.User == null)
{
throw new Exception("Вход только авторизованным");
}
if (DateFrom != DateTime.MinValue && DateTo != DateTime.MinValue)
{
ApiUser.PostRequest("api/component/createreporttopdffile", new ReportBindingModel
{
FileName = "C:\\!КУРСОВАЯ\\Отчёт за период.pdf",
DateFrom = DateFrom,
DateTo = DateTo,
UserId = ApiUser.User.Id
});
ApiUser.PostRequest("api/component/sendpdftomail", new MailSendInfoBindingModel
{
MailAddress = ApiUser.User.Email,
Subject = "Отчет за период",
Text = "Отчет по компонентам с " + DateFrom.ToShortDateString() + " по " + DateTo.ToShortDateString()
});
}
Response.Redirect("Index");
}
[HttpGet] [HttpGet]
public IActionResult Privacy() public IActionResult Privacy()
{ {
if (ApiUser.User == null) if (ApiUser.User == null)
{
return Redirect("~/Home/Enter"); return Redirect("~/Home/Enter");
}
return View(ApiUser.User); return View(ApiUser.User);
} }
@ -287,13 +456,11 @@ namespace ComputerShopGuarantorApp.Controllers
public void Privacy(string Login, string Password, string Email) public void Privacy(string Login, string Password, string Email)
{ {
if (ApiUser.User == null) if (ApiUser.User == null)
{
throw new Exception("Вход только авторизованным"); throw new Exception("Вход только авторизованным");
}
if (string.IsNullOrEmpty(Login) || string.IsNullOrEmpty(Password) || string.IsNullOrEmpty(Email)) if (string.IsNullOrEmpty(Login) || string.IsNullOrEmpty(Password) || string.IsNullOrEmpty(Email))
{
throw new Exception("Введите логин, пароль и почту"); throw new Exception("Введите логин, пароль и почту");
}
ApiUser.PostRequest("api/user/updatedata", new UserBindingModel ApiUser.PostRequest("api/user/updatedata", new UserBindingModel
{ {
Id = ApiUser.User.Id, Id = ApiUser.User.Id,
@ -305,6 +472,7 @@ namespace ComputerShopGuarantorApp.Controllers
ApiUser.User.Login = Login; ApiUser.User.Login = Login;
ApiUser.User.Password = Password; ApiUser.User.Password = Password;
ApiUser.User.Email = Email; ApiUser.User.Email = Email;
Response.Redirect("Index"); Response.Redirect("Index");
} }
@ -323,14 +491,12 @@ namespace ComputerShopGuarantorApp.Controllers
public void Enter(string Login, string Password) public void Enter(string Login, string Password)
{ {
if (string.IsNullOrEmpty(Login) || string.IsNullOrEmpty(Password)) if (string.IsNullOrEmpty(Login) || string.IsNullOrEmpty(Password))
{
throw new Exception("Введите логин и пароль"); throw new Exception("Введите логин и пароль");
}
ApiUser.User = ApiUser.GetRequest<UserViewModel>($"api/user/loginguarantor?login={Login}&password={Password}"); ApiUser.User = ApiUser.GetRequest<UserViewModel>($"api/user/loginguarantor?login={Login}&password={Password}");
if (ApiUser.User == null) if (ApiUser.User == null)
{
throw new Exception("Неверный логин или пароль"); throw new Exception("Неверный логин или пароль");
}
Response.Redirect("Index"); Response.Redirect("Index");
} }
@ -343,9 +509,8 @@ namespace ComputerShopGuarantorApp.Controllers
public void Register(string Login, string Password, string Email) public void Register(string Login, string Password, string Email)
{ {
if (string.IsNullOrEmpty(Login) || string.IsNullOrEmpty(Password) || string.IsNullOrEmpty(Email)) if (string.IsNullOrEmpty(Login) || string.IsNullOrEmpty(Password) || string.IsNullOrEmpty(Email))
{
throw new Exception("Введите логин, пароль и почту"); throw new Exception("Введите логин, пароль и почту");
}
ApiUser.PostRequest("api/user/registerguarantor", new UserBindingModel ApiUser.PostRequest("api/user/registerguarantor", new UserBindingModel
{ {
Login = Login, Login = Login,
@ -353,12 +518,18 @@ namespace ComputerShopGuarantorApp.Controllers
Email = Email Email = Email
}); });
ApiUser.User = ApiUser.GetRequest<UserViewModel>($"api/user/loginguarantor?login={Login}&password={Password}"); ApiUser.User = ApiUser.GetRequest<UserViewModel>($"api/user/loginguarantor?login={Login}&password={Password}");
if (ApiUser.User == null)
{ if (ApiUser.User == null)
Response.Redirect("Enter"); Response.Redirect("Enter");
}
Response.Redirect("Index"); Response.Redirect("Index");
return; return;
} }
public void Logout()
{
ApiUser.User = null;
Response.Redirect("Index");
}
} }
} }

View File

@ -1,7 +1,21 @@
using ComputerShopBusinessLogic.BusinessLogics;
using ComputerShopBusinessLogic.OfficePackage;
using ComputerShopBusinessLogic.OfficePackage.Implements;
using ComputerShopContracts.BusinessLogicContracts;
using ComputerShopContracts.StorageContracts;
using ComputerShopDatabaseImplement.Implements;
using ComputerShopGuarantorApp; using ComputerShopGuarantorApp;
var Builder = WebApplication.CreateBuilder(args); var Builder = WebApplication.CreateBuilder(args);
//Builder.Services.AddTransient<IUserStorage, UserStorage>();
Builder.Services.AddTransient<IComponentStorage, ComponentStorage>();
Builder.Services.AddTransient<IReportGuarantorLogic, ReportGuarantorLogic>();
Builder.Services.AddTransient<AbstractSaveToWordGuarantor, SaveToWordGuarantor>();
Builder.Services.AddTransient<AbstractSaveToExcelGuarantor, SaveToExcelGuarantor>();
Builder.Services.AddTransient<AbstractSaveToPdfGuarantor, SaveToPdfGuarantor>();
// Add services to the container. // Add services to the container.
Builder.Services.AddControllersWithViews(); Builder.Services.AddControllersWithViews();

View File

@ -20,23 +20,23 @@
<form method="post"> <form method="post">
<div class="form-group"> <div class="form-group">
<label class="mb-3">Название:</label> <label class="mb-1">Название:</label>
<input type="text" name="assemblyName" class="mb-3 form-control" value="@(Model?.AssemblyName ?? "")"> <input type="text" name="assemblyName" class="mb-3 form-control" value="@(Model?.AssemblyName ?? "")">
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="mb-3">Цена:</label> <label class="mb-1">Цена:</label>
<input type="number" name="price" class="mb-3 form-control" value="@(Model?.Price ?? 0.00)" readonly> <input type="number" name="price" class="mb-3 form-control" value="@(Model?.Price ?? 0.00)" readonly>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="mb-3">Категория:</label> <label class="mb-1">Категория:</label>
<input type="text" name="category" class="mb-3 form-control" value="@(Model?.Category ?? "")"> <input type="text" name="category" class="mb-3 form-control" value="@(Model?.Category ?? "")">
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="mb-3">Комплектующие:</label> <label class="mb-1">Комплектующие:</label>
<select name="componentIds" class="form-control border border-dark rounded" multiple size="6"> <select name="componentIds" class="form-control border border-dark rounded mb-3" multiple size="6">
@foreach (var Component in ViewBag.Components) @foreach (var Component in ViewBag.Components)
{ {
@if (Model != null && Model.AssemblyComponents.Values.Any(x => Component.Id == x.Id)) @if (Model != null && Model.AssemblyComponents.Values.Any(x => Component.Id == x.Id))
@ -51,11 +51,6 @@
</select> </select>
</div> </div>
<div class="row"> <input type="submit" value="Сохранить" class="btn btn-primary my-2" />
<div class="col-8"></div>
<div class="col-4">
<input type="submit" value="Сохранить" class="btn btn-primary" />
</div>
</div>
</form> </form>
</div> </div>

View File

@ -20,20 +20,15 @@
<form method="post"> <form method="post">
<div class="form-group"> <div class="form-group">
<label class="mb-3">Наименование:</label> <label class="mb-1">Наименование:</label>
<input type="text" name="componentName" class="mb-3 form-control" value="@(Model == null ? "" : Model.ComponentName)"> <input type="text" name="componentName" class="mb-3 form-control" value="@(Model == null ? "" : Model.ComponentName)">
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="mb-3">Стоимость:</label> <label class="mb-1">Стоимость:</label>
<input type="number" name="cost" class="mb-3 form-control" step="1" value="@(Model == null ? 0 : Model.Cost)"> <input type="number" name="cost" class="mb-3 form-control" step="1" value="@(Model == null ? 0 : Model.Cost)">
</div> </div>
<div class="row"> <input type="submit" value="Сохранить" class="btn btn-primary my-2" />
<div class="col-8"></div>
<div class="col-4">
<input type="submit" value="Сохранить" class="btn btn-primary" />
</div>
</div>
</form> </form>
</div> </div>

View File

@ -1,6 +1,34 @@
@{ @using ComputerShopContracts.ViewModels
ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>
<p>Use this page to detail your site's privacy policy.</p> @model UserViewModel
@{
ViewData["Title"] = "Профиль";
}
<div class="container-md py-4 mb-4">
<div class="text-center">
<h2>Профиль поручителя</h2>
<p class="lead text-muted">На этой странице можно изменить данные или выйти из аккаунта</p>
</div>
<form method="post">
<div class="form-group">
<label class="mb-1">Логин:</label>
<input type="text" name="login" class="mb-3 form-control" value="@Model.Login" />
</div>
<div class="form-group">
<label class="mb-1">Почта:</label>
<input type="email" name="email" class="mb-3 form-control" value="@Model.Email" />
</div>
<div class="form-group">
<label class="mb-1">Пароль:</label>
<input type="password" name="password" class="mb-3 form-control" value="@Model.Password" />
</div>
<div class="flex-column mt-2">
<input type="submit" value="Сохранить" class="btn btn-primary" />
<a class="btn btn-danger ms-2" asp-area="" asp-controller="Home" asp-action="Logout">Выйти</a>
</div>
</form>
</div>

View File

@ -20,23 +20,23 @@
<form method="post"> <form method="post">
<div class="form-group"> <div class="form-group">
<label class="mb-3">Название:</label> <label class="mb-1">Название:</label>
<input type="text" name="productName" class="mb-3 form-control" value="@(Model?.ProductName ?? "")"> <input type="text" name="productName" class="mb-3 form-control" value="@(Model?.ProductName ?? "")">
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="mb-3">Цена:</label> <label class="mb-1">Цена:</label>
<input type="number" name="price" class="mb-3 form-control" value="@(Model?.Price ?? 0.00)" readonly> <input type="number" name="price" class="mb-3 form-control" value="@(Model?.Price ?? 0.00)" readonly>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="mb-3">Гарантия:</label> <label class="mb-1">Гарантия:</label>
<input type="number" name="warranty" class="mb-3 form-control" value="@(Model?.Warranty ?? 0)"> <input type="number" name="warranty" class="mb-3 form-control" value="@(Model?.Warranty ?? 0)">
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="mb-3">Комплектующие:</label> <label class="mb-1">Комплектующие:</label>
<select name="componentIds" class="form-control border border-dark rounded" multiple size="6"> <select name="componentIds" class="form-control border border-dark rounded mb-3" multiple size="6">
@foreach (var Component in ViewBag.Components) @foreach (var Component in ViewBag.Components)
{ {
@if (Model != null && Model.ProductComponents.Values.Any(x => Component.Id == x.Id)) @if (Model != null && Model.ProductComponents.Values.Any(x => Component.Id == x.Id))
@ -52,8 +52,8 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="mb-3">Поставщик:</label> <label class="mb-1">Поставщик:</label>
<select name="shipmentId" class="form-control border border-dark rounded" size="4"> <select name="shipmentId" class="form-control border border-dark rounded mb-3" size="4">
@foreach (var Shipment in ViewBag.Shipments) @foreach (var Shipment in ViewBag.Shipments)
{ {
@if (Model != null && Model.ShipmentId == Shipment.Id) @if (Model != null && Model.ShipmentId == Shipment.Id)
@ -68,11 +68,6 @@
</select> </select>
</div> </div>
<div class="row"> <input type="submit" value="Сохранить" class="btn btn-primary my-2" />
<div class="col-8"></div>
<div class="col-4">
<input type="submit" value="Сохранить" class="btn btn-primary" />
</div>
</div>
</form> </form>
</div> </div>

View File

@ -0,0 +1,54 @@
@using ComputerShopContracts.ViewModels
@{
ViewData["Title"] = "Комплектующие по дате поставки";
}
<div class="container-md py-4 mb-4">
<div class="text-center">
<h2>Получение сведений за период по комплектующим</h2>
<p class="lead text-muted">Информация о комплектующих, которые указывались в сборках и заявках</p>
</div>
<form method="post">
<div class="form-group">
<label class="mb-3" for="dateFrom">Начальная дата:</label>
<input type="datetime-local" placeholder="Выберите дату начала периода" id="dateFrom" name="dateFrom" />
</div>
<div class="form-group">
<label class="mb-3" for="dateTo">Конечная дата:</label>
<input type="datetime-local" placeholder="Выберите дату окончания периода" id="dateTo" name="dateTo" />
</div>
<div class="flex-column mt-2">
<input type="submit" value="Отправить на почту" class="btn btn-primary" />
<button class="btn btn-dark ms-2" type="button" id="show">Вывести</button>
</div>
</form>
</div>
<div class="mt-3" id="report">
</div>
<script>
function check() {
console.log('Check was called!');
var dateFrom = $('#dateFrom').val();
var dateTo = $('#dateTo').val();
if (dateFrom && dateTo) {
$.ajax({
method: "GET",
url: "/Home/GetComponentsByRequestDate",
data: { dateFrom: dateFrom, dateTo: dateTo },
success: function (result) {
if (result != null) {
$('#report').html(result);
}
}
});
};
}
check();
$('#show').on('click', (e) => check());
</script>

View File

@ -0,0 +1,43 @@
@using ComputerShopContracts.ViewModels
@{
ViewData["Title"] = "Комплектующие";
}
<div class="container-md py-4 mb-4">
<div class="text-center">
<h2>Получение списка партий товаров по выбранным комплектующим</h2>
<p class="lead text-muted">Укажите комплектующие, для который вы хотите получить список партий товаров, и выберите тип файла для отчета</p>
</div>
<form method="post">
<div class="form-group">
<label class="pt-3 mb-3">Выберите комплектующие:</label>
<select multiple name="componentIds" class="form-control mb-3">
@foreach (var Component in ViewBag.Components)
{
<option value="@Component.Id">[@Component.Id] @Component.ComponentName</option>
}
</select>
</div>
<div class="pb-3">
<label class="u-label u-text-custom-color-1 u-label-1">
Выберите формат файла:
</label>
<div class="form-check form-check-inline ms-3">
<input class="form-check-input" type="radio" name="type" value="docx" checked>
<label class="u-label u-text-custom-color-1 u-label-1" for="docx">
Word-файл
</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="type" value="xlsx" id="xlsx">
<label class="u-label u-text-custom-color-1 u-label-1" for="xlsx">
Excel-файл
</label>
</div>
</div>
<p>
<input type="submit" value="Получить отчёт" class="btn btn-primary" />
</p>
</form>
</div>

View File

@ -8,6 +8,8 @@
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.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="~/ComputerShopGuarantorApp.styles.css" asp-append-version="true" /> <link rel="stylesheet" href="~/ComputerShopGuarantorApp.styles.css" asp-append-version="true" />
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</head> </head>
<body> <body>
<header> <header>
@ -33,10 +35,10 @@
<a class="nav-link" asp-area="" asp-controller="Home" asp-action="Products">Товары</a> <a class="nav-link" asp-area="" asp-controller="Home" asp-action="Products">Товары</a>
</li> </li>
<li class="nav-item me-3"> <li class="nav-item me-3">
<a class="nav-link" asp-area="" asp-controller="Home" asp-action="Index">Отчет</a> <a class="nav-link" asp-area="" asp-controller="Home" asp-action="ReportComponentsWithShipments">Получение списка</a>
</li> </li>
<li class="nav-item me-3"> <li class="nav-item me-3">
<a class="nav-link" asp-area="" asp-controller="Home" asp-action="Index">Выгрузка списка</a> <a class="nav-link" asp-area="" asp-controller="Home" asp-action="ReportComponentsByRequestDate">Сведения за период</a>
</li> </li>
@if (ApiUser.User == null) @if (ApiUser.User == null)
@ -70,7 +72,7 @@
<footer class="bg-dark text-light mt-auto footer"> <footer class="bg-dark text-light mt-auto footer">
<div class="container"> <div class="container">
&copy; 2024 - "Ты ж программист" @* - <a asp-area="" asp-controller="Home" asp-action="Privacy" class="text-decoration-underline text-secondary">Privacy</a> *@ &copy; 2024 - "Ты ж программист"
</div> </div>
</footer> </footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script> <script src="~/lib/jquery/dist/jquery.min.js"></script>

View File

@ -1,4 +1,5 @@
using ComputerShopContracts.BindingModels; using ComputerShopBusinessLogic.MailWorker;
using ComputerShopContracts.BindingModels;
using ComputerShopContracts.BusinessLogicContracts; using ComputerShopContracts.BusinessLogicContracts;
using ComputerShopContracts.SearchModels; using ComputerShopContracts.SearchModels;
using ComputerShopContracts.ViewModels; using ComputerShopContracts.ViewModels;
@ -12,11 +13,15 @@ namespace ComputerShopRestApi.Controllers
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IComponentLogic _componentLogic; private readonly IComponentLogic _componentLogic;
private readonly IReportGuarantorLogic _reportLogic;
private readonly AbstractMailWorker _mailWorker;
public ComponentController(IComponentLogic Logic, ILogger<ComponentController> Logger) public ComponentController(IComponentLogic Logic, ILogger<ComponentController> Logger, IReportGuarantorLogic ReportLogic, AbstractMailWorker MailWorker)
{ {
_logger = Logger; _logger = Logger;
_componentLogic = Logic; _componentLogic = Logic;
_reportLogic = ReportLogic;
_mailWorker = MailWorker;
} }
[HttpGet] [HttpGet]
@ -94,5 +99,62 @@ namespace ComputerShopRestApi.Controllers
throw; throw;
} }
} }
[HttpPost]
public void CreateReportToWordFile(ReportBindingModel Model)
{
try
{
_reportLogic.SaveReportToWordFile(Model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка создания отчета");
throw;
}
}
[HttpPost]
public void CreateReportToExcelFile(ReportBindingModel Model)
{
try
{
_reportLogic.SaveReportToExcelFile(Model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка создания отчета");
throw;
}
}
[HttpPost]
public void CreateReportToPdfFile(ReportBindingModel Model)
{
try
{
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
_reportLogic.SaveReportComponentsByRequestDateToPdfFile(Model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка создания отчета");
throw;
}
}
[HttpPost]
public void SendPdfToMail(MailSendInfoBindingModel Model)
{
try
{
_mailWorker.MailSendAsync(Model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка отправки письма");
throw;
}
}
} }
} }

View File

@ -42,6 +42,10 @@ Builder.Services.AddTransient<AbstractSaveToExcelImplementer, SaveToExcelImpleme
Builder.Services.AddTransient<AbstractSaveToWordImplementer, SaveToWordImplementer>(); Builder.Services.AddTransient<AbstractSaveToWordImplementer, SaveToWordImplementer>();
Builder.Services.AddTransient<AbstractSaveToPdfImplementer, SaveToPdfImplementer>(); Builder.Services.AddTransient<AbstractSaveToPdfImplementer, SaveToPdfImplementer>();
Builder.Services.AddTransient<AbstractSaveToExcelGuarantor, SaveToExcelGuarantor>();
Builder.Services.AddTransient<AbstractSaveToWordGuarantor, SaveToWordGuarantor>();
Builder.Services.AddTransient<AbstractSaveToPdfGuarantor, SaveToPdfGuarantor>();
Builder.Services.AddSingleton<AbstractMailWorker, MailKitWorker>(); Builder.Services.AddSingleton<AbstractMailWorker, MailKitWorker>();
Builder.Services.AddControllers(); Builder.Services.AddControllers();