From a6ac91305e34d113e720696d1d9480098f26f44d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zieli=C5=84ski?= Date: Mon, 24 Mar 2025 16:34:56 +0100 Subject: [PATCH] Add - operator into basecalc --- WebAPI/Calculators/BaseCalc.cs | 2 +- WebAPI/Controllers/DataInboxController.cs | 11 ++- WebAPI/Controllers/LayersController.cs | 15 ++++ .../CreateDataInboxImportWorker .sql | 76 ++++++++++++++++++ ...eProcessWorker-T3MultiSourceSummary-AA.sql | 2 +- WebAPI/Helpers/HttpRequests/AutoImport.http | 2 +- WebAPI/Models/Record.cs | 2 +- WebAPI/dataImporters/morska.d3.importer.cs | 77 +++++++++++++++++++ 8 files changed, 181 insertions(+), 6 deletions(-) create mode 100644 WebAPI/Helpers/DbSeed/Admin-Monthly/CreateDataInboxImportWorker .sql create mode 100644 WebAPI/dataImporters/morska.d3.importer.cs diff --git a/WebAPI/Calculators/BaseCalc.cs b/WebAPI/Calculators/BaseCalc.cs index b7b1f32..75f2972 100644 --- a/WebAPI/Calculators/BaseCalc.cs +++ b/WebAPI/Calculators/BaseCalc.cs @@ -35,7 +35,7 @@ public class BaseCalc // check right side of expression return !string.IsNullOrEmpty(Formula) && - Formula.All(c => char.IsDigit(c) || c == '[' || c == ']' || c == '+'); + Formula.All(c => char.IsDigit(c) || c == '[' || c == ']' || c == '+' || c == '-'); } public Record CalculateT3(List records) diff --git a/WebAPI/Controllers/DataInboxController.cs b/WebAPI/Controllers/DataInboxController.cs index ca2b618..174b2f1 100644 --- a/WebAPI/Controllers/DataInboxController.cs +++ b/WebAPI/Controllers/DataInboxController.cs @@ -16,16 +16,18 @@ public class DataInboxController : Controller private readonly AppDbContext _db; private readonly IConfiguration _configuration; private readonly LogsController _logsController; + private readonly LayersController _layersController; public DataInboxController( AppDbContext db, - GoogleSheetsHelper googleSheetsHelper, IConfiguration configuration, - FirestoreDb firestoreDb) + FirestoreDb firestoreDb, + LayersController layersController) { _db = db; _configuration = configuration; _logsController = new LogsController(firestoreDb); + _layersController = layersController; } [HttpPut] @@ -115,6 +117,11 @@ public class DataInboxController : Controller CreatedAt = DateTime.UtcNow }); + if (dataInbox.Name == "morska.d3.importer") + { + // TODO: import dataInbox as Layer + } + return Ok(); } catch (Exception e) diff --git a/WebAPI/Controllers/LayersController.cs b/WebAPI/Controllers/LayersController.cs index 72166e7..e3e0677 100644 --- a/WebAPI/Controllers/LayersController.cs +++ b/WebAPI/Controllers/LayersController.cs @@ -369,6 +369,21 @@ public class LayersController : Controller { var type = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportType")?.Desc1 ?? "Standard"; + var source = importWorker.Records!.FirstOrDefault(x => x.Code == "Source")?.Desc1 ?? + "GoogleSheet"; + if (source == "DataInbox" && type == "Import-D3") { + var d3Importer = new MorskaD3Importer(_db, this); + d3Importer.Import(importWorker); + _logsController.AddEntry(new LogEntry + { + Title = $"{importWorker.Name}, {importWorker.Id}", + Type = LogEntryType.Info, + LogType = LogType.Import, + Message = "Success", + CreatedAt = DateTime.UtcNow + }); + continue; + } switch (type) { case "D1": diff --git a/WebAPI/Helpers/DbSeed/Admin-Monthly/CreateDataInboxImportWorker .sql b/WebAPI/Helpers/DbSeed/Admin-Monthly/CreateDataInboxImportWorker .sql new file mode 100644 index 0000000..b47e44f --- /dev/null +++ b/WebAPI/Helpers/DbSeed/Admin-Monthly/CreateDataInboxImportWorker .sql @@ -0,0 +1,76 @@ +DECLARE @JustForDebug TINYINT = 1; + +-- SETUP VARIABLES +DECLARE @Type NVARCHAR(3) = 'D3'; +DECLARE @Month INT = 1; +DECLARE @Year INT = 2025; + +IF @Type NOT IN ('D3') +BEGIN + SELECT 'Type is not valid' AS Logger; + RETURN; +END; + +DECLARE @ImportType NVARCHAR(20) = 'Import-D3'; + +DECLARE @StartDate NVARCHAR(10) = FORMAT(DATEADD(DAY, 24, DATEADD(MONTH, @Month - 2, DATEFROMPARTS(YEAR(GETDATE()), 1, 1))), 'yyyy.MM.dd'); +DECLARE @EndDate NVARCHAR(10) = FORMAT(DATEFROMPARTS(YEAR(GETDATE()), @Month + 1, 5), 'yyyy.MM.dd'); +DECLARE @Number INT = (SELECT COUNT(id) + 1 FROM [diunabi-morska].[dbo].[Layers]); +DECLARE @CurrentTimestamp NVARCHAR(14) = FORMAT(GETDATE(), 'yyyyMMddHHmm'); +DECLARE @FormattedMonth NVARCHAR(2) = FORMAT(@Month, '00'); +DECLARE @Name NVARCHAR(50) = CONCAT( + 'L', @Number, '-A-IW_', @Type, '-', @Year, '/', @FormattedMonth, '-', @CurrentTimestamp +); + +DECLARE @LayerId UNIQUEIDENTIFIER = NEWID(); + +SELECT @Name AS Name, @ImportType AS ImportType, @StartDate AS StartDate, @EndDate AS EndDate; + +IF @JustForDebug = 1 +BEGIN + SELECT 'Just for debug' AS Logger; + RETURN; +END; + + +INSERT INTO [diunabi-morska].[dbo].[Layers] +([Id], [Number], [Name], [CreatedAt], [ModifiedAt], [IsDeleted], [CreatedById], [ModifiedById], [Type]) +VALUES (@LayerId, @Number, @Name, GETDATE(), GETDATE(), 0, '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 2); + +INSERT INTO [diunabi-morska].[dbo].[Records] +([Id], [Code], [Desc1], [CreatedAt], [ModifiedAt], [CreatedById], [ModifiedById], [IsDeleted], [LayerId]) +VALUES ((SELECT NEWID()), 'StartDate', @StartDate, GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); + +INSERT INTO [diunabi-morska].[dbo].[Records] +([Id], [Code], [Desc1], [CreatedAt], [ModifiedAt], [CreatedById], [ModifiedById], [IsDeleted], [LayerId]) +VALUES ((SELECT NEWID()), 'EndDate', @EndDate, GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); + +INSERT INTO [diunabi-morska].[dbo].[Records] +([Id], [Code], [Desc1], [CreatedAt], [ModifiedAt], [CreatedById], [ModifiedById], [IsDeleted], [LayerId]) +VALUES ((SELECT NEWID()), 'Source', 'DataInbox', GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); + +INSERT INTO [diunabi-morska].[dbo].[Records] +([Id], [Code], [Desc1], [CreatedAt], [ModifiedAt], [CreatedById], [ModifiedById], [IsDeleted], [LayerId]) +VALUES ((SELECT NEWID()), 'ImportName', @Type, GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); + +INSERT INTO [diunabi-morska].[dbo].[Records] +([Id], [Code], [Desc1], [CreatedAt], [ModifiedAt], [CreatedById], [ModifiedById], [IsDeleted], [LayerId]) +VALUES ((SELECT NEWID()), 'ImportMonth', @FormattedMonth, GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); + +INSERT INTO [diunabi-morska].[dbo].[Records] +([Id], [Code], [Desc1], [CreatedAt], [ModifiedAt], [CreatedById], [ModifiedById], [IsDeleted], [LayerId]) +VALUES ((SELECT NEWID()), 'ImportYear', @Year, GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); + +INSERT INTO [diunabi-morska].[dbo].[Records] +([Id], [Code], [Desc1], [CreatedAt], [ModifiedAt], [CreatedById], [ModifiedById], [IsDeleted], [LayerId]) +VALUES ((SELECT NEWID()), 'Type', 'ImportWorker', GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); + +INSERT INTO [diunabi-morska].[dbo].[Records] +([Id], [Code], [Desc1], [CreatedAt], [ModifiedAt], [CreatedById], [ModifiedById], [IsDeleted], [LayerId]) +VALUES ((SELECT NEWID()), 'IsEnabled', 'True', GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); + +INSERT INTO [diunabi-morska].[dbo].[Records] +([Id], [Code], [Desc1], [CreatedAt], [ModifiedAt], [CreatedById], [ModifiedById], [IsDeleted], [LayerId]) +VALUES ((SELECT NEWID()), 'ImportType', @ImportType, GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); + +SELECT 'ImportWorker created' AS Logger; \ No newline at end of file diff --git a/WebAPI/Helpers/DbSeed/Admin-Monthly/CreateProcessWorker-T3MultiSourceSummary-AA.sql b/WebAPI/Helpers/DbSeed/Admin-Monthly/CreateProcessWorker-T3MultiSourceSummary-AA.sql index a4c8f28..b4b4208 100644 --- a/WebAPI/Helpers/DbSeed/Admin-Monthly/CreateProcessWorker-T3MultiSourceSummary-AA.sql +++ b/WebAPI/Helpers/DbSeed/Admin-Monthly/CreateProcessWorker-T3MultiSourceSummary-AA.sql @@ -63,4 +63,4 @@ VALUES ((SELECT NEWID()), 'Month', @FormattedMonth, GETDATE(), GETDATE(), '117be INSERT INTO [diunabi-morska].[dbo].[Records] ([Id], [Code], [Desc1], [CreatedAt], [ModifiedAt], [CreatedById], [ModifiedById], [IsDeleted], [LayerId]) -VALUES ((SELECT NEWID()), 'DynamicCode-0', '[1001]=[9000]+[9005]', GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); \ No newline at end of file +VALUES ((SELECT NEWID()), 'DynamicCode-0', '[1001]=[9000]+[9005]-[9006]', GETDATE(), GETDATE(), '117be4f0-b5d1-41a1-a962-39dc30cce368', '117be4f0-b5d1-41a1-a962-39dc30cce368', 0, @LayerId); \ No newline at end of file diff --git a/WebAPI/Helpers/HttpRequests/AutoImport.http b/WebAPI/Helpers/HttpRequests/AutoImport.http index d8cfd30..90de1de 100644 --- a/WebAPI/Helpers/HttpRequests/AutoImport.http +++ b/WebAPI/Helpers/HttpRequests/AutoImport.http @@ -1,3 +1,3 @@ ### -GET http://localhost:5400/api/Layers/AutoImport/10763478CB738D4ecb2h76g803478CB738D4e/D1- +GET http://localhost:5400/api/Layers/AutoImport/10763478CB738D4ecb2h76g803478CB738D4e/D3- diff --git a/WebAPI/Models/Record.cs b/WebAPI/Models/Record.cs index 42a444a..1c5b8c3 100644 --- a/WebAPI/Models/Record.cs +++ b/WebAPI/Models/Record.cs @@ -6,7 +6,7 @@ public class Record { #region Properties [Key] - public Guid Id { get; init; } + public Guid Id { get; set; } [Required] [StringLength(50)] public string? Code { get; init; } diff --git a/WebAPI/dataImporters/morska.d3.importer.cs b/WebAPI/dataImporters/morska.d3.importer.cs new file mode 100644 index 0000000..4b20336 --- /dev/null +++ b/WebAPI/dataImporters/morska.d3.importer.cs @@ -0,0 +1,77 @@ +using System.Globalization; +using System.Text; +using System.Text.Json; +using Google.Apis.Sheets.v4; +using WebAPI; +using WebAPI.Controllers; +using WebAPI.Models; + +namespace DiunaBIWebAPI.dataImporters; + +public class MorskaD3Importer( + AppDbContext db, + LayersController controller) +{ + public void Import(Layer importWorker) + { + var year = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportYear")?.Desc1; + if (year == null) + { + throw new Exception($"ImportYear not found, {importWorker.Name}"); + } + var month = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportMonth")?.Desc1; + if (month == null) + { + throw new Exception($"ImportMonth not found, {importWorker.Name}"); + } + var name = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportName")?.Desc1; + if (name == null) + { + throw new Exception($"ImportName not found, {importWorker.Name}"); + } + var type = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportType")?.Desc1; + if (name == null) + { + throw new Exception($"ImportType not found, {importWorker.Name}"); + } + var dataInbox = db.DataInbox.OrderByDescending(x => x.CreatedAt).FirstOrDefault(x => x.Name == type); + if (dataInbox == null) + { + throw new Exception($"DataInbox not found, {type}"); + } + var data = Convert.FromBase64String(dataInbox.Data); + var records = JsonSerializer.Deserialize>(Encoding.UTF8.GetString(data)); + if (records == null) + { + throw new Exception($"DataInbox.Data is empty, {dataInbox.Name}"); + } + year = "2024"; + records = records.Where(x => x.Code!.EndsWith($"{year}{month}")).ToList(); + if (records.Count == 0) + { + throw new Exception($"No records found for {year}{month}"); + } + records = records.Select(x => + { + x.Id = Guid.NewGuid(); + x.CreatedAt = DateTime.UtcNow; + x.ModifiedAt = DateTime.UtcNow; + return x; + }).ToList(); + var layer = new Layer + { + Number = db.Layers.Count() + 1, + ParentId = importWorker.Id, + Type = LayerType.Import, + CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), + ModifiedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), + CreatedAt = DateTime.UtcNow, + ModifiedAt = DateTime.UtcNow + }; + layer.Name = $"L{layer.Number}-I-{name}-{year}/{month}-{DateTime.Now.ToString("yyyyMMddHHmm", CultureInfo.InvariantCulture)}"; + + db.Layers.Add(layer); + controller.SaveRecords(layer.Id, records, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); + //db.SaveChanges(); + } +} \ No newline at end of file