diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/Default.css b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/Default.css
index e52eccef88..e62abbbe9c 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/Default.css
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/Default.css
@@ -14,4 +14,15 @@
.payment-info-summary {
border-bottom: 0.25rem solid var(--bc-colors-white-background);
+}
+
+#ApplicationPaymentRequestListTable .error-row td {
+ background-color: #FEEAEA;
+ color: #CC0000 !important;
+}
+
+.info-btn {
+ font-size: 13pt;
+ font-family: BCSans, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-weight: 100;
}
\ No newline at end of file
diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/Default.js b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/Default.js
index e36b24ac28..cd3cbfe767 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/Default.js
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/Default.js
@@ -8,7 +8,7 @@
let dt = $('#ApplicationPaymentRequestListTable');
let dataTable;
const listColumns = getColumns();
- const defaultVisibleColumns = ['id', 'amount', 'status', 'supplierName'];
+ const defaultVisibleColumns = ['id', 'amount', 'status', 'supplierName', 'invoiceStatus', 'cASResponse', 'category'];
$('body').on('click', '#savePaymentInfoBtn', function () {
let applicationId = document.getElementById(
@@ -221,6 +221,52 @@
dataTable.on('search.dt', () => handleSearch());
+ dataTable.on('draw', function () {
+ dataTable.rows().every(function () {
+ let data = this.data();
+ let $row = $(this.node());
+ $row.removeClass('error-row');
+ if (data.casResponse && data.casResponse !== '' &&
+ data.casResponse.toUpperCase() !== 'SUCCEEDED') {
+ $row.addClass('error-row');
+ }
+ });
+ });
+
+ // Reposition the COLUMNS dropdown to open upward when there is not enough space below. Opens downward if there is no ample space in either direction.
+ $('#dynamicButtonContainerId').on('click', '.dt-button', function () {
+ if ($(this).closest('.dt-button-collection').length) return;
+ const $btn = $(this);
+ setTimeout(function () {
+ const $collection = $('#dynamicButtonContainerId .dt-button-collection').filter(':visible').first();
+ if (!$collection.length) return;
+ const btnRect = $btn[0].getBoundingClientRect();
+ const collHeight = $collection.outerHeight();
+ const rightOffset = window.innerWidth - btnRect.right;
+ if (btnRect.bottom + collHeight > window.innerHeight) {
+ $collection[0].style.setProperty('position', 'fixed', 'important');
+ $collection[0].style.setProperty('bottom', (window.innerHeight - btnRect.top) + 'px', 'important');
+ $collection[0].style.setProperty('top', '', 'important');
+ } else {
+ $collection[0].style.setProperty('position', 'fixed', 'important');
+ $collection[0].style.setProperty('top', btnRect.bottom + 'px', 'important');
+ $collection[0].style.setProperty('bottom', '', 'important');
+ }
+ $collection[0].style.setProperty('left', 'auto', 'important');
+ $collection[0].style.setProperty('right', rightOffset + 'px', 'important');
+ }, 0);
+ });
+
+ $('#ApplicationPaymentRequestListTable').on('click', 'tr td', function (e) {
+ let column = dataTable.column(this);
+ let columnName = dataTable.context[0].aoColumns[column.index()].sName;
+ if (columnName === 'cASResponse') {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ return false;
+ }
+ });
+
dataTable.on('select', function (e, dt, type, indexes) {
if (indexes?.length) {
indexes.forEach((index) => {
@@ -282,6 +328,8 @@
getApplicationPaymentPaidOnColumn(),
getApplicationPaymentDescriptionColumn(),
getApplicationPaymentCASResponseColumn(),
+ getApplicationPaymentInvoiceStatusColumn(),
+ getApplicationPaymentCategoryColumn(),
getMailingAddressColumn(),
getMaskedBankAccountColumn(),
getSiteNumberColumn(),
@@ -385,21 +433,41 @@
title: l('PaymentInfoView:ApplicationPaymentListTable.CASResponse'),
name: 'cASResponse',
data: 'casResponse',
- className: 'data-table-header',
+ className: 'data-table-header notexport',
index: 8,
render: function (data) {
if (data + '' !== 'undefined' && data?.length > 0) {
- return (
- '
'
- );
+ return '
';
}
- return '{Not Available}';
+ return null;
},
};
}
+ function getApplicationPaymentInvoiceStatusColumn() {
+ return {
+ title: l('PaymentInfoView:ApplicationPaymentListTable.InvoiceStatus'),
+ name: 'invoiceStatus',
+ data: 'invoiceStatus',
+ className: 'data-table-header',
+ index: 9,
+ defaultContent: '',
+ };
+ }
+
+ function getApplicationPaymentCategoryColumn() {
+ const category = document.getElementById('PaymentInfoApplicationCategory')?.value || '';
+ return {
+ title: l('PaymentInfoView:ApplicationPaymentListTable.Category'),
+ name: 'category',
+ data: null,
+ className: 'data-table-header',
+ index: 10,
+ defaultContent: category,
+ render: function () { return category; },
+ };
+ }
+
function getMailingAddressColumn() {
return {
title: l(
@@ -424,7 +492,7 @@
nullToEmpty(full.site.postalCode)
);
},
- index: 9,
+ index: 11,
};
}
@@ -436,7 +504,7 @@
name: 'bankAccount',
data: 'site.bankAccount',
className: 'data-table-header',
- index: 10,
+ index: 12,
};
}
@@ -446,7 +514,7 @@
name: 'number',
data: 'site.number',
className: 'data-table-header',
- index: 11,
+ index: 13,
};
}
@@ -458,7 +526,7 @@
name: 'supplierNumber',
data: 'supplierNumber',
className: 'data-table-header',
- index: 12,
+ index: 14,
};
}
function getSupplierNameColumn() {
@@ -469,7 +537,7 @@
name: 'supplierName',
data: 'supplierName',
className: 'data-table-header',
- index: 13,
+ index: 15,
};
}
diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/PaymentInfoViewComponent.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/PaymentInfoViewComponent.cs
index 32ddf14fee..474e499afd 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/PaymentInfoViewComponent.cs
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/PaymentInfoViewComponent.cs
@@ -46,6 +46,8 @@ public async Task
InvokeAsync(Guid applicationId, Guid app
ApplicantId = application.Applicant.Id
};
+ model.Category = application.ApplicationForm?.Category ?? string.Empty;
+
var rollup = await _paymentRequestService.GetApplicationPaymentRollupAsync(applicationId);
model.TotalPaid = rollup.TotalPaid;
model.TotalPendingAmounts = rollup.TotalPending;
diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/PaymentInfoViewModel.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/PaymentInfoViewModel.cs
index a2940570f9..ae376c30a0 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/PaymentInfoViewModel.cs
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentInfo/PaymentInfoViewModel.cs
@@ -27,5 +27,6 @@ public class PaymentInfoViewModel : PageModel
public Guid ApplicationId { get; set; }
public Guid ApplicationFormVersionId { get; set; }
public Guid ApplicantId { get; set; }
+ public string Category { get; set; } = string.Empty;
}
}
diff --git a/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/js/DateUtils.js b/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/js/DateUtils.js
index 651e25ebc5..bfb5b0e8d5 100644
--- a/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/js/DateUtils.js
+++ b/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/js/DateUtils.js
@@ -34,8 +34,32 @@ const DateUtils = (function () {
);
}
+ /**
+ * Formats a date-only UTC string without local timezone conversion.
+ * Use this for date-only fields (Due Date, Decision Date, Project Start/End Date)
+ * where the stored date should be displayed as-is regardless of browser timezone.
+ * @param {string} dateUtc - The UTC date string to format
+ * @param {string} type - The type of formatting (for DataTables compatibility)
+ * @returns {string|number|null} Formatted date string or timestamp for sorting, empty string if input is invalid
+ */
+ function formatDate(dateUtc, type) {
+ if (!dateUtc) return '';
+ if (type === 'sort' || type === 'type') {
+ return new Date(dateUtc).getTime();
+ }
+ try {
+ return luxon.DateTime.fromISO(dateUtc, {
+ locale: abp.localization.currentCulture.name,
+ }).toUTC().toLocaleString();
+ } catch (e) {
+ console.warn('Date parse error:', e);
+ return dateUtc;
+ }
+ }
+
// Public API
return {
- formatUtcDateToLocal: formatUtcDateToLocal
+ formatUtcDateToLocal: formatUtcDateToLocal,
+ formatDate: formatDate
};
})();
\ No newline at end of file
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/ApplicantProfile/Payments/ApplicantPaymentDetailsDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/ApplicantProfile/Payments/ApplicantPaymentDetailsDto.cs
index bd3812e099..675196ed38 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/ApplicantProfile/Payments/ApplicantPaymentDetailsDto.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/ApplicantProfile/Payments/ApplicantPaymentDetailsDto.cs
@@ -14,6 +14,9 @@ public class ApplicantPaymentDetailsDto : EntityDto
public PaymentRequestStatus Status { get; set; }
public decimal Amount { get; set; }
public string? PaymentStatus { get; set; }
+ public string? InvoiceStatus { get; set; }
+ public string? CasResponse { get; set; }
+ public string Category { get; set; } = string.Empty;
public string SupplierNumber { get; set; } = string.Empty;
public string SupplierName { get; set; } = string.Empty;
public SiteDto? Site { get; set; }
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/ApplicantProfile/ProfileData/OrgInfoItemDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/ApplicantProfile/ProfileData/OrgInfoItemDto.cs
index 4de11bf387..7c9bb154b8 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/ApplicantProfile/ProfileData/OrgInfoItemDto.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/ApplicantProfile/ProfileData/OrgInfoItemDto.cs
@@ -14,7 +14,11 @@ public class OrgInfoItemDto
public string? NonRegOrgName { get; set; }
public string? FiscalMonth { get; set; }
public int? FiscalDay { get; set; }
+ // Kept for Grants Portal backward compatibility — the portal reads this JSON key.
+ // Value is sourced from Applicant.ApproxNumberOfEmployees, not Applicant.OrganizationSize.
+ // Portal developer can migrate to ApproxNumberOfEmployees once this field is confirmed stable.
public string? OrganizationSize { get; set; }
+ public string? ApproxNumberOfEmployees { get; set; }
public string? Sector { get; set; }
public string? SubSector { get; set; }
}
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantListDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantListDto.cs
index 86f439a7d4..b8ab20408b 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantListDto.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Applicants/ApplicantListDto.cs
@@ -18,7 +18,6 @@ public class ApplicantListDto : AuditedEntityDto
// Additional columns (initially hidden)
public string? NonRegisteredBusinessName { get; set; }
public string? NonRegOrgName { get; set; }
- public string? OrganizationSize { get; set; }
public string? Sector { get; set; }
public string? SubSector { get; set; }
public string? ApproxNumberOfEmployees { get; set; }
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/ApplicantSummaryDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/ApplicantSummaryDto.cs
index c8d35e6141..332d0f7986 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/ApplicantSummaryDto.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/ApplicantSummaryDto.cs
@@ -14,7 +14,7 @@ public class ApplicantSummaryDto
public string? OrgStatus { get; set; }
public string? BusinessNumber { get; set; }
public string? OrganizationType { get; set; }
- public string? OrganizationSize { get; set; }
+ public string? ApproxNumberOfEmployees { get; set; }
public string? SectorSubSectorIndustryDesc { get; set; }
public bool? RedStop { get; set; }
public bool? IndigenousOrgInd { get; set; }
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/CreateUpdateApplicantInfoDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/CreateUpdateApplicantInfoDto.cs
index cce17c3579..6c9fb44c49 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/CreateUpdateApplicantInfoDto.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/CreateUpdateApplicantInfoDto.cs
@@ -13,7 +13,7 @@ public class CreateUpdateApplicantInfoDto : CustomDataFieldDto
public string? OrgStatus { get; set; }
public string? BusinessNumber { get; set; }
public string? OrganizationType { get; set; }
- public string? OrganizationSize { get; set; }
+ public string? ApproxNumberOfEmployees { get; set; }
public string? Sector { get; set; }
public string? SubSector { get; set; }
@@ -67,7 +67,7 @@ public class UpsertApplicantInfoDto : CustomDataFieldDto
public string? OrgNumber { get; set; }
public string? OrgStatus { get; set; }
public string? OrganizationType { get; set; }
- public string? OrganizationSize { get; set; }
+ public string? ApproxNumberOfEmployees { get; set; }
public string? Sector { get; set; }
public string? SubSector { get; set; }
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationApplicant.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationApplicant.cs
index b5f642253c..423b60e6aa 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationApplicant.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationApplicant.cs
@@ -15,7 +15,7 @@ public class GrantApplicationApplicantDto : AuditedEntityDto
public string OrgStatus { get; set; } = string.Empty;
public string BusinessNumber { get; set; } = string.Empty;
public string OrganizationType { get; set; } = string.Empty;
- public string OrganizationSize { get; set; } = string.Empty;
+ public string ApproxNumberOfEmployees { get; set; } = string.Empty;
public string SectorSubSectorIndustryDesc { get; set; } = string.Empty;
public bool RedStop { get; set; } = false;
public string IndigenousOrgInd { get; set; } = string.Empty;
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationDto.cs
index 1f703d5204..53fda330fa 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationDto.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationDto.cs
@@ -68,7 +68,7 @@ public class GrantApplicationDto : AuditedEntityDto
public GrantApplicationAssigneeDto? Owner { get; set; } = new();
public string? OrgStatus { get; set; } = string.Empty;
public string? BusinessNumber { get; set; } = string.Empty;
- public string? OrganizationSize { get; set; } = string.Empty;
+ public string? ApproxNumberOfEmployees { get; set; } = string.Empty;
public string? OrgNumber { get; set; } = string.Empty;
public string? SectorSubSectorIndustryDesc { get; set; } = string.Empty;
public string? SigningAuthorityFullName { get; set; }
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/UpdateApplicantSummaryDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/UpdateApplicantSummaryDto.cs
index 0571deb1a3..fcf960d18f 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/UpdateApplicantSummaryDto.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/UpdateApplicantSummaryDto.cs
@@ -13,7 +13,7 @@ public class UpdateApplicantSummaryDto
public string? OrgStatus { get; set; }
public string? BusinessNumber { get; set; }
public string? OrganizationType { get; set; }
- public string? OrganizationSize { get; set; }
+ public string? ApproxNumberOfEmployees { get; set; }
public string? SectorSubSectorIndustryDesc { get; set; }
public bool? RedStop { get; set; }
public bool? IndigenousOrgInd { get; set; }
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Notifications/INotificationListAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Notifications/INotificationListAppService.cs
new file mode 100644
index 0000000000..9b06691e8a
--- /dev/null
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Notifications/INotificationListAppService.cs
@@ -0,0 +1,10 @@
+using System.Threading.Tasks;
+using Volo.Abp.Application.Dtos;
+using Volo.Abp.Application.Services;
+
+namespace Unity.GrantManager.Notifications;
+
+public interface INotificationListAppService : IApplicationService
+{
+ Task> GetListAsync(PagedAndSortedResultRequestDto input);
+}
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Notifications/NotificationSummaryDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Notifications/NotificationSummaryDto.cs
new file mode 100644
index 0000000000..249ca709fa
--- /dev/null
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Notifications/NotificationSummaryDto.cs
@@ -0,0 +1,19 @@
+using System;
+using Unity.Notifications.Emails;
+using Volo.Abp.Application.Dtos;
+
+namespace Unity.GrantManager.Notifications;
+
+public class NotificationSummaryDto : EntityDto
+{
+ public Guid ApplicationId { get; set; }
+ public string SubmissionReferenceNo { get; set; } = string.Empty;
+ public string ApplicantName { get; set; } = string.Empty;
+ public DateTime? SentDateTime { get; set; }
+ public string Status { get; set; } = string.Empty;
+ public string FromAddress { get; set; } = string.Empty;
+ public string ToAddress { get; set; } = string.Empty;
+ public string Subject { get; set; } = string.Empty;
+ public RecipientType? Recipient { get; set; }
+ public EmailType? EmailType { get; set; }
+}
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/DataProviders/OrgInfoDataProvider.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/DataProviders/OrgInfoDataProvider.cs
index 8b02ea0817..287cf93a98 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/DataProviders/OrgInfoDataProvider.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/DataProviders/OrgInfoDataProvider.cs
@@ -56,7 +56,7 @@ join applicant in applicantsQuery on submission.ApplicantId equals applicant.Id
applicant.NonRegOrgName,
applicant.FiscalMonth,
applicant.FiscalDay,
- applicant.OrganizationSize,
+ applicant.ApproxNumberOfEmployees,
applicant.Sector,
applicant.SubSector
})
@@ -75,7 +75,8 @@ join applicant in applicantsQuery on submission.ApplicantId equals applicant.Id
NonRegOrgName = r.NonRegOrgName,
FiscalMonth = r.FiscalMonth,
FiscalDay = r.FiscalDay,
- OrganizationSize = r.OrganizationSize,
+ OrganizationSize = r.ApproxNumberOfEmployees,
+ ApproxNumberOfEmployees = r.ApproxNumberOfEmployees,
Sector = r.Sector,
SubSector = r.SubSector
}));
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/Payments/ApplicantPaymentsAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/Payments/ApplicantPaymentsAppService.cs
index 5942eb2d9b..600d4df4b2 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/Payments/ApplicantPaymentsAppService.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/ApplicantProfile/Payments/ApplicantPaymentsAppService.cs
@@ -51,6 +51,7 @@ public async Task> GetPaymentListByApplicantIdA
if (applications.Count == 0) return [];
var referenceMap = applications.ToDictionary(a => a.Id, a => a.ReferenceNo);
+ var categoryMap = applications.ToDictionary(a => a.Id, a => a.ApplicationForm?.Category ?? string.Empty);
var applicationIds = applications.Select(a => a.Id).ToList();
var payments = await paymentRequestAppService.GetListByApplicationIdsAsync(applicationIds);
@@ -64,6 +65,9 @@ public async Task> GetPaymentListByApplicantIdA
Status = p.Status,
Amount = p.Amount,
PaymentStatus = p.PaymentStatus,
+ InvoiceStatus = p.InvoiceStatus,
+ CasResponse = p.CasResponse,
+ Category = categoryMap.TryGetValue(p.CorrelationId, out var cat) ? cat : string.Empty,
SupplierNumber = p.SupplierNumber,
SupplierName = p.SupplierName,
Site = p.Site
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 f87dfdafc7..15c346d508 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Applicants/ApplicantAppService.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Applicants/ApplicantAppService.cs
@@ -785,7 +785,6 @@ public async Task> GetListAsync(ApplicantListRe
RedStop = applicant.RedStop,
NonRegisteredBusinessName = applicant.NonRegisteredBusinessName,
NonRegOrgName = applicant.NonRegOrgName,
- OrganizationSize = applicant.OrganizationSize,
Sector = applicant.Sector,
SubSector = applicant.SubSector,
ApproxNumberOfEmployees = applicant.ApproxNumberOfEmployees,
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/GrantApplicationAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/GrantApplicationAppService.cs
index 4fb8bf6d0f..a580ef0ea6 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/GrantApplicationAppService.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/GrantApplicationAppService.cs
@@ -13,12 +13,12 @@
using System.Text.Json;
using System.Threading.Tasks;
using Unity.AI.Automation;
-using Unity.AI.Models;
+using Unity.AI.Models;
using Unity.AI.Permissions;
-using Unity.AI.RateLimit;
-using Unity.AI.Responses;
+using Unity.AI.RateLimit;
+using Unity.AI.Responses;
using Unity.Flex.WorksheetInstances;
-using Unity.Flex.Worksheets;
+using Unity.Flex.Worksheets;
using Unity.GrantManager.Applicants;
using Unity.GrantManager.ApplicationForms;
using Unity.GrantManager.Applications;
@@ -46,21 +46,21 @@ namespace Unity.GrantManager.GrantApplications;
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(GrantApplicationAppService), typeof(IGrantApplicationAppService))]
public class GrantApplicationAppService(
- IApplicationManager applicationManager,
- IApplicationRepository applicationRepository,
- IApplicationChefsFileAttachmentRepository applicationChefsFileAttachmentRepository,
- IApplicationStatusRepository applicationStatusRepository,
+ IApplicationManager applicationManager,
+ IApplicationRepository applicationRepository,
+ IApplicationChefsFileAttachmentRepository applicationChefsFileAttachmentRepository,
+ IApplicationStatusRepository applicationStatusRepository,
IApplicationFormSubmissionRepository applicationFormSubmissionRepository,
IApplicantRepository applicantRepository,
IApplicationFormRepository applicationFormRepository,
IApplicantAgentRepository applicantAgentRepository,
IApplicantAddressRepository applicantAddressRepository,
IApplicantSupplierAppService applicantSupplierService,
- IPaymentRequestAppService paymentRequestService,
- IApplicationAIGenerationQueue aiGenerationQueue,
- IAIGenerationStatusAppService aiGenerationStatusAppService,
- IAIRateLimiter aiRateLimiter,
- IFeatureChecker featureChecker)
+ IPaymentRequestAppService paymentRequestService,
+ IApplicationAIGenerationQueue aiGenerationQueue,
+ IAIGenerationStatusAppService aiGenerationStatusAppService,
+ IAIRateLimiter aiRateLimiter,
+ IFeatureChecker featureChecker)
: GrantManagerAppService, IGrantApplicationAppService
#pragma warning restore S107 // Methods should not have too many parameters
{
@@ -181,7 +181,7 @@ public async Task> GetListAsync(GrantApplica
OrgStatus = rec.ApplicantOrgStatus ?? string.Empty,
BusinessNumber = rec.ApplicantBusinessNumber ?? string.Empty,
OrganizationType = rec.ApplicantOrganizationType ?? string.Empty,
- OrganizationSize = rec.ApplicantOrganizationSize ?? string.Empty,
+ ApproxNumberOfEmployees = rec.ApplicantApproxNumberOfEmployees ?? string.Empty,
SectorSubSectorIndustryDesc = rec.ApplicantSectorSubSectorIndustryDesc ?? string.Empty,
RedStop = rec.ApplicantRedStop ?? false,
IndigenousOrgInd = rec.ApplicantIndigenousOrgInd ?? string.Empty,
@@ -195,7 +195,7 @@ public async Task> GetListAsync(GrantApplica
OrgStatus = rec.ApplicantOrgStatus,
BusinessNumber = rec.ApplicantBusinessNumber,
OrgNumber = rec.ApplicantOrgNumber,
- OrganizationSize = rec.ApplicantOrganizationSize,
+ ApproxNumberOfEmployees = rec.ApplicantApproxNumberOfEmployees,
SectorSubSectorIndustryDesc = rec.ApplicantSectorSubSectorIndustryDesc,
Sector = rec.ApplicantSector,
SubSector = rec.ApplicantSubSector,
@@ -344,7 +344,7 @@ public async Task GetAsync(Guid id)
{
appDto.OrganizationName = application.Applicant.OrgName;
appDto.OrgNumber = application.Applicant.OrgNumber;
- appDto.OrganizationSize = application.Applicant.OrganizationSize;
+ appDto.ApproxNumberOfEmployees = application.Applicant.ApproxNumberOfEmployees;
appDto.OrgStatus = application.Applicant.OrgStatus;
appDto.BusinessNumber = application.Applicant.BusinessNumber;
appDto.NonRegOrgName = application.Applicant.NonRegOrgName;
@@ -829,7 +829,7 @@ public async Task UpdateMergedApplicantAsync(Guid applicationId, CreateUpdateApp
applicant.OrgName = input.OrgName ?? "";
applicant.OrgNumber = input.OrgNumber ?? "";
applicant.OrgStatus = input.OrgStatus ?? "";
- applicant.OrganizationSize = input.OrganizationSize ?? "";
+ applicant.ApproxNumberOfEmployees = input.ApproxNumberOfEmployees ?? "";
applicant.Sector = input.Sector ?? "";
applicant.SubSector = input.SubSector ?? "";
applicant.SectorSubSectorIndustryDesc = input.SectorSubSectorIndustryDesc ?? "";
@@ -1173,14 +1173,14 @@ await LocalEventBus.PublishAsync(
return applicationManager.GetWorkflowDiagram(isDirectApproval);
}
- public async Task QueueAIGenerationAsync(Guid applicationId, string? promptVersion = null)
+ public async Task QueueAIGenerationAsync(Guid applicationId, string? promptVersion = null)
{
await EnsureAIAnalysisEnabledAsync();
return await QueueApplicationAnalysisAsync(applicationId, promptVersion);
}
[Authorize(AIPermissions.Analysis.GenerateApplicationAnalysis)]
- public async Task QueueApplicationAnalysisAsync(Guid applicationId, string? promptVersion = null)
+ public async Task QueueApplicationAnalysisAsync(Guid applicationId, string? promptVersion = null)
{
await EnsureAIAnalysisEnabledAsync();
await aiGenerationQueue.QueueApplicationAnalysisAsync(applicationId, CurrentTenant.Id, promptVersion);
@@ -1190,28 +1190,28 @@ public async Task QueueApplicationAnalysisAsync(Guid appl
AIGenerationRequestKeyHelper.ApplicationAnalysisOperationType,
CurrentTenant.Id);
- return await CreateGenerationStatusAsync(
- request ?? throw new UserFriendlyException("Unable to queue AI analysis request."));
+ return await CreateGenerationStatusAsync(
+ request ?? throw new UserFriendlyException("Unable to queue AI analysis request."));
}
[Authorize(AIPermissions.Analysis.GenerateAttachmentSummaries)]
- public async Task QueueAttachmentSummaryAsync(QueueAttachmentSummaryRequestDto input, string? promptVersion = null)
- {
- await EnsureAttachmentSummariesEnabledAsync();
- var attachmentIds = await ResolveAttachmentSummaryIdsAsync(input);
- await aiGenerationQueue.QueueAttachmentSummaryAsync(input.ApplicationId, CurrentTenant.Id, promptVersion, attachmentIds);
-
- var request = await aiGenerationStatusAppService.GetLatestAsync(
- input.ApplicationId,
- AIGenerationRequestKeyHelper.AttachmentSummaryOperationType,
- CurrentTenant.Id);
-
- return await CreateGenerationStatusAsync(
- request ?? throw new UserFriendlyException("Unable to queue AI attachment summary request."));
+ public async Task QueueAttachmentSummaryAsync(QueueAttachmentSummaryRequestDto input, string? promptVersion = null)
+ {
+ await EnsureAttachmentSummariesEnabledAsync();
+ var attachmentIds = await ResolveAttachmentSummaryIdsAsync(input);
+ await aiGenerationQueue.QueueAttachmentSummaryAsync(input.ApplicationId, CurrentTenant.Id, promptVersion, attachmentIds);
+
+ var request = await aiGenerationStatusAppService.GetLatestAsync(
+ input.ApplicationId,
+ AIGenerationRequestKeyHelper.AttachmentSummaryOperationType,
+ CurrentTenant.Id);
+
+ return await CreateGenerationStatusAsync(
+ request ?? throw new UserFriendlyException("Unable to queue AI attachment summary request."));
}
[Authorize(AIPermissions.Analysis.GenerateScoring)]
- public async Task QueueApplicationScoringAsync(Guid applicationId, string? promptVersion = null)
+ public async Task QueueApplicationScoringAsync(Guid applicationId, string? promptVersion = null)
{
await EnsureScoringEnabledAsync();
await aiGenerationQueue.QueueApplicationScoringAsync(applicationId, CurrentTenant.Id, promptVersion);
@@ -1221,21 +1221,21 @@ public async Task QueueApplicationScoringAsync(Guid appli
AIGenerationRequestKeyHelper.ApplicationScoringOperationType,
CurrentTenant.Id);
- return await CreateGenerationStatusAsync(
- request ?? throw new UserFriendlyException("Unable to queue AI scoring request."));
+ return await CreateGenerationStatusAsync(
+ request ?? throw new UserFriendlyException("Unable to queue AI scoring request."));
}
- public async Task GetAIGenerationStatusAsync(Guid applicationId, string operationType, string? promptVersion = null)
+ public async Task GetAIGenerationStatusAsync(Guid applicationId, string operationType, string? promptVersion = null)
{
- await EnsureAIGenerationStatusAccessAsync(operationType);
- return await CreateGenerationStatusAsync(
- await aiGenerationStatusAppService.GetLatestAsync(applicationId, operationType, CurrentTenant.Id));
+ await EnsureAIGenerationStatusAccessAsync(operationType);
+ return await CreateGenerationStatusAsync(
+ await aiGenerationStatusAppService.GetLatestAsync(applicationId, operationType, CurrentTenant.Id));
}
[Authorize(AIPermissions.Analysis.GenerateApplicationAnalysis)]
[Authorize(AIPermissions.Analysis.GenerateAttachmentSummaries)]
[Authorize(AIPermissions.Analysis.GenerateScoring)]
- public async Task QueueAllAIStagesAsync(Guid applicationId, string? promptVersion = null)
+ public async Task QueueAllAIStagesAsync(Guid applicationId, string? promptVersion = null)
{
await EnsureAttachmentSummariesEnabledAsync();
await EnsureAIAnalysisEnabledAsync();
@@ -1247,20 +1247,20 @@ public async Task QueueAllAIStagesAsync(Guid applicationI
AIGenerationRequestKeyHelper.PipelineOperationType,
CurrentTenant.Id);
- return await CreateGenerationStatusAsync(
- request ?? throw new UserFriendlyException("Unable to queue AI generation request."));
- }
-
- private async Task CreateGenerationStatusAsync(AIGenerationRequestDto? request)
- {
- var state = await aiRateLimiter.GetStateAsync();
- return new AIGenerationStatusDto
- {
- GenerationRequest = request,
- IsGenerating = state.IsGenerating,
- RetryAfterSeconds = state.RetryAfterSeconds
- };
- }
+ return await CreateGenerationStatusAsync(
+ request ?? throw new UserFriendlyException("Unable to queue AI generation request."));
+ }
+
+ private async Task CreateGenerationStatusAsync(AIGenerationRequestDto? request)
+ {
+ var state = await aiRateLimiter.GetStateAsync();
+ return new AIGenerationStatusDto
+ {
+ GenerationRequest = request,
+ IsGenerating = state.IsGenerating,
+ RetryAfterSeconds = state.RetryAfterSeconds
+ };
+ }
private async Task EnsureAIGenerationStatusAccessAsync(string operationType)
{
@@ -1285,49 +1285,49 @@ private async Task EnsureAIGenerationStatusAccessAsync(string operationType)
}
}
- private async Task EnsureAttachmentSummariesEnabledAsync()
- {
- if (!await featureChecker.IsEnabledAsync("Unity.AI.AttachmentSummaries"))
- {
- throw new UserFriendlyException("AI attachment summaries are not enabled.");
- }
- }
-
- private async Task> ResolveAttachmentSummaryIdsAsync(QueueAttachmentSummaryRequestDto input)
- {
- if (input == null)
- {
- throw new UserFriendlyException("Attachment summary request is required.");
- }
-
- if (input.ApplicationId == Guid.Empty)
- {
- throw new UserFriendlyException("Application id is required.");
- }
-
- var applicationAttachmentIds = (await applicationChefsFileAttachmentRepository.GetListAsync(a => a.ApplicationId == input.ApplicationId))
- .Select(a => a.Id)
- .ToList();
-
- if (applicationAttachmentIds.Count == 0)
- {
- throw new UserFriendlyException("No attachments were found to generate summaries.");
- }
-
- if (input.AttachmentIds is not { Count: > 0 })
- {
- return applicationAttachmentIds;
- }
-
- var applicationAttachmentIdSet = applicationAttachmentIds.ToHashSet();
- var selectedAttachmentIds = input.AttachmentIds.Distinct().ToList();
- if (selectedAttachmentIds.Any(id => !applicationAttachmentIdSet.Contains(id)))
- {
- throw new UserFriendlyException("One or more selected attachments do not belong to the application.");
- }
-
- return selectedAttachmentIds;
- }
+ private async Task EnsureAttachmentSummariesEnabledAsync()
+ {
+ if (!await featureChecker.IsEnabledAsync("Unity.AI.AttachmentSummaries"))
+ {
+ throw new UserFriendlyException("AI attachment summaries are not enabled.");
+ }
+ }
+
+ private async Task> ResolveAttachmentSummaryIdsAsync(QueueAttachmentSummaryRequestDto input)
+ {
+ if (input == null)
+ {
+ throw new UserFriendlyException("Attachment summary request is required.");
+ }
+
+ if (input.ApplicationId == Guid.Empty)
+ {
+ throw new UserFriendlyException("Application id is required.");
+ }
+
+ var applicationAttachmentIds = (await applicationChefsFileAttachmentRepository.GetListAsync(a => a.ApplicationId == input.ApplicationId))
+ .Select(a => a.Id)
+ .ToList();
+
+ if (applicationAttachmentIds.Count == 0)
+ {
+ throw new UserFriendlyException("No attachments were found to generate summaries.");
+ }
+
+ if (input.AttachmentIds is not { Count: > 0 })
+ {
+ return applicationAttachmentIds;
+ }
+
+ var applicationAttachmentIdSet = applicationAttachmentIds.ToHashSet();
+ var selectedAttachmentIds = input.AttachmentIds.Distinct().ToList();
+ if (selectedAttachmentIds.Any(id => !applicationAttachmentIdSet.Contains(id)))
+ {
+ throw new UserFriendlyException("One or more selected attachments do not belong to the application.");
+ }
+
+ return selectedAttachmentIds;
+ }
private async Task EnsureAIAnalysisEnabledAsync()
{
@@ -1488,4 +1488,4 @@ private static void UpdateFindingDismissedState(IEnumerable HandleAsync(PluginDataPayload payload)
applicant.OrgStatus = innerData.Status;
applicant.NonRegOrgName = innerData.NonRegOrgName;
applicant.FiscalMonth = innerData.FiscalMonth;
- applicant.OrganizationSize = innerData.OrganizationSize;
+ applicant.ApproxNumberOfEmployees = innerData.ApproxNumberOfEmployees ?? innerData.OrganizationSize;
if (int.TryParse(innerData.FiscalDay, out var fiscalDay))
{
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantsPortal/Messages/Commands/OrganizationEditData.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantsPortal/Messages/Commands/OrganizationEditData.cs
index e2d08dc007..48deb25541 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantsPortal/Messages/Commands/OrganizationEditData.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantsPortal/Messages/Commands/OrganizationEditData.cs
@@ -25,6 +25,13 @@ public class OrganizationEditData
[JsonProperty("fiscalDay")]
public string? FiscalDay { get; set; }
+ // Kept for Grants Portal backward compatibility — portal sends "organizationSize" in the PUT payload.
+ // OrganizationEditHandler falls back to this value when ApproxNumberOfEmployees is not present.
[JsonProperty("organizationSize")]
public string? OrganizationSize { get; set; }
+
+ // Preferred field — portal developer should migrate the PUT payload to send "approxNumberOfEmployees"
+ // instead of "organizationSize" after deployment. Handler uses this when present.
+ [JsonProperty("approxNumberOfEmployees")]
+ public string? ApproxNumberOfEmployees { get; set; }
}
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Norifications/NotificationListAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Norifications/NotificationListAppService.cs
new file mode 100644
index 0000000000..1721b95ba4
--- /dev/null
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Norifications/NotificationListAppService.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authorization;
+using Unity.GrantManager.Applications;
+using Unity.Notifications.Emails;
+using Unity.Notifications.Permissions;
+using Volo.Abp.Application.Dtos;
+using Volo.Abp.Application.Services;
+using Volo.Abp.Domain.Repositories;
+using Volo.Abp.Features;
+
+namespace Unity.GrantManager.Notifications;
+
+[Authorize(NotificationsPermissions.NotificationList.View)]
+[RequiresFeature("Unity.Notifications")]
+public class NotificationListAppService(
+ IEmailLogsRepository emailLogsRepository,
+ IRepository applicationRepository,
+ IRepository applicantRepository)
+ : ApplicationService, INotificationListAppService
+{
+ public virtual async Task> GetListAsync(PagedAndSortedResultRequestDto input)
+ {
+ var sorting = ResolveSorting(input.Sorting);
+
+ var totalCount = await emailLogsRepository.GetCountAsync();
+ var logs = await emailLogsRepository.GetPagedListAsync(input.SkipCount, input.MaxResultCount, sorting);
+
+ var applicationIds = logs.Select(l => l.ApplicationId).Distinct().ToArray();
+ var applications = await applicationRepository.GetListAsync(a => applicationIds.Contains(a.Id));
+ var referenceByAppId = applications.ToDictionary(a => a.Id, a => a.ReferenceNo);
+ var applicantIdByAppId = applications.ToDictionary(a => a.Id, a => a.ApplicantId);
+
+ var applicantIds = logs.Select(l => l.ApplicantId)
+ .Concat(applicantIdByAppId.Values)
+ .Distinct()
+ .ToArray();
+ var applicants = await applicantRepository.GetListAsync(a => applicantIds.Contains(a.Id));
+ var applicantNameById = applicants.ToDictionary(a => a.Id, a => a.ApplicantName ?? string.Empty);
+
+ var items = logs.Select(log =>
+ {
+ referenceByAppId.TryGetValue(log.ApplicationId, out var referenceNo);
+
+ // Prefer the EmailLog.ApplicantId; fall back to the application's applicant.
+ var applicantId = log.ApplicantId != Guid.Empty
+ ? log.ApplicantId
+ : applicantIdByAppId.GetValueOrDefault(log.ApplicationId);
+ applicantNameById.TryGetValue(applicantId, out var applicantName);
+
+ return new NotificationSummaryDto
+ {
+ Id = log.Id,
+ ApplicationId = log.ApplicationId,
+ SubmissionReferenceNo = referenceNo ?? string.Empty,
+ ApplicantName = applicantName ?? string.Empty,
+ SentDateTime = log.SentDateTime,
+ Status = log.Status,
+ FromAddress = log.FromAddress,
+ ToAddress = log.ToAddress,
+ Subject = log.Subject,
+ Recipient = log.Recipient,
+ EmailType = log.EmailType
+ };
+ }).ToList();
+
+ return new PagedResultDto(totalCount, items);
+ }
+
+ private const string DefaultSorting = "SentDateTime DESC";
+
+ // Only EmailLog-backed columns can be sorted at the database level. Joined columns
+ // (Submission Id, Applicant Name) are not sortable server-side; any unrecognized
+ // value falls back to the default so client input is never forwarded raw into the
+ // dynamic-LINQ ordering.
+ private static readonly HashSet SortableColumns = new(StringComparer.OrdinalIgnoreCase)
+ {
+ nameof(EmailLog.SentDateTime),
+ nameof(EmailLog.Status),
+ nameof(EmailLog.FromAddress),
+ nameof(EmailLog.ToAddress),
+ nameof(EmailLog.Subject),
+ nameof(EmailLog.Recipient),
+ nameof(EmailLog.EmailType)
+ };
+
+ private static string ResolveSorting(string? requested)
+ {
+ if (string.IsNullOrWhiteSpace(requested))
+ {
+ return DefaultSorting;
+ }
+
+ var parts = requested.Trim().Split(' ', StringSplitOptions.RemoveEmptyEntries);
+ var column = parts[0].TrimEnd(',');
+
+ if (!SortableColumns.TryGetValue(column, out var canonicalColumn))
+ {
+ return DefaultSorting;
+ }
+
+ var descending = parts.Length > 1 && parts[1].StartsWith("DESC", StringComparison.OrdinalIgnoreCase);
+ return $"{canonicalColumn} {(descending ? "DESC" : "ASC")}";
+ }
+}
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain.Shared/Localization/GrantManager/en.json b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain.Shared/Localization/GrantManager/en.json
index ea4545069b..a449490f7e 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain.Shared/Localization/GrantManager/en.json
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain.Shared/Localization/GrantManager/en.json
@@ -425,6 +425,7 @@
"ApplicantInfoView:ApplicantInfo.OrgBookStatus": "Org book status ",
"ApplicantInfoView:ApplicantInfo.OrganizationType": "Organization Type",
"ApplicantInfoView:ApplicantInfo.OrganizationSize": "Organization Size",
+ "ApplicantInfoView:ApplicantInfo.ApproxNumberOfEmployees": "Organization Size (Approximate Number of Employees)",
"ApplicantInfoView:ApplicantInfo.UnityApplicant": "Applicant Id",
"ApplicantInfoView:ApplicantInfo.FiscalMonth": "Fiscal Year End Month",
"ApplicantInfoView:ApplicantInfo.FiscalDay": "Fiscal Year End Day",
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/Applicant.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/Applicant.cs
index feac9027ac..7e497cdc25 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/Applicant.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/Applicant.cs
@@ -13,6 +13,9 @@ public class Applicant : AuditedAggregateRoot, IMultiTenant
public string? OrgNumber { get; set; }
public string? OrgStatus { get; set; }
public string? OrganizationType { get; set; }
+ // Retained to protect the DB column from being dropped by EF Core migrations.
+ // No longer read or written by Unity — ApproxNumberOfEmployees is the canonical field.
+ // Do not remove until a DB migration explicitly drops or consolidates the column.
public string? OrganizationSize { get; set; }
public string? Sector { get; set; }
public string? SubSector { get; set; }
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicantListRecord.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicantListRecord.cs
index 0e4ce1b6b1..72bccbb077 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicantListRecord.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicantListRecord.cs
@@ -15,7 +15,6 @@ public class ApplicantListRecord
public bool? RedStop { get; set; }
public string? NonRegisteredBusinessName { get; set; }
public string? NonRegOrgName { get; set; }
- public string? OrganizationSize { get; set; }
public string? Sector { get; set; }
public string? SubSector { get; set; }
public string? ApproxNumberOfEmployees { get; set; }
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicationListRecord.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicationListRecord.cs
index f086d1299e..999ad5fa13 100644
--- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicationListRecord.cs
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicationListRecord.cs
@@ -76,7 +76,7 @@ public class ApplicationListRecord
public string? ApplicantOrgNumber { get; init; }
public string? ApplicantOrgStatus { get; init; }
public string? ApplicantBusinessNumber { get; init; }
- public string? ApplicantOrganizationSize { get; init; }
+ public string? ApplicantApproxNumberOfEmployees { get; init; }
public string? ApplicantSectorSubSectorIndustryDesc { get; init; }
public bool? ApplicantRedStop { get; init; }
public string? ApplicantIndigenousOrgInd { get; init; }
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260617185103_AB33225_EmailSentDate_Datafix.Designer.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260617185103_AB33225_EmailSentDate_Datafix.Designer.cs
new file mode 100644
index 0000000000..0b730ce66f
--- /dev/null
+++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260617185103_AB33225_EmailSentDate_Datafix.Designer.cs
@@ -0,0 +1,5068 @@
+//
+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("20260617185103_AB33225_EmailSentDate_Datafix")]
+ partial class AB33225_EmailSentDate_Datafix
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql)
+ .HasAnnotation("ProductVersion", "10.0.3")
+ .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("IsArchived")
+ .HasColumnType("boolean");
+
+ 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("IsArchived")
+ .HasColumnType("boolean");
+
+ 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("Definition")
+ .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("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("DeleterId")
+ .HasColumnType("uuid");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone");
+
+ 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("IsDeleted")
+ .HasColumnType("boolean");
+
+ 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