using System.Globalization; using System.Text.RegularExpressions; 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 T1R3Processor( AppDbContext db, LayersController controller, SpreadsheetsResource.ValuesResource googleSheetValues) { public void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var source = processWorker.Records?.Where(x => x.Code == "Source").First().Desc1; if (source == null) { throw new Exception("Source record not found"); } 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}-R3-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 newRecords = new List(); string pattern = @$"^L\d+-P-{year}/\d+-{source}-T5$"; var dataSources = db.Layers .Where(x => !x.IsDeleted) .Include(layer => layer.Records!) .AsEnumerable() .Where(x => Regex.IsMatch(x.Name!, pattern)) .ToList(); foreach (var dataSource in dataSources) { var month = ProcessHelper.ExtractMonthFromLayerName(dataSource.Name!); if (month == null) { throw new Exception($"Month not found: {dataSource.Name}"); } foreach (var record in dataSource.Records!) { if (record.Value1 == null) continue; for (var i = 1; i < 33; i++) { if (ProcessHelper.GetValue(record, i) == null) continue; var newRecord = new Record { Id = Guid.NewGuid(), Code = $"{record.Code}{month}{i:D2}", CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow, Value1 = i==1 ? record.Value1 : record.Value1 * ProcessHelper.GetValue(record, i) / 100, Desc1 = record.Desc1 }; newRecords.Add(newRecord); } } } 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 = "10Xo8BBF92nM7_JzzeOuWp49Gz8OsYuCxLDOeChqpW_8"; var r3 = db.Layers .Where(x => x.Number == 3954) .Include(x => x.Records) .FirstOrDefault(); for (var i = 1; i <= 12; i++) { var sheetName = ProcessHelper.GetSheetName(i, 2024); ValueRange? dataRangeResponse; try { dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetName}!A7:A200").Execute(); } catch { continue; // Sheet not exist } if (dataRangeResponse == null) continue; // Sheet not exist var data = dataRangeResponse.Values; var updateValueRange = new ValueRange { Values = new List>() }; foreach (var row in data) { if (row.Count == 0) continue; var code = row[0].ToString(); var updateRow = new List(); for (var j = 1; j < 16; j++) { var codeRecord = r3!.Records!.FirstOrDefault(x => x.Code == $"{code}{i:D2}{j:D2}"); if (codeRecord is { Value1: not null }) { updateRow.Add(codeRecord.Value1); } else { updateRow.Add(""); } } updateValueRange.Values.Add(updateRow); } dataRangeResponse.Values = data; var update = googleSheetValues.Update(updateValueRange, sheetId, $"{sheetName}!C7:Q200"); update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; update.Execute(); // update time var timeUtc = new List { r3!.ModifiedAt.ToString("dd.MM.yyyy HH:mm:ss", CultureInfo.GetCultureInfo("pl-PL")) }; var warsawTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"); var warsawTime = TimeZoneInfo.ConvertTimeFromUtc(r3.ModifiedAt.ToUniversalTime(), warsawTimeZone); var timeWarsaw = new List { warsawTime.ToString("dd.MM.yyyy HH:mm:ss", CultureInfo.GetCultureInfo("pl-PL")) }; var valueRangeTime = new ValueRange { Values = new List> () }; valueRangeTime.Values.Add(timeUtc); valueRangeTime.Values.Add(timeWarsaw); var updateTimeUtc = googleSheetValues.Update(valueRangeTime, sheetId, $"{sheetName}!G1:G2"); updateTimeUtc.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateTimeUtc.Execute(); } } }