236 lines
11 KiB
C#
236 lines
11 KiB
C#
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();
|
||
}
|
||
}
|
||
}
|