Files
PIBD-23_Coursach_YouAreProg…/YouAreProgrammerShop/YAPBusinessLogic/Implementations/ReportBusinessLogicContract.cs
2025-08-26 20:39:48 +04:00

236 lines
11 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 System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using YAPBusinessLogic.OfficePackage;
using YAPContracts.StorageContracts;
using YAPDatabase.Implementations;
namespace YAPBusinessLogic.Implementations
{
internal class ReportBusinessLogicContract
{
private readonly ProductStorageContract _productStorageContract;
private readonly PurchaseStorageContract _purchaseStorageContract;
private readonly ProductSetStorageContract _productSetStorageContract;
private readonly ComponentStorageContract _componentStorageContract;
private readonly BasePdfBuilder _pdfBuilder;
public ReportBusinessLogicContract(ProductStorageContract productStorageContract, PurchaseStorageContract purchaseStorageContract, ProductSetStorageContract productSetStorageContract, ComponentStorageContract componentStorageContract, BasePdfBuilder pdfBuilder)
{
_productStorageContract = productStorageContract;
_purchaseStorageContract = purchaseStorageContract;
_productSetStorageContract = productSetStorageContract;
_componentStorageContract = componentStorageContract;
_pdfBuilder = pdfBuilder;
}
/// <summary>
/// Список товаров по выбранным сборкам в формате текстового документа или электронной таблицы
/// </summary>
/// <param name="setsIds">Id соборок</param>
/// <param name="format">doc/xls</param>
/// <param name="outputPath">Пусть, куда сохранить файл</param>
public void MakeReportProductsByProductSets(List<string> setsIds, string format, string outputPath)
{
// Получаем продукты по сборкам
var products = _productStorageContract.GetListProductsByProductSet(setsIds);
if (string.Equals(format, "xls", StringComparison.OrdinalIgnoreCase))
{
var excel = new OpenXmlExcelBuilder();
// Заголовок
excel.AddHeader("Изделия - Сборки", 0, 4);
// контент: изделие и под ним сборки
foreach (var prod in products)
{
excel.AddParagraph(prod.Product.Name, 0);
foreach (var wm in prod.Sets)
excel.AddParagraph($" {wm.SetName}", 1);
}
using var st = excel.Build();
File.WriteAllBytes(outputPath, ((MemoryStream)st).ToArray());
}
else if (string.Equals(format, "doc", StringComparison.OrdinalIgnoreCase))
{
var word = new OpenXmlWordBuilder();
// Добавляем заголовок
word.AddHeader("Изделия - Сборки");
// Добавляем контент: название изделия + список сборок
foreach (var prod in products)
{
word.AddParagraph(prod.Product.Name);
foreach (var wm in prod.Sets)
{
word.AddParagraph($" {wm.SetName}");
}
}
// Генерируем и сохраняем
using var stream = word.Build();
// Убедимся, что позиция в потоке в начале
if (stream.CanSeek) stream.Seek(0, SeekOrigin.Begin);
File.WriteAllBytes(outputPath, ((MemoryStream)stream).ToArray());
}
else
{
throw new ArgumentException("Поддерживаются только форматы «doc» и «xls»", nameof(format));
}
}
/// <summary>
/// Список сборок по выбранным товарам в формате текстового документа или электронной таблицы
/// </summary>
/// <param name="productIds">Id товаров</param>
/// <param name="format">doc/xls</param>
/// <param name="outputPath">Пусть, куда сохранить файл</param>
public void MakeReportProductSetsByProducts(List<string> productIds, string format, string outputPath)
{
// Получаем продукты по сборкам
var productSets = _productSetStorageContract.GetListProductSetsByProducts(productIds);
if (string.Equals(format, "xls", StringComparison.OrdinalIgnoreCase))
{
var excel = new OpenXmlExcelBuilder();
// Заголовок
excel.AddHeader("Сборки - Изделия", 0, 4);
// контент: Сборки и под ними изделия
foreach (var prod in productSets)
{
excel.AddParagraph(prod.Set.SetName, 0);
foreach (var wm in prod.Products)
excel.AddParagraph($" {wm.Name}", 1);
}
using var st = excel.Build();
File.WriteAllBytes(outputPath, ((MemoryStream)st).ToArray());
}
else if (string.Equals(format, "doc", StringComparison.OrdinalIgnoreCase))
{
var word = new OpenXmlWordBuilder();
// Добавляем заголовок
word.AddHeader("Изделия - Сборки");
// Добавляем контент: название изделия + список сборок
foreach (var prod in productSets)
{
word.AddParagraph(prod.Set.SetName);
foreach (var wm in prod.Products)
{
word.AddParagraph($" {wm.Name}");
}
}
// Генерируем и сохраняем
using var stream = word.Build();
// Убедимся, что позиция в потоке в начале
if (stream.CanSeek) stream.Seek(0, SeekOrigin.Begin);
File.WriteAllBytes(outputPath, ((MemoryStream)stream).ToArray());
}
else
{
throw new ArgumentException("Поддерживаются только форматы «doc» и «xls»", nameof(format));
}
}
/// <summary>
/// Отчет по продажам за период с расшифровкой по комментариям и комплектющим
/// </summary>
/// <param name="dateStart">Начало периода</param>
/// <param name="dateEnd">Конец периода</param>
public Stream MakeReportByPurchases(DateTime dateStart, DateTime dateEnd)
{
_pdfBuilder.AddHeader("Отчет по продажам");
var reportData = _purchaseStorageContract.GetDataForReport(dateStart, dateEnd);
_pdfBuilder.AddParagraph($"Период: {dateStart} — {dateEnd}");
foreach (var sale in reportData)
{
_pdfBuilder.AddParagraph($"----------------------------------");
_pdfBuilder.AddParagraph($"Дата продажи: {sale.Purchase.PurchaseDate}");
_pdfBuilder.AddParagraph($"Сумма: {sale.Purchase.TotalPrice}");
_pdfBuilder.AddParagraph($"");
_pdfBuilder.AddParagraph($"Комплектующие");
if (sale.Components is { Count: > 0 })
{
_pdfBuilder.AddTable(
new[] { "Название", "Тип" },
sale.Components.Select(p => new[] { p.Name, p.ComponentType.ToString() }).ToList()
);
}
else
{
_pdfBuilder.AddParagraph("Комплектующих не найдено.");
}
_pdfBuilder.AddParagraph($"Комментарии");
if (sale.Comments is { Count: > 0 })
{
_pdfBuilder.AddTable(
new[] { "Текст", "Дата" },
sale.Comments.Select(p => new[] { p.Text, p.Date.ToString("dd.MM.yyyy") }).ToList()
);
}
else
{
_pdfBuilder.AddParagraph("Комментариев не найдено.");
}
}
return _pdfBuilder.Build();
}
/// <summary>
/// Отчет по комплектующим за период с расшифровкой по покупкам и заказам
/// </summary>
/// <param name="dateStart">Начало периода</param>
/// <param name="dateEnd">Конец периода</param>
public Stream MakeReportByComponents(DateTime dateStart, DateTime dateEnd)
{
_pdfBuilder.AddHeader("Отчет по комплектующим");
var reportData = _componentStorageContract.GetDataForReport(dateStart, dateEnd);
_pdfBuilder.AddParagraph($"Период: {dateStart} — {dateEnd}");
foreach (var comp in reportData)
{
_pdfBuilder.AddParagraph($"----------------------------------");
_pdfBuilder.AddParagraph($"Имя: {comp.Component.Name}");
_pdfBuilder.AddParagraph($"Тип: {comp.Component.ComponentType}");
_pdfBuilder.AddParagraph($"");
_pdfBuilder.AddParagraph($"Покупки");
if (comp.Purchases is { Count: > 0 })
{
_pdfBuilder.AddTable(
new[] { "Дата", "Сумма" },
comp.Purchases.Select(p => new[] { p.PurchaseDate.ToString("MM/dd/yy"), p.TotalPrice.ToString() }).ToList()
);
}
else
{
_pdfBuilder.AddParagraph("Покупок не найдено.");
}
_pdfBuilder.AddParagraph($"Заказы");
if (comp.Orders is { Count: > 0 })
{
_pdfBuilder.AddTable(
new[] { "Дата", "Имя" },
comp.Orders.Select(p => new[] { p.OrderDate.ToString("dd.MM.yyyy"), p.DealerName }).ToList()
);
}
else
{
_pdfBuilder.AddParagraph("Заказов не найдено.");
}
}
return _pdfBuilder.Build();
}
}
}