Skip to content
Merged

Dev #1498

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
c524c5d
AB#27018 - Add Payment Info Permission Definitions and Controls
plavoie-BC Jul 8, 2025
8c08bde
AB#27018 - Remove Payments.EditSupplierInfo
plavoie-BC Jul 9, 2025
dbf71fa
AB#27018 - Add Payment Info Control Restrictions
plavoie-BC Jul 9, 2025
406b7e3
AB#27018 - Payment Info - SonarQube Cleanup
plavoie-BC Jul 9, 2025
5639661
AB#27018 - Update PaymentsPermissionDefinitionProvider.cs
plavoie-BC Jul 9, 2025
086311d
AB#27018 - Payment Info - Additional SonarQube Cleanup
plavoie-BC Jul 9, 2025
7daf96a
Merge branch 'dev' into feature/AB#27018-payment-info-permissions
plavoie-BC Jul 9, 2025
ec38160
Merge pull request #1482 from bcgov/feature/AB#27018-payment-info-per…
JamesPasta Jul 10, 2025
03ee31f
bugfix/AB#29441 Fix Total Paid Amount column
samsaravillo Jul 10, 2025
324edd5
feature/AB#29314 Summary fields in Payment Request
samsaravillo Jul 11, 2025
0e4bb9b
Merge pull request #1491 from bcgov/bugfix/AB#29441-Fix-total-paid-ap…
JamesPasta Jul 11, 2025
0d815a5
feature/ab#29314 sonarQube Fix
samsaravillo Jul 11, 2025
c62b90c
feature/AB#29314 Improve layout of payment request header row
samsaravillo Jul 11, 2025
0921a61
feature/AB#29339 - This is the 3rd change requested by REDIP to the l…
Stephan-McColm Jul 11, 2025
261ebe7
Merge pull request #1493 from bcgov/feature/AB#29339-update-detailed-…
DarylTodosichuk Jul 11, 2025
1cf73f0
Feature/AB#29529 Added quotes to missing submissions email and prod e…
cyrusparsons Jul 11, 2025
4e09c45
Merge branch 'dev' into feature/AB#29529-Add-Quotes-And-Disable-Missi…
cyrusparsons Jul 11, 2025
f75f30e
29519:Bug - Cannot Create a new Tag from the Applications List or fro…
don-aot Jul 14, 2025
011ae45
29522:The tags displayed on the applications list for a submission a…
don-aot Jul 14, 2025
cd71c6f
bugfix/AB#29536-Fix-applicant-name-label
samsaravillo Jul 14, 2025
56f19a2
Merge pull request #1492 from bcgov/feature/AB#29314-payment-request-…
JamesPasta Jul 15, 2025
854d904
Merge pull request #1494 from bcgov/feature/AB#29529-Add-Quotes-And-D…
JamesPasta Jul 15, 2025
55cce9c
Merge pull request #1495 from bcgov/bugfix/AB#29519-Cannot-Create-a-n…
JamesPasta Jul 15, 2025
dd11c78
Merge pull request #1497 from bcgov/bugfix/AB#29536-Applicant-name-typo
JamesPasta Jul 15, 2025
dec65b9
Merge pull request #1496 from bcgov/bugfix/AB#29522--The-tags-display…
JamesPasta Jul 15, 2025
650c153
29520:Bug - Cannot add an existing tag to a submission - "Please sele…
don-aot Jul 15, 2025
57603c5
bugfix/AB#29522-Fix unit test in application tag
samsaravillo Jul 15, 2025
df2d600
Merge branch 'dev' into bugfix/AB#29520-Cannot-add-an-existing-tag-to…
don-aot Jul 15, 2025
a2a6f29
Merge pull request #1503 from bcgov/bugfix/AB#29522-Application-tag
JamesPasta Jul 15, 2025
8ca588f
Merge branch 'dev' into bugfix/AB#29520-Cannot-add-an-existing-tag-to…
don-aot Jul 15, 2025
5e37af3
Merge pull request #1499 from bcgov/bugfix/AB#29520-Cannot-add-an-exi…
JamesPasta Jul 15, 2025
b4a7328
Bug fix
don-aot Jul 15, 2025
12535d1
Merge branch 'dev' into bugfix/AB#29520-Cannot-add-an-existing-tag-to…
don-aot Jul 15, 2025
303b8b5
Merge pull request #1504 from bcgov/bugfix/AB#29520-Cannot-add-an-exi…
JamesPasta Jul 15, 2025
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
Original file line number Diff line number Diff line change
@@ -1,26 +1,57 @@
using Unity.Payments.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;

namespace Unity.Payments.Permissions;

public class PaymentsPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var grantApplicationPermissionsGroup = context.AddGroup(PaymentsPermissions.GroupName, L("Permission:Payments"));

// Payment Requests
var paymentsPermissions = grantApplicationPermissionsGroup.AddPermission(PaymentsPermissions.Payments.Default, L("Permission:Payments.Default"));
paymentsPermissions.AddChild(PaymentsPermissions.Payments.L1ApproveOrDecline, L("Permission:Payments.L1ApproveOrDecline"));
paymentsPermissions.AddChild(PaymentsPermissions.Payments.L2ApproveOrDecline, L("Permission:Payments.L2ApproveOrDecline"));
paymentsPermissions.AddChild(PaymentsPermissions.Payments.L3ApproveOrDecline, L("Permission:Payments.L3ApproveOrDecline"));
paymentsPermissions.AddChild(PaymentsPermissions.Payments.RequestPayment, L("Permission:Payments.RequestPayment"));
paymentsPermissions.AddChild(PaymentsPermissions.Payments.EditSupplierInfo, L("Permission:Payments.EditSupplierInfo"));
}

private static LocalizableString L(string name)
{
return LocalizableString.Create<PaymentsResource>(name);
}
}
using Unity.Modules.Shared;
using Unity.Payments.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Features;
using Volo.Abp.Localization;

namespace Unity.Payments.Permissions;

public class PaymentsPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var grantApplicationPermissionsGroup = context.AddGroup(PaymentsPermissions.GroupName, L("Permission:Payments"));

// Payment Requests
var paymentsPermissions = grantApplicationPermissionsGroup.AddPermission(PaymentsPermissions.Payments.Default, L("Permission:Payments.Default"));
paymentsPermissions.AddChild(PaymentsPermissions.Payments.L1ApproveOrDecline, L("Permission:Payments.L1ApproveOrDecline"));
paymentsPermissions.AddChild(PaymentsPermissions.Payments.L2ApproveOrDecline, L("Permission:Payments.L2ApproveOrDecline"));
paymentsPermissions.AddChild(PaymentsPermissions.Payments.L3ApproveOrDecline, L("Permission:Payments.L3ApproveOrDecline"));
paymentsPermissions.AddChild(PaymentsPermissions.Payments.RequestPayment, L("Permission:Payments.RequestPayment"));

//-- PAYMENT INFO PERMISSIONS
grantApplicationPermissionsGroup.Add_PaymentInfo_Permissions();
}

private static LocalizableString L(string name)
{
return LocalizableString.Create<PaymentsResource>(name);
}
}

[System.Diagnostics.CodeAnalysis.SuppressMessage("Minor Code Smell", "S1481:Unused local variables should be removed", Justification = "Configuration Code")]
public static class PaymentPermissionGroupDefinitionExtensions
{
public static void Add_PaymentInfo_Permissions(this PermissionGroupDefinition grantApplicationPermissionsGroup)
{
#region PAYMENT INFO GRANULAR PERMISSIONS
var upx_Payment = grantApplicationPermissionsGroup
.AddPermission(UnitySelector.Payment.Default, LocalizableString.Create<PaymentsResource>(UnitySelector.Payment.Default))
.RequireFeatures("Unity.Payments");

var upx_Payment_Summary = upx_Payment.AddPaymentChild(UnitySelector.Payment.Summary.Default);

var upx_Payment_Supplier = upx_Payment.AddPaymentChild(UnitySelector.Payment.Supplier.Default);
var upx_Payment_Supplier_Update = upx_Payment_Supplier.AddPaymentChild(UnitySelector.Payment.Supplier.Update);

var upx_PaymentList_Authority = upx_Payment.AddPaymentChild(UnitySelector.Payment.PaymentList.Default);
#endregion
}



public static PermissionDefinition AddPaymentChild(this PermissionDefinition parent, string name)
{
return parent.AddChild(name, LocalizableString.Create<PaymentsResource>(name)).RequireFeatures("Unity.Payments");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@
"Permission:Payments.L2ApproveOrDecline": "Approve/Decline L2 Payments",
"Permission:Payments.L3ApproveOrDecline": "Approve/Decline L3 Payments",
"Permission:Payments.RequestPayment": "Request Payment",
"Permission:Payments.EditSupplierInfo": "Update Supplier Info",

"Enum:PaymentRequestStatus.L1Pending": "L1 Pending",
"Enum:PaymentRequestStatus.L1Approved": "L1 Approved",
Expand All @@ -132,6 +131,12 @@
"Enum:PaymentRequestStatus.NotValidated": "Not Validated",
"Enum:PaymentRequestStatus.Paid": "Paid",
"Enum:PaymentRequestStatus.Failed": "Payment Failed",
"Enum:PaymentRequestStatus.PaymentFailed": "Payment Failed"
"Enum:PaymentRequestStatus.PaymentFailed": "Payment Failed",

"Unity.GrantManager.ApplicationManagement.Payment": "Payment Info",
"Unity.GrantManager.ApplicationManagement.Payment.Summary": "Payment Summary",
"Unity.GrantManager.ApplicationManagement.Payment.Supplier": "Supplier Info",
"Unity.GrantManager.ApplicationManagement.Payment.Supplier.Update": "Edit Supplier Info",
"Unity.GrantManager.ApplicationManagement.Payment.PaymentList": "Payment List"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,17 @@
<abp-card class="pb-0">
<abp-card-body class="pb-0 mb-0">
<abp-row class="m-0 p-1">
<abp-column size="_4">
<abp-input asp-for="@Model.BatchNumberDisplay" type="text" label="@L["ApplicationPaymentRequest:BatchNumberName"]" disabled="true" />
<abp-column size="_4" >
<label for="@Model.BatchNumberDisplay" class="form-label unt-form-label-primary">@L["ApplicationPaymentRequest:BatchNumberName"]</label>
<input type="text" class="form-control" value="@Model.BatchNumberDisplay" disabled />
</abp-column>
<abp-column size="_4">
<abp-input id="ApplicationCount" type="text" asp-for="ApplicationPaymentRequestForm.Count" label="@L["ApplicationPaymentRequest:NumberPayment"]" disabled="true" />
<label for="@Model.ApplicationPaymentRequestForm?.Count" class="form-label unt-form-label-primary">@L["ApplicationPaymentRequest:NumberPayment"]</label>
<input type="text" class="form-control" id="ApplicationCount" value="@Model.ApplicationPaymentRequestForm?.Count" disabled />
</abp-column>
<abp-column size="_4">
<abp-input asp-for="@Model.TotalAmount" class="totalAmount unity-currency-input" type="text" label="@L["ApplicationPaymentRequest:TotalAmount"]" disabled="true" />
<label for="@Model.TotalAmount" class="form-label unt-form-label-primary">@L["ApplicationPaymentRequest:TotalAmount"]</label>
<input type="text" class="form-control totalAmount unity-currency-input" id="ApplicationCount" value="@Model.TotalAmount" disabled />
</abp-column>
</abp-row>
</abp-card-body>
Expand All @@ -34,10 +37,19 @@
<abp-input id="PaymentThreshold" type="hidden" asp-for="PaymentThreshold" />
@for (var i = 0; i < Model.ApplicationPaymentRequestForm?.Count; i++)
{
<div id="@($"{Model.ApplicationPaymentRequestForm[i].CorrelationId}_container")" class="single-payment">
<div id="@($"{Model.ApplicationPaymentRequestForm[i].CorrelationId}_container")" class="single-payment payment-item">
<abp-row class="m-0 p-2">
<abp-column size="_11" class="px-1"><h6 class="single-payment-card-application-name">@Model.ApplicationPaymentRequestForm[i].ApplicantName/@Model.ApplicationPaymentRequestForm[i].InvoiceNumber</h6></abp-column>
<abp-column size="_1" class="px-1 remove-single-payment"> <abp-button onclick='removeApplicationPaymentRequest("@Model.ApplicationPaymentRequestForm[i].CorrelationId" + "_container")' size="Small" icon-type="Other" class="m-0 p-0 remove-single-payment" icon="fa fa-times" data-parameter="@Model.ApplicationPaymentRequestForm[i].CorrelationId" /></abp-column>
<abp-column size="_12" class="d-flex justify-content-between align-items-center px-1">
<h6 class="single-payment-card-application-name fw-bold mb-0">
@Model.ApplicationPaymentRequestForm[i].ApplicantName/@Model.ApplicationPaymentRequestForm[i].InvoiceNumber
</h6>
<abp-button onclick='removeApplicationPaymentRequest("@Model.ApplicationPaymentRequestForm[i].CorrelationId" + "_container")'
size="Small"
icon-type="Other"
class="m-0 p-0 remove-single-payment"
icon="fa fa-times"
data-parameter="@Model.ApplicationPaymentRequestForm[i].CorrelationId" />
</abp-column>
</abp-row>

<input name="ApplicationPaymentRequestForm.Index" type="hidden" value="@i" />
Expand All @@ -49,16 +61,15 @@
<input type="hidden" asp-for="@Model.ApplicationPaymentRequestForm[i].SupplierNumber" />
<input type="hidden" asp-for="@Model.ApplicationPaymentRequestForm[i].RemainingAmount" />
<input type="hidden" asp-for="@Model.ApplicationPaymentRequestForm[i].SiteId" />

<abp-row class="m-0 p-3">
<abp-column size="_2" class="px-1">
<abp-input asp-for="@Model.ApplicationPaymentRequestForm[i].InvoiceNumber" disabled="@Model.ApplicationPaymentRequestForm[i].DisableFields"/>
</abp-column>
<abp-column size="_2" class="px-1">
<abp-input asp-for="@Model.ApplicationPaymentRequestForm[i].Amount"
class="amount unity-currency-input"
disabled="@Model.ApplicationPaymentRequestForm[i].DisableFields"
onchange='checkMaxValue("@Model.ApplicationPaymentRequestForm[i].CorrelationId",this, @Model.ApplicationPaymentRequestForm[i].RemainingAmount)' />
class="amount unity-currency-input"
disabled="@Model.ApplicationPaymentRequestForm[i].DisableFields"
onchange='checkMaxValueRequest("@Model.ApplicationPaymentRequestForm[i].CorrelationId",this, @Model.ApplicationPaymentRequestForm[i].RemainingAmount)' />
</abp-column>
<abp-column size="_4" class="px-1">
<abp-input asp-for="@Model.ApplicationPaymentRequestForm[i].SiteName" alt="@Model.ApplicationPaymentRequestForm[i].SiteName" disabled="true"/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@

function removeApplicationPaymentRequest(applicationId) {
let $container = $('#' + applicationId);

// Get the amount value inside this container before removing it
let amountValue = $container.find('.amount').val();
let amount = parseFloat((amountValue || "0").replace(/,/g, ''));

// Update the total amount
let $totalInput = $('.totalAmount');
let currentTotal = parseFloat(($totalInput.val() || "0").replace(/,/g, '')) || 0;
let newTotal = currentTotal - amount;
if (newTotal < 0) newTotal = 0;
$totalInput.val(newTotal.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }));
$container.remove();

$('#' + applicationId).remove();
let applicationCount = $('#ApplicationCount').val();
$('#ApplicationCount').val(applicationCount - 1);

if ((applicationCount - 1) == 1) {
$('.max-error').css("display", "none");
$('.payment-divider').css("display", "none");
Expand All @@ -27,20 +18,26 @@ function removeApplicationPaymentRequest(applicationId) {
else {
$('#no-payment-msg').css("display", "none");
}

// Always recalculate the total after removal
calculateTotalAmount();
}

function closePaymentModal() {
$('#payment-modal').modal('hide');
}

function checkMaxValue(applicationId, input, amountRemaining) {
function checkMaxValueRequest(applicationId, input, amountRemaining) {
let enteredValue = parseFloat(input.value.replace(/,/g, ""));
let remainingErrorId = "#column_" + applicationId + "_remaining_error";
if (amountRemaining < enteredValue) {
$(remainingErrorId).css("display", "block");
} else {
$(remainingErrorId).css("display", "none");
}

// Update the total amount after checking the value
calculateTotalAmount();
}

function submitPayments() {
Expand All @@ -56,4 +53,13 @@ function submitPayments() {
} else {
$('#paymentform').submit();
}
};
};

function calculateTotalAmount() {
let total = 0;
$('.amount').each(function () {
let value = parseFloat($(this).val().replace(/,/g, '')) || 0;
total += value;
});
$('.totalAmount').val(total.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }));
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ $(function () {
let defaultClass = 'tags-common';
let id, tagText, tagClass;

id = tagData.Id;
tagText = tagData.Name || '';
id = tagData.id;
tagText = tagData.name || '';
tagClass = tagData.class || defaultClass;


Expand Down Expand Up @@ -79,7 +79,7 @@ $(function () {
TagsInput.prototype.deleteTag = function (tag, i) {
let self = this;

if (this.arr[i].Name === 'Uncommon Tags') {
if (this.arr[i].name === 'Uncommon Tags') {
abp.message.confirm('Are you sure you want to delete all the uncommon tags?')
.then(function (confirmed) {
if (confirmed) {
Expand All @@ -106,7 +106,7 @@ $(function () {

if (
!this.options.duplicate &&
this.arr.some(tag => tag.Name === string)
this.arr.some(tag => tag.name === string)
) {
console.log('duplicate found "' + string + '"');
return true;
Expand All @@ -130,6 +130,7 @@ $(function () {
return this.arr.join(',');
}
TagsInput.prototype.setSuggestions = function (sugArray) {

suggestionsArray = sugArray;
}

Expand Down Expand Up @@ -164,7 +165,7 @@ $(function () {

if (inputValue.length > 1) {
const suggestions = suggestionsArray.filter(tag =>
(tag.Name.toLowerCase()).includes(inputValue));
(tag.name.toLowerCase()).includes(inputValue));


if (suggestions.length) {
Expand Down Expand Up @@ -197,7 +198,7 @@ $(function () {
suggestions.forEach(suggestion => {
const suggestionElement = document.createElement('div');
suggestionElement.className = 'tags-suggestion-element';
suggestionElement.innerText = typeof suggestion === 'string' ? suggestion : suggestion.Name;
suggestionElement.innerText = typeof suggestion === 'string' ? suggestion : suggestion.name;


suggestionElement.addEventListener('click', function () {
Expand Down Expand Up @@ -258,7 +259,7 @@ $(function () {

const matched = suggestionsArray.find(s =>

s.Name.toLowerCase() === str.toLowerCase()
s.name.toLowerCase() === str.toLowerCase()
);

if (matched) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@
<input type="hidden" id="SelectedTagsJson" name="SelectedTagsJson" />
<abp-input type="hidden" id="SelectedPaymentRequestIds" asp-for="@Model.SelectedPaymentRequestIds" />
<abp-input type="hidden" id="ActionType" asp-for="@Model.ActionType" />
<input type="hidden" id="CommonTags" name="CommonTags" value='@Html.Raw(JsonConvert.SerializeObject(Model.CommonTags))' />
<input type="hidden" id="UncommonTags" name="UncommonTags" value='@Html.Raw(JsonConvert.SerializeObject(Model.UncommonTags))' />
<input type="hidden" id="AllTags" name="AllTags" value='@Html.Raw(JsonConvert.SerializeObject(Model.AllTags))' />
<input type="hidden" id="Tags" name="Tags" value='@Html.Raw(JsonConvert.SerializeObject(Model.Tags))' />
<input type="hidden" id="TagsJson" name="TagsJson" value='@Html.Raw(JsonConvert.SerializeObject(Model.Tags))' />

Expand Down
Loading