Plugins engine is working

This commit is contained in:
Michał Zieliński
2025-06-02 16:54:33 +02:00
parent 8df1b34478
commit 099d72618f
29 changed files with 668 additions and 227 deletions

6
global.json Normal file
View File

@@ -0,0 +1,6 @@
{
"sdk": {
"version": "8.0.0",
"rollForward": "latestFeature"
}
}

View File

@@ -10,5 +10,6 @@
<PackageReference Include="Google.Apis.Sheets.v4" Version="1.68.0.3525" /> <PackageReference Include="Google.Apis.Sheets.v4" Version="1.68.0.3525" />
<PackageReference Include="Google.Apis.Auth" Version="1.68.0" /> <PackageReference Include="Google.Apis.Auth" Version="1.68.0" />
<PackageReference Include="AngouriMath" Version="1.4.0-preview.3" /> <PackageReference Include="AngouriMath" Version="1.4.0-preview.3" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -0,0 +1,10 @@
using DiunaBI.Core.Models;
namespace DiunaBI.Core.Interfaces;
public interface IDataExporter
{
string ExporterType { get; }
bool CanExport(string exporterType);
void Export(Layer layer);
}

View File

@@ -0,0 +1,11 @@
using DiunaBI.Core.Models;
namespace DiunaBI.Core.Interfaces;
public interface IDataImporter
{
string ImporterType { get; }
bool CanImport(string importerType);
void Import(Layer importWorker);
}

View File

@@ -0,0 +1,11 @@
using DiunaBI.Core.Models;
namespace DiunaBI.Core.Interfaces;
public interface IDataProcessor
{
string ProcessorType { get; }
bool CanProcess(string processorType);
void Process(Layer processWorker);
}

View File

@@ -0,0 +1,12 @@
namespace DiunaBI.Core.Interfaces;
public interface IPlugin
{
string Name { get; }
string Version { get; }
string Author { get; }
string Description { get; }
void Initialize();
void Dispose();
}

View File

@@ -0,0 +1,136 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using DiunaBI.Core.Interfaces;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace DiunaBI.Core.Services;
public class PluginManager
{
private readonly ILogger<PluginManager> _logger;
private readonly IServiceProvider _serviceProvider;
private readonly List<Type> _processorTypes = new();
private readonly List<Type> _importerTypes = new();
private readonly List<IDataExporter> _exporters = new();
private readonly List<IPlugin> _plugins = new();
public PluginManager(ILogger<PluginManager> logger, IServiceProvider serviceProvider)
{
_logger = logger;
_serviceProvider = serviceProvider;
}
public void LoadPluginsFromDirectory(string pluginsPath)
{
if (!Directory.Exists(pluginsPath))
{
_logger.LogWarning("Plugins directory not found: {Path}", pluginsPath);
return;
}
var dllFiles = Directory.GetFiles(pluginsPath, "*.dll", SearchOption.AllDirectories);
foreach (var dllFile in dllFiles)
{
try
{
LoadPluginFromAssembly(dllFile);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to load plugin from {File}", dllFile);
}
}
_logger.LogInformation("Loaded {ProcessorCount} processors and {ImporterCount} importers from {PluginCount} plugins",
_processorTypes.Count, _importerTypes.Count, _plugins.Count);
}
private void LoadPluginFromAssembly(string assemblyPath)
{
_logger.LogDebug("Loading assembly from: {Path}", assemblyPath); // Information -> Debug
try
{
var assembly = Assembly.LoadFrom(assemblyPath);
_logger.LogDebug("Assembly loaded successfully: {Name}", assembly.FullName); // Information -> Debug
foreach (var type in assembly.GetTypes())
{
if (typeof(IDataProcessor).IsAssignableFrom(type) && !type.IsInterface && !type.IsAbstract)
{
_processorTypes.Add(type);
_logger.LogDebug("Registered processor: {Type}", type.Name); // Information -> Debug
}
if (typeof(IDataImporter).IsAssignableFrom(type) && !type.IsInterface && !type.IsAbstract)
{
_importerTypes.Add(type);
_logger.LogDebug("Registered importer: {Type}", type.Name); // Information -> Debug
}
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to load assembly from {Path}", assemblyPath); // ZOSTAW jako Error
}
}
public IDataProcessor? GetProcessor(string processorType)
{
foreach (var type in _processorTypes)
{
try
{
using var scope = _serviceProvider.CreateScope();
var instance = (IDataProcessor)ActivatorUtilities.CreateInstance(scope.ServiceProvider, type);
if (instance.CanProcess(processorType))
{
var scopedProvider = _serviceProvider.CreateScope().ServiceProvider;
return (IDataProcessor)ActivatorUtilities.CreateInstance(scopedProvider, type);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to create processor instance of type {Type}", type.Name);
}
}
return null;
}
public IDataImporter? GetImporter(string importerType)
{
foreach (var type in _importerTypes)
{
try
{
using var scope = _serviceProvider.CreateScope();
var instance = (IDataImporter)ActivatorUtilities.CreateInstance(scope.ServiceProvider, type);
if (instance.CanImport(importerType))
{
var scopedProvider = _serviceProvider.CreateScope().ServiceProvider;
return (IDataImporter)ActivatorUtilities.CreateInstance(scopedProvider, type);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to create importer instance of type {Type}", type.Name);
}
}
return null;
}
public IDataExporter? GetExporter(string exporterType)
{
return _exporters.FirstOrDefault(e => e.CanExport(exporterType));
}
public IEnumerable<IDataExporter> GetAllExporters() => _exporters.AsReadOnly();
public IEnumerable<IPlugin> GetAllPlugins() => _plugins.AsReadOnly();
}

View File

@@ -0,0 +1,11 @@
using DiunaBI.Core.Interfaces;
using DiunaBI.Core.Models;
namespace DiunaBI.Plugins.Morska.Exporters;
public abstract class MorskaBaseExporter : IDataExporter
{
public abstract string ExporterType { get; }
public virtual bool CanExport(string exporterType) => ExporterType == exporterType;
public abstract void Export(Layer layer);
}

View File

@@ -3,11 +3,13 @@ using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data; using Google.Apis.Sheets.v4.Data;
using DiunaBI.Core.Models; using DiunaBI.Core.Models;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using DiunaBI.Plugins.Morska.Exporters;
namespace DiunaBI.Core.Services.Exports; namespace DiunaBI.Core.Services.Exports;
public class GoogleSheetExport public class GoogleSheetExport : MorskaBaseExporter
{ {
public override string ExporterType => "GoogleSheet";
private readonly GoogleDriveHelper _googleDriveHelper; private readonly GoogleDriveHelper _googleDriveHelper;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
@@ -20,7 +22,7 @@ public class GoogleSheetExport
_googleSheetValues = googleSheetValues; _googleSheetValues = googleSheetValues;
_configuration = configuration; _configuration = configuration;
} }
public void Export(Layer layer) public override void Export(Layer layer)
{ {
if (_googleDriveHelper.Service is null) if (_googleDriveHelper.Service is null)
{ {
@@ -29,31 +31,31 @@ public class GoogleSheetExport
try try
{ {
var data = new List<IList<object>> { new List<object> { layer.Name! } }; var data = new List<IList<object>> { new List<object> { layer.Name! } };
switch (layer.Type) switch (layer.Type)
{ {
case LayerType.Import: case LayerType.Import:
{ {
data.Add(new List<object> { "Code", "Value1" }); data.Add(new List<object> { "Code", "Value1" });
data.AddRange(layer.Records!.Select(record => new List<object> { record.Code!, record.Value1! })); data.AddRange(layer.Records!.Select(record => new List<object> { record.Code!, record.Value1! }));
break; break;
} }
case LayerType.Administration: case LayerType.Administration:
{ {
data.Add(new List<object> { "Code", "Desc1" }); data.Add(new List<object> { "Code", "Desc1" });
data.AddRange(layer.Records!.Select(record => new List<object> { record.Code!, record.Desc1! })); data.AddRange(layer.Records!.Select(record => new List<object> { record.Code!, record.Desc1! }));
break; break;
} }
case LayerType.Processed: case LayerType.Processed:
{ {
data.Add(new List<object> { "Code", "Value1", "Value2", "Value3", "Value3", data.Add(new List<object> { "Code", "Value1", "Value2", "Value3", "Value3",
"Value5", "Value6", "Value7", "Value8", "Value9", "Value10", "Value5", "Value6", "Value7", "Value8", "Value9", "Value10",
"Value11", "Value12", "Value13", "Value14", "Value15", "Value16", "Value11", "Value12", "Value13", "Value14", "Value15", "Value16",
"Value17", "Value18", "Value19", "Value20", "Value21", "Value22", "Value17", "Value18", "Value19", "Value20", "Value21", "Value22",
"Value23", "Value24", "Value25", "Value26", "Value27", "Value28", "Value23", "Value24", "Value25", "Value26", "Value27", "Value28",
"Value29", "Value30", "Value31", "Value32"}); "Value29", "Value30", "Value31", "Value32"});
data.AddRange(layer.Records!.Select(record => new List<object> data.AddRange(layer.Records!.Select(record => new List<object>
{ {
record.Code!, record.Code!,
@@ -89,8 +91,8 @@ public class GoogleSheetExport
record.Value30!, record.Value30!,
record.Value31!, record.Value31!,
record.Value32! record.Value32!
})); }));
break; break;
} }
default: default:
throw new Exception("Wrong LayerType"); throw new Exception("Wrong LayerType");
@@ -114,7 +116,7 @@ public class GoogleSheetExport
updateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW; updateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;
updateRequest.Execute(); updateRequest.Execute();
} }
catch (Exception e) catch (Exception e)
{ {
Console.WriteLine(e.ToString()); Console.WriteLine(e.ToString());

View File

@@ -0,0 +1,13 @@
using DiunaBI.Core.Interfaces;
using DiunaBI.Core.Models;
namespace DiunaBI.Plugins.Morska.Importers;
public abstract class MorskaBaseImporter : IDataImporter
{
public abstract string ImporterType { get; }
public virtual bool CanImport(string importerType) => ImporterType == importerType;
public abstract void Import(Layer importWorker);
}

View File

@@ -5,11 +5,22 @@ using DiunaBI.Database.Context;
namespace DiunaBI.Plugins.Morska.Importers; namespace DiunaBI.Plugins.Morska.Importers;
public class MorskaD1Importer( public class MorskaD1Importer : MorskaBaseImporter
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues)
{ {
public void Import(Layer importWorker) public override string ImporterType => "MorskaD1";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
public MorskaD1Importer(
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues)
{
_db = db;
_googleSheetValues = googleSheetValues;
}
public override void Import(Layer importWorker)
{ {
var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1;
if (sheetId == null) if (sheetId == null)
@@ -45,7 +56,7 @@ public class MorskaD1Importer(
var layer = new Layer var layer = new Layer
{ {
Number = db.Layers.Count() + 1, Number = _db.Layers.Count() + 1,
ParentId = importWorker.Id, ParentId = importWorker.Id,
Type = LayerType.Import, Type = LayerType.Import,
CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"),
@@ -55,36 +66,36 @@ public class MorskaD1Importer(
}; };
layer.Name = $"L{layer.Number}-I-{name}-{year}/{month}-{DateTime.Now.ToString("yyyyMMddHHmm", CultureInfo.InvariantCulture)}"; layer.Name = $"L{layer.Number}-I-{name}-{year}/{month}-{DateTime.Now.ToString("yyyyMMddHHmm", CultureInfo.InvariantCulture)}";
var dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); var dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute();
var data = dataRangeResponse.Values; var data = dataRangeResponse.Values;
var newRecords = (from t in data var newRecords = (from t in data
where t.Count > 1 && (string)t[0] != string.Empty where t.Count > 1 && (string)t[0] != string.Empty
select new Record select new Record
{ {
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Code = t[0].ToString(), Code = t[0].ToString(),
Value1 = IndexExists(t, 3) ? ParseValue(t[3]?.ToString()) : null, Value1 = IndexExists(t, 3) ? ParseValue(t[3]?.ToString()) : null,
Value2 = IndexExists(t, 4) ? ParseValue(t[4]?.ToString()) : null, Value2 = IndexExists(t, 4) ? ParseValue(t[4]?.ToString()) : null,
Value3 = IndexExists(t, 5) ? ParseValue(t[5]?.ToString()) : null, Value3 = IndexExists(t, 5) ? ParseValue(t[5]?.ToString()) : null,
Value4 = IndexExists(t, 6) ? ParseValue(t[6]?.ToString()) : null, Value4 = IndexExists(t, 6) ? ParseValue(t[6]?.ToString()) : null,
Value5 = IndexExists(t, 7) ? ParseValue(t[7]?.ToString()) : null, Value5 = IndexExists(t, 7) ? ParseValue(t[7]?.ToString()) : null,
Value6 = IndexExists(t, 8) ? ParseValue(t[8]?.ToString()) : null, Value6 = IndexExists(t, 8) ? ParseValue(t[8]?.ToString()) : null,
Value7 = IndexExists(t, 9) ? ParseValue(t[9]?.ToString()) : null, Value7 = IndexExists(t, 9) ? ParseValue(t[9]?.ToString()) : null,
Value8 = IndexExists(t, 10) ? ParseValue(t[10]?.ToString()) : null, Value8 = IndexExists(t, 10) ? ParseValue(t[10]?.ToString()) : null,
Value9 = IndexExists(t, 11) ? ParseValue(t[11]?.ToString()) : null, Value9 = IndexExists(t, 11) ? ParseValue(t[11]?.ToString()) : null,
Value10 = IndexExists(t, 12) ? ParseValue(t[12]?.ToString()) : null, Value10 = IndexExists(t, 12) ? ParseValue(t[12]?.ToString()) : null,
Value11 = IndexExists(t, 13) ? ParseValue(t[13]?.ToString()) : null, Value11 = IndexExists(t, 13) ? ParseValue(t[13]?.ToString()) : null,
Value12 = IndexExists(t, 14) ? ParseValue(t[14]?.ToString()) : null, Value12 = IndexExists(t, 14) ? ParseValue(t[14]?.ToString()) : null,
Value13 = IndexExists(t, 15) ? ParseValue(t[15]?.ToString()) : null, Value13 = IndexExists(t, 15) ? ParseValue(t[15]?.ToString()) : null,
Value14 = IndexExists(t, 16) ? ParseValue(t[16]?.ToString()) : null, Value14 = IndexExists(t, 16) ? ParseValue(t[16]?.ToString()) : null,
Value15 = IndexExists(t, 17) ? ParseValue(t[17]?.ToString()) : null, Value15 = IndexExists(t, 17) ? ParseValue(t[17]?.ToString()) : null,
CreatedAt = DateTime.UtcNow, CreatedAt = DateTime.UtcNow,
ModifiedAt = DateTime.UtcNow ModifiedAt = DateTime.UtcNow
}).ToList(); }).ToList();
db.Layers.Add(layer); _db.Layers.Add(layer);
// TODO: Save records to the layer // TODO: Save records to the layer
//controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
private double? ParseValue(string? value) private double? ParseValue(string? value)

View File

@@ -6,10 +6,17 @@ using DiunaBI.Database.Context;
namespace DiunaBI.Plugins.Morska.Importers; namespace DiunaBI.Plugins.Morska.Importers;
public class MorskaD3Importer( public class MorskaD3Importer : MorskaBaseImporter
AppDbContext db)
{ {
public void Import(Layer importWorker) public override string ImporterType => "MorskaD3";
private readonly AppDbContext _db;
public MorskaD3Importer(
AppDbContext db)
{
_db = db;
}
public override void Import(Layer importWorker)
{ {
var year = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportYear")?.Desc1; var year = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportYear")?.Desc1;
if (year == null) if (year == null)
@@ -31,7 +38,7 @@ public class MorskaD3Importer(
{ {
throw new Exception($"ImportType not found, {importWorker.Name}"); throw new Exception($"ImportType not found, {importWorker.Name}");
} }
var dataInbox = db.DataInbox.OrderByDescending(x => x.CreatedAt).FirstOrDefault(x => x.Name == type); var dataInbox = _db.DataInbox.OrderByDescending(x => x.CreatedAt).FirstOrDefault(x => x.Name == type);
if (dataInbox == null) if (dataInbox == null)
{ {
throw new Exception($"DataInbox not found, {type}"); throw new Exception($"DataInbox not found, {type}");
@@ -57,7 +64,7 @@ public class MorskaD3Importer(
}).ToList(); }).ToList();
var layer = new Layer var layer = new Layer
{ {
Number = db.Layers.Count() + 1, Number = _db.Layers.Count() + 1,
ParentId = importWorker.Id, ParentId = importWorker.Id,
Type = LayerType.Import, Type = LayerType.Import,
CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"),
@@ -67,9 +74,9 @@ public class MorskaD3Importer(
}; };
layer.Name = $"L{layer.Number}-I-{name}-{year}/{month}-{DateTime.Now.ToString("yyyyMMddHHmm", CultureInfo.InvariantCulture)}"; layer.Name = $"L{layer.Number}-I-{name}-{year}/{month}-{DateTime.Now.ToString("yyyyMMddHHmm", CultureInfo.InvariantCulture)}";
db.Layers.Add(layer); _db.Layers.Add(layer);
// TODO: Save records to the layer // TODO: Save records to the layer
//controller.SaveRecords(layer.Id, records, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(layer.Id, records, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -5,11 +5,20 @@ using DiunaBI.Database.Context;
namespace DiunaBI.Plugins.Morska.Importers; namespace DiunaBI.Plugins.Morska.Importers;
public class MorskaFk2Importer( public class MorskaFk2Importer : MorskaBaseImporter
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues)
{ {
public void Import(Layer importWorker) public override string ImporterType => "MorskaFK2";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
public MorskaFk2Importer(
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues)
{
_db = db;
_googleSheetValues = googleSheetValues;
}
public override void Import(Layer importWorker)
{ {
var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1;
if (sheetId == null) if (sheetId == null)
@@ -45,7 +54,7 @@ public class MorskaFk2Importer(
var layer = new Layer var layer = new Layer
{ {
Number = db.Layers.Count() + 1, Number = _db.Layers.Count() + 1,
ParentId = importWorker.Id, ParentId = importWorker.Id,
Type = LayerType.Import, Type = LayerType.Import,
CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"),
@@ -57,7 +66,7 @@ public class MorskaFk2Importer(
var newRecords = new List<Record>(); var newRecords = new List<Record>();
var dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); var dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute();
var data = dataRangeResponse.Values; var data = dataRangeResponse.Values;
for (var i = 0; i < data.Count; i++) for (var i = 0; i < data.Count; i++)
{ {
@@ -84,9 +93,9 @@ public class MorskaFk2Importer(
}; };
newRecords.Add(record); newRecords.Add(record);
} }
db.Layers.Add(layer); _db.Layers.Add(layer);
// TODO: Save records to the layer // TODO: Save records to the layer
//controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -5,11 +5,20 @@ using DiunaBI.Database.Context;
namespace DiunaBI.Plugins.Morska.Importers; namespace DiunaBI.Plugins.Morska.Importers;
public class MorskaImporter( public class MorskaImporter : MorskaBaseImporter
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues)
{ {
public void Import(Layer importWorker) public override string ImporterType => "MorskaImporter";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
public MorskaImporter(
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues)
{
_db = db;
_googleSheetValues = googleSheetValues;
}
public override void Import(Layer importWorker)
{ {
var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1;
if (sheetId == null) if (sheetId == null)
@@ -45,7 +54,7 @@ public class MorskaImporter(
var layer = new Layer var layer = new Layer
{ {
Number = db.Layers.Count() + 1, Number = _db.Layers.Count() + 1,
ParentId = importWorker.Id, ParentId = importWorker.Id,
Type = LayerType.Import, Type = LayerType.Import,
CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"),
@@ -57,7 +66,7 @@ public class MorskaImporter(
var newRecords = new List<Record>(); var newRecords = new List<Record>();
var dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); var dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute();
var data = dataRangeResponse.Values; var data = dataRangeResponse.Values;
for (var i = 0; i < data[1].Count; i++) for (var i = 0; i < data[1].Count; i++)
{ {
@@ -73,9 +82,9 @@ public class MorskaImporter(
}; };
newRecords.Add(record); newRecords.Add(record);
} }
db.Layers.Add(layer); _db.Layers.Add(layer);
// TODO: Save records to the layer // TODO: Save records to the layer
//controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -0,0 +1,13 @@
using DiunaBI.Core.Interfaces;
using DiunaBI.Core.Models;
namespace DiunaBI.Plugins.Morska.Processors;
public abstract class MorskaBaseProcessor : IDataProcessor
{
public abstract string ProcessorType { get; }
public virtual bool CanProcess(string processorType) => ProcessorType == processorType;
public abstract void Process(Layer processWorker);
}

View File

@@ -9,11 +9,20 @@ using DiunaBI.Core.Services.Calculations;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T1R1Processor( public class T1R1Processor : MorskaBaseProcessor
{
public override string ProcessorType => "T1.R1";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
public T1R1Processor(
AppDbContext db, AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues) SpreadsheetsResource.ValuesResource googleSheetValues)
{ {
public void Process(Layer processWorker) _db = db;
_googleSheetValues = googleSheetValues;
}
public override void Process(Layer processWorker)
{ {
var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!);
var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList(); var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList();
@@ -22,7 +31,7 @@ public class T1R1Processor(
throw new Exception("Source record not found"); throw new Exception("Source record not found");
} }
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id .Where(x => x.ParentId == processWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
@@ -37,7 +46,7 @@ public class T1R1Processor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-P-{year}-R1-T1"; processedLayer.Name = $"L{processedLayer.Number}-P-{year}-R1-T1";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -66,7 +75,7 @@ public class T1R1Processor(
foreach (var source in sources) foreach (var source in sources)
{ {
var monthCopy = month; var monthCopy = month;
var dataSource = db.Layers.Where(x => var dataSource = _db.Layers.Where(x =>
x.Type == LayerType.Processed && x.Type == LayerType.Processed &&
!x.IsDeleted && !x.IsCancelled && !x.IsDeleted && !x.IsCancelled &&
x.Name != null && x.Name.Contains($"{year}/{monthCopy:D2}-{source.Desc1}-T3") x.Name != null && x.Name.Contains($"{year}/{monthCopy:D2}-{source.Desc1}-T3")
@@ -180,15 +189,15 @@ public class T1R1Processor(
if (isNew) if (isNew)
{ {
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
} }
else else
{ {
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
} }
//TODO: Save records to the layer //TODO: Save records to the layer
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
var sheetName = processWorker.Records?.SingleOrDefault(x => x.Code == "GoogleSheetName")?.Desc1; var sheetName = processWorker.Records?.SingleOrDefault(x => x.Code == "GoogleSheetName")?.Desc1;
if (sheetName == null) if (sheetName == null)
@@ -202,10 +211,10 @@ public class T1R1Processor(
private void UpdateReport(Guid sourceId, string sheetName) private void UpdateReport(Guid sourceId, string sheetName)
{ {
const string sheetId = "1pph-XowjlK5CIaCEV_A5buK4ceJ0Z0YoUlDI4VMkhhA"; const string sheetId = "1pph-XowjlK5CIaCEV_A5buK4ceJ0Z0YoUlDI4VMkhhA";
var request = googleSheetValues.Get(sheetId, $"{sheetName}!C4:DA4"); var request = _googleSheetValues.Get(sheetId, $"{sheetName}!C4:DA4");
var response = request.Execute(); var response = request.Execute();
var r1 = db.Layers var r1 = _db.Layers
.Where(x => x.Id == sourceId) .Where(x => x.Id == sourceId)
.Include(x => x.Records) .Include(x => x.Records)
.AsNoTracking() .AsNoTracking()
@@ -256,7 +265,7 @@ public class T1R1Processor(
valueRange.Values.Add(emptyRow); valueRange.Values.Add(emptyRow);
valueRange.Values.Add(valuesSum); valueRange.Values.Add(valuesSum);
var update = googleSheetValues.Update(valueRange, sheetId, $"{sheetName}!C7:DA20"); var update = _googleSheetValues.Update(valueRange, sheetId, $"{sheetName}!C7:DA20");
update.ValueInputOption = update.ValueInputOption =
SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
update.Execute(); update.Execute();
@@ -279,7 +288,7 @@ public class T1R1Processor(
valueRangeTime.Values.Add(timeUtc); valueRangeTime.Values.Add(timeUtc);
valueRangeTime.Values.Add(timeWarsaw); valueRangeTime.Values.Add(timeWarsaw);
var updateTimeUtc = googleSheetValues.Update(valueRangeTime, sheetId, $"{sheetName}!G1:G2"); var updateTimeUtc = _googleSheetValues.Update(valueRangeTime, sheetId, $"{sheetName}!G1:G2");
updateTimeUtc.ValueInputOption = updateTimeUtc.ValueInputOption =
SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
updateTimeUtc.Execute(); updateTimeUtc.Execute();

View File

@@ -9,11 +9,20 @@ using DiunaBI.Database.Context;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T1R3Processor( public class T1R3Processor : MorskaBaseProcessor
{
public override string ProcessorType => "T1.R3";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
public T1R3Processor(
AppDbContext db, AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues) SpreadsheetsResource.ValuesResource googleSheetValues)
{ {
public void Process(Layer processWorker) _db = db;
_googleSheetValues = googleSheetValues;
}
public override void Process(Layer processWorker)
{ {
var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!);
var source = processWorker.Records?.Where(x => x.Code == "Source").First().Desc1; var source = processWorker.Records?.Where(x => x.Code == "Source").First().Desc1;
@@ -22,7 +31,7 @@ public class T1R3Processor(
throw new Exception("Source record not found"); throw new Exception("Source record not found");
} }
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id .Where(x => x.ParentId == processWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
@@ -37,7 +46,7 @@ public class T1R3Processor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-P-{year}-R3-T1"; processedLayer.Name = $"L{processedLayer.Number}-P-{year}-R3-T1";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -53,7 +62,7 @@ public class T1R3Processor(
var newRecords = new List<Record>(); var newRecords = new List<Record>();
string pattern = @$"^L\d+-P-{year}/\d+-{source}-T5$"; string pattern = @$"^L\d+-P-{year}/\d+-{source}-T5$";
var dataSources = db.Layers var dataSources = _db.Layers
.Where(x => !x.IsDeleted && !x.IsCancelled) .Where(x => !x.IsDeleted && !x.IsCancelled)
.Include(layer => layer.Records!) .Include(layer => layer.Records!)
.AsNoTracking() .AsNoTracking()
@@ -93,15 +102,15 @@ public class T1R3Processor(
if (isNew) if (isNew)
{ {
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
} }
else else
{ {
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
} }
//TODO save records //TODO save records
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
UpdateReport(processedLayer.Id, year); UpdateReport(processedLayer.Id, year);
} }
@@ -110,7 +119,7 @@ public class T1R3Processor(
{ {
const string sheetId = "10Xo8BBF92nM7_JzzeOuWp49Gz8OsYuCxLDOeChqpW_8"; const string sheetId = "10Xo8BBF92nM7_JzzeOuWp49Gz8OsYuCxLDOeChqpW_8";
var r3 = db.Layers var r3 = _db.Layers
.Where(x => x.Id == sourceId) .Where(x => x.Id == sourceId)
.Include(x => x.Records) .Include(x => x.Records)
.AsNoTracking() .AsNoTracking()
@@ -122,7 +131,7 @@ public class T1R3Processor(
ValueRange? dataRangeResponse; ValueRange? dataRangeResponse;
try try
{ {
dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetName}!A7:A200").Execute(); dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetName}!A7:A200").Execute();
} }
catch catch
{ {
@@ -161,7 +170,7 @@ public class T1R3Processor(
} }
dataRangeResponse.Values = data; dataRangeResponse.Values = data;
var update = googleSheetValues.Update(updateValueRange, sheetId, $"{sheetName}!C7:Q200"); var update = _googleSheetValues.Update(updateValueRange, sheetId, $"{sheetName}!C7:Q200");
update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
update.Execute(); update.Execute();
@@ -183,7 +192,7 @@ public class T1R3Processor(
valueRangeTime.Values.Add(timeUtc); valueRangeTime.Values.Add(timeUtc);
valueRangeTime.Values.Add(timeWarsaw); valueRangeTime.Values.Add(timeWarsaw);
var updateTimeUtc = googleSheetValues.Update(valueRangeTime, sheetId, $"{sheetName}!G1:G2"); var updateTimeUtc = _googleSheetValues.Update(valueRangeTime, sheetId, $"{sheetName}!G1:G2");
updateTimeUtc.ValueInputOption = updateTimeUtc.ValueInputOption =
SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
updateTimeUtc.Execute(); updateTimeUtc.Execute();

View File

@@ -5,10 +5,17 @@ using DiunaBI.Database.Context;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T3MultiSourceCopySelectedCodesProcessor( public class T3MultiSourceCopySelectedCodesProcessor : MorskaBaseProcessor
AppDbContext db)
{ {
public void Process(Layer processWorker) public override string ProcessorType => "T3.MultiSourceCopySelectedCodes";
private readonly AppDbContext _db;
public T3MultiSourceCopySelectedCodesProcessor(
AppDbContext db)
{
_db = db;
}
public override void Process(Layer processWorker)
{ {
var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!);
var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!); var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!);
@@ -25,7 +32,7 @@ public class T3MultiSourceCopySelectedCodesProcessor(
var codesList = ProcessHelper.ParseCodes(codes); var codesList = ProcessHelper.ParseCodes(codes);
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id .Where(x => x.ParentId == processWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
@@ -40,7 +47,7 @@ public class T3MultiSourceCopySelectedCodesProcessor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-AB-T3"; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-AB-T3";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -52,7 +59,7 @@ public class T3MultiSourceCopySelectedCodesProcessor(
processedLayer.ModifiedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.ModifiedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
processedLayer.ModifiedAt = DateTime.UtcNow; processedLayer.ModifiedAt = DateTime.UtcNow;
var dataSources = sources.Select(source => db.Layers var dataSources = sources.Select(source => _db.Layers
.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{month:D2}-{source.Desc1}-T3")) .Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{month:D2}-{source.Desc1}-T3"))
.Include(x => x.Records).AsNoTracking() .Include(x => x.Records).AsNoTracking()
.FirstOrDefault()) .FirstOrDefault())
@@ -85,14 +92,14 @@ public class T3MultiSourceCopySelectedCodesProcessor(
.ToList(); .ToList();
if (isNew) if (isNew)
{ {
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
} }
else else
{ {
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
} }
//TODO: Save records //TODO: Save records
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -5,14 +5,21 @@ using DiunaBI.Database.Context;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T3MultiSourceCopySelectedCodesYearSummaryProcessor( public class T3MultiSourceCopySelectedCodesYearSummaryProcessor : MorskaBaseProcessor
AppDbContext db)
{ {
public void Process(Layer processWorker) public override string ProcessorType => "T3.MultiSourceCopySelectedCodesYearSummary";
private readonly AppDbContext _db;
public T3MultiSourceCopySelectedCodesYearSummaryProcessor(
AppDbContext db)
{
_db = db;
}
public override void Process(Layer processWorker)
{ {
var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!);
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id .Where(x => x.ParentId == processWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
@@ -27,7 +34,7 @@ public class T3MultiSourceCopySelectedCodesYearSummaryProcessor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-P-{year}/13-AB-T3"; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/13-AB-T3";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -46,7 +53,7 @@ public class T3MultiSourceCopySelectedCodesYearSummaryProcessor(
for (var i = 1; i < 13; i++) for (var i = 1; i < 13; i++)
{ {
var j = i; var j = i;
var dataSource = db.Layers.Where(x => var dataSource = _db.Layers.Where(x =>
x.Type == LayerType.Processed x.Type == LayerType.Processed
&& !x.IsDeleted && !x.IsCancelled && !x.IsDeleted && !x.IsCancelled
&& x.Name != null && x.Name.Contains($"{year}/{j:D2}-AB-T3")) && x.Name != null && x.Name.Contains($"{year}/{j:D2}-AB-T3"))
@@ -87,14 +94,14 @@ public class T3MultiSourceCopySelectedCodesYearSummaryProcessor(
if (isNew) if (isNew)
{ {
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
} }
else else
{ {
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
} }
//TODO: save records //TODO: save records
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -6,10 +6,17 @@ using DiunaBI.Core.Services.Calculations;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T3MultiSourceSummaryProcessor( public class T3MultiSourceSummaryProcessor : MorskaBaseProcessor
AppDbContext db)
{ {
public void Process(Layer processWorker) public override string ProcessorType => "T3.MultiSourceSummary";
private readonly AppDbContext _db;
T3MultiSourceSummaryProcessor(
AppDbContext db)
{
_db = db;
}
public override void Process(Layer processWorker)
{ {
var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!);
var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!); var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!);
@@ -19,7 +26,7 @@ public class T3MultiSourceSummaryProcessor(
throw new Exception("Source record not found"); throw new Exception("Source record not found");
} }
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id .Where(x => x.ParentId == processWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
@@ -34,7 +41,7 @@ public class T3MultiSourceSummaryProcessor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-AA-T3"; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-AA-T3";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -48,7 +55,7 @@ public class T3MultiSourceSummaryProcessor(
var newRecords = new List<Record>(); var newRecords = new List<Record>();
var dataSources = sources.Select(source => db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{month:D2}-{source.Desc1}-T3")) var dataSources = sources.Select(source => _db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{month:D2}-{source.Desc1}-T3"))
.Include(x => x.Records) .Include(x => x.Records)
.AsNoTracking() .AsNoTracking()
.FirstOrDefault()) .FirstOrDefault())
@@ -165,14 +172,14 @@ public class T3MultiSourceSummaryProcessor(
if (isNew) if (isNew)
{ {
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
} }
else else
{ {
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
} }
//TODO: save records //TODO: save records
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -6,10 +6,16 @@ using DiunaBI.Core.Services.Calculations;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T3MultiSourceYearSummaryProcessor( public class T3MultiSourceYearSummaryProcessor : MorskaBaseProcessor
AppDbContext db)
{ {
public void Process(Layer processWorker) public override string ProcessorType => "T3.MultiSourceYearSummary";
private readonly AppDbContext _db;
T3MultiSourceYearSummaryProcessor(
AppDbContext db)
{
_db = db;
}
public override void Process(Layer processWorker)
{ {
var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!);
var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList(); var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList();
@@ -18,7 +24,7 @@ public class T3MultiSourceYearSummaryProcessor(
throw new Exception("Source record not found"); throw new Exception("Source record not found");
} }
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id .Where(x => x.ParentId == processWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
@@ -33,7 +39,7 @@ public class T3MultiSourceYearSummaryProcessor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-P-{year}/13-AA-T3"; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/13-AA-T3";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -47,7 +53,7 @@ public class T3MultiSourceYearSummaryProcessor(
var newRecords = new List<Record>(); var newRecords = new List<Record>();
var dataSources = sources.Select(source => db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/13-{source.Desc1}-T3")) var dataSources = sources.Select(source => _db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/13-{source.Desc1}-T3"))
.Include(x => x.Records) .Include(x => x.Records)
.AsNoTracking() .AsNoTracking()
.FirstOrDefault()) .FirstOrDefault())
@@ -185,14 +191,14 @@ public class T3MultiSourceYearSummaryProcessor(
} }
if (isNew) if (isNew)
{ {
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
} }
else else
{ {
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
} }
//TODO: save records //TODO: save records
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -5,10 +5,16 @@ using DiunaBI.Core.Services;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T3SingleSourceProcessor( public class T3SingleSourceProcessor : MorskaBaseProcessor
AppDbContext db)
{ {
public void Process(Layer processWorker) public override string ProcessorType => "T3.SingleSource";
private readonly AppDbContext _db;
public T3SingleSourceProcessor(
AppDbContext db)
{
_db = db;
}
public override void Process(Layer processWorker)
{ {
var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!);
var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!); var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!);
@@ -17,7 +23,7 @@ public class T3SingleSourceProcessor(
{ {
throw new Exception("SourceLayer record not found"); throw new Exception("SourceLayer record not found");
} }
var sourceImportWorker = db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled); var sourceImportWorker = _db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled);
if (sourceImportWorker == null) if (sourceImportWorker == null)
{ {
throw new Exception("SourceImportWorkerL layer not found"); throw new Exception("SourceImportWorkerL layer not found");
@@ -28,7 +34,7 @@ public class T3SingleSourceProcessor(
throw new Exception("Source record not found"); throw new Exception("Source record not found");
} }
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id) .Where(x => x.ParentId == processWorker.Id)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
.FirstOrDefault(); .FirstOrDefault();
@@ -42,7 +48,7 @@ public class T3SingleSourceProcessor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-{source}-T3"; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-{source}-T3";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -57,7 +63,7 @@ public class T3SingleSourceProcessor(
var newRecords = new List<Record>(); var newRecords = new List<Record>();
var dataSources = db.Layers var dataSources = _db.Layers
.Include(x => x.Records) .Include(x => x.Records)
.Where(x => x.ParentId == sourceImportWorker.Id .Where(x => x.ParentId == sourceImportWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
@@ -127,15 +133,15 @@ public class T3SingleSourceProcessor(
if (isNew) if (isNew)
{ {
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
} }
else else
{ {
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
} }
//TODO: save records //TODO: save records
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -5,10 +5,16 @@ using DiunaBI.Core.Services;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T3SourceYearSummaryProcessor( public class T3SourceYearSummaryProcessor : MorskaBaseProcessor
AppDbContext db)
{ {
public void Process(Layer processWorker) public override string ProcessorType => "T3.SourceYearSummary";
private readonly AppDbContext _db;
public T3SourceYearSummaryProcessor(
AppDbContext db)
{
_db = db;
}
public override void Process(Layer processWorker)
{ {
var year = processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1; var year = processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1;
var source = processWorker.Records?.SingleOrDefault(x => x.Code == "Source")?.Desc1; var source = processWorker.Records?.SingleOrDefault(x => x.Code == "Source")?.Desc1;
@@ -16,7 +22,7 @@ public class T3SourceYearSummaryProcessor(
{ {
throw new Exception("Source record not found"); throw new Exception("Source record not found");
} }
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id .Where(x => x.ParentId == processWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
@@ -31,7 +37,7 @@ public class T3SourceYearSummaryProcessor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-P-{year}/13-{source}-T3"; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/13-{source}-T3";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -49,7 +55,7 @@ public class T3SourceYearSummaryProcessor(
for (var i = 1; i < 13; i++) for (var i = 1; i < 13; i++)
{ {
var j = i; var j = i;
var dataSource = db.Layers.Where(x => var dataSource = _db.Layers.Where(x =>
x.Type == LayerType.Processed x.Type == LayerType.Processed
&& !x.IsDeleted && !x.IsCancelled && !x.IsDeleted && !x.IsCancelled
&& x.Name != null && x.Name.Contains($"{year}/{j:D2}-{source}-T3")) && x.Name != null && x.Name.Contains($"{year}/{j:D2}-{source}-T3"))
@@ -89,14 +95,14 @@ public class T3SourceYearSummaryProcessor(
if (isNew) if (isNew)
{ {
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
} }
else else
{ {
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
} }
//TODO: save records //TODO: save records
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -9,11 +9,20 @@ using DiunaBI.Core.Services;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T4R2Processor( public class T4R2Processor : MorskaBaseProcessor
{
public override string ProcessorType => "T4.R2";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
public T4R2Processor(
AppDbContext db, AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues) SpreadsheetsResource.ValuesResource googleSheetValues)
{ {
public void Process(Layer processWorker) _db = db;
_googleSheetValues = googleSheetValues;
}
public override void Process(Layer processWorker)
{ {
var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!);
var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList(); var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList();
@@ -29,7 +38,7 @@ public class T4R2Processor(
} }
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id .Where(x => x.ParentId == processWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
@@ -44,7 +53,7 @@ public class T4R2Processor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-{layerName}"; processedLayer.Name = $"L{processedLayer.Number}-{layerName}";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -76,7 +85,7 @@ public class T4R2Processor(
if ((year == DateTime.UtcNow.Year && month <= DateTime.UtcNow.Month) || year < DateTime.UtcNow.Year) if ((year == DateTime.UtcNow.Year && month <= DateTime.UtcNow.Month) || year < DateTime.UtcNow.Year)
{ {
var monthCopy = month; var monthCopy = month;
var dataSource = db.Layers.Where(x => var dataSource = _db.Layers.Where(x =>
x.Type == LayerType.Processed && x.Type == LayerType.Processed &&
!x.IsDeleted && !x.IsCancelled && !x.IsDeleted && !x.IsCancelled &&
x.Name != null && x.Name.Contains($"{year}/{monthCopy:D2}-{source.Desc1}-T") x.Name != null && x.Name.Contains($"{year}/{monthCopy:D2}-{source.Desc1}-T")
@@ -144,7 +153,7 @@ public class T4R2Processor(
} }
// year summary // year summary
var dataSourceSum = db.Layers.Where(x => var dataSourceSum = _db.Layers.Where(x =>
x.Type == LayerType.Processed && x.Type == LayerType.Processed &&
!x.IsDeleted && !x.IsCancelled && !x.IsDeleted && !x.IsCancelled &&
x.Name != null && x.Name.Contains($"{year}/13-{source.Desc1}-T") x.Name != null && x.Name.Contains($"{year}/13-{source.Desc1}-T")
@@ -189,15 +198,15 @@ public class T4R2Processor(
if (isNew) if (isNew)
{ {
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
} }
else else
{ {
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
} }
// TODO: save records // TODO: save records
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
var reportSheetName = processWorker.Records?.SingleOrDefault(x => x.Code == "GoogleSheetName")?.Desc1; var reportSheetName = processWorker.Records?.SingleOrDefault(x => x.Code == "GoogleSheetName")?.Desc1;
if (reportSheetName == null) if (reportSheetName == null)
@@ -216,10 +225,10 @@ public class T4R2Processor(
private void UpdateReport(Guid sourceId, string reportSheetName, string invoicesSheetName) private void UpdateReport(Guid sourceId, string reportSheetName, string invoicesSheetName)
{ {
const string sheetId = "1FsUmk_YRIeeGzFCX9tuUJCaLyRtjutX2ZGAEU1DMfJQ"; const string sheetId = "1FsUmk_YRIeeGzFCX9tuUJCaLyRtjutX2ZGAEU1DMfJQ";
var request = googleSheetValues.Get(sheetId, "C4:Z4"); var request = _googleSheetValues.Get(sheetId, "C4:Z4");
var response = request.Execute(); var response = request.Execute();
var r2 = db.Layers var r2 = _db.Layers
.Where(x => x.Id == sourceId && !x.IsDeleted && !x.IsCancelled) .Where(x => x.Id == sourceId && !x.IsDeleted && !x.IsCancelled)
.Include(x => x.Records) .Include(x => x.Records)
.AsNoTracking() .AsNoTracking()
@@ -249,7 +258,7 @@ public class T4R2Processor(
{ {
Values = new List<IList<object>> { values } Values = new List<IList<object>> { values }
}; };
var update = googleSheetValues.Update(valueRange, sheetId, $"{reportSheetName}!C{row}:XZ{row}"); var update = _googleSheetValues.Update(valueRange, sheetId, $"{reportSheetName}!C{row}:XZ{row}");
update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
update.Execute(); update.Execute();
} }
@@ -277,7 +286,7 @@ public class T4R2Processor(
{ {
Values = new List<IList<object>> { emptyRow } Values = new List<IList<object>> { emptyRow }
}; };
var updateEmpty = googleSheetValues.Update(valueRangeEmpty, sheetId, $"{reportSheetName}!C{rowEmpty}:XZ{rowEmpty}"); var updateEmpty = _googleSheetValues.Update(valueRangeEmpty, sheetId, $"{reportSheetName}!C{rowEmpty}:XZ{rowEmpty}");
updateEmpty.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateEmpty.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
updateEmpty.Execute(); updateEmpty.Execute();
@@ -285,7 +294,7 @@ public class T4R2Processor(
{ {
Values = new List<IList<object>> { valuesSum } Values = new List<IList<object>> { valuesSum }
}; };
var updateSum = googleSheetValues.Update(valueRangeSum, sheetId, $"{reportSheetName}!C{rowSum}:XZ{rowSum}"); var updateSum = _googleSheetValues.Update(valueRangeSum, sheetId, $"{reportSheetName}!C{rowSum}:XZ{rowSum}");
updateSum.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateSum.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
updateSum.Execute(); updateSum.Execute();
@@ -298,7 +307,7 @@ public class T4R2Processor(
{ {
Values = new List<IList<object>> { timeUtc } Values = new List<IList<object>> { timeUtc }
}; };
var updateTimeUtc = googleSheetValues.Update(valueRangeUtcTime, sheetId, $"{reportSheetName}!G1"); var updateTimeUtc = _googleSheetValues.Update(valueRangeUtcTime, sheetId, $"{reportSheetName}!G1");
updateTimeUtc.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateTimeUtc.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
updateTimeUtc.Execute(); updateTimeUtc.Execute();
@@ -312,7 +321,7 @@ public class T4R2Processor(
{ {
Values = new List<IList<object>> { timeWarsaw } Values = new List<IList<object>> { timeWarsaw }
}; };
var updateTimeWarsaw = googleSheetValues.Update(valueRangeWarsawTime, sheetId, $"{reportSheetName}!G2"); var updateTimeWarsaw = _googleSheetValues.Update(valueRangeWarsawTime, sheetId, $"{reportSheetName}!G2");
updateTimeWarsaw.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateTimeWarsaw.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
updateTimeWarsaw.Execute(); updateTimeWarsaw.Execute();
@@ -346,14 +355,14 @@ public class T4R2Processor(
var cleanupValueRange = new ValueRange { Values = cleanUpValues }; var cleanupValueRange = new ValueRange { Values = cleanUpValues };
var cleanupInvoices = googleSheetValues.Update(cleanupValueRange, sheetId, $"{invoicesSheetName}!A6:E"); var cleanupInvoices = _googleSheetValues.Update(cleanupValueRange, sheetId, $"{invoicesSheetName}!A6:E");
cleanupInvoices.ValueInputOption = cleanupInvoices.ValueInputOption =
SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
cleanupInvoices.Execute(); cleanupInvoices.Execute();
var invoicesValueRange = new ValueRange { Values = invoicesValues }; var invoicesValueRange = new ValueRange { Values = invoicesValues };
var updateInvoices = googleSheetValues.Update(invoicesValueRange, sheetId, $"{invoicesSheetName}!A6:E"); var updateInvoices = _googleSheetValues.Update(invoicesValueRange, sheetId, $"{invoicesSheetName}!A6:E");
updateInvoices.ValueInputOption = updateInvoices.ValueInputOption =
SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
updateInvoices.Execute(); updateInvoices.Execute();

View File

@@ -4,10 +4,17 @@ using DiunaBI.Database.Context;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T4SingleSourceProcessor( public class T4SingleSourceProcessor : MorskaBaseProcessor
AppDbContext db)
{ {
public void Process(Layer processWorker) public override string ProcessorType => "T4.SingleSource";
private readonly AppDbContext _db;
public T4SingleSourceProcessor(
AppDbContext db)
{
_db = db;
}
public override void Process(Layer processWorker)
{ {
var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!);
var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!); var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!);
@@ -16,7 +23,7 @@ public class T4SingleSourceProcessor(
{ {
throw new Exception("SourceLayer record not found"); throw new Exception("SourceLayer record not found");
} }
var sourceImportWorker = db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled); var sourceImportWorker = _db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled);
if (sourceImportWorker == null) if (sourceImportWorker == null)
{ {
throw new Exception("SourceImportWorkerL layer not found"); throw new Exception("SourceImportWorkerL layer not found");
@@ -27,7 +34,7 @@ public class T4SingleSourceProcessor(
throw new Exception("Source record not found"); throw new Exception("Source record not found");
} }
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id && .Where(x => x.ParentId == processWorker.Id &&
!x.IsDeleted && !x.IsCancelled) !x.IsDeleted && !x.IsCancelled)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
@@ -42,7 +49,7 @@ public class T4SingleSourceProcessor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-{source}-T4"; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-{source}-T4";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -55,7 +62,7 @@ public class T4SingleSourceProcessor(
processedLayer.ModifiedAt = DateTime.UtcNow; processedLayer.ModifiedAt = DateTime.UtcNow;
var dataSource = db.Layers var dataSource = _db.Layers
.Include(x => x.Records) .Include(x => x.Records)
.Where(x => x.ParentId == sourceImportWorker.Id .Where(x => x.ParentId == sourceImportWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
@@ -81,15 +88,15 @@ public class T4SingleSourceProcessor(
if (isNew) if (isNew)
{ {
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
} }
else else
{ {
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
} }
// TODO: save records // TODO: save records
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -5,21 +5,28 @@ using DiunaBI.Database.Context;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T5LastValuesProcessor( public class T5LastValuesProcessor : MorskaBaseProcessor
AppDbContext db)
{ {
public void Process(Layer processWorker) public override string ProcessorType => "T5.LastValues";
private readonly AppDbContext _db;
public T5LastValuesProcessor(
AppDbContext db)
{
_db = db;
}
public override void Process(Layer processWorker)
{ {
var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!);
var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!); var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!);
var sourceLayer = processWorker.Records?.SingleOrDefault(x => x.Code == "SourceLayer")?.Desc1; var sourceLayer = processWorker.Records?.SingleOrDefault(x => x.Code == "SourceLayer")?.Desc1;
if (sourceLayer == null) throw new Exception("SourceLayer record not found"); if (sourceLayer == null) throw new Exception("SourceLayer record not found");
var sourceImportWorker = db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled); var sourceImportWorker = _db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled);
if (sourceImportWorker == null) throw new Exception("SourceImportWorker layer not found"); if (sourceImportWorker == null) throw new Exception("SourceImportWorker layer not found");
var source = processWorker.Records?.SingleOrDefault(x => x.Code == "Source")?.Desc1; var source = processWorker.Records?.SingleOrDefault(x => x.Code == "Source")?.Desc1;
if (sourceLayer == null) throw new Exception("Source record not found"); if (sourceLayer == null) throw new Exception("Source record not found");
var processedLayer = db.Layers var processedLayer = _db.Layers
.Where(x => x.ParentId == processWorker.Id .Where(x => x.ParentId == processWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
@@ -34,7 +41,7 @@ public class T5LastValuesProcessor(
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Type = LayerType.Processed, Type = LayerType.Processed,
ParentId = processWorker.Id, ParentId = processWorker.Id,
Number = db.Layers.Count() + 1 Number = _db.Layers.Count() + 1
}; };
processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-{source}-T5"; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-{source}-T5";
processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D");
@@ -48,7 +55,7 @@ public class T5LastValuesProcessor(
var newRecords = new List<Record>(); var newRecords = new List<Record>();
var dataSources = db.Layers var dataSources = _db.Layers
.Include(x => x.Records) .Include(x => x.Records)
.Where(x => x.ParentId == sourceImportWorker.Id .Where(x => x.ParentId == sourceImportWorker.Id
&& !x.IsDeleted && !x.IsCancelled) && !x.IsDeleted && !x.IsCancelled)
@@ -85,11 +92,11 @@ public class T5LastValuesProcessor(
} }
if (isNew) if (isNew)
db.Layers.Add(processedLayer); _db.Layers.Add(processedLayer);
else else
db.Layers.Update(processedLayer); _db.Layers.Update(processedLayer);
// TODO: save records // TODO: save records
//controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"));
db.SaveChanges(); _db.SaveChanges();
} }
} }

View File

@@ -8,9 +8,6 @@ using DiunaBI.Core.Models;
using DiunaBI.Database.Context; using DiunaBI.Database.Context;
using DiunaBI.Core.Services; using DiunaBI.Core.Services;
using Google.Cloud.Firestore; using Google.Cloud.Firestore;
using DiunaBI.Plugins.Morska.Importers;
using DiunaBI.Plugins.Morska.Processors;
using DiunaBI.Core.Services.Exports;
namespace DiunaBI.WebAPI.Controllers; namespace DiunaBI.WebAPI.Controllers;
@@ -23,13 +20,15 @@ public class LayersController : Controller
private readonly GoogleDriveHelper _googleDriveHelper; private readonly GoogleDriveHelper _googleDriveHelper;
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
private readonly LogsController _logsController; private readonly LogsController _logsController;
private readonly PluginManager _pluginManager;
public LayersController( public LayersController(
AppDbContext db, AppDbContext db,
GoogleSheetsHelper googleSheetsHelper, GoogleSheetsHelper googleSheetsHelper,
GoogleDriveHelper googleDriveHelper, GoogleDriveHelper googleDriveHelper,
IConfiguration configuration, IConfiguration configuration,
FirestoreDb firestoreDb FirestoreDb firestoreDb,
PluginManager pluginManager
) )
{ {
_db = db; _db = db;
@@ -41,6 +40,7 @@ public class LayersController : Controller
_googleDriveHelper = googleDriveHelper; _googleDriveHelper = googleDriveHelper;
_configuration = configuration; _configuration = configuration;
_logsController = new LogsController(firestoreDb); _logsController = new LogsController(firestoreDb);
_pluginManager = pluginManager;
} }
[HttpGet] [HttpGet]
@@ -237,7 +237,11 @@ public class LayersController : Controller
var layer = _db.Layers var layer = _db.Layers
.Include(x => x.Records!.OrderByDescending(y => y.Code)).AsNoTracking().First(x => x.Id == id && !x.IsDeleted); .Include(x => x.Records!.OrderByDescending(y => y.Code)).AsNoTracking().First(x => x.Id == id && !x.IsDeleted);
var export = new GoogleSheetExport(_googleDriveHelper, _googleSheetValues, _configuration); var export = _pluginManager.GetExporter("GoogleSheet");
if (export == null)
{
throw new Exception("GoogleSheet exporter not found");
}
export.Export(layer); export.Export(layer);
return Ok(true); return Ok(true);
} }
@@ -376,8 +380,13 @@ public class LayersController : Controller
"GoogleSheet"; "GoogleSheet";
if (source == "DataInbox" && type == "Import-D3") if (source == "DataInbox" && type == "Import-D3")
{ {
var d3Importer = new MorskaD3Importer(_db); var d3Importer = _pluginManager.GetImporter("MorskaD3");
if (d3Importer == null)
{
throw new Exception("MorskaD3 importer not found");
}
d3Importer.Import(importWorker); d3Importer.Import(importWorker);
_logsController.AddEntry(new LogEntry _logsController.AddEntry(new LogEntry
{ {
Title = $"{importWorker.Name}, {importWorker.Id}", Title = $"{importWorker.Name}, {importWorker.Id}",
@@ -391,8 +400,13 @@ public class LayersController : Controller
switch (type) switch (type)
{ {
case "D1": case "D1":
var d1Importer = new MorskaD1Importer(_db, _googleSheetValues); var d1importer = _pluginManager.GetImporter("MorskaD1");
d1Importer.Import(importWorker); if (d1importer == null)
{
throw new Exception("MorskaD1 importer not found");
}
d1importer.Import(importWorker);
Thread.Sleep(5000); // be aware of GSheet API quota Thread.Sleep(5000); // be aware of GSheet API quota
_logsController.AddEntry(new LogEntry _logsController.AddEntry(new LogEntry
@@ -406,8 +420,12 @@ public class LayersController : Controller
break; break;
case "FK2": case "FK2":
{ {
var fk2Importer = new MorskaFk2Importer(_db, _googleSheetValues); var fk2importer = _pluginManager.GetImporter("MorskaFK2");
fk2Importer.Import(importWorker); if (fk2importer == null)
{
throw new Exception("MorskaFK2 importer not found");
}
fk2importer.Import(importWorker);
Thread.Sleep(5000); // be aware of GSheet API quota Thread.Sleep(5000); // be aware of GSheet API quota
_logsController.AddEntry(new LogEntry _logsController.AddEntry(new LogEntry
@@ -439,7 +457,11 @@ public class LayersController : Controller
if (startDateParsed.Date <= DateTime.UtcNow.Date && if (startDateParsed.Date <= DateTime.UtcNow.Date &&
endDateParsed.Date >= DateTime.UtcNow.Date) endDateParsed.Date >= DateTime.UtcNow.Date)
{ {
var importer = new MorskaImporter(_db, _googleSheetValues); var importer = _pluginManager.GetImporter("MorskaImporter");
if (importer == null)
{
throw new Exception("MorskaImporter not found");
}
importer.Import(importWorker); importer.Import(importWorker);
Thread.Sleep(5000); // be aware of GSheet API quota Thread.Sleep(5000); // be aware of GSheet API quota
@@ -454,7 +476,11 @@ public class LayersController : Controller
} }
else if (IsImportedLayerUpToDate(importWorker) == false) else if (IsImportedLayerUpToDate(importWorker) == false)
{ {
var importer = new MorskaImporter(_db, _googleSheetValues); var importer = _pluginManager.GetImporter("MorskaImporter");
if (importer == null)
{
throw new Exception("MorskaImporter not found");
}
importer.Import(importWorker); importer.Import(importWorker);
Thread.Sleep(5000); // be aware of GSheet API quota Thread.Sleep(5000); // be aware of GSheet API quota
@@ -610,8 +636,11 @@ public class LayersController : Controller
throw new Exception("ProcessType record not found"); throw new Exception("ProcessType record not found");
case "T3-SourceYearSummary": case "T3-SourceYearSummary":
{ {
var processor = var processor = _pluginManager.GetProcessor("T3.SourceYearSummary");
new T3SourceYearSummaryProcessor(_db); if (processor == null)
{
throw new Exception("T3.SourceYearSummary processor not found");
}
processor.Process(processWorker); processor.Process(processWorker);
_logsController.AddEntry(new LogEntry _logsController.AddEntry(new LogEntry
@@ -626,8 +655,11 @@ public class LayersController : Controller
} }
case "T3-MultiSourceYearSummary": case "T3-MultiSourceYearSummary":
{ {
var processor = var processor = _pluginManager.GetProcessor("T3.MultiSourceYearSummary");
new T3MultiSourceYearSummaryProcessor(_db); if (processor == null)
{
throw new Exception("T3.MultiSourceYearSummary processor not found");
}
processor.Process(processWorker); processor.Process(processWorker);
_logsController.AddEntry(new LogEntry _logsController.AddEntry(new LogEntry
@@ -642,8 +674,11 @@ public class LayersController : Controller
} }
case "T3-MultiSourceCopySelectedCodesYearSummary": case "T3-MultiSourceCopySelectedCodesYearSummary":
{ {
var processor = var processor = _pluginManager.GetProcessor("T3.MultiSourceCopySelectedCodesYearSummary");
new T3MultiSourceCopySelectedCodesYearSummaryProcessor(_db); if (processor == null)
{
throw new Exception("T3.MultiSourceCopySelectedCodesYearSummary processor not found");
}
processor.Process(processWorker); processor.Process(processWorker);
_logsController.AddEntry(new LogEntry _logsController.AddEntry(new LogEntry
@@ -658,7 +693,11 @@ public class LayersController : Controller
} }
case "T1-R1": case "T1-R1":
{ {
var processor = new T1R1Processor(_db, _googleSheetValues); var processor = _pluginManager.GetProcessor("T1.R1");
if (processor == null)
{
throw new Exception("T1.R1 processor not found");
}
processor.Process(processWorker); processor.Process(processWorker);
_logsController.AddEntry(new LogEntry _logsController.AddEntry(new LogEntry
@@ -673,7 +712,11 @@ public class LayersController : Controller
} }
case "T4-R2": case "T4-R2":
{ {
var processor = new T4R2Processor(_db, _googleSheetValues); var processor = _pluginManager.GetProcessor("T4.R2");
if (processor == null)
{
throw new Exception("T4.R2 processor not found");
}
processor.Process(processWorker); processor.Process(processWorker);
_logsController.AddEntry(new LogEntry _logsController.AddEntry(new LogEntry
@@ -688,7 +731,11 @@ public class LayersController : Controller
} }
case "T1-R3": case "T1-R3":
{ {
var processor = new T1R3Processor(_db, _googleSheetValues); var processor = _pluginManager.GetProcessor("T1.R3");
if (processor == null)
{
throw new Exception("T1.R3 processor not found");
}
processor.Process(processWorker); processor.Process(processWorker);
_logsController.AddEntry(new LogEntry _logsController.AddEntry(new LogEntry
@@ -713,33 +760,51 @@ public class LayersController : Controller
{ {
case "T3-SingleSource": case "T3-SingleSource":
{ {
var t3SingleSource = new T3SingleSourceProcessor(_db); var t3SingleSource = _pluginManager.GetProcessor("T3.SingleSource");
if (t3SingleSource == null)
{
throw new Exception("T3.SingleSource processor not found");
}
t3SingleSource.Process(processWorker); t3SingleSource.Process(processWorker);
break; break;
} }
case "T4-SingleSource": case "T4-SingleSource":
{ {
var t4SingleSource = new T4SingleSourceProcessor(_db); var t4SingleSource = _pluginManager.GetProcessor("T4.SingleSource");
if (t4SingleSource == null)
{
throw new Exception("T4.SingleSource processor not found");
}
t4SingleSource.Process(processWorker); t4SingleSource.Process(processWorker);
break; break;
} }
case "T5-LastValues": case "T5-LastValues":
{ {
var t5LastValues = new T5LastValuesProcessor(_db); var t5LastValues = _pluginManager.GetProcessor("T5.LastValues");
if (t5LastValues == null)
{
throw new Exception("T5.LastValues processor not found");
}
t5LastValues.Process(processWorker); t5LastValues.Process(processWorker);
break; break;
} }
case "T3-MultiSourceSummary": case "T3-MultiSourceSummary":
{ {
var t3MultiSourceSummary = var t3MultiSourceSummary = _pluginManager.GetProcessor("T3.MultiSourceSummary");
new T3MultiSourceSummaryProcessor(_db); if (t3MultiSourceSummary == null)
{
throw new Exception("T3.MultiSourceSummary processor not found");
}
t3MultiSourceSummary.Process(processWorker); t3MultiSourceSummary.Process(processWorker);
break; break;
} }
case "T3-MultiSourceCopySelectedCodes": case "T3-MultiSourceCopySelectedCodes":
{ {
var t3MultiSourceCopySelectedCode = var t3MultiSourceCopySelectedCode = _pluginManager.GetProcessor("T3.MultiSourceCopySelectedCodes");
new T3MultiSourceCopySelectedCodesProcessor(_db); if (t3MultiSourceCopySelectedCode == null)
{
throw new Exception("T3.MultiSourceCopySelectedCodes processor not found");
}
t3MultiSourceCopySelectedCode.Process(processWorker); t3MultiSourceCopySelectedCode.Process(processWorker);
break; break;
} }

View File

@@ -19,7 +19,6 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DiunaBI.Core\DiunaBI.Core.csproj" /> <ProjectReference Include="..\DiunaBI.Core\DiunaBI.Core.csproj" />
<ProjectReference Include="..\DiunaBI.Database\DiunaBI.Database.csproj" /> <ProjectReference Include="..\DiunaBI.Database\DiunaBI.Database.csproj" />
<ProjectReference Include="..\DiunaBI.Plugins.Morska\DiunaBI.Plugins.Morska.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -33,4 +32,15 @@
<ItemGroup> <ItemGroup>
<Folder Include="plugins\" /> <Folder Include="plugins\" />
</ItemGroup> </ItemGroup>
<Target Name="CopyPlugins" AfterTargets="Build">
<MSBuild Projects="../DiunaBI.Plugins.Morska/DiunaBI.Plugins.Morska.csproj"
Properties="Configuration=$(Configuration);TargetFramework=$(TargetFramework)" />
<ItemGroup>
<PluginFiles Include="../DiunaBI.Plugins.Morska/bin/$(Configuration)/$(TargetFramework)/DiunaBI.Plugins.Morska.dll" />
</ItemGroup>
<MakeDir Directories="$(OutputPath)Plugins" />
<Copy SourceFiles="@(PluginFiles)" DestinationFolder="$(OutputPath)Plugins" />
</Target>
</Project> </Project>

View File

@@ -5,10 +5,11 @@ using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt; using System.IdentityModel.Tokens.Jwt;
using System.Reflection;
using System.Text; using System.Text;
using DiunaBI.Core.Models;
using DiunaBI.Database.Context; using DiunaBI.Database.Context;
using DiunaBI.Core.Services; using DiunaBI.Core.Services;
using Google.Apis.Sheets.v4;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -57,8 +58,22 @@ builder.Services.AddAuthentication(options =>
}); });
builder.Services.AddAuthentication(); builder.Services.AddAuthentication();
builder.Services.AddSingleton(typeof(GoogleSheetsHelper)); // Zarejestruj Google Sheets dependencies
builder.Services.AddSingleton(typeof(GoogleDriveHelper)); builder.Services.AddSingleton<GoogleSheetsHelper>();
builder.Services.AddSingleton<GoogleDriveHelper>();
builder.Services.AddSingleton<SpreadsheetsResource.ValuesResource>(provider =>
{
var googleSheetsHelper = provider.GetRequiredService<GoogleSheetsHelper>();
var valuesResource = googleSheetsHelper.Service?.Spreadsheets.Values;
if (valuesResource == null)
{
throw new InvalidOperationException("Google Sheets Service is not initialized properly");
}
return valuesResource;
});
var fileName = "diunabi-admin-firebase.json"; var fileName = "diunabi-admin-firebase.json";
#if DEBUG #if DEBUG
@@ -72,8 +87,17 @@ FirebaseAdmin.FirebaseApp.Create(new AppOptions()
}); });
builder.Services.AddSingleton(FirestoreDb.Create("diunabi-admin")); builder.Services.AddSingleton(FirestoreDb.Create("diunabi-admin"));
builder.Services.AddSingleton<PluginManager>();
var app = builder.Build(); var app = builder.Build();
var pluginManager = app.Services.GetRequiredService<PluginManager>();
var executablePath = Assembly.GetExecutingAssembly().Location;
var executableDir = Path.GetDirectoryName(executablePath)!;
var pluginsPath = Path.Combine(executableDir, "Plugins");
pluginManager.LoadPluginsFromDirectory(pluginsPath);
app.Use(async (context, next) => app.Use(async (context, next) =>
{ {