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