diff --git a/src/iLoan.Rules.Web/Components/Pages/AddCoreRule.razor b/src/iLoan.Rules.Web/Components/Pages/AddCoreRule.razor
index 61786fb..d95fd70 100644
--- a/src/iLoan.Rules.Web/Components/Pages/AddCoreRule.razor
+++ b/src/iLoan.Rules.Web/Components/Pages/AddCoreRule.razor
@@ -9,7 +9,7 @@
-
+
@@ -115,7 +115,7 @@
-
+
@@ -156,7 +156,7 @@
-
+
@@ -177,10 +177,10 @@
-
+
-
+
diff --git a/src/iLoan.Rules.Web/Components/Pages/CoreRules.razor b/src/iLoan.Rules.Web/Components/Pages/CoreRules.razor
index 3b67b43..5b08be6 100644
--- a/src/iLoan.Rules.Web/Components/Pages/CoreRules.razor
+++ b/src/iLoan.Rules.Web/Components/Pages/CoreRules.razor
@@ -8,7 +8,8 @@
-
+
+
@@ -79,7 +80,7 @@
- CoreRuleCriteriaAddButtonClick(args,coreRuleChild)) />
+ CoreRuleCriteriaAddButtonClick(args, coreRuleChild))/>
diff --git a/src/iLoan.Rules.Web/Components/Pages/CoreRules.razor.cs b/src/iLoan.Rules.Web/Components/Pages/CoreRules.razor.cs
index f100dd5..b59db9c 100644
--- a/src/iLoan.Rules.Web/Components/Pages/CoreRules.razor.cs
+++ b/src/iLoan.Rules.Web/Components/Pages/CoreRules.razor.cs
@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using ILoan.Rules.Web.Services;
using Microsoft.JSInterop;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
@@ -33,6 +34,9 @@ namespace ILoan.Rules.Web.Components.Pages
[Inject]
public RulesService RulesService { get; set; }
+ [Inject]
+ public RuleFileGeneratorService RuleFileGeneratorService { get; set; }
+
protected IEnumerable coreRules;
protected RadzenDataGrid grid0;
@@ -47,6 +51,23 @@ namespace ILoan.Rules.Web.Components.Pages
await grid0.Reload();
}
+ ///
+ /// Execute RuleFileGeneratorService to generate SQL files
+ ///
+ ///
+ ///
+ protected async Task GenerateButtonClick()
+ {
+ await RuleFileGeneratorService.GenerateRuleFilesAsync();
+ NotificationService.Notify(new NotificationMessage
+ {
+ Severity = NotificationSeverity.Success,
+ Summary = $"Success",
+ Detail = $"Rule files generated successfully",
+
+ });
+ }
+
protected async Task EditRow(ILoan.Rules.Web.Models.Rules.CoreRule args)
{
await DialogService.OpenAsync("Edit CoreRule", new Dictionary { {"ID", args.ID} });
diff --git a/src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor b/src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor
index ff2984d..e679931 100644
--- a/src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor
+++ b/src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor
@@ -10,7 +10,7 @@
-
+
@@ -116,7 +116,7 @@
-
+
@@ -149,7 +149,7 @@
-
+
@@ -157,7 +157,7 @@
-
+
@@ -178,10 +178,10 @@
-
+
-
+
diff --git a/src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor.cs b/src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor.cs
index 183da57..08a3bd5 100644
--- a/src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor.cs
+++ b/src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor.cs
@@ -1,12 +1,7 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using Microsoft.JSInterop;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
+using Microsoft.JSInterop;
using Radzen;
-using Radzen.Blazor;
namespace ILoan.Rules.Web.Components.Pages
{
@@ -46,6 +41,7 @@ namespace ILoan.Rules.Web.Components.Pages
{
try
{
+ coreRule.Update += 1;
await RulesService.UpdateCoreRule(ID, coreRule);
DialogService.Close(coreRule);
}
diff --git a/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriteriaOperator.razor b/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriteriaOperator.razor
index 2be95b8..c65c274 100644
--- a/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriteriaOperator.razor
+++ b/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriteriaOperator.razor
@@ -23,6 +23,14 @@
+
+
+
+
+
+
+
+
diff --git a/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriteriaOperator.razor.cs b/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriteriaOperator.razor.cs
index 0dff8d6..b0595fb 100644
--- a/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriteriaOperator.razor.cs
+++ b/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriteriaOperator.razor.cs
@@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Radzen;
using Radzen.Blazor;
+using ILoan.Rules.Web.Models.Rules;
namespace ILoan.Rules.Web.Components.Pages
{
@@ -50,6 +51,7 @@ namespace ILoan.Rules.Web.Components.Pages
{
try
{
+ coreRuleCriteriaOperator.Update += 1;
await RulesService.UpdateCoreRuleCriteriaOperator(ID, coreRuleCriteriaOperator);
DialogService.Close(coreRuleCriteriaOperator);
}
diff --git a/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriterion.razor b/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriterion.razor
index b86a3cf..a70b4b9 100644
--- a/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriterion.razor
+++ b/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriterion.razor
@@ -63,6 +63,14 @@
+
+
+
+
+
+
+
+
diff --git a/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriterion.razor.cs b/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriterion.razor.cs
index 676a4d8..85f92e7 100644
--- a/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriterion.razor.cs
+++ b/src/iLoan.Rules.Web/Components/Pages/EditCoreRuleCriterion.razor.cs
@@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Radzen;
using Radzen.Blazor;
+using ILoan.Rules.Web.Models.Rules;
namespace ILoan.Rules.Web.Components.Pages
{
@@ -50,6 +51,7 @@ namespace ILoan.Rules.Web.Components.Pages
{
try
{
+ coreRuleCriterion.Update += 1;
await RulesService.UpdateCoreRuleCriterion(ID, coreRuleCriterion);
DialogService.Close(coreRuleCriterion);
}
diff --git a/src/iLoan.Rules.Web/Models/Rules/CoreRule.cs b/src/iLoan.Rules.Web/Models/Rules/CoreRule.cs
index 2d23ce8..44d312e 100644
--- a/src/iLoan.Rules.Web/Models/Rules/CoreRule.cs
+++ b/src/iLoan.Rules.Web/Models/Rules/CoreRule.cs
@@ -57,7 +57,7 @@ namespace ILoan.Rules.Web.Models.Rules
public string Title { get; set; }
- public string update { get; set; }
+ public int Update { get; set; }
public ICollection CoreRuleCriteria { get; set; } = [];
diff --git a/src/iLoan.Rules.Web/Models/Rules/CoreRuleCriteriaOperator.cs b/src/iLoan.Rules.Web/Models/Rules/CoreRuleCriteriaOperator.cs
index d705642..dcc84d8 100644
--- a/src/iLoan.Rules.Web/Models/Rules/CoreRuleCriteriaOperator.cs
+++ b/src/iLoan.Rules.Web/Models/Rules/CoreRuleCriteriaOperator.cs
@@ -18,5 +18,8 @@ namespace ILoan.Rules.Web.Models.Rules
[Column("Operator")]
public string Operator1 { get; set; }
+
+
+ public int Update { get; set; } = 0;
}
}
\ No newline at end of file
diff --git a/src/iLoan.Rules.Web/Models/Rules/CoreRuleCriterion.cs b/src/iLoan.Rules.Web/Models/Rules/CoreRuleCriterion.cs
index 7c2443b..58a289f 100644
--- a/src/iLoan.Rules.Web/Models/Rules/CoreRuleCriterion.cs
+++ b/src/iLoan.Rules.Web/Models/Rules/CoreRuleCriterion.cs
@@ -27,5 +27,8 @@ namespace ILoan.Rules.Web.Models.Rules
public bool? ReturnCount { get; set; }
public bool? IsThresholdCriterium { get; set; }
+
+
+ public int Update { get; set; }
}
}
\ No newline at end of file
diff --git a/src/iLoan.Rules.Web/Program.cs b/src/iLoan.Rules.Web/Program.cs
index 3d69627..bdba3b4 100644
--- a/src/iLoan.Rules.Web/Program.cs
+++ b/src/iLoan.Rules.Web/Program.cs
@@ -1,5 +1,6 @@
using Radzen;
using ILoan.Rules.Web.Components;
+using ILoan.Rules.Web.Services;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
@@ -9,6 +10,7 @@ builder.Services.AddControllers();
builder.Services.AddRadzenComponents();
builder.Services.AddHttpClient();
builder.Services.AddScoped();
+builder.Services.AddScoped();
builder.Services.AddDbContext(options =>
{
options.UseNpgsql(builder.Configuration.GetConnectionString("RulesConnection"));
diff --git a/src/iLoan.Rules.Web/Services/RuleFileGeneratorService.cs b/src/iLoan.Rules.Web/Services/RuleFileGeneratorService.cs
new file mode 100644
index 0000000..cf8e2d1
--- /dev/null
+++ b/src/iLoan.Rules.Web/Services/RuleFileGeneratorService.cs
@@ -0,0 +1,75 @@
+using ILoan.Rules.Web.Data;
+using ILoan.Rules.Web.Models.Rules;
+using Microsoft.EntityFrameworkCore;
+using System.Text;
+
+namespace ILoan.Rules.Web.Services;
+
+public class RuleFileGeneratorService
+{
+ private readonly RulesContext _context;
+ private readonly int _startRuleId;
+ private int _startSeq;
+ private readonly string _root;
+
+ public RuleFileGeneratorService(RulesContext context, IConfiguration configuration)
+ {
+ _context = context;
+ _startRuleId = configuration.GetValue("Parameters:StartRuleId");
+ _startSeq = configuration.GetValue("Parameters:StartSeqNo");
+ _root = configuration.GetValue("Parameters:GeneratorRoot");
+ }
+
+ public async Task GenerateRuleFilesAsync()
+ {
+ if (!_root.EndsWith("migrations"))
+ {
+ if (Directory.Exists(_root)) Directory.Delete(_root, true);
+ if (!Directory.Exists(_root)) Directory.CreateDirectory(_root);
+ }
+
+ var rules = await _context.CoreRules.Where(rule => rule.ID >= _startRuleId).ToListAsync();
+
+ foreach (var rule in rules.OrderBy(x =>x.ID))
+ {
+ var fileName = $"V2.{_startSeq:000}__{rule.WorkItemId}_Rules_{rule.ID}_{rule.Title}.sql";
+
+ if (rule.Update > 0)
+ {
+ fileName = $"V2.{_startSeq:000}__{rule.WorkItemId}_Rules_{rule.ID}_{rule.Title}_Update({rule.Update}).sql";
+ }
+
+ var sql = GenerateSqlStatement(rule);
+ // Simulate writing to a file (you can replace this with actual file writing)
+ Console.WriteLine($"Generating file: {fileName}");
+ await File.WriteAllTextAsync(Path.Combine(_root, fileName), sql, Encoding.UTF8);
+ _startSeq++;
+ }
+ }
+
+ private string GenerateSqlStatement(CoreRule rule)
+ {
+ return $@"
+-- SQL statement to insert or update the rule
+INSERT INTO core.""Core_Rules"" (
+ ""ID"", ""RuleName"", ""Source"", ""DefaultThreshold"", ""Blocked"", ""TriggersManualReview"",
+ ""SuggestedResolution"", ""TriggerReason"", ""UseLastRecord"", ""ApplicantType"", ""FilterOnClickthrough"",
+ ""RunBeforeStatus"", ""DisplaySection"", ""WarningField"", ""DutchRuleName"", ""DutchTriggerReason"",
+ ""DutchSuggestedResolution"", ""DutchFilterOnClickthrough"", ""RuleExplanation"", ""DutchRuleExplanation""
+) OVERRIDING SYSTEM VALUE VALUES (
+ {rule.ID}, '{EscapeSingleQuote(rule.RuleName)}', '{EscapeSingleQuote(rule.Source)}', {rule.DefaultThreshold?.ToString() ?? "NULL"},
+ {rule.Blocked.ToString().ToUpper()}, {rule.TriggersManualReview.ToString().ToUpper()}, '{EscapeSingleQuote(rule.SuggestedResolution)}',
+ '{EscapeSingleQuote(rule.TriggerReason)}', {rule.UseLastRecord?.ToString().ToUpper() ?? "NULL"}, '{EscapeSingleQuote(rule.ApplicantType)}',
+ '{EscapeSingleQuote(rule.FilterOnClickthrough)}', '{EscapeSingleQuote(rule.RunBeforeStatus)}', '{EscapeSingleQuote(rule.DisplaySection)}',
+ '{EscapeSingleQuote(rule.WarningField)}', '{EscapeSingleQuote(rule.DutchRuleName)}', '{EscapeSingleQuote(rule.DutchTriggerReason)}',
+ '{EscapeSingleQuote(rule.DutchSuggestedResolution)}', '{EscapeSingleQuote(rule.DutchFilterOnClickthrough)}',
+ '{EscapeSingleQuote(rule.RuleExplanation)}', '{EscapeSingleQuote(rule.DutchRuleExplanation)}'
+);
+";
+ }
+
+ private static string? EscapeSingleQuote(string value)
+ {
+ return value?.Replace("'", "''");
+ }
+}
\ No newline at end of file
diff --git a/src/iLoan.Rules.Web/appsettings.json b/src/iLoan.Rules.Web/appsettings.json
index 1e549f8..4ed5d73 100644
--- a/src/iLoan.Rules.Web/appsettings.json
+++ b/src/iLoan.Rules.Web/appsettings.json
@@ -15,5 +15,10 @@
"UseDatabaseNames": false,
"UseEFNaming": false
}
+ },
+ "Parameters": {
+ "GeneratorRoot": "C:\\iloan\\iloan-base-dev\\migrations",
+ "StartSeqNo": 104,
+ "StartRuleId": 480
}
}
\ No newline at end of file