using ClosedXML.Excel; using JdeScoping.ExcelIO.Configuration; using JdeScoping.ExcelIO.Formatting; using JdeScoping.ExcelIO.Models.Reporting; using Microsoft.Extensions.Options; namespace JdeScoping.ExcelIO.Generators; /// /// Generates the Search Criteria sheet for Excel export. /// public class CriteriaSheetGenerator { private readonly IOptions _options; private readonly AttributeTableWriter _tableWriter; /// /// Initializes a new instance of the CriteriaSheetGenerator class. /// /// Excel export options. /// Attribute table writer. public CriteriaSheetGenerator( IOptions options, AttributeTableWriter tableWriter) { _options = options; _tableWriter = tableWriter; } /// /// Generates the Search Criteria sheet. /// /// The workbook to add the sheet to. /// The search model with criteria. 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 { 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"; } }