using System.Globalization; using DiunaBIWebAPI.dataProcessors; using Google.Apis.Sheets.v4; using Google.Apis.Sheets.v4.Data; using Microsoft.EntityFrameworkCore; using WebAPI.Controllers; using WebAPI.Models; namespace WebAPI.dataProcessors; public class T1R1OldProcessor( AppDbContext db, SpreadsheetsResource.ValuesResource googleSheetValues, LayersController controller, LogsController logsController) { public void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList(); if (sources!.Count == 0) { throw new Exception("Source record not found"); } var codes = processWorker.Records?.SingleOrDefault(x => x.Code == "Codes")?.Desc1; if (codes == null) { throw new Exception("Codes record not found"); } var codesList = ProcessHelper.ParseCodes(codes); var processedLayer = db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted) .OrderByDescending(x => x.CreatedAt) .FirstOrDefault(); var isNew = false; if (processedLayer == null) { isNew = true; processedLayer = new Layer { Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, Number = db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}-R1-T1"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.ModifiedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedAt = DateTime.UtcNow; processedLayer.ModifiedAt = DateTime.UtcNow; } processedLayer.ModifiedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.ModifiedAt = DateTime.UtcNow; var dataSources = new List(); foreach (var source in sources) { for (var month = 1; month <= DateTime.UtcNow.Month; month++) { var monthCopy = month; var dataSource = db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && x.Name != null && x.Name.Contains($"{year}/{monthCopy:D2}-{source.Desc1}-T3") ) .Include(x => x.Records) .FirstOrDefault(); if (dataSource != null) { dataSources.Add(dataSource); } else { logsController.AddEntry(new LogEntry { Title = $"{processWorker.Name}, {processWorker.Id}", Type = LogEntryType.Warning, LogType = LogType.Process, Message = $"Data source {year}/{month:D2}-{source.Desc1}-T3 not found", CreatedAt = DateTime.UtcNow }); } } // year summary var dataSourceSum = db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && x.Name != null && x.Name.Contains($"{year}/13-{source.Desc1}-T3") ) .Include(x => x.Records) .FirstOrDefault(); if (dataSourceSum != null) { dataSources.Add(dataSourceSum); } else { logsController.AddEntry(new LogEntry { Title = $"{processWorker.Name}, {processWorker.Id}", Type = LogEntryType.Warning, LogType = LogType.Process, Message = $"Data source {year}/13-{source.Desc1}-T3 not found", CreatedAt = DateTime.UtcNow }); } } if (dataSources.Count == 0) { throw new Exception("DataSources are empty"); } var newRecords = dataSources .SelectMany(x => x.Records!) .Where(x => codesList.Contains(int.Parse(x.Code!))) .Select(x => { var layer = dataSources.SingleOrDefault(y => y.Id == x.LayerId); var postFix = layer!.Name!.Split("/")[1].Split("-")[0]; if (postFix.Length == 1) { postFix = "0" + postFix; } var newRecord = new Record { Id = Guid.NewGuid(), Code = x.Code + postFix, CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow, Value1 = x.Value32 }; return newRecord; }) .ToList(); if (isNew) { db.Layers.Add(processedLayer); } else { db.Layers.Update(processedLayer); } controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); db.SaveChanges(); UpdateReport(); } private void UpdateReport() { const string sheetId = "1pph-XowjlK5CIaCEV_A5buK4ceJ0Z0YoUlDI4VMkhhA"; const string sheetName = "OLD_Raport_R1_Eksport"; var request = googleSheetValues.Get(sheetId, "C4:EX4"); var response = request.Execute(); var r1 = db.Layers .Where(x => x.Number == 1205) .Include(x => x.Records) .FirstOrDefault(); const int startRow = 6; var codesRow = response.Values[0]; for (var i = 1; i <= DateTime.UtcNow.Month; i++) { var values = new List(); var month = i < 10 ? $"0{i}" : i.ToString(); var row = (startRow + i).ToString(); foreach (string code in codesRow) { var record = r1!.Records?.SingleOrDefault(x => x.Code == $"{code}{month}"); if (record != null) { values.Add(record.Value1!.Value); } else { values.Add("0"); } } var valueRange = new ValueRange { Values = new List> { values } }; var update = googleSheetValues.Update(valueRange, sheetId, $"{sheetName}!C{row}:XZ{row}"); update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; update.Execute(); } // sum var valuesSum = new List(); var emptyRow = new List(); var rowEmpty = (startRow + DateTime.UtcNow.Month + 1).ToString(); var rowSum = (startRow + DateTime.UtcNow.Month + 2).ToString(); foreach (string code in codesRow) { var record = r1!.Records?.SingleOrDefault(x => x.Code == $"{code}13"); emptyRow.Add(""); if (record != null) { valuesSum.Add(record.Value1!.Value); } else { valuesSum.Add("0"); } } // insert empty row before sum var valueRangeEmpty = new ValueRange { Values = new List> { emptyRow } }; var updateEmpty = googleSheetValues.Update(valueRangeEmpty, sheetId, $"{sheetName}!C{rowEmpty}:XZ{rowEmpty}"); updateEmpty.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateEmpty.Execute(); var valueRangeSum = new ValueRange { Values = new List> { valuesSum } }; var updateSum = googleSheetValues.Update(valueRangeSum, sheetId, $"{sheetName}!C{rowSum}:XZ{rowSum}"); updateSum.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateSum.Execute(); // update time var timeUtc = new List { r1!.ModifiedAt.ToString("dd.MM.yyyy HH:mm:ss", CultureInfo.GetCultureInfo("pl-PL")) }; var valueRangeUtcTime = new ValueRange { Values = new List> { timeUtc } }; var updateTimeUtc = googleSheetValues.Update(valueRangeUtcTime, sheetId, $"{sheetName}!G1"); updateTimeUtc.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateTimeUtc.Execute(); var warsawTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"); var warsawTime = TimeZoneInfo.ConvertTimeFromUtc(r1.ModifiedAt.ToUniversalTime(), warsawTimeZone); var timeWarsaw = new List { warsawTime.ToString("dd.MM.yyyy HH:mm:ss", CultureInfo.GetCultureInfo("pl-PL")) }; var valueRangeWarsawTime = new ValueRange { Values = new List> { timeWarsaw } }; var updateTimeWarsaw = googleSheetValues.Update(valueRangeWarsawTime, sheetId, $"{sheetName}!G2"); updateTimeWarsaw.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateTimeWarsaw.Execute(); } }