Files
jdescopingtool/NEW/src/JdeScoping.ExcelIO/Generators/CriteriaSheetGenerator.cs
T
Joseph Doherty 26ff8d9b4f Initial commit: JDE Scoping Tool migration project
Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
2026-01-02 07:43:29 -05:00

181 lines
5.9 KiB
C#

using ClosedXML.Excel;
using JdeScoping.ExcelIO.Configuration;
using JdeScoping.ExcelIO.Formatting;
using JdeScoping.ExcelIO.Models.Reporting;
using Microsoft.Extensions.Options;
namespace JdeScoping.ExcelIO.Generators;
/// <summary>
/// Generates the Search Criteria sheet for Excel export.
/// </summary>
public class CriteriaSheetGenerator
{
private readonly IOptions<ExcelExportOptions> _options;
private readonly AttributeTableWriter _tableWriter;
/// <summary>
/// Initializes a new instance of the CriteriaSheetGenerator class.
/// </summary>
/// <param name="options">Excel export options.</param>
/// <param name="tableWriter">Attribute table writer.</param>
public CriteriaSheetGenerator(
IOptions<ExcelExportOptions> options,
AttributeTableWriter tableWriter)
{
_options = options;
_tableWriter = tableWriter;
}
/// <summary>
/// Generates the Search Criteria sheet.
/// </summary>
/// <param name="workbook">The workbook to add the sheet to.</param>
/// <param name="search">The search model with criteria.</param>
public void Generate(XLWorkbook workbook, SearchModel search)
{
var worksheet = workbook.Worksheets.Add("Search Criteria");
var row = 1;
// Write name and user
HeaderFormatter.ApplyHeaderFormat(worksheet.Cell(row, 1), "Search Name");
worksheet.Cell(row, 2).Value = search.Name;
HeaderFormatter.ApplyHeaderFormat(worksheet.Cell(++row, 1), "User Name");
worksheet.Cell(row, 2).Value = search.UserName;
// Skip row
row++;
// Write timestamps
HeaderFormatter.ApplyHeaderFormat(worksheet.Cell(++row, 1), "Submit timestamp");
worksheet.Cell(row, 2).Value = FormatTimestamp(search.SubmitDt);
HeaderFormatter.ApplyHeaderFormat(worksheet.Cell(++row, 1), "Start timestamp");
worksheet.Cell(row, 2).Value = FormatTimestamp(search.StartDt);
HeaderFormatter.ApplyHeaderFormat(worksheet.Cell(++row, 1), "Completed timestamp");
worksheet.Cell(row, 2).Value = FormatTimestamp(search.EndDt);
// Skip row
row++;
// Write timespan filter table
var timespanData = new List<TimespanFilter>
{
new() { MinimumDt = search.MinimumDt, MaximumDt = search.MaximumDt }
};
var timespanTable = _tableWriter.WriteTable(worksheet, ++row, 1, timespanData);
if (timespanTable != null)
{
row = timespanTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write work order filter table
var workOrderTable = _tableWriter.WriteTable(worksheet, row, 1, search.WorkOrderFilter);
if (workOrderTable != null)
{
row = workOrderTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write item number filter table
var itemNumberTable = _tableWriter.WriteTable(worksheet, row, 1, search.ItemNumberFilter);
if (itemNumberTable != null)
{
row = itemNumberTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write profit center filter table
var profitCenterTable = _tableWriter.WriteTable(worksheet, row, 1, search.ProfitCenterFilter);
if (profitCenterTable != null)
{
row = profitCenterTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write work center filter table
var workCenterTable = _tableWriter.WriteTable(worksheet, row, 1, search.WorkCenterFilter);
if (workCenterTable != null)
{
row = workCenterTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write component lot filter table
var componentLotTable = _tableWriter.WriteTable(worksheet, row, 1, search.ComponentLotFilter);
if (componentLotTable != null)
{
row = componentLotTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write operator filter table
var operatorTable = _tableWriter.WriteTable(worksheet, row, 1, search.OperatorFilter);
if (operatorTable != null)
{
row = operatorTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write item/operation/MIS filter table
var itemOpMisTable = _tableWriter.WriteTable(worksheet, row, 1, search.ItemOperationMisFilter);
if (itemOpMisTable != null)
{
row = itemOpMisTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write extract MIS data option
var headerRange = worksheet.Range(row, 1, row, 2);
HeaderFormatter.ApplyHeaderFormat(headerRange, "Extract MIS data?", merge: true);
worksheet.Cell(++row, 1).Value = search.ExtractMisData ? "YES" : "NO";
// Auto-fit columns with 15% padding
for (var column = 1; column <= 4; column++)
{
worksheet.Column(column).AdjustToContents();
worksheet.Column(column).Width *= ExcelFormats.CriteriaPaddingFactor;
}
// Apply protection
WorksheetProtector.ApplyCriteriaProtection(worksheet, _options.Value.CriteriaSheetPassword);
}
private static string FormatTimestamp(DateTime? dateTime)
{
if (!dateTime.HasValue)
{
return string.Empty;
}
return $"{dateTime.Value:MMM dd, yyyy hh:mm:ss tt} EST";
}
}