Skip to content
Merged

Dev #2096

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
a960047
AB#32008 Add Office document text extraction support (Word/Excel)
jacobwillsmith Feb 27, 2026
7ed4d3f
AB#32008 Resolve ICell specificity error
jacobwillsmith Feb 27, 2026
39899cc
Added new placeholders on appsettings.
hasanpour Feb 27, 2026
d3474e2
Added AI Scoring user.
hasanpour Feb 27, 2026
8316a27
AB#31871: Add AI Scoring to Feature Flags
hasanpour Feb 27, 2026
ce760cb
AB#32008 Sonar fix simplify docx paragraph extraction loop
jacobwillsmith Feb 28, 2026
608863d
AB#32021: Added AI Scoring to permissions
hasanpour Feb 28, 2026
5d02ba9
AB#32008 Simplify text extraction async flow and stale comments
jacobwillsmith Mar 2, 2026
dcd023b
Created the handler.
hasanpour Mar 3, 2026
e943f05
Read-Only Enforcement
hasanpour Mar 3, 2026
7c3c06d
feature/AB#31620-SentToFSB
JamesPasta Mar 3, 2026
1c91856
AB#31822 - Enable DataTables fixed headers and scrollable bodies
plavoie-BC Mar 4, 2026
a5187c8
AB#31822 - Update NPM dependencies and lockfile for latest patches
plavoie-BC Mar 4, 2026
a7f9f96
Merge remote-tracking branch 'origin/dev' into feature/AB#31822-datat…
plavoie-BC Mar 4, 2026
cab3f32
AB#31822 - Fix parameter name typo
plavoie-BC Mar 4, 2026
d57080f
AB#31822 - Fix paramater naming for Scroll Y calculation
plavoie-BC Mar 4, 2026
d8d4877
AB#31871: Feature Flag Filtering
hasanpour Mar 4, 2026
5c94603
AB#31822 - Add fixed header and footer to Grant Applicants page
plavoie-BC Mar 4, 2026
b4e3da5
AB#31822 - Add plugin to support scroll resize on table layout events
plavoie-BC Mar 4, 2026
d6f3976
AB#31822 - Refactor ScrollResize, improve DataTable layout & sizing
plavoie-BC Mar 4, 2026
9c2bc50
Merge remote-tracking branch 'origin/dev' into feature/AB#31822-datat…
plavoie-BC Mar 4, 2026
9b85676
feature/AB#31620-SentToFSB
JamesPasta Mar 4, 2026
aed4e2f
Merge pull request #2081 from bcgov/feature/AB#31620-SentToFSB-Lookup…
JamesPasta Mar 4, 2026
5202764
AB#31822 - Add DataTable code quality fixes
plavoie-BC Mar 4, 2026
6090196
AB#31822 - Remove UTF character
plavoie-BC Mar 4, 2026
e3e5e98
Merge remote-tracking branch 'origin/dev' into feature/AB#31822-datat…
plavoie-BC Mar 4, 2026
e15ffd1
AB#31822 - Include first and last pagination in footer
plavoie-BC Mar 4, 2026
740cb11
AB#31822 - Update DataTable pageLength options to include 'All'
plavoie-BC Mar 4, 2026
b16d19d
AB#32008 Optimize Office text extraction memory usage and limits
jacobwillsmith Mar 4, 2026
e1c0d7d
AB#31822 - DataTable code quality fixes
plavoie-BC Mar 4, 2026
f683528
Merge pull request #2048 from bcgov/feature/AB#32008-AddOfficeExtract…
jacobwillsmith Mar 4, 2026
42aee7c
Merge branch 'dev' into feature/AB#31822-datatable-fixed-scroll
plavoie-BC Mar 4, 2026
88d5f91
AB#32007 Apply bounded append memory optimization to PDF text extraction
jacobwillsmith Mar 4, 2026
70711dd
Sorting: AI assessment always first in list
hasanpour Mar 4, 2026
8875795
AB#27126: Create Edit Red-Stop Permission
aurelio-aot Mar 4, 2026
4ff3866
AB#32008 Reduce Office extraction Sonar complexity
jacobwillsmith Mar 4, 2026
96097ac
AB#32008 Apply Office extraction Sonar cleanup
jacobwillsmith Mar 4, 2026
ddd103f
Merge pull request #2083 from bcgov/feature/AB#31822-datatable-fixed-…
JamesPasta Mar 4, 2026
a9985fc
AB#27126: Fix sonarqube issues
aurelio-aot Mar 5, 2026
de7571d
Move the jquery maskMoney to a deferred load on the page for CreatePa…
DavidBrightBcGov Mar 5, 2026
67f77e4
Added: Clone AI Assesment
hasanpour Mar 5, 2026
ee5404b
Merge pull request #2093 from bcgov/bugfix/AB#32123-payment-request-m…
DavidBrightBcGov Mar 5, 2026
a103968
Added unit tests.
hasanpour Mar 5, 2026
384c547
Marked AI assessment as complete.
hasanpour Mar 5, 2026
350a9b1
Fixed merge conflicts.
hasanpour Mar 5, 2026
beb873d
Merge pull request #2089 from bcgov/feature/AB#27126-Red-Stop-Permiss…
JamesPasta Mar 5, 2026
632eb7b
Merge pull request #2094 from bcgov/feature/AB#31681-Scoring-Assistant
JamesPasta Mar 6, 2026
7ec9247
Merge pull request #2088 from bcgov/feature/AB#32008-AddOfficeExtract…
JamesPasta Mar 6, 2026
c2a1eda
Merge pull request #2086 from bcgov/feature/AB#32007-AddPdfExtraction…
JamesPasta Mar 6, 2026
975c8b0
AB#32012 Refactor AI flow orchestration and rename summary handler
jacobwillsmith Feb 21, 2026
4cac71f
AB#32012 Align orchestration flow and prompt contracts
jacobwillsmith Mar 6, 2026
567cfcb
AB#32012 Harden attachment AI flow and sanitize attachment summary re…
jacobwillsmith Feb 21, 2026
0e74fe6
AB#32012 Align AI analysis UI flow with title/detail summaries and ai…
jacobwillsmith Feb 21, 2026
20d4248
AB#32012 Normalize AI analysis parsing and confidence handling
jacobwillsmith Mar 6, 2026
e875c64
AB#32012 Align analysis/attachment prompt contracts with DTO shape
jacobwillsmith Mar 6, 2026
c55a81a
AB#32012 Prioritize extracted content over separators at text limits
jacobwillsmith Mar 6, 2026
529ed31
AB#32012 Apply final AI maintainability and consistency cleanups
jacobwillsmith Mar 6, 2026
4b4f506
AB#32012 Apply remaining AI Sonar cleanups
jacobwillsmith Mar 6, 2026
bfbf293
AB#32217-update-school-info-json
DarylTodosichuk Mar 6, 2026
b4b103b
Merge pull request #2099 from bcgov/feature/AB#32217-update-school-in…
DarylTodosichuk Mar 6, 2026
7e631c2
AB#32012 Apply Where filters for DOCX extraction loops
jacobwillsmith Mar 6, 2026
0c807f1
AB#32012 Reorder DOCX/PDF LINQ filters for Sonar loop rule
jacobwillsmith Mar 6, 2026
0807ea7
AB#32012 Refactor extraction loops to prefiltered sequences for Sonar
jacobwillsmith Mar 6, 2026
3a6f9fe
AB#32195
DavidBrightBcGov Mar 6, 2026
e96ace6
AB#31822 - Fix pagination defaults
plavoie-BC Mar 6, 2026
8858ae9
Merge pull request #2101 from bcgov/bugfix/AB#31822-fix-pagination-de…
JamesPasta Mar 6, 2026
6fe3a86
AB#32012 Reorder text extraction projections for Sonar consistency
jacobwillsmith Mar 6, 2026
c75440f
AB#32195
DavidBrightBcGov Mar 6, 2026
2ceb161
AB#31165 - Refactor CHES email object construction and field handling
plavoie-BC Mar 6, 2026
f488c8f
Merge pull request #2102 from bcgov/bugfix/AB#32195-quick-date-range-…
JamesPasta Mar 6, 2026
3edb94d
AB#31165 - Clarify excludeTemplate naming
plavoie-BC Mar 6, 2026
83689db
AB#32012 Address Copilot findings for AI orchestration and analysis s…
jacobwillsmith Mar 6, 2026
e6c591d
AB#32012 Fix JsonException and JsonArray compile issues
jacobwillsmith Mar 6, 2026
6dd9416
Merge pull request #2098 from bcgov/feature/AB#32012-RefactorAIFlowOr…
jacobwillsmith Mar 6, 2026
632b3b4
Merge branch 'dev' into bugfix/AB#31165-notifications-drop-cc-bcc
plavoie-BC Mar 6, 2026
2c3c676
Merge pull request #2103 from bcgov/bugfix/AB#31165-notifications-dro…
JamesPasta Mar 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion applications/Unity.GrantManager/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ AuthServer__Realm="standard" #"unity-local"
AuthServer__RequireHttpsMetadata="false"
AuthServer__Audience="unity-4899" #"unity-web"
AuthServer__ClientId="unity-4899" #"unity-web"
AuthServer__ClientSecret="="********""
AuthServer__ClientSecret="********"
AuthServer__IsBehindTlsTerminationProxy="false"
AuthServer__SpecifyOidcParameters="true"
AuthServer__OidcSignin="http://localhost:44342/signin-oidc"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,3 @@
#IdentityRolesWrapper {
background-color: transparent;
}

#IdentityRolesWrapper .dt-scroll-body {
max-height: calc(100vh - 370px);
overflow-y: scroll;
}
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,8 @@ $(function () {
dataTableName: 'IdentityRolesTable',
dynamicButtonContainerId: 'dynamicButtonContainerId',
useNullPlaceholder: true,
externalSearchId: 'search-roles'
externalSearchId: 'search-roles',
fixedHeaders: true
});

_createModal.onResult(function () {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,3 @@
#UsersWrapper {
background-color: transparent;
}

#UsersWrapper .dt-scroll-body {
max-height: calc(100vh - 370px);
overflow-y: scroll;
}
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,8 @@ $(function () {
dataTableName: 'UsersTable',
dynamicButtonContainerId: 'dynamicButtonContainerId',
useNullPlaceholder: true,
externalSearchId: 'search-users'
externalSearchId: 'search-users',
fixedHeaders: true
});

_editModal.onResult(function () {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,9 @@ public async Task<HttpResponseMessage> SendEmailAsync(string emailTo, string bod
}

// Send the email using the CHES client service
var emailObject = await GetEmailObjectAsync(emailTo, body, subject, emailFrom, emailBodyType, emailTemplateName, emailCC, emailBCC);
var emailObject = await GetEmailObjectAsync(
emailTo, body, subject, emailFrom, emailBodyType, emailTemplateName, emailCC, emailBCC, excludeTemplate: true);

var response = await chesClientService.SendAsync(emailObject);

// Assuming SendAsync returns a HttpResponseMessage or equivalent:
Expand Down Expand Up @@ -222,7 +224,8 @@ public async Task<dynamic> BuildEmailObjectWithAttachmentsAsync(EmailLog emailLo
emailLog.BodyType,
emailLog.TemplateName,
emailLog.CC,
emailLog.BCC);
emailLog.BCC,
excludeTemplate: true);

// Retrieve attachments from S3
var attachments = await emailAttachmentService.GetAttachmentsAsync(emailLog.Id);
Expand Down Expand Up @@ -261,7 +264,8 @@ protected virtual async Task<dynamic> GetEmailObjectAsync(
string? emailBodyType,
string? emailTemplateName,
string? emailCC = null,
string? emailBCC = null)
string? emailBCC = null,
bool excludeTemplate = false)
{
var toList = emailTo.ParseEmailList() ?? [];
var ccList = emailCC.ParseEmailList();
Expand All @@ -274,28 +278,47 @@ protected virtual async Task<dynamic> GetEmailObjectAsync(

emailObjectDictionary["body"] = body;
emailObjectDictionary["bodyType"] = emailBodyType ?? "text";
emailObjectDictionary["cc"] = ccList;
emailObjectDictionary["bcc"] = bccList;
emailObjectDictionary["encoding"] = "utf-8";
emailObjectDictionary["from"] = emailFrom ?? defaultFromAddress ?? "NoReply@gov.bc.ca";
emailObjectDictionary["priority"] = "normal";
emailObjectDictionary["subject"] = subject;
emailObjectDictionary["tag"] = "tag";
emailObjectDictionary["to"] = toList;
emailObjectDictionary["templateName"] = emailTemplateName;

// Only include cc/bcc when provided CHES API expects arrays, not null.
if (ccList != null)
{
emailObjectDictionary["cc"] = ccList;
}
if (bccList != null)
{
emailObjectDictionary["bcc"] = bccList;
}

// templateName is not part of the CHES MessageObject schema
// store it on the EmailLog but don't send it to the API.
if (!excludeTemplate)
{
emailObjectDictionary["templateName"] = emailTemplateName;
}

return emailObject;
}

protected virtual EmailLog UpdateMappedEmailLog(EmailLog emailLog, dynamic emailDynamicObject)
{
var dict = (IDictionary<string, object?>)emailDynamicObject;
emailLog.Body = emailDynamicObject.body;
emailLog.Subject = emailDynamicObject.subject;
emailLog.BodyType = emailDynamicObject.bodyType;
emailLog.FromAddress = emailDynamicObject.from;
emailLog.ToAddress = string.Join(",", emailDynamicObject.to);
emailLog.CC = emailDynamicObject.cc != null ? string.Join(",", (IEnumerable<string>)emailDynamicObject.cc) : string.Empty;
emailLog.BCC = emailDynamicObject.bcc != null ? string.Join(",", (IEnumerable<string>)emailDynamicObject.bcc) : string.Empty;
emailLog.CC = dict.TryGetValue("cc", out var cc) && cc is IEnumerable<string> ccList
? string.Join(",", ccList)
: string.Empty;
emailLog.BCC = dict.TryGetValue("bcc", out var bcc) && bcc is IEnumerable<string> bccList
? string.Join(",", bccList)
: string.Empty;
emailLog.TemplateName = emailDynamicObject.templateName;
return emailLog;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ public static class CasPaymentRequestStatus
{
// Unity Status
public const string SentToCas = "SentToCas";
public const string SentToAccountsPayable = "SentToAccountsPayable";

// CAS INVOICE STATUS
public const string ErrorFromCas = "Error";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Unity.Payments.Domain.Shared;
using Unity.Payments.Domain.Workflow;
using Unity.Payments.Enums;
using Unity.Payments.Codes;
using Unity.Payments.PaymentRequests;
using Unity.Payments.Permissions;
using Volo.Abp.Authorization.Permissions;
Expand Down Expand Up @@ -150,6 +151,7 @@ public async Task<PaymentRequest> TriggerAction(Guid paymentRequestsId, PaymentA
if (preventPayment)
{
statusChangedTo = PaymentRequestStatus.FSB;
paymentRequest.SetInvoiceStatus(CasPaymentRequestStatus.SentToAccountsPayable);
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ public PaymentRequestRepository(IDbContextProvider<PaymentsDbContext> dbContextP
{
ReCheckStatusList.Add(CasPaymentRequestStatus.ServiceUnavailable);
ReCheckStatusList.Add(CasPaymentRequestStatus.SentToCas);
ReCheckStatusList.Add(CasPaymentRequestStatus.NotFound);
ReCheckStatusList.Add(CasPaymentRequestStatus.SentToAccountsPayable);
ReCheckStatusList.Add(CasPaymentRequestStatus.NeverValidated);

FailedStatusList.Add(CasPaymentRequestStatus.ServiceUnavailable);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
using System.Threading.Tasks;
using Unity.Payments.Domain.PaymentRequests;
using System;
using System.Linq;
using Volo.Abp.Application.Services;
using System.Collections.Generic;
using Volo.Abp.TenantManagement;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Uow;
using Microsoft.Extensions.Logging;
using Unity.Payments.Integrations.Cas;
using System.Linq;
using Unity.Payments.Codes;
using Unity.Payments.RabbitMQ.QueueMessages;
using Unity.Notifications.Integrations.RabbitMQ;

Expand Down Expand Up @@ -138,6 +139,11 @@ public async Task AddPaymentRequestsToReconciliationQueue()
paymentReqeust = await _paymentRequestsRepository.GetAsync(PaymentRequestId);
if (paymentReqeust != null)
{
if(paymentReqeust.InvoiceStatus == CasPaymentRequestStatus.NotFound && result.InvoiceStatus == CasPaymentRequestStatus.NotFound)
{
result.InvoiceStatus = CasPaymentRequestStatus.NotFound+"2";
}

paymentReqeust.SetInvoiceStatus(result.InvoiceStatus ?? "");
paymentReqeust.SetPaymentStatus(result.PaymentStatus ?? "");
paymentReqeust.SetPaymentDate(result.PaymentDate ?? "");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@
</abp-column>
</abp-row>
@if (canOverride)
{
{
<abp-row class="m-0 p-1">
<abp-column size="_8">
<label for="AccountCodingSelect" class="form-label unt-form-label-primary">@L["ApplicationPaymentRequest:AccountCodingOverride"]</label>
Expand Down Expand Up @@ -182,10 +182,13 @@
<abp-input asp-for="@Model.ApplicationPaymentRequestForm[i].InvoiceNumber" disabled="@item.DisableFields"/>
</abp-column>
<abp-column size="_2" class="px-1">
<abp-input asp-for="@Model.ApplicationPaymentRequestForm[i].Amount"
class="amount unity-currency-input"
<div class="unity-input-group">
<span class="unity-input-prepend">$</span>
<abp-input asp-for="@Model.ApplicationPaymentRequestForm[i].Amount"
class="unity-currency-input amount"
disabled="@item.DisableFields"
onchange='checkMaxValueRequest("@item.CorrelationId",this, @item.RemainingAmount)' />
</div>
</abp-column>
<abp-column size="_4" class="px-1">
<abp-input asp-for="@Model.ApplicationPaymentRequestForm[i].SiteName" alt="@item.SiteName" disabled="true"/>
Expand Down Expand Up @@ -256,3 +259,20 @@
</abp-modal>
</form>

<script defer>
(function () {
if (window.jQuery) {
$('.unity-currency-input').maskMoney();

// Format existing values from server fields
$('.unity-currency-input').each(function () {
let $currencyField = $(this);
let fieldVal = $currencyField.val();
if (fieldVal) {
$currencyField.maskMoney('mask', fieldVal);
}
});
}
})();
</script>

Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,6 @@ function validateParentChildAmounts(correlationId) {
}

$(function () {
$('.unity-currency-input').maskMoney();
// Validate payment amounts on initial page load
validateAllPaymentAmounts();
});
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,8 @@ $(function () {
languageSetValues: {},
dataTableName: 'PaymentRequestListTable',
dynamicButtonContainerId: 'dynamicButtonContainerId',
useNullPlaceholder: true
useNullPlaceholder: true,
fixedHeaders: true
});

// Attach the draw event to add custom row coloring logic
Expand All @@ -186,10 +187,16 @@ $(function () {

payment_approve_buttons.disable();
payment_check_status_buttons.disable();
history_button.disable();
dataTable.on('search.dt', () => handleSearch());

function checkAllRowsHaveState(state) {
return dataTable.rows('.selected').data().toArray().every(row => row.status === state);
function checkAllRowsHaveState(states) {
const allowedStates = Array.isArray(states) ? states : [states];
return dataTable
.rows('.selected')
.data()
.toArray()
.every(row => allowedStates.includes(row.status));
}

$('#PaymentRequestListTable').on('click', 'tr td', function (e) {
Expand Down Expand Up @@ -256,13 +263,13 @@ $(function () {
}

function checkActionButtons() {
let isOnlySubmittedToCas = checkAllRowsHaveState('Submitted');
if (isOnlySubmittedToCas) {
let isInSentState = checkAllRowsHaveState(['Submitted', 'FSB']);
if (isInSentState) {
payment_check_status_buttons.enable();
} else {
payment_check_status_buttons.disable();
}
if (dataTable.rows({ selected: true }).indexes().length > 0 && !isOnlySubmittedToCas) {
if (dataTable.rows({ selected: true }).indexes().length > 0 && !isInSentState) {
if (abp.auth.isGranted('PaymentsPermissions.Payments.L1ApproveOrDecline')
|| abp.auth.isGranted('PaymentsPermissions.Payments.L2ApproveOrDecline')
|| abp.auth.isGranted('PaymentsPermissions.Payments.L3ApproveOrDecline')) {
Expand All @@ -272,15 +279,11 @@ $(function () {
payment_approve_buttons.disable();
}

if (dataTable.rows({ selected: true }).indexes().length == 1) {
history_button.enable();
} else {
history_button.disable();
}
checkEnableHistoryButton(dataTable, history_button);
}
else {
payment_approve_buttons.disable();
history_button.enable();
checkEnableHistoryButton(dataTable, history_button);
}
}

Expand Down Expand Up @@ -792,6 +795,14 @@ let casPaymentResponseModal = new abp.ModalManager({
viewUrl: '../PaymentRequests/CasPaymentRequestResponse'
});

function checkEnableHistoryButton(dataTable, history_button) {
if (dataTable.rows({ selected: true }).indexes().length == 1) {
history_button.enable();
} else {
history_button.disable();
}
}

function openCasResponseModal(casResponse) {
casPaymentResponseModal.open({
casResponse: casResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@
dataTableName: 'ApplicationPaymentRequestListTable',
externalSearchId: 'PaymentListSearch',
dynamicButtonContainerId: 'dynamicButtonContainerId',
lengthMenu: [10, 25, 50, -1]
});

dataTable.on('search.dt', () => handleSearch());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@
dataTableName: 'EndpointsTable',
dynamicButtonContainerId: 'dynamicButtonContainerId',
useNullPlaceholder: true,
externalSearchId: 'search-endpoints'
externalSearchId: 'search-endpoints',
fixedHeaders: true
});

createModal.onResult(function () {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public override void ConfigureBundle(BundleConfigurationContext context)
context.Files.AddIfNotContains("/themes/ux2/zone-extensions.js");
context.Files.Add("/themes/ux2/layout.js");
context.Files.Add("/themes/ux2/plugins/filterRow.js");
context.Files.Add("/themes/ux2/plugins/scrollResize.js");
context.Files.Add("/themes/ux2/plugins/colvisAlpha.js");
context.Files.Add("/themes/ux2/table-utils.js");
context.Files.Add("/js/DateUtils.js");
Expand Down
Loading
Loading