26ff8d9b4f
Set up repository with legacy .NET Framework 4.8 source (OLD/), new .NET 10 Blazor solution (NEW/), OpenSpec specifications, documentation, and project configuration.
181 lines
5.9 KiB
C#
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";
|
|
}
|
|
}
|