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.
This commit is contained in:
@@ -0,0 +1,180 @@
|
||||
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";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user