diff --git a/ReportingServices.Test/UnitTest1.cs b/ReportingServices.Test/APIHelperTester.cs similarity index 98% rename from ReportingServices.Test/UnitTest1.cs rename to ReportingServices.Test/APIHelperTester.cs index 73a84b1..ba95d69 100644 --- a/ReportingServices.Test/UnitTest1.cs +++ b/ReportingServices.Test/APIHelperTester.cs @@ -3,7 +3,7 @@ using ReportingServices.HelperClasses; namespace ReportingServices.Test { [TestClass] - public class UnitTest1 + public class APIHelperTester { [TestMethod] public void CheckShortDateWithPassedInDate() diff --git a/ReportingServices.Test/DailyReportTester.cs b/ReportingServices.Test/DailyReportTester.cs new file mode 100644 index 0000000..03e4e7f --- /dev/null +++ b/ReportingServices.Test/DailyReportTester.cs @@ -0,0 +1,64 @@ +using ReportingServices.ViewModels.ProductionReport; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ReportingServices.Test +{ + [TestClass] + public class DailyReportTester + { + [TestMethod] + public void SetRDSInfo_InputData_CalculatedAndStoresCorrectly() + { + // Arrange + DailyReport rpt = new(); + rpt.CurrentEntries = TestingClass.ManualReportEntries; + Dictionary> dualLayerReactors = new() + { + { "ASM", new List() { 24, 62 } }, + { "HTR", new List() { } }, + { "EPP", new List() { 40, 42, 44, 46 } }, + }; + int asmUnloadTempsLessThan700 = 3; + int htrUnloadTempsLessThan700 = 3; + + // Act + rpt.SetRDSInfo(TestingClass.RDSList); + + // Assert + CollectionAssert.AreEqual(dualLayerReactors["ASM"].ToList(), rpt.DualLayerReactors["ASM"].ToList()); + CollectionAssert.AreEqual(dualLayerReactors["HTR"].ToList(), rpt.DualLayerReactors["HTR"].ToList()); + CollectionAssert.AreEqual(dualLayerReactors["EPP"].ToList(), rpt.DualLayerReactors["EPP"].ToList()); + Assert.AreEqual(asmUnloadTempsLessThan700, rpt.CurrentEntries[(int)DateTime.Now.DayOfWeek].ASMUnloadTempsLessThan700); + Assert.AreEqual(htrUnloadTempsLessThan700, rpt.CurrentEntries[(int)DateTime.Now.DayOfWeek].HTRUnloadTempsLessThan700); + } + + [TestMethod] + public void SetReactorInfo_InputData_CalculatedAndStoresCorrectly() + { + // Arrange + DailyReport rpt = new(); + rpt.CurrentEntries = TestingClass.ManualReportEntries; + int numberOfToolsWaferSize6IN = 11; + int numberOfToolsWaferSize8IN = 46; + int numberOfToolsWaferSize6INScheduled = 9; + int numberOfToolsWaferSize8INScheduled = 39; + int singleLoadLockASM = 5; + int singleLoadLockHTR = 14; + + // Act + rpt.SetReactorInfo(TestingClass.Reactors, TestingClass.UnscheduledReactors); + + // Assert + Assert.AreEqual(numberOfToolsWaferSize6IN, rpt.NumberOfToolsWaferSize6IN); + Assert.AreEqual(numberOfToolsWaferSize8IN, rpt.NumberOfToolsWaferSize8IN); + Assert.AreEqual(numberOfToolsWaferSize6INScheduled, rpt.NumberOfToolsWaferSize6INScheduled); + Assert.AreEqual(numberOfToolsWaferSize8INScheduled, rpt.NumberOfToolsWaferSize8INScheduled); + Assert.AreEqual(singleLoadLockASM, rpt.CurrentEntries[(int)DateTime.Now.DayOfWeek].ASMSingleLoadLock); + Assert.AreEqual(singleLoadLockHTR, rpt.CurrentEntries[(int)DateTime.Now.DayOfWeek].HTRSingleLoadLock); + } + } +} diff --git a/ReportingServices.Test/TestingClass.cs b/ReportingServices.Test/TestingClass.cs new file mode 100644 index 0000000..11d05b9 --- /dev/null +++ b/ReportingServices.Test/TestingClass.cs @@ -0,0 +1,186 @@ +using ReportingServices.Models.ProductionReport; + +namespace ReportingServices.Test +{ + internal static class TestingClass + { + public static readonly List RDSList = new() + { + new RDS(79, "ASM+", new DateTime(2022, 12, 13), 600, "Standard 1 Layer"), + new RDS(45, "HTR", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"), + new RDS(62, "ASM+", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(62, "ASM+", new DateTime(2022, 12, 13), 700, "Standard 2 Layer"), + new RDS(62, "ASM+", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(24, "ASM", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(24, "ASM", new DateTime(2022, 12, 13), 800, "Standard 2 Layer"), + new RDS(24, "ASM", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(66, "ASM+", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(28, "ASM", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(28, "ASM", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(63, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(63, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(23, "ASM", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"), + new RDS(23, "ASM", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"), + new RDS(32, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(58, "ASM", new DateTime(2022, 12, 13), 650, "Standard 1 Layer"), + new RDS(77, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(77, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(57, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(57, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(20, "ASM", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(20, "ASM", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(43, "ASM+", new DateTime(2022, 12, 13), 750, "Standard 1 Layer"), + new RDS(43, "ASM+", new DateTime(2022, 12, 13), 750, "Standard 1 Layer"), + new RDS(29, "ASM", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(25, "ASM", new DateTime(2022, 12, 13), 750, "Standard 1 Layer"), + new RDS(51, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(51, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(51, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(38, "HTR", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"), + new RDS(38, "HTR", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"), + new RDS(64, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(64, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(32, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(37, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(37, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(30, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(31, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(33, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(33, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(33, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(55, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(55, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(55, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(36, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(21, "ASM", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(21, "ASM", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(73, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(75, "ASM+", new DateTime(2022, 12, 13), 750, "Standard 1 Layer"), + new RDS(75, "ASM+", new DateTime(2022, 12, 13), 750, "Standard 1 Layer"), + new RDS(51, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(53, "ASM+", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(53, "ASM+", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(35, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(35, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(35, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(36, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(68, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(68, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(68, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(41, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(41, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(41, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(70, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(70, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(70, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(70, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(74, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(74, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(74, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"), + new RDS(61, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(61, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"), + new RDS(49, "HTR", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"), + new RDS(42, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(42, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(42, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(46, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(46, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(52, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"), + new RDS(48, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"), + new RDS(54, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"), + new RDS(50, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"), + new RDS(40, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(40, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(42, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(42, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(44, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(44, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(46, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(46, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(46, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"), + new RDS(48, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"), + new RDS(50, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"), + new RDS(52, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"), + new RDS(54, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"), + new RDS(48, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"), + new RDS(52, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"), + }; + + public static readonly List Reactors = new() + { + new Reactor(20, "ASM", "200 mm 8 in", false), + new Reactor(21, "ASM", "200 mm 8 in", false), + new Reactor(22, "ASM", "200 mm 8 in", false), + new Reactor(23, "ASM", "200 mm 8 in", false), + new Reactor(24, "ASM", "200 mm 8 in", false), + new Reactor(25, "ASM", "200 mm 8 in", true), + new Reactor(26, "ASM", "200 mm 8 in", false), + new Reactor(27, "ASM", "200 mm 8 in", false), + new Reactor(28, "ASM", "150 mm 6 in", true), + new Reactor(29, "ASM", "200 mm 8 in", false), + new Reactor(30, "HTR", "200 mm 8 in", true), + new Reactor(31, "HTR", "200 mm 8 in", true), + new Reactor(32, "HTR", "200 mm 8 in", true), + new Reactor(33, "HTR", "200 mm 8 in", true), + new Reactor(34, "HTR", "200 mm 8 in", false), + new Reactor(35, "HTR", "200 mm 8 in", false), + new Reactor(36, "HTR", "200 mm 8 in", false), + new Reactor(37, "HTR", "200 mm 8 in", true), + new Reactor(38, "HTR", "200 mm 8 in", true), + new Reactor(39, "ASM+", "200 mm 8 in", false), + new Reactor(40, "EPP", "150 mm 6 in", false), + new Reactor(41, "HTR", "200 mm 8 in", true), + new Reactor(42, "EPP", "150 mm 6 in", false), + new Reactor(43, "ASM+", "200 mm 8 in", false), + new Reactor(44, "EPP", "150 mm 6 in", false), + new Reactor(45, "HTR", "200 mm 8 in", true), + new Reactor(46, "EPP", "150 mm 6 in", false), + new Reactor(47, "HTR", "150 mm 6 in", true), + new Reactor(48, "EPP", "200 mm 8 in", false), + new Reactor(49, "HTR", "200 mm 8 in", true), + new Reactor(50, "EPP", "200 mm 8 in", false), + new Reactor(51, "HTR", "150 mm 6 in", true), + new Reactor(52, "EPP", "200 mm 8 in", false), + new Reactor(53, "ASM+", "200 mm 8 in", false), + new Reactor(54, "EPP", "200 mm 8 in", false), + new Reactor(55, "HTR", "200 mm 8 in", true), + new Reactor(56, "ASM+", "200 mm 8 in", true), + new Reactor(57, "ASM+", "200 mm 8 in", false), + new Reactor(58, "ASM", "200 mm 8 in", false), + new Reactor(59, "ASM", "200 mm 8 in", false), + new Reactor(60, "ASM+", "200 mm 8 in", true), + new Reactor(61, "ASM+", "200 mm 8 in", false), + new Reactor(62, "ASM+", "200 mm 8 in", true), + new Reactor(63, "ASM+", "200 mm 8 in", false), + new Reactor(64, "ASM+", "200 mm 8 in", false), + new Reactor(65, "ASM+", "200 mm 8 in", false), + new Reactor(66, "ASM+", "200 mm 8 in", false), + new Reactor(68, "HTR", "200 mm 8 in", false), + new Reactor(70, "HTR", "150 mm 6 in", true), + new Reactor(72, "HTR", "200 mm 8 in", true), + new Reactor(73, "HTR", "200 mm 8 in", false), + new Reactor(74, "HTR", "150 mm 6 in", false), + new Reactor(75, "ASM+", "200 mm 8 in", false), + new Reactor(77, "ASM+", "200 mm 8 in", false), + new Reactor(79, "ASM+", "200 mm 8 in", false), + new Reactor(100, "ASM", "150 mm 6 in", false), + new Reactor(101, "ASM", "150 mm 6 in", false), + }; + + public static readonly List UnscheduledReactors = new() + { + 20, 25, 30, 32, 49, 55, 59, 67, 69, 70, 74 + }; + + public static readonly List ManualReportEntries = new() + { + new ManualReportEntries(), + new ManualReportEntries(), + new ManualReportEntries(), + new ManualReportEntries(), + new ManualReportEntries(), + new ManualReportEntries(), + new ManualReportEntries(), + }; + } +} diff --git a/ReportingServices/Controllers/ProductionReportController.cs b/ReportingServices/Controllers/ProductionReportController.cs index 4451676..d312ca2 100644 --- a/ReportingServices/Controllers/ProductionReportController.cs +++ b/ReportingServices/Controllers/ProductionReportController.cs @@ -2,26 +2,22 @@ using ReportingServices.Dependency_Injections; using ReportingServices.HelperClasses; using ReportingServices.Models.ProductionReport; -using ReportingServices.ReportingObjects; -using System.Web; +using ReportingServices.ViewModels.ProductionReport; namespace ReportingServices.Controllers { public class ProductionReportController : Controller { - private readonly IJsonFileHandler _jsonFileHandler; private readonly IScrapeDatabaseRepository _scrapeDatabaseRepository; private readonly IFabTimeReportingRepository _fabTimeReportingRepository; private readonly ILogger _logger; private readonly int _reportIndex = (int)DateTime.Now.DayOfWeek; private readonly string _dailyRptFilePath = "wwwroot/Assets/DailyReportInfo.json"; private readonly string _toolStateOwnerFilePath = "wwwroot/Assets/ToolStates.json"; - private readonly string _toolFilter = "~R76%2C%20~R78%2C%20~R25%2C%20~R67%2C%20~R69%2C%20~R71%2C%20~R47%2C%20~R51%2C%20~R28"; - public ProductionReportController(IJsonFileHandler jsonFileHandler, IScrapeDatabaseRepository scrapeDatabaseRepository, + public ProductionReportController(IScrapeDatabaseRepository scrapeDatabaseRepository, IFabTimeReportingRepository fabTimeReportingRepository, ILogger logger) { - _jsonFileHandler = jsonFileHandler; _scrapeDatabaseRepository = scrapeDatabaseRepository; _fabTimeReportingRepository = fabTimeReportingRepository; _logger = logger; @@ -37,8 +33,9 @@ namespace ReportingServices.Controllers { try { - DailyReport dailyReport = SetUpDailyReport(); - Dictionary> toolStateOwners = _jsonFileHandler.LoadJSONFile>>(_toolStateOwnerFilePath); + DailyReportHelper.SetRepositories(_fabTimeReportingRepository, _scrapeDatabaseRepository); + DailyReport dailyReport = DailyReportHelper.SetUpDailyReport(); + Dictionary> toolStateOwners = JsonFileHandler.LoadJSONFile>>(_toolStateOwnerFilePath); dailyReport.ToolStatesByOwner = toolStateOwners; @@ -54,7 +51,7 @@ namespace ReportingServices.Controllers public IActionResult EditDailyReport() { - Dictionary> entries = _jsonFileHandler.LoadJSONFile>>(_dailyRptFilePath); + Dictionary> entries = JsonFileHandler.LoadJSONFile>>(_dailyRptFilePath); ManualReportEntries rpt = entries["Current Week"][_reportIndex]; @@ -64,136 +61,16 @@ namespace ReportingServices.Controllers [HttpPost] public IActionResult EditDailyReport(ManualReportEntries rpt) { - Dictionary> report = _jsonFileHandler.LoadJSONFile>>(_dailyRptFilePath); + Dictionary> report = JsonFileHandler.LoadJSONFile>>(_dailyRptFilePath); rpt.Date = DateTime.Parse(DateTime.Now.ToShortDateString()); rpt.Day = DateTime.Now.DayOfWeek; report["Current Week"][_reportIndex] = rpt; - _jsonFileHandler.SaveJSONFile(report, _dailyRptFilePath); + JsonFileHandler.SaveJSONFile(report, _dailyRptFilePath); return RedirectToAction("DailyReport"); } - - public async Task> MovesTrendCaller(string startDate = "", string endDate = "") - { - string url = APIHelperFunctions.GenerateURLWithParameters(startDate: startDate, endDate: endDate, chart: "MOVESLOTLIST", areasLike: "CLEANROOM", operationsLike: "1UNLOAD"); - - List outsByRDS = await _fabTimeReportingRepository.GetMovesTrendData(url); - - return outsByRDS; - } - - public async Task> ToolStateTrendCaller(string toolType) - { - string url = APIHelperFunctions.GenerateURLWithParameters(chart: "TOOLSTATE", periodLen: "24", capacityTypesLike: toolType, toolsLike: _toolFilter); - - List toolAvailability = await _fabTimeReportingRepository.GetToolStateTrendData(url); - - return toolAvailability; - } - - public async Task> ToolStatesCaller(string toolType) - { - string capacityFilter = toolType == "ASM" ? toolType + "%2CASM%2B" : toolType; - string startDate = HttpUtility.UrlEncode(APIHelperFunctions.GetDateWithOffsetAsAPIString(DateTime.Now.ToString(), -12.5f)); - - string url = APIHelperFunctions.GenerateURLWithParameters(chart: "ToolStateGantt", periodLen: "24", - capacityTypesLike: capacityFilter, toolsLike: _toolFilter, startDate: startDate); - - List toolStates = await _fabTimeReportingRepository.GetToolStateData(url); - - return toolStates; - } - - public DailyReport SetUpDailyReport() - { - DailyReport report = new(); - - Task> task1 = MovesTrendCaller(); - Task> task2 = MovesTrendCaller(startDate: report.StartDate.AddDays(-7).ToString(), endDate: report.StartDate.ToString()); - Task> task3 = ToolStateTrendCaller("ASM"); - Task> task4 = ToolStateTrendCaller("EPP"); - Task> task5 = ToolStateTrendCaller("HTR"); - Task> task6 = ToolStatesCaller("ASM"); - Task> task7 = ToolStatesCaller("EPP"); - Task> task8 = ToolStatesCaller("HTR"); - Task> task9 = ToolStatesCaller("Metrology"); - Task> task10 = ToolStatesCaller("Cleans"); - - report.AddToolAvailibilityByType("ASM", task3.Result); - report.AddToolAvailibilityByType("EPP", task4.Result); - report.AddToolAvailibilityByType("HTR", task5.Result); - report.AddToolStateByType("ASM", task6.Result); - report.AddToolStateByType("EPP", task7.Result); - report.AddToolStateByType("HTR", task8.Result); - report.AddToolStateByType("Metrology", task9.Result); - report.AddToolStateByType("Cleans", task10.Result); - - report.CurrentWeek.SetOutsByDay(task1.Result); - report.PreviousWeek.SetOutsByDay(task2.Result); - - List scrap = _scrapeDatabaseRepository.GetScrapByDay(task1.Result); - List previousScrap = _scrapeDatabaseRepository.GetScrapByDay(task2.Result); - - report.CurrentWeek.SetScrapByDay(scrap); - report.PreviousWeek.SetScrapByDay(previousScrap); - - report.ReverseLists(); - - report.QuarterlyTargets = _scrapeDatabaseRepository.GetQuarterlyTargets(); - - int[] toolsByWaferSize = _scrapeDatabaseRepository.GetNumberOfToolsByWaferSize("''"); - - report.NumberOfToolsWaferSize6IN = toolsByWaferSize[0]; - report.NumberOfToolsWaferSize8IN = toolsByWaferSize[1]; - - string reactors = ""; - - foreach (KeyValuePair keyValuePairs in report.ToolStateByType) - { - if (keyValuePairs.Key != "Metrology" && keyValuePairs.Key != "Cleans") - { - foreach (ToolStateCurrent tool in keyValuePairs.Value.ToolStateCurrents) - { - if (tool.BasicStateDescription != "Productive" && tool.ReactorStatus != "Out of Service") - { - reactors = reactors + "'" + tool.Tool.Substring(1) + "', "; - } - } - } - } - - reactors = reactors.Substring(0, reactors.Length - 2); - - report.DualLayerReactors = _scrapeDatabaseRepository.GetDualLayerReactors(); - - int[] toolsByWaferSizeScheduled = _scrapeDatabaseRepository.GetNumberOfToolsByWaferSize(reactors); - - report.NumberOfToolsWaferSize6INScheduled = toolsByWaferSizeScheduled[0]; - report.NumberOfToolsWaferSize8INScheduled = toolsByWaferSizeScheduled[1]; - - Dictionary> entries = _jsonFileHandler.LoadJSONFile>>(_dailyRptFilePath); - - report.CurrentEntries = entries["Current Week"]; - report.PreviousEntries = entries["Previous Week"]; - - int[] singleLoadLocks = _scrapeDatabaseRepository.GetNumberOfSingleLoadLocks(); - - report.CurrentEntries[_reportIndex].ASMSingleLoadLock = singleLoadLocks[0]; - report.CurrentEntries[_reportIndex].HTRSingleLoadLock = singleLoadLocks[1]; - - int[] unloadTempsLessThan700 = _scrapeDatabaseRepository.GetNumberOfToolUnloadTempsLessThan700(); - - report.CurrentEntries[_reportIndex].ASMUnloadTempsLessThan700 = unloadTempsLessThan700[0]; - report.CurrentEntries[_reportIndex].HTRUnloadTempsLessThan700 = unloadTempsLessThan700[1]; - - entries["Current Week"] = report.CurrentEntries; - - _jsonFileHandler.SaveJSONFile(entries, _dailyRptFilePath); - - return report; - } } } diff --git a/ReportingServices/Dependency Injections/Implementations/FabTimeReportingRepository.cs b/ReportingServices/Dependency Injections/Implementations/FabTimeReportingRepository.cs deleted file mode 100644 index 69027e9..0000000 --- a/ReportingServices/Dependency Injections/Implementations/FabTimeReportingRepository.cs +++ /dev/null @@ -1,41 +0,0 @@ -using ReportingServices.ReportingObjects; -using System.Text.Json; - -namespace ReportingServices.Dependency_Injections -{ - public class FabTimeReportingRepository : IFabTimeReportingRepository - { - public async Task> GetMovesTrendData(string url) - { - return await GetJsonData>(url); - } - - public async Task> GetToolStateTrendData(string url) - { - return await GetJsonData>(url); - } - - public async Task> GetToolStateData(string url) - { - return await GetJsonData>(url); - } - - public async Task GetJsonData(string url) - { - T deserializedJson; - - using (var client = new HttpClient()) - { - using (HttpResponseMessage response = await client.GetAsync(url)) - { - string apiResponse = await response.Content.ReadAsStringAsync(); - deserializedJson = JsonSerializer.Deserialize(apiResponse); - } - } - - return deserializedJson; - } - - - } -} diff --git a/ReportingServices/Dependency Injections/Interfaces/IFabTimeReportingRepository.cs b/ReportingServices/Dependency Injections/Interfaces/IFabTimeReportingRepository.cs deleted file mode 100644 index b6b3594..0000000 --- a/ReportingServices/Dependency Injections/Interfaces/IFabTimeReportingRepository.cs +++ /dev/null @@ -1,12 +0,0 @@ -using ReportingServices.ReportingObjects; - -namespace ReportingServices.Dependency_Injections -{ - public interface IFabTimeReportingRepository - { - public Task> GetMovesTrendData(string url); - public Task> GetToolStateTrendData(string url); - public Task> GetToolStateData(string url); - public Task GetJsonData(string url); - } -} diff --git a/ReportingServices/Dependency Injections/Interfaces/IJsonFileHandler.cs b/ReportingServices/Dependency Injections/Interfaces/IJsonFileHandler.cs deleted file mode 100644 index 8506cf1..0000000 --- a/ReportingServices/Dependency Injections/Interfaces/IJsonFileHandler.cs +++ /dev/null @@ -1,10 +0,0 @@ -using ReportingServices.ReportingObjects; - -namespace ReportingServices.Dependency_Injections -{ - public interface IJsonFileHandler - { - public void SaveJSONFile(T obj, string file); - public T LoadJSONFile(string file); - } -} diff --git a/ReportingServices/HelperClasses/DailyReportHelper.cs b/ReportingServices/HelperClasses/DailyReportHelper.cs new file mode 100644 index 0000000..d1f8d39 --- /dev/null +++ b/ReportingServices/HelperClasses/DailyReportHelper.cs @@ -0,0 +1,84 @@ +using ReportingServices.Dependency_Injections; +using ReportingServices.Models.ProductionReport; +using ReportingServices.ViewModels.ProductionReport; + +namespace ReportingServices.HelperClasses +{ + public static class DailyReportHelper + { + private static IFabTimeReportingRepository _fabTimeReportingRepository; + private static IScrapeDatabaseRepository _scrapeDatabaseRepository; + private static readonly string _dailyRptFilePath = "wwwroot/Assets/DailyReportInfo.json"; + + public static void SetRepositories(IFabTimeReportingRepository fabTimeReportingRepository, IScrapeDatabaseRepository scrapeDatabaseRepository) + { + _fabTimeReportingRepository = fabTimeReportingRepository; + _scrapeDatabaseRepository = scrapeDatabaseRepository; + } + + public static DailyReport SetUpDailyReport() + { + List tasks = new(); + DailyReport report = new(); + + Task> task1 = _fabTimeReportingRepository.GetMovesTrendData(); + Task> task2 = _fabTimeReportingRepository.GetMovesTrendData(startDate: report.StartDate.AddDays(-7).ToString(), endDate: report.StartDate.ToString()); + tasks.Add(_fabTimeReportingRepository.GetToolStateTrendData(report, "ASM")); + tasks.Add(_fabTimeReportingRepository.GetToolStateTrendData(report, "EPP")); + tasks.Add(_fabTimeReportingRepository.GetToolStateTrendData(report, "HTR")); + tasks.Add(_fabTimeReportingRepository.GetToolStateData(report, "ASM")); + tasks.Add(_fabTimeReportingRepository.GetToolStateData(report, "EPP")); + tasks.Add(_fabTimeReportingRepository.GetToolStateData(report, "HTR")); + tasks.Add(_fabTimeReportingRepository.GetToolStateData(report, "Metrology")); + tasks.Add(_fabTimeReportingRepository.GetToolStateData(report, "Cleans")); + + report.QuarterlyTargets = _scrapeDatabaseRepository.GetQuarterlyTargets(); + + Dictionary> entries = JsonFileHandler.LoadJSONFile>>(_dailyRptFilePath); + + report.CurrentEntries = entries["Current Week"]; + report.PreviousEntries = entries["Previous Week"]; + + report.SetRDSInfo(_scrapeDatabaseRepository.GetRDSForLastDay()); + + Task.WaitAll(tasks.ToArray()); + + report.SetReactorInfo(_scrapeDatabaseRepository.GetReactors(), GetUnscheduledReactors(report)); + + List scrap = _scrapeDatabaseRepository.GetScrapByDay(task1.Result); + List previousScrap = _scrapeDatabaseRepository.GetScrapByDay(task2.Result); + + report.CurrentWeek.SetYieldInformation(task1.Result, scrap); + report.PreviousWeek.SetYieldInformation(task2.Result, previousScrap); + + report.ReverseLists(); + + entries["Current Week"] = report.CurrentEntries; + + JsonFileHandler.SaveJSONFile(entries, _dailyRptFilePath); + + return report; + } + + public static List GetUnscheduledReactors(DailyReport report) + { + List reactors = new(); + + foreach (KeyValuePair keyValuePairs in report.ToolStateByType) + { + if (keyValuePairs.Key != "Metrology" && keyValuePairs.Key != "Cleans") + { + foreach (ToolStateCurrent tool in keyValuePairs.Value.ToolStateCurrents) + { + if (tool.BasicStateDescription != "Productive" && tool.ReactorStatus != "Out of Service") + { + reactors.Add(int.Parse(tool.Tool.Substring(1))); + } + } + } + } + + return reactors; + } + } +} diff --git a/ReportingServices/Dependency Injections/Implementations/JsonFileHandler.cs b/ReportingServices/HelperClasses/JsonFileHandler.cs similarity index 58% rename from ReportingServices/Dependency Injections/Implementations/JsonFileHandler.cs rename to ReportingServices/HelperClasses/JsonFileHandler.cs index fc8c977..1f077af 100644 --- a/ReportingServices/Dependency Injections/Implementations/JsonFileHandler.cs +++ b/ReportingServices/HelperClasses/JsonFileHandler.cs @@ -1,16 +1,16 @@ using System.Text.Json; -namespace ReportingServices.Dependency_Injections +namespace ReportingServices.HelperClasses { - public class JsonFileHandler : IJsonFileHandler + public static class JsonFileHandler { - public T LoadJSONFile(string file) + public static T LoadJSONFile(string file) { string json = File.ReadAllText(file); return JsonSerializer.Deserialize(json); } - public void SaveJSONFile(T obj, string file) + public static void SaveJSONFile(T obj, string file) { string json = JsonSerializer.Serialize(obj); File.WriteAllText(file, json); diff --git a/ReportingServices/Models/ProductionReport/DailyReport.cs b/ReportingServices/Models/ProductionReport/DailyReport.cs deleted file mode 100644 index 64b9bf3..0000000 --- a/ReportingServices/Models/ProductionReport/DailyReport.cs +++ /dev/null @@ -1,56 +0,0 @@ -using ReportingServices.HelperClasses; -using ReportingServices.ReportingObjects; - -namespace ReportingServices.Models.ProductionReport -{ - public class DailyReport - { - public DateTime StartDate { get; set; } - public YieldStatistics CurrentWeek { get; set; } - public YieldStatistics PreviousWeek { get; set; } - public Dictionary> ToolAvailibilityByType { get; set; } - public Dictionary ToolStateByType { get; set; } - public Dictionary> ToolStatesByOwner { get; set; } - public Dictionary> DualLayerReactors { get; set; } - public List PreviousEntries { get; set; } - public List CurrentEntries { get; set; } - public int NumberOfToolsWaferSize6IN { get; set; } - public int NumberOfToolsWaferSize8IN { get; set; } - public int NumberOfToolsWaferSize6INScheduled { get; set; } - public int NumberOfToolsWaferSize8INScheduled { get; set; } - public QuarterlyTargets QuarterlyTargets { get; set; } - - public DailyReport() - { - ToolAvailibilityByType = new(); - ToolStateByType = new(); - PreviousEntries = new(); - CurrentEntries = new(); - StartDate = DateTime.Parse(APIHelperFunctions.GetBeginningOfWeekAsAPIString()); - CurrentWeek = new(StartDate, true); - PreviousWeek = new(StartDate.AddDays(-7), false); - } - - public void AddToolAvailibilityByType(string key, List states) - { - ToolAvailibilityByType.Add(key, states); - } - - public void AddToolStateByType(string key, List states) - { - ToolStateByType state = new(states); - - ToolStateByType.Add(key, state); - } - - public void ReverseLists() - { - CurrentWeek.ScrapByDay = APIHelperFunctions.ReverseList(CurrentWeek.ScrapByDay); - PreviousWeek.ScrapByDay = APIHelperFunctions.ReverseList(PreviousWeek.ScrapByDay); - - ToolAvailibilityByType["ASM"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["ASM"]); - ToolAvailibilityByType["EPP"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["EPP"]); - ToolAvailibilityByType["HTR"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["HTR"]); - } - } -} diff --git a/ReportingServices/ReportingObjects/EquipmentStateByDay.cs b/ReportingServices/Models/ProductionReport/EquipmentStateByDay.cs similarity index 72% rename from ReportingServices/ReportingObjects/EquipmentStateByDay.cs rename to ReportingServices/Models/ProductionReport/EquipmentStateByDay.cs index 1a012c4..8b1a119 100644 --- a/ReportingServices/ReportingObjects/EquipmentStateByDay.cs +++ b/ReportingServices/Models/ProductionReport/EquipmentStateByDay.cs @@ -1,4 +1,4 @@ -namespace ReportingServices.ReportingObjects +namespace ReportingServices.Models.ProductionReport { public class EquipmentStateByDay { diff --git a/ReportingServices/ReportingObjects/ManualReportEntries.cs b/ReportingServices/Models/ProductionReport/ManualReportEntries.cs similarity index 95% rename from ReportingServices/ReportingObjects/ManualReportEntries.cs rename to ReportingServices/Models/ProductionReport/ManualReportEntries.cs index 9d2e9ce..2efbc79 100644 --- a/ReportingServices/ReportingObjects/ManualReportEntries.cs +++ b/ReportingServices/Models/ProductionReport/ManualReportEntries.cs @@ -1,4 +1,4 @@ -namespace ReportingServices.ReportingObjects +namespace ReportingServices.Models.ProductionReport { public class ManualReportEntries { diff --git a/ReportingServices/ReportingObjects/QuarterlyTargets.cs b/ReportingServices/Models/ProductionReport/QuarterlyTargets.cs similarity index 80% rename from ReportingServices/ReportingObjects/QuarterlyTargets.cs rename to ReportingServices/Models/ProductionReport/QuarterlyTargets.cs index 38c86cf..027a448 100644 --- a/ReportingServices/ReportingObjects/QuarterlyTargets.cs +++ b/ReportingServices/Models/ProductionReport/QuarterlyTargets.cs @@ -1,4 +1,4 @@ -namespace ReportingServices.ReportingObjects +namespace ReportingServices.Models.ProductionReport { public class QuarterlyTargets { diff --git a/ReportingServices/Models/ProductionReport/RDS.cs b/ReportingServices/Models/ProductionReport/RDS.cs new file mode 100644 index 0000000..bcb050e --- /dev/null +++ b/ReportingServices/Models/ProductionReport/RDS.cs @@ -0,0 +1,20 @@ +namespace ReportingServices.Models.ProductionReport +{ + public class RDS + { + public int Reactor { get; set; } + public string ReactorType { get; set; } + public DateTime DateOut { get; set; } + public int UnloadTemp { get; set; } + public string LayerType { get; set; } + + public RDS(int reactor, string reactorType, DateTime dateOut, int unloadTemp, string layerType) + { + Reactor = reactor; + ReactorType = reactorType; + DateOut = dateOut; + UnloadTemp = unloadTemp; + LayerType = layerType; + } + } +} diff --git a/ReportingServices/Models/ProductionReport/Reactor.cs b/ReportingServices/Models/ProductionReport/Reactor.cs new file mode 100644 index 0000000..3f1ea58 --- /dev/null +++ b/ReportingServices/Models/ProductionReport/Reactor.cs @@ -0,0 +1,18 @@ +namespace ReportingServices.Models.ProductionReport +{ + public class Reactor + { + public int ReactorNumber { get; set; } + public string Type { get; set; } + public string PocketSize { get; set; } + public bool HasDisabledLoadlock { get; set; } + + public Reactor(int reactorNumber, string type, string pocketSize, bool hasDisabledLoadlock) + { + ReactorNumber = reactorNumber; + Type = type; + PocketSize = pocketSize; + HasDisabledLoadlock = hasDisabledLoadlock; + } + } +} diff --git a/ReportingServices/ReportingObjects/ReactorOutsByDay.cs b/ReportingServices/Models/ProductionReport/ReactorOutsByDay.cs similarity index 84% rename from ReportingServices/ReportingObjects/ReactorOutsByDay.cs rename to ReportingServices/Models/ProductionReport/ReactorOutsByDay.cs index cf71faa..a8f57dc 100644 --- a/ReportingServices/ReportingObjects/ReactorOutsByDay.cs +++ b/ReportingServices/Models/ProductionReport/ReactorOutsByDay.cs @@ -1,4 +1,4 @@ -namespace ReportingServices.ReportingObjects +namespace ReportingServices.Models.ProductionReport { public class ReactorOutsByDay { diff --git a/ReportingServices/ReportingObjects/ReactorOutsByRDS.cs b/ReportingServices/Models/ProductionReport/ReactorOutsByRDS.cs similarity index 77% rename from ReportingServices/ReportingObjects/ReactorOutsByRDS.cs rename to ReportingServices/Models/ProductionReport/ReactorOutsByRDS.cs index 78e0367..1099eb5 100644 --- a/ReportingServices/ReportingObjects/ReactorOutsByRDS.cs +++ b/ReportingServices/Models/ProductionReport/ReactorOutsByRDS.cs @@ -1,4 +1,4 @@ -namespace ReportingServices.ReportingObjects +namespace ReportingServices.Models.ProductionReport { public class ReactorOutsByRDS { diff --git a/ReportingServices/ReportingObjects/ScrapByDay.cs b/ReportingServices/Models/ProductionReport/ScrapByDay.cs similarity index 91% rename from ReportingServices/ReportingObjects/ScrapByDay.cs rename to ReportingServices/Models/ProductionReport/ScrapByDay.cs index 4cc07fc..e5bf942 100644 --- a/ReportingServices/ReportingObjects/ScrapByDay.cs +++ b/ReportingServices/Models/ProductionReport/ScrapByDay.cs @@ -1,4 +1,4 @@ -namespace ReportingServices.ReportingObjects +namespace ReportingServices.Models.ProductionReport { public class ScrapByDay { diff --git a/ReportingServices/ReportingObjects/ToolStateCurrent.cs b/ReportingServices/Models/ProductionReport/ToolStateCurrent.cs similarity index 88% rename from ReportingServices/ReportingObjects/ToolStateCurrent.cs rename to ReportingServices/Models/ProductionReport/ToolStateCurrent.cs index b02ca7d..d38b8a0 100644 --- a/ReportingServices/ReportingObjects/ToolStateCurrent.cs +++ b/ReportingServices/Models/ProductionReport/ToolStateCurrent.cs @@ -1,4 +1,4 @@ -namespace ReportingServices.ReportingObjects +namespace ReportingServices.Models.ProductionReport { public class ToolStateCurrent { diff --git a/ReportingServices/Models/ProductionReport/YieldStatistics.cs b/ReportingServices/Models/ProductionReport/YieldStatistics.cs index 797edee..3f38da5 100644 --- a/ReportingServices/Models/ProductionReport/YieldStatistics.cs +++ b/ReportingServices/Models/ProductionReport/YieldStatistics.cs @@ -1,6 +1,4 @@ -using ReportingServices.ReportingObjects; - -namespace ReportingServices.Models.ProductionReport +namespace ReportingServices.Models.ProductionReport { public class YieldStatistics { @@ -15,13 +13,9 @@ namespace ReportingServices.Models.ProductionReport IsCurrentWeek = isCurrentWeek; } - public void SetOutsByDay(List outs) + public void SetYieldInformation(List outs, List scrap) { OutsByDay = GetReactorOutsByDay(outs); - } - - public void SetScrapByDay(List scrap) - { ScrapByDay = scrap; } diff --git a/ReportingServices/Program.cs b/ReportingServices/Program.cs index 00890df..e7051be 100644 --- a/ReportingServices/Program.cs +++ b/ReportingServices/Program.cs @@ -1,4 +1,5 @@ using ReportingServices.Dependency_Injections; +using ReportingServices.HelperClasses; using Serilog; LoggerConfiguration loggerConfiguration = new(); @@ -13,7 +14,6 @@ Serilog.ILogger log = Log.ForContext(); // Add services to the container. builder.Services.AddControllersWithViews(); -builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/ReportingServices/Repositories/Implementations/FabTimeReportingRepository.cs b/ReportingServices/Repositories/Implementations/FabTimeReportingRepository.cs new file mode 100644 index 0000000..1abf65d --- /dev/null +++ b/ReportingServices/Repositories/Implementations/FabTimeReportingRepository.cs @@ -0,0 +1,60 @@ +using ReportingServices.HelperClasses; +using ReportingServices.Models.ProductionReport; +using ReportingServices.ViewModels.ProductionReport; +using System.Text.Json; +using System.Web; + +namespace ReportingServices.Dependency_Injections +{ + public class FabTimeReportingRepository : IFabTimeReportingRepository + { + private readonly string _toolFilter = "~R76%2C%20~R78%2C%20~R25%2C%20~R67%2C%20~R69%2C%20~R71%2C%20~R47%2C%20~R51%2C%20~R28"; + + public async Task> GetMovesTrendData(string startDate = "", string endDate = "") + { + string url = APIHelperFunctions.GenerateURLWithParameters(startDate: startDate, endDate: endDate, chart: "MOVESLOTLIST", areasLike: "CLEANROOM", operationsLike: "1UNLOAD"); + + return await GetJsonData>(url); + } + + public async Task GetToolStateTrendData(DailyReport rpt, string toolType) + { + string url = APIHelperFunctions.GenerateURLWithParameters(chart: "TOOLSTATE", periodLen: "24", capacityTypesLike: toolType, toolsLike: _toolFilter); + + rpt.AddToolAvailibilityByType(toolType, await GetJsonData>(url)); + + return; + } + + public async Task GetToolStateData(DailyReport rpt, string toolType) + { + string capacityFilter = toolType == "ASM" ? toolType + "%2CASM%2B" : toolType; + string startDate = HttpUtility.UrlEncode(APIHelperFunctions.GetDateWithOffsetAsAPIString(DateTime.Now.ToString(), -12.5f)); + + string url = APIHelperFunctions.GenerateURLWithParameters(chart: "ToolStateGantt", periodLen: "24", + capacityTypesLike: capacityFilter, toolsLike: _toolFilter, startDate: startDate); + + rpt.AddToolStateByType(toolType, await GetJsonData>(url)); + + return; + } + + public async Task GetJsonData(string url) + { + T deserializedJson; + + using (var client = new HttpClient()) + { + using (HttpResponseMessage response = await client.GetAsync(url)) + { + string apiResponse = await response.Content.ReadAsStringAsync(); + deserializedJson = JsonSerializer.Deserialize(apiResponse); + } + } + + return deserializedJson; + } + + + } +} diff --git a/ReportingServices/Dependency Injections/Implementations/ScrapeDatabaseRepository.cs b/ReportingServices/Repositories/Implementations/ScrapeDatabaseRepository.cs similarity index 64% rename from ReportingServices/Dependency Injections/Implementations/ScrapeDatabaseRepository.cs rename to ReportingServices/Repositories/Implementations/ScrapeDatabaseRepository.cs index 549ca40..50313f4 100644 --- a/ReportingServices/Dependency Injections/Implementations/ScrapeDatabaseRepository.cs +++ b/ReportingServices/Repositories/Implementations/ScrapeDatabaseRepository.cs @@ -1,6 +1,6 @@ using Microsoft.Data.SqlClient; using ReportingServices.Models.PlanningReport; -using ReportingServices.ReportingObjects; +using ReportingServices.Models.ProductionReport; using System.Data; namespace ReportingServices.Dependency_Injections @@ -131,114 +131,6 @@ namespace ReportingServices.Dependency_Injections return weeklyPartChanges; } - public int[] GetNumberOfToolsByWaferSize(string reactors) - { - int[] singleLoadLocks = new int[2]; - - OpenConnection(); - - SqlCommand cmd = _connection.CreateCommand(); - - string query = "SELECT " + - " SUSC_POCKET_SIZE, " + - " COUNT(SUSC_POCKET_SIZE) " + - " FROM REACTOR " + - " WHERE REACT_ASSIGNMENT IS NOT NULL " + - " AND REACT_ASSIGNMENT <> 'Out of Service' " + - " AND REACT_ASSIGNMENT <> '' " + - " AND REACT_NO NOT IN (" + reactors + ") " + - "GROUP BY SUSC_POCKET_SIZE"; - - cmd.CommandText = query; - - using (SqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - singleLoadLocks[0] = int.Parse(reader[1].ToString()); - - reader.Read(); - - singleLoadLocks[1] = int.Parse(reader[1].ToString()); - } - - cmd.Dispose(); - - CloseConnection(); - - return singleLoadLocks; - } - - public int[] GetNumberOfSingleLoadLocks() - { - int[] singleLoadLocks = new int[2]; - - OpenConnection(); - - SqlCommand cmd = _connection.CreateCommand(); - - string query = "SELECT REACT_TYPE, SUM(CASE WHEN ACTIVE_LL_DISABLED <> '' AND ACTIVE_LL_DISABLED IS NOT NULL THEN 1 ELSE 0 END) AS SLL" + - " FROM REACTOR " + - " WHERE REACT_ASSIGNMENT IS NOT NULL " + - " AND REACT_ASSIGNMENT <> 'Out of Service' " + - " AND REACT_ASSIGNMENT<> '' " + - " AND REACT_TYPE IN('ASM', 'HTR') " + - "GROUP BY REACT_TYPE"; - - cmd.CommandText = query; - - using (SqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - singleLoadLocks[0] = int.Parse(reader[1].ToString()); - - reader.Read(); - - singleLoadLocks[1] = int.Parse(reader[1].ToString()); - } - - cmd.Dispose(); - - CloseConnection(); - - return singleLoadLocks; - } - - public int[] GetNumberOfToolUnloadTempsLessThan700() - { - int[] unloadTempTools = new int[2]; - - OpenConnection(); - - SqlCommand cmd = _connection.CreateCommand(); - - string query = "SELECT REACTOR_TYPE, COUNT(DISTINCT(REACTOR)) AS ULT FROM RDS " + - "INNER JOIN RDS_LAYER lay ON lay.RDS_NO = SEQ " + - "WHERE DATE_OUT > DATEADD(DAY, -1, SYSDATETIME()) " + - " AND UL_TEMP< 700 " + - "GROUP BY REACTOR_TYPE"; - - cmd.CommandText = query; - - using (SqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - unloadTempTools[0] = int.Parse(reader[1].ToString()); - - reader.Read(); - - unloadTempTools[1] = int.Parse(reader[1].ToString()); - } - - cmd.Dispose(); - - CloseConnection(); - - return unloadTempTools; - } - public QuarterlyTargets GetQuarterlyTargets() { Dictionary targets = new(); @@ -286,49 +178,63 @@ namespace ReportingServices.Dependency_Injections return quarterlyTargets; } - public Dictionary> GetDualLayerReactors() + public List GetReactors() { - Dictionary> dualLayers = new(); - - dualLayers.Add("ASM", new List()); - dualLayers.Add("HTR", new List()); - dualLayers.Add("EPP", new List()); + List reactors = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); - string query = "SELECT REACTOR_TYPE, REACTOR FROM " + - "(SELECT " + - " REACTOR, " + - " rds.REACTOR_TYPE, " + - " PROD_SPEC_ID, " + - " SUM(CASE WHEN psn.LAYER_TYPE = 'Standard 2 Layer' THEN 1 ELSE 0 END) AS Dual " + - " FROM RDS " + - "INNER JOIN PROD_SPEC psn ON rds.PROD_SPEC_ID = psn.SEQ " + - " WHERE DATE_OUT BETWEEN DATEADD(DAY, -1, SYSDATETIME()) AND SYSDATETIME() " + - "GROUP BY REACTOR, PROD_SPEC_ID, rds.REACTOR_TYPE) res " + - "WHERE res.Dual > 0 " + - "ORDER BY 1, 2 "; + string query = "SELECT " + + " REACT_NO, REACT_TYPE, SUSC_POCKET_SIZE, CASE WHEN ACTIVE_LL_DISABLED <> '' THEN 'TRUE' ELSE 'FALSE' END AS \"LL_DISABLED\" " + + " FROM REACTOR " + + " WHERE REACT_ASSIGNMENT IS NOT NULL " + + " AND REACT_ASSIGNMENT <> 'Out of Service' " + + " AND REACT_ASSIGNMENT<> ''"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) - { - if (reader[0].ToString() == "ASM+") - dualLayers["ASM"].Add("R" + reader[1].ToString()); - else - dualLayers[reader[0].ToString()].Add("R" + reader[1].ToString()); - } + reactors.Add(new Reactor(int.Parse(reader[0].ToString()), reader[1].ToString(), reader[2].ToString(), bool.Parse(reader[3].ToString()))); } cmd.Dispose(); CloseConnection(); - return dualLayers; + return reactors; + } + + public List GetRDSForLastDay() + { + List rdsList = new(); + + OpenConnection(); + + SqlCommand cmd = _connection.CreateCommand(); + + string query = "SELECT rds.REACTOR, rds.REACTOR_TYPE, rds.DATE_OUT, " + + "CASE WHEN lay.UL_TEMP IS NULL THEN '1000' ELSE lay.UL_TEMP END, psn.LAYER_TYPE FROM RDS " + + "INNER JOIN RDS_LAYER lay ON lay.RDS_NO = SEQ " + + "INNER JOIN PROD_SPEC psn ON rds.PROD_SPEC_ID = psn.SEQ " + + "WHERE DATE_OUT > DATEADD(DAY, -1, SYSDATETIME())"; + + cmd.CommandText = query; + + using (SqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + rdsList.Add(new RDS(int.Parse(reader[0].ToString()), reader[1].ToString(), DateTime.Parse(reader[2].ToString()), int.Parse(reader[3].ToString()), reader[4].ToString())); + } + + cmd.Dispose(); + + CloseConnection(); + + return rdsList; } } } diff --git a/ReportingServices/Repositories/Interfaces/IFabTimeReportingRepository.cs b/ReportingServices/Repositories/Interfaces/IFabTimeReportingRepository.cs new file mode 100644 index 0000000..44cfd86 --- /dev/null +++ b/ReportingServices/Repositories/Interfaces/IFabTimeReportingRepository.cs @@ -0,0 +1,13 @@ +using ReportingServices.Models.ProductionReport; +using ReportingServices.ViewModels.ProductionReport; + +namespace ReportingServices.Dependency_Injections +{ + public interface IFabTimeReportingRepository + { + public Task> GetMovesTrendData(string startDate = "", string endDate = ""); + public Task GetToolStateTrendData(DailyReport rpt, string toolType); + public Task GetToolStateData(DailyReport rpt, string toolType); + public Task GetJsonData(string url); + } +} diff --git a/ReportingServices/Dependency Injections/Interfaces/IScrapeDatabaseRepository.cs b/ReportingServices/Repositories/Interfaces/IScrapeDatabaseRepository.cs similarity index 64% rename from ReportingServices/Dependency Injections/Interfaces/IScrapeDatabaseRepository.cs rename to ReportingServices/Repositories/Interfaces/IScrapeDatabaseRepository.cs index 2e29ad1..48306d8 100644 --- a/ReportingServices/Dependency Injections/Interfaces/IScrapeDatabaseRepository.cs +++ b/ReportingServices/Repositories/Interfaces/IScrapeDatabaseRepository.cs @@ -1,5 +1,5 @@ using ReportingServices.Models.PlanningReport; -using ReportingServices.ReportingObjects; +using ReportingServices.Models.ProductionReport; namespace ReportingServices.Dependency_Injections { @@ -10,10 +10,8 @@ namespace ReportingServices.Dependency_Injections public List GetScrapByDay(List outs); public List GetReactorPSNWORuns(string startDate, string endDate); public int GetNumberOfPartChanges(string startDate, string endDate); - public int[] GetNumberOfToolsByWaferSize(string reactors); - public int[] GetNumberOfSingleLoadLocks(); - public int[] GetNumberOfToolUnloadTempsLessThan700(); public QuarterlyTargets GetQuarterlyTargets(); - public Dictionary> GetDualLayerReactors(); + public List GetReactors(); + public List GetRDSForLastDay(); } } diff --git a/ReportingServices/ViewModels/ProductionReport/DailyReport.cs b/ReportingServices/ViewModels/ProductionReport/DailyReport.cs new file mode 100644 index 0000000..8bc9be2 --- /dev/null +++ b/ReportingServices/ViewModels/ProductionReport/DailyReport.cs @@ -0,0 +1,132 @@ +using ReportingServices.HelperClasses; +using ReportingServices.Models.ProductionReport; + +namespace ReportingServices.ViewModels.ProductionReport +{ + public class DailyReport + { + public DateTime StartDate { get; set; } + public YieldStatistics CurrentWeek { get; set; } + public YieldStatistics PreviousWeek { get; set; } + public Dictionary> ToolAvailibilityByType { get; set; } + public Dictionary ToolStateByType { get; set; } + public Dictionary> ToolStatesByOwner { get; set; } + public Dictionary> DualLayerReactors { get; set; } + public List PreviousEntries { get; set; } + public List CurrentEntries { get; set; } + public int NumberOfToolsWaferSize6IN { get; set; } + public int NumberOfToolsWaferSize8IN { get; set; } + public int NumberOfToolsWaferSize6INScheduled { get; set; } + public int NumberOfToolsWaferSize8INScheduled { get; set; } + public QuarterlyTargets QuarterlyTargets { get; set; } + + public DailyReport() + { + ToolAvailibilityByType = new(); + ToolStateByType = new(); + PreviousEntries = new(); + CurrentEntries = new(); + DualLayerReactors = new(); + StartDate = DateTime.Parse(APIHelperFunctions.GetBeginningOfWeekAsAPIString()); + CurrentWeek = new(StartDate, true); + PreviousWeek = new(StartDate.AddDays(-7), false); + } + + public void AddToolAvailibilityByType(string key, List states) + { + ToolAvailibilityByType.Add(key, states); + } + + public void AddToolStateByType(string key, List states) + { + ToolStateByType state = new(states); + + ToolStateByType.Add(key, state); + } + + public void SetReactorInfo(List reactors, List unscheduledReactors) + { + SetToolsByPocketSize(reactors, unscheduledReactors); + SetDisabledLoadlocks(reactors); + } + + public void SetRDSInfo(List rdsList) + { + SetDualLayerReactors(rdsList); + SetUnloadTempsLessThan700(rdsList); + } + + private void SetToolsByPocketSize(List reactors, List unscheduledReactors) + { + NumberOfToolsWaferSize6IN = reactors.Where(react => react.PocketSize.Contains("150")).Count(); + NumberOfToolsWaferSize8IN = reactors.Where(react => react.PocketSize.Contains("200")).Count(); + + NumberOfToolsWaferSize6INScheduled = + reactors.Where(react => !unscheduledReactors.Contains(react.ReactorNumber) + && react.PocketSize.Contains("150")).Count(); + NumberOfToolsWaferSize8INScheduled = + reactors.Where(react => !unscheduledReactors.Contains(react.ReactorNumber) + && react.PocketSize.Contains("200")).Count(); + } + + private void SetDisabledLoadlocks(List reactors) + { + List reactorsWithDisabledLoadlocks = reactors.Where(react => react.HasDisabledLoadlock).ToList(); + + int singleLoadlockASM = reactorsWithDisabledLoadlocks.Where(react => react.Type.Contains("ASM")).Count(); + int singleLoadlockHTR = reactorsWithDisabledLoadlocks.Where(react => react.Type.Contains("HTR")).Count(); + + CurrentEntries[(int)DateTime.Now.DayOfWeek].ASMSingleLoadLock = singleLoadlockASM; + CurrentEntries[(int)DateTime.Now.DayOfWeek].HTRSingleLoadLock = singleLoadlockHTR; + } + + private void SetDualLayerReactors(List rdsList) + { + List rdsWithDualLayerPSN = rdsList.Where(rds => rds.LayerType.Contains("2 Layer")).ToList(); + + DualLayerReactors.Add("ASM", rdsWithDualLayerPSN. + Where(rds => rds.ReactorType.Contains("ASM")). + OrderBy(rds => rds.Reactor). + Select(rds => rds.Reactor). + Distinct().ToList()); + DualLayerReactors.Add("HTR", rdsWithDualLayerPSN. + Where(rds => rds.ReactorType.Contains("HTR")). + OrderBy(rds => rds.Reactor). + Select(rds => rds.Reactor). + Distinct().ToList()); + DualLayerReactors.Add("EPP", rdsWithDualLayerPSN. + Where(rds => rds.ReactorType.Contains("EPP")). + OrderBy(rds => rds.Reactor). + Select(rds => rds.Reactor). + Distinct().ToList()); + } + + private void SetUnloadTempsLessThan700(List rdsList) + { + List rdsWithTempsLessThan700 = rdsList.Where(rds => rds.UnloadTemp < 700).ToList(); + + CurrentEntries[(int)DateTime.Now.DayOfWeek].ASMUnloadTempsLessThan700 = + rdsWithTempsLessThan700. + Where(rds => rds.ReactorType. + Contains("ASM")). + Select(rds => rds.Reactor). + Distinct().Count(); + CurrentEntries[(int)DateTime.Now.DayOfWeek].HTRUnloadTempsLessThan700 = + rdsWithTempsLessThan700. + Where(rds => rds.ReactorType. + Contains("HTR")). + Select(rds => rds.Reactor). + Distinct().Count(); + } + + public void ReverseLists() + { + CurrentWeek.ScrapByDay = APIHelperFunctions.ReverseList(CurrentWeek.ScrapByDay); + PreviousWeek.ScrapByDay = APIHelperFunctions.ReverseList(PreviousWeek.ScrapByDay); + + ToolAvailibilityByType["ASM"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["ASM"]); + ToolAvailibilityByType["EPP"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["EPP"]); + ToolAvailibilityByType["HTR"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["HTR"]); + } + } +} diff --git a/ReportingServices/ReportingObjects/ToolStateByType.cs b/ReportingServices/ViewModels/ProductionReport/ToolStateByType.cs similarity index 96% rename from ReportingServices/ReportingObjects/ToolStateByType.cs rename to ReportingServices/ViewModels/ProductionReport/ToolStateByType.cs index eb40f42..8ea6c1a 100644 --- a/ReportingServices/ReportingObjects/ToolStateByType.cs +++ b/ReportingServices/ViewModels/ProductionReport/ToolStateByType.cs @@ -1,4 +1,6 @@ -namespace ReportingServices.ReportingObjects +using ReportingServices.Models.ProductionReport; + +namespace ReportingServices.ViewModels.ProductionReport { public class ToolStateByType { diff --git a/ReportingServices/Views/ProductionReport/DailyReport.cshtml b/ReportingServices/Views/ProductionReport/DailyReport.cshtml index 942c471..744a0c9 100644 --- a/ReportingServices/Views/ProductionReport/DailyReport.cshtml +++ b/ReportingServices/Views/ProductionReport/DailyReport.cshtml @@ -1,8 +1,7 @@ -@using ReportingServices.ReportingObjects -@model ReportingServices.Models.ProductionReport.DailyReport +@using ReportingServices.ViewModels.ProductionReport +@using ReportingServices.Models.ProductionReport +@model DailyReport @{ - - int ASMAvailablePct = 0; int EPPAvailablePct = 0; int HTRAvailablePct = 0; diff --git a/ReportingServices/Views/ProductionReport/EditDailyReport.cshtml b/ReportingServices/Views/ProductionReport/EditDailyReport.cshtml index 23f956e..21ed3e9 100644 --- a/ReportingServices/Views/ProductionReport/EditDailyReport.cshtml +++ b/ReportingServices/Views/ProductionReport/EditDailyReport.cshtml @@ -1,4 +1,5 @@ -@model ReportingServices.ReportingObjects.ManualReportEntries +@using ReportingServices.Models.ProductionReport +@model ManualReportEntries @{ ViewData["Title"] = "Edit Daily Passdown | Mesa Reporting Services"; diff --git a/ReportingServices/appsettings.Development.json b/ReportingServices/appsettings.Development.json index 2f4b910..0a35c7e 100644 --- a/ReportingServices/appsettings.Development.json +++ b/ReportingServices/appsettings.Development.json @@ -7,5 +7,8 @@ }, "Serilog": { "MinimumLevel": "Debug" + }, + "ConnectionStrings": { + "DefaultConnection": "Server=MESTSV01EC.ec.local\\TEST1,50572;Database=LSL2SQL;User Id=srpadmin;Password=0okm9ijn;TrustServerCertificate=true" } } diff --git a/ReportingServices/appsettings.Release.json b/ReportingServices/appsettings.Release.json new file mode 100644 index 0000000..a2a590b --- /dev/null +++ b/ReportingServices/appsettings.Release.json @@ -0,0 +1,14 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "Serilog": { + "MinimumLevel": "Debug" + }, + "ConnectionStrings": { + "DefaultConnection": "Server=MESSV01EC.EC.LOCAL\\PROD1,53959;Database=LSL2SQL;User Id=srpadmin;Password=0okm9ijn;TrustServerCertificate=true" + } +} diff --git a/ReportingServices/appsettings.json b/ReportingServices/appsettings.json index 9b1c471..c78b19c 100644 --- a/ReportingServices/appsettings.json +++ b/ReportingServices/appsettings.json @@ -6,7 +6,7 @@ } }, "ConnectionStrings": { - "DefaultConnection": "Server=Messv01ec.ec.local\\PROD1,53959;Database=LSL2SQL;User Id=srpadmin;Password=0okm9ijn;TrustServerCertificate=true" + "DefaultConnection": "Server=MESSV01EC.EC.LOCAL\\PROD1,53959;Database=LSL2SQL;User Id=srpadmin;Password=0okm9ijn;TrustServerCertificate=true" }, "AllowedHosts": "*", "Serilog": { diff --git a/ReportingServices/wwwroot/Assets/DailyReportInfo.json b/ReportingServices/wwwroot/Assets/DailyReportInfo.json index 17b4680..c0827ea 100644 --- a/ReportingServices/wwwroot/Assets/DailyReportInfo.json +++ b/ReportingServices/wwwroot/Assets/DailyReportInfo.json @@ -1 +1 @@ -{"Previous Week":[{"Day":0,"Date":"2022-11-27T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":1,"Date":"2022-11-28T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":10,"HTRSingleLoadLock":16,"ASMUnloadTempsLessThan700":2,"HTRUnloadTempsLessThan700":1},{"Day":2,"Date":"2022-11-29T00:00:00","OperatorHeadcountDays":14,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":3,"HTRSingleLoadLock":12,"ASMUnloadTempsLessThan700":3,"HTRUnloadTempsLessThan700":1},{"Day":3,"Date":"2022-11-30T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":4,"Date":"2022-12-01T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":5,"Date":"2022-12-02T00:00:00","OperatorHeadcountDays":0,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":6,"Date":"2022-12-03T00:00:00","OperatorHeadcountDays":13,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0}],"Current Week":[{"Day":0,"Date":"2022-12-04T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":1,"Date":"2022-12-05T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":10,"HTRSingleLoadLock":16,"ASMUnloadTempsLessThan700":2,"HTRUnloadTempsLessThan700":1},{"Day":2,"Date":"2022-12-06T00:00:00","OperatorHeadcountDays":14,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":3,"HTRSingleLoadLock":12,"ASMUnloadTempsLessThan700":3,"HTRUnloadTempsLessThan700":1},{"Day":3,"Date":"2022-12-07T00:00:00","OperatorHeadcountDays":13,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":3,"HTRSingleLoadLock":12,"ASMUnloadTempsLessThan700":2,"HTRUnloadTempsLessThan700":1},{"Day":4,"Date":"2022-12-08T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":3,"HTRSingleLoadLock":12,"ASMUnloadTempsLessThan700":2,"HTRUnloadTempsLessThan700":1},{"Day":5,"Date":"2022-12-09T00:00:00","OperatorHeadcountDays":0,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":2,"HTRSingleLoadLock":14,"ASMUnloadTempsLessThan700":2,"HTRUnloadTempsLessThan700":1},{"Day":6,"Date":"2022-12-10T00:00:00","OperatorHeadcountDays":13,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0}]} \ No newline at end of file +{"Previous Week":[{"Day":0,"Date":"2022-11-27T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":1,"Date":"2022-11-28T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":10,"HTRSingleLoadLock":16,"ASMUnloadTempsLessThan700":2,"HTRUnloadTempsLessThan700":1},{"Day":2,"Date":"2022-11-29T00:00:00","OperatorHeadcountDays":14,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":3,"HTRSingleLoadLock":12,"ASMUnloadTempsLessThan700":3,"HTRUnloadTempsLessThan700":1},{"Day":3,"Date":"2022-11-30T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":4,"Date":"2022-12-01T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":5,"Date":"2022-12-02T00:00:00","OperatorHeadcountDays":0,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":6,"Date":"2022-12-03T00:00:00","OperatorHeadcountDays":13,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0}],"Current Week":[{"Day":0,"Date":"2022-12-04T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":1,"Date":"2022-12-05T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":5,"HTRSingleLoadLock":14,"ASMUnloadTempsLessThan700":3,"HTRUnloadTempsLessThan700":3},{"Day":2,"Date":"2022-12-13T00:00:00","OperatorHeadcountDays":11,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0},{"Day":3,"Date":"2022-12-07T00:00:00","OperatorHeadcountDays":13,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":3,"HTRSingleLoadLock":12,"ASMUnloadTempsLessThan700":2,"HTRUnloadTempsLessThan700":1},{"Day":4,"Date":"2022-12-08T00:00:00","OperatorHeadcountDays":6,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":3,"HTRSingleLoadLock":12,"ASMUnloadTempsLessThan700":2,"HTRUnloadTempsLessThan700":1},{"Day":5,"Date":"2022-12-09T00:00:00","OperatorHeadcountDays":0,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":2,"HTRSingleLoadLock":14,"ASMUnloadTempsLessThan700":2,"HTRUnloadTempsLessThan700":1},{"Day":6,"Date":"2022-12-10T00:00:00","OperatorHeadcountDays":13,"OperatorHeadcountNights":15,"OperatorCallOutsDays":2,"OperatorCallOutsNights":0,"EngineeringHeadcountDays":2,"EngineeringHeadcountNights":2,"EngineeringCallOutsDays":0,"EngineeringCallOutsNights":0,"MaintenanceHeadcountDays":4,"MaintenanceHeadcountNights":5,"MaintenanceCallOutsDays":0,"MaintenanceCallOutsNights":2,"BottleChanges":"R22","DailyPartChanges":"R22,R23,R25","WeeklyPartChanges":"R21,R23,R29,R30","ASMSingleLoadLock":0,"HTRSingleLoadLock":0,"ASMUnloadTempsLessThan700":0,"HTRUnloadTempsLessThan700":0}]} \ No newline at end of file