diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js
index dc9371b52e..ba06ae76b7 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js
@@ -2,6 +2,7 @@ $(function () {
const l = abp.localization.getResource('Payments');
const nullPlaceholder = '—';
const formatter = createNumberFormatter();
+ const guidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
let dt = $('#PaymentRequestListTable');
let dataTable;
let isApprove = false;
@@ -377,7 +378,29 @@ $(function () {
name: 'applicantName',
data: 'payeeName',
className: 'data-table-header',
- index: columnIndex
+ index: columnIndex,
+ render: function (data, type, row) {
+ let applicantName = (typeof data !== 'string' || data.trim() === '') ? 'Applicant Name' : data;
+
+ if (type === 'sort' || type === 'filter') {
+ return applicantName;
+ }
+
+ const safeApplicantName = $.fn.dataTable.render.text().display(applicantName);
+
+ if (type === 'display' && abp.auth.isGranted('GrantApplicationManagement.Applicants.ViewList')) {
+ const applicantId = row?.correlationId;
+ const isGuid = applicantId && guidPattern.test(applicantId);
+
+ if (row?.correlationProvider === 'Application' && isGuid) {
+ return `${safeApplicantName}`;
+ }
+
+ return safeApplicantName;
+ }
+
+ return applicantName;
+ },
};
}
diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.js b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.js
index b4a2d9f208..a53d13f64d 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.js
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.js
@@ -303,10 +303,10 @@ $(function () {
{
text: 'Filter',
className: 'custom-table-btn flex-none btn btn-secondary',
- id: 'btn-toggle-filter',
+ id: 'btn-supplier-toggle-filter',
action: function (e, dt, node, config) { },
attr: {
- id: 'btn-toggle-filter',
+ id: 'btn-supplier-toggle-filter',
},
},
];
@@ -334,6 +334,9 @@ $(function () {
dynamicButtonContainerId: 'siteDynamicButtonContainerId',
});
+ initializeFilterRowPlugin(dataTable, 'btn-supplier-toggle-filter');
+
+
function getColumns() {
let columnIndex = 0;
diff --git a/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/plugins/filterRow.js b/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/plugins/filterRow.js
index 08449b0c09..449703e461 100644
--- a/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/plugins/filterRow.js
+++ b/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/plugins/filterRow.js
@@ -32,6 +32,7 @@
'use strict';
let DataTable = $.fn.dataTable;
+ let _filterRowInstanceCount = 0;
// Ensure DataTable is loaded
if (!DataTable) {
@@ -55,7 +56,7 @@
this.s = {
dt: new DataTable.Api(settings),
- namespace: '.dtFilterRow',
+ namespace: '.dtFilterRow' + (++_filterRowInstanceCount),
filterData: {},
opts: $.extend({}, DataTable.FilterRow.defaults, opts)
};
@@ -260,7 +261,8 @@
$btn.on('shown.bs.popover' + this.s.namespace, () => {
- const $popover = $('.popover.custom-popover');
+ const popoverId = $btn.attr('aria-describedby');
+ const $popover = popoverId ? $('#' + popoverId) : $('.popover.custom-popover');
$popover.find('#showFilter')
.off('click' + this.s.namespace)
@@ -348,7 +350,12 @@
}
});
- if (Object.keys(this.s.filterData).length > 0) {
+ // Show filter row if filters are active
+ let externalSearchId = dt.init().externalSearchInputId;
+ let externalSearchVal = externalSearchId ? $(externalSearchId).val() : '';
+ let hasFilters = Object.keys(this.s.filterData).length > 0 || externalSearchVal !== '';
+
+ if (hasFilters) {
this.dom.filterRow.show();
}
@@ -390,24 +397,40 @@
this._updateButtonState();
},
+ /**
+ * Show the filter row
+ * @public
+ */
show: function () {
this.dom.filterRow.show();
this.s.dt.trigger('filterRow-visibility', [true]);
return this;
},
+ /**
+ * Hide the filter row
+ * @public
+ */
hide: function () {
this.dom.filterRow.hide();
this.s.dt.trigger('filterRow-visibility', [false]);
return this;
},
+ /**
+ * Toggle the filter row visibility
+ * @public
+ */
toggle: function () {
this.dom.filterRow.toggle();
this.s.dt.trigger('filterRow-visibility', [this.dom.filterRow.is(':visible')]);
return this;
},
+ /**
+ * Destroy the filter row feature
+ * @private
+ */
_destroy: function () {
let dt = this.s.dt;
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantTenantDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantTenantDto.cs
index 9794ad422a..e9e5b5c24a 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantTenantDto.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantTenantDto.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
namespace Unity.GrantManager.Applicants
{
@@ -6,5 +7,6 @@ public class ApplicantTenantDto
{
public Guid TenantId { get; set; }
public string TenantName { get; set; } = string.Empty;
+ public Dictionary Metadata { get; set; } = [];
}
}
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantTenantMetadataKeys.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantTenantMetadataKeys.cs
new file mode 100644
index 0000000000..e8b08e9fdd
--- /dev/null
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantTenantMetadataKeys.cs
@@ -0,0 +1,11 @@
+namespace Unity.GrantManager.Applicants
+{
+ ///
+ /// Well-known keys for the dictionary.
+ /// Shared with external consumers (e.g. Applicant Portal plugins).
+ ///
+ public static class ApplicantTenantMetadataKeys
+ {
+ public const string DefaultFromAddress = "DefaultFromAddress";
+ }
+}
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/ApplicantProfileAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/ApplicantProfileAppService.cs
index e7146685ee..bcb856bb16 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/ApplicantProfileAppService.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/ApplicantProfileAppService.cs
@@ -1,15 +1,17 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.Extensions.Logging;
using Unity.GrantManager.Applicants;
using Unity.GrantManager.Applications;
+using Unity.Notifications.Settings;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.MultiTenancy;
+using Volo.Abp.Settings;
using Volo.Abp.TenantManagement;
namespace Unity.GrantManager.ApplicantProfile
@@ -20,7 +22,8 @@ public class ApplicantProfileAppService(
ITenantRepository tenantRepository,
IRepository applicantTenantMapRepository,
IRepository applicationFormSubmissionRepository,
- IEnumerable dataProviders)
+ IEnumerable dataProviders,
+ ISettingProvider settingProvider)
: ApplicationService, IApplicantProfileAppService
{
private readonly Dictionary _providersByKey
@@ -69,12 +72,13 @@ public async Task> GetApplicantTenantsAsync(ApplicantPr
// Extract the username part from the OIDC sub (part before '@')
var subUsername = SubjectNormalizer.Normalize(request.Subject);
if (subUsername is null) return [];
+ List mappings = [];
// Query the ApplicantTenantMaps table in the host database
using (currentTenant.Change(null))
{
var queryable = await applicantTenantMapRepository.GetQueryableAsync();
- var mappings = await queryable
+ mappings = await queryable
.Where(m => m.OidcSubUsername == subUsername)
.Select(m => new ApplicantTenantDto
{
@@ -82,8 +86,27 @@ public async Task> GetApplicantTenantsAsync(ApplicantPr
TenantName = m.TenantName
})
.ToListAsync();
+ }
+
+ // Apply tenant specific metadata
+ foreach (var map in mappings)
+ {
+ await AddTenantMetadataAsync(map);
+ }
+
+ return mappings;
+ }
- return mappings;
+ ///
+ /// Add on any relevant tenant specific metadata
+ ///
+ /// The applicant tenant DTO to enrich with tenant-specific metadata.
+ private async Task AddTenantMetadataAsync(ApplicantTenantDto tenantMap)
+ {
+ using (currentTenant.Change(tenantMap.TenantId))
+ {
+ var defaultEmailAddress = await settingProvider.GetOrNullAsync(NotificationsSettings.Mailing.DefaultFromAddress);
+ tenantMap.Metadata[ApplicantTenantMetadataKeys.DefaultFromAddress] = defaultEmailAddress ?? "NoReply@gov.bc.ca";
}
}
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Applicants/ApplicantAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Applicants/ApplicantAppService.cs
index 9b541dadf9..73c468aa06 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Applicants/ApplicantAppService.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Applicants/ApplicantAppService.cs
@@ -357,19 +357,22 @@ public async Task GetNextUnityApplicantIdAsync()
foreach (var id in orderedIds)
{
- if (id == candidate)
- {
- candidate++;
- }
- else // Gap found: candidate is the first available ID.
- {
- break;
- }
+ if (id < candidate) continue; // Skip duplicates already passed.
+ if (id == candidate) candidate++;
+ else break; // Gap found: candidate is the first available ID.
}
return candidate;
}
+ [RemoteService(true)]
+ public async Task IsUnityApplicantIdAvailableAsync(string unityApplicantId, Guid currentApplicantId)
+ {
+ if (string.IsNullOrEmpty(unityApplicantId)) return true;
+ var existing = await applicantRepository.GetByUnityApplicantIdAsync(unityApplicantId);
+ return existing == null || existing.Id == currentApplicantId;
+ }
+
[RemoteService(true)]
public async Task GetExistingApplicantAsync(string? unityApplicantId)
{
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Applicants/IApplicantAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Applicants/IApplicantAppService.cs
index 0cedccdf1c..9921573dfe 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Applicants/IApplicantAppService.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Applicants/IApplicantAppService.cs
@@ -20,6 +20,7 @@ public interface IApplicantAppService : IApplicationService
Task RelateDefaultSupplierAsync(ApplicantAgentDto applicantAgentDto);
Task UpdateApplicantOrgMatchAsync(Applicant applicant);
Task GetNextUnityApplicantIdAsync();
+ Task IsUnityApplicantIdAvailableAsync(string unityApplicantId, Guid currentApplicantId);
Task> GetApplicantsBySiteIdAsync(Guid siteId);
Task GetApplicantLookUpAutocompleteQueryAsync(string? applicantLookUpQuery);
Task> GetListAsync(ApplicantListRequestDto input);
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Comments/CommentsManager.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Comments/CommentsManager.cs
index 68695904e8..101cf3252c 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Comments/CommentsManager.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Comments/CommentsManager.cs
@@ -118,7 +118,7 @@ join user in await _personRepository.GetQueryableAsync() on applicationComment.C
where applicationComment.ApplicationId == ownerId
orderby applicationComment.PinDateTime.HasValue descending,
applicationComment.PinDateTime ascending,
- applicationComment.CreationTime descending
+ (applicationComment.LastModificationTime ?? applicationComment.CreationTime) descending
select new CommentListItem
{
Comment = applicationComment.Comment,
@@ -138,7 +138,7 @@ join user in await _personRepository.GetQueryableAsync() on assessmentComment.Co
where assessmentComment.AssessmentId == ownerId
orderby assessmentComment.PinDateTime.HasValue descending,
assessmentComment.PinDateTime ascending,
- assessmentComment.CreationTime descending
+ (assessmentComment.LastModificationTime ?? assessmentComment.CreationTime) descending
select new CommentListItem
{
Comment = assessmentComment.Comment,
@@ -158,19 +158,19 @@ join user in await _personRepository.GetQueryableAsync() on applicantComment.Com
where applicantComment.ApplicantId == ownerId
orderby applicantComment.PinDateTime.HasValue descending,
applicantComment.PinDateTime ascending,
- applicantComment.CreationTime descending
- select new CommentListItem
- {
- Comment = applicantComment.Comment,
- CommenterId = applicantComment.CommenterId,
- CommenterDisplayName = user.OidcDisplayName,
- CommenterBadge = user.Badge,
- CreationTime = applicantComment.CreationTime,
- OwnerId = ownerId,
- Id = applicantComment.Id,
- LastModificationTime = applicantComment.LastModificationTime,
- PinDateTime = applicantComment.PinDateTime,
- };
+ (applicantComment.LastModificationTime ?? applicantComment.CreationTime) descending
+ select new CommentListItem
+ {
+ Comment = applicantComment.Comment,
+ CommenterId = applicantComment.CommenterId,
+ CommenterDisplayName = user.OidcDisplayName,
+ CommenterBadge = user.Badge,
+ CreationTime = applicantComment.CreationTime,
+ OwnerId = ownerId,
+ Id = applicantComment.Id,
+ LastModificationTime = applicantComment.LastModificationTime,
+ PinDateTime = applicantComment.PinDateTime,
+ };
return applicantCommentsQry.ToList();
default:
throw new ArgumentOutOfRangeException(nameof(type));
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260408213219_Backfill_UnityApplicationId_ABPP2025FallClaims.Designer.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260408213219_Backfill_UnityApplicationId_ABPP2025FallClaims.Designer.cs
new file mode 100644
index 0000000000..da4021ce21
--- /dev/null
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260408213219_Backfill_UnityApplicationId_ABPP2025FallClaims.Designer.cs
@@ -0,0 +1,4941 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Unity.GrantManager.EntityFrameworkCore;
+using Volo.Abp.EntityFrameworkCore;
+
+#nullable disable
+
+namespace Unity.GrantManager.Migrations.TenantMigrations
+{
+ [DbContext(typeof(GrantTenantDbContext))]
+ [Migration("20260408213219_Backfill_UnityApplicationId_ABPP2025FallClaims")]
+ partial class Backfill_UnityApplicationId_ABPP2025FallClaims
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql)
+ .HasAnnotation("ProductVersion", "9.0.5")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CorrelationId")
+ .HasColumnType("uuid");
+
+ b.Property("CorrelationProvider")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("DeleterId")
+ .HasColumnType("uuid")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("DeletionTime");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("ReportData")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("ScoresheetId")
+ .HasColumnType("uuid");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ScoresheetId");
+
+ b.ToTable("ScoresheetInstances", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Answer", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("CurrentValue")
+ .HasColumnType("jsonb");
+
+ b.Property("DeleterId")
+ .HasColumnType("uuid")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("DeletionTime");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("QuestionId")
+ .HasColumnType("uuid");
+
+ b.Property("ScoresheetInstanceId")
+ .HasColumnType("uuid");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("Version")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("QuestionId");
+
+ b.HasIndex("ScoresheetInstanceId");
+
+ b.ToTable("Answers", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Question", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("Definition")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("DeleterId")
+ .HasColumnType("uuid")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("DeletionTime");
+
+ b.Property("Description")
+ .HasColumnType("text");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("Label")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Order")
+ .HasColumnType("bigint");
+
+ b.Property("SectionId")
+ .HasColumnType("uuid");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SectionId");
+
+ b.ToTable("Questions", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Scoresheet", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("DeleterId")
+ .HasColumnType("uuid")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("DeletionTime");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Order")
+ .HasColumnType("bigint");
+
+ b.Property("Published")
+ .HasColumnType("boolean");
+
+ b.Property("ReportColumns")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ReportKeys")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ReportViewName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Version")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.ToTable("Scoresheets", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.ScoresheetSection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("DeleterId")
+ .HasColumnType("uuid")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("DeletionTime");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Order")
+ .HasColumnType("bigint");
+
+ b.Property("ScoresheetId")
+ .HasColumnType("uuid");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ScoresheetId");
+
+ b.ToTable("ScoresheetSections", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.CustomFieldValue", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("CurrentValue")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("CustomFieldId")
+ .HasColumnType("uuid");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("WorksheetInstanceId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorksheetInstanceId");
+
+ b.ToTable("CustomFieldValues", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.WorksheetInstance", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CorrelationId")
+ .HasColumnType("uuid");
+
+ b.Property("CorrelationProvider")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("CurrentValue")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("DeleterId")
+ .HasColumnType("uuid")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("DeletionTime");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("ReportData")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("UiAnchor")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("WorksheetCorrelationId")
+ .HasColumnType("uuid");
+
+ b.Property("WorksheetCorrelationProvider")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("WorksheetId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.ToTable("WorksheetInstances", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.Flex.Domain.WorksheetLinks.WorksheetLink", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CorrelationId")
+ .HasColumnType("uuid");
+
+ b.Property("CorrelationProvider")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Order")
+ .HasColumnType("bigint");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("UiAnchor")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("WorksheetId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorksheetId");
+
+ b.ToTable("WorksheetLinks", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.Flex.Domain.Worksheets.CustomField", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("Definition")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("DeleterId")
+ .HasColumnType("uuid")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("DeletionTime");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Label")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Order")
+ .HasColumnType("bigint");
+
+ b.Property("SectionId")
+ .HasColumnType("uuid");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SectionId");
+
+ b.ToTable("CustomFields", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.Flex.Domain.Worksheets.Worksheet", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("DeleterId")
+ .HasColumnType("uuid")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("DeletionTime");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Published")
+ .HasColumnType("boolean");
+
+ b.Property("ReportColumns")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ReportKeys")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ReportViewName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Version")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.ToTable("Worksheets", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.Flex.Domain.Worksheets.WorksheetSection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("DeleterId")
+ .HasColumnType("uuid")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("DeletionTime");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Order")
+ .HasColumnType("bigint");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("WorksheetId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorksheetId");
+
+ b.ToTable("WorksheetSections", "Flex");
+ });
+
+ modelBuilder.Entity("Unity.GrantManager.Applications.Applicant", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("ApplicantName")
+ .IsRequired()
+ .HasMaxLength(600)
+ .HasColumnType("character varying(600)");
+
+ b.Property("ApproxNumberOfEmployees")
+ .HasColumnType("text");
+
+ b.Property("AuditComments")
+ .HasColumnType("text");
+
+ b.Property("BusinessNumber")
+ .HasColumnType("text");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("FiscalDay")
+ .HasColumnType("integer");
+
+ b.Property("FiscalMonth")
+ .HasColumnType("text");
+
+ b.Property("FundingHistoryComments")
+ .HasColumnType("text");
+
+ b.Property("IndigenousOrgInd")
+ .HasColumnType("text");
+
+ b.Property("IsDuplicated")
+ .HasColumnType("boolean");
+
+ b.Property("IssueTrackingComments")
+ .HasColumnType("text");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("MatchPercentage")
+ .HasColumnType("numeric");
+
+ b.Property("NonRegOrgName")
+ .HasColumnType("text");
+
+ b.Property("NonRegisteredBusinessName")
+ .HasColumnType("text");
+
+ b.Property("OrgName")
+ .HasColumnType("text");
+
+ b.Property("OrgNumber")
+ .HasColumnType("text");
+
+ b.Property("OrgStatus")
+ .HasColumnType("text");
+
+ b.Property("OrganizationSize")
+ .HasColumnType("text");
+
+ b.Property("OrganizationType")
+ .HasColumnType("text");
+
+ b.Property("RedStop")
+ .HasColumnType("boolean");
+
+ b.Property("Sector")
+ .HasColumnType("text");
+
+ b.Property("SectorSubSectorIndustryDesc")
+ .HasColumnType("text");
+
+ b.Property("SiteId")
+ .HasColumnType("uuid");
+
+ b.Property("StartedOperatingDate")
+ .HasColumnType("date");
+
+ b.Property("Status")
+ .HasColumnType("text");
+
+ b.Property("SubSector")
+ .HasColumnType("text");
+
+ b.Property("SupplierId")
+ .HasColumnType("uuid");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("UnityApplicantId")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ApplicantName");
+
+ b.ToTable("Applicants", (string)null);
+ });
+
+ modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAddress", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("AddressType")
+ .HasColumnType("integer");
+
+ b.Property("ApplicantId")
+ .HasColumnType("uuid");
+
+ b.Property("ApplicationId")
+ .HasColumnType("uuid");
+
+ b.Property("City")
+ .HasColumnType("text");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("Country")
+ .HasColumnType("text");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Postal")
+ .HasColumnType("text");
+
+ b.Property("Province")
+ .HasColumnType("text");
+
+ b.Property("Street")
+ .HasColumnType("text");
+
+ b.Property("Street2")
+ .HasColumnType("text");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("TenantId");
+
+ b.Property("Unit")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ApplicantId");
+
+ b.HasIndex("ApplicationId");
+
+ b.ToTable("ApplicantAddresses", (string)null);
+ });
+
+ modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAgent", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("ApplicantId")
+ .HasColumnType("uuid");
+
+ b.Property("ApplicationId")
+ .HasColumnType("uuid");
+
+ b.Property("BceidBusinessGuid")
+ .HasColumnType("uuid");
+
+ b.Property("BceidBusinessName")
+ .HasColumnType("text");
+
+ b.Property("BceidUserGuid")
+ .HasColumnType("uuid");
+
+ b.Property("BceidUserName")
+ .HasColumnType("text");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("ContactOrder")
+ .HasColumnType("integer");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("CreatorId");
+
+ b.Property("Email")
+ .HasColumnType("text");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IdentityEmail")
+ .HasColumnType("text");
+
+ b.Property("IdentityName")
+ .HasColumnType("text");
+
+ b.Property("IdentityProvider")
+ .HasColumnType("text");
+
+ b.Property("IsActive")
+ .HasColumnType("boolean");
+
+ b.Property("IsConfirmed")
+ .HasColumnType("boolean");
+
+ b.Property