Skip to content
Merged

Dev #2018

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
e9cfa4a
Initial Commit
Feb 12, 2026
4bdd1ce
resolving conflicts
Feb 13, 2026
d29ea3c
Merge pull request #2002 from bcgov/feature/AB#31906-POM-for-Applicat…
DarylTodosichuk Feb 14, 2026
79329bb
AB#28769 - Refactor ApplicationContactsWidget to support reload
plavoie-BC Feb 17, 2026
6525a74
Merge branch 'dev' into bugfix/AB#28769-contact-refresh
plavoie-BC Feb 17, 2026
c5f13e4
AB#28769 - Update ApplicationContactWidget unity tests
plavoie-BC Feb 17, 2026
5ba92e8
Merge branch 'bugfix/AB#28769-contact-refresh' of https://github.com/…
plavoie-BC Feb 17, 2026
295e5b4
AB#28769 - Add contact refresh code quality improvements
plavoie-BC Feb 17, 2026
b545c6c
AB#28769 - Update applications/Unity.GrantManager/src/Unity.GrantMana…
plavoie-BC Feb 17, 2026
82821c7
AB#28769 - Update applications/Unity.GrantManager/src/Unity.GrantMana…
plavoie-BC Feb 17, 2026
1d21a19
AB#28769 - Update applications/Unity.GrantManager/src/Unity.GrantMana…
plavoie-BC Feb 17, 2026
8882dc5
AB#31848: Compute Table Height Offset for Applicant Profile Details
aurelio-aot Feb 17, 2026
d2af527
AB#31896 - generic contacts service start, and applicant profile read
AndreGAot Feb 17, 2026
c8cca0d
AB#31284 - Allow copying of disabled input fields
plavoie-BC Feb 17, 2026
e79c86d
AB#31896 update role map on getcontacts profile
AndreGAot Feb 18, 2026
6bca7fe
AB#31896 update the lookup for profile contacts
AndreGAot Feb 18, 2026
0a82052
AB#31384 - Bugfix - Total Paid Amount - Update payment status checks …
plavoie-BC Feb 18, 2026
8878829
AB#31896 SonarQube cleanup
AndreGAot Feb 18, 2026
51d7ee5
AB#31413: Layout Adjustments on Applicant Profile - Applicant Info
aurelio-aot Feb 19, 2026
8a7d12f
Improve race condition handling in application links modal
DavidBrightBcGov Feb 19, 2026
9c2724d
Typo
DavidBrightBcGov Feb 19, 2026
98933c4
Making sonarqube happy
DavidBrightBcGov Feb 19, 2026
900a0d9
Fixing a logic condition of assigning the refreshed database data pos…
DavidBrightBcGov Feb 19, 2026
418eb85
Merge branch 'dev' into feature/AB#31896-applicant-profile-contacts
AndreGAot Feb 19, 2026
d9958f9
Merge pull request #2014 from bcgov/bugfix/AB#31894-link-type-race-co…
DavidBrightBcGov Feb 19, 2026
9332a66
AB#31896 - fix unit tests
AndreGAot Feb 19, 2026
8fd71f0
AB#31896 - codeQL suggestions and cleanup
AndreGAot Feb 19, 2026
d8a84fd
AB#31896 sonarQube cleanup
AndreGAot Feb 19, 2026
efa2706
AB#31896 remove unnecessary #pragma disables
AndreGAot Feb 19, 2026
86baf65
Merge pull request #2015 from bcgov/feature/AB#31896-applicant-profil…
AndreGAot Feb 19, 2026
48bac3b
Added the quick date range select drop down next to search with prede…
DavidBrightBcGov Feb 19, 2026
3a9799a
Fixed an option chaining flagged by Sonarqube
DavidBrightBcGov Feb 20, 2026
5a8f511
Merge pull request #2012 from bcgov/feature/AB#31413-ApplicantProfile…
JamesPasta Feb 20, 2026
441de45
Merge pull request #2011 from bcgov/bugfix/AB#31384-total-paid-amount
JamesPasta Feb 20, 2026
6b13f43
Merge pull request #2008 from bcgov/bugfix/AB#28769-contact-refresh
JamesPasta Feb 20, 2026
76cdd6f
Merge pull request #2009 from bcgov/bugfix/AB#31848-applicant-profile…
JamesPasta Feb 20, 2026
0116ca2
Merge pull request #2010 from bcgov/feature/AB#31284-copy-disabled-fi…
JamesPasta Feb 20, 2026
cbce9df
Merge pull request #2017 from bcgov/feature/AB#31737-enhanced-date-fi…
JamesPasta Feb 20, 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
878 changes: 246 additions & 632 deletions applications/Unity.AutoUI/cypress/e2e/ApplicationsActionBar.cy.ts

Large diffs are not rendered by default.

506 changes: 506 additions & 0 deletions applications/Unity.AutoUI/cypress/pages/ApplicationDetailsPage.ts

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Threading.Tasks;
using Unity.GrantManager.Applications;
using Unity.GrantManager.GrantApplications;
using Unity.Payments.Codes;
using Unity.Payments.Enums;
using Unity.Payments.PaymentRequests;
using Volo.Abp.AspNetCore.Mvc;
Expand Down Expand Up @@ -101,7 +102,7 @@ private static (decimal paidAmount, decimal pendingAmount) CalculatePaymentAmoun

var paidAmount = requestsList
.Where(e => !string.IsNullOrWhiteSpace(e.PaymentStatus)
&& e.PaymentStatus.Trim().Equals("Fully Paid", StringComparison.OrdinalIgnoreCase))
&& e.PaymentStatus.Trim().Equals(CasPaymentRequestStatus.FullyPaid, StringComparison.OrdinalIgnoreCase))
.Sum(e => e.Amount);

var pendingAmount = requestsList
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -518,20 +518,28 @@ input.form-control-currency {

input.form-control:disabled, textarea.form-control:disabled, .form-select:disabled, input.form-control-currency:disabled {
color: var(--bc-colors-grey-text-200);
pointer-events: none;
background-color: var(--bc-colors-grey-hover) !important;
opacity: var(--bs-btn-disabled-opacity);
background-blend-mode: difference;
border: var(--bs-border-width) solid var(--bs-border-color);

pointer-events: auto;
user-select: text;
-webkit-user-select: text;
cursor: text;
}

input.form-control-currency:disabled {
color: var(--bc-colors-grey-text-200);
pointer-events: none;
background-color: var(--bc-colors-grey-hover) !important;
opacity: var(--bs-btn-disabled-opacity);
background-blend-mode: difference;
border: var(--bs-border-width) solid var(--bs-border-color);

pointer-events: auto;
user-select: text;
-webkit-user-select: text;
cursor: text;
}

textarea.form-control:disabled {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using Unity.GrantManager.Applicants.ProfileData;
using Unity.GrantManager.ApplicantProfile.ProfileData;

namespace Unity.GrantManager.Applicants
namespace Unity.GrantManager.ApplicantProfile
{
public class ApplicantProfileDto
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System;

namespace Unity.GrantManager.Applicants
namespace Unity.GrantManager.ApplicantProfile
{
public class ApplicantProfileRequest
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Unity.GrantManager.Applicants;

namespace Unity.GrantManager.Applicants
namespace Unity.GrantManager.ApplicantProfile
{
public interface IApplicantProfileAppService
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Unity.GrantManager.ApplicantProfile.ProfileData;

namespace Unity.GrantManager.ApplicantProfile;

/// <summary>
/// Provides applicant-profile-specific contact retrieval operations.
/// This service aggregates contacts from two sources: profile-linked contacts
/// and application-level contacts matched by OIDC subject.
/// </summary>
public interface IApplicantProfileContactService
{
/// <summary>
/// Retrieves contacts linked to the specified applicant profile.
/// </summary>
/// <param name="profileId">The unique identifier of the applicant profile.</param>
/// <returns>A list of <see cref="ContactInfoItemDto"/> with <c>IsEditable</c> set to <c>true</c>.</returns>
Task<List<ContactInfoItemDto>> GetProfileContactsAsync(Guid profileId);

/// <summary>
/// Retrieves application contacts associated with submissions matching the given OIDC subject.
/// The subject is normalized by stripping the domain portion (after <c>@</c>) and converting to upper case.
/// </summary>
/// <param name="subject">The OIDC subject identifier (e.g. "user@idir").</param>
/// <returns>A list of <see cref="ContactInfoItemDto"/> with <c>IsEditable</c> set to <c>false</c>.</returns>
Task<List<ContactInfoItemDto>> GetApplicationContactsBySubjectAsync(string subject);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System.Threading.Tasks;
using Unity.GrantManager.Applicants.ProfileData;
using Unity.GrantManager.ApplicantProfile.ProfileData;

namespace Unity.GrantManager.Applicants.ApplicantProfile
namespace Unity.GrantManager.ApplicantProfile
{
/// <summary>
/// Defines a contract for components that can provide applicant profile data
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Unity.GrantManager.Applicants.ProfileData
namespace Unity.GrantManager.ApplicantProfile.ProfileData
{
public class ApplicantAddressInfoDto : ApplicantProfileDataDto
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Collections.Generic;

namespace Unity.GrantManager.ApplicantProfile.ProfileData
{
public class ApplicantContactInfoDto : ApplicantProfileDataDto
{
public override string DataType => "CONTACTINFO";

public List<ContactInfoItemDto> Contacts { get; set; } = [];
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Unity.GrantManager.Applicants.ProfileData
namespace Unity.GrantManager.ApplicantProfile.ProfileData
{
public class ApplicantOrgInfoDto : ApplicantProfileDataDto
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Unity.GrantManager.Applicants.ProfileData
namespace Unity.GrantManager.ApplicantProfile.ProfileData
{
public class ApplicantPaymentInfoDto : ApplicantProfileDataDto
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;

namespace Unity.GrantManager.ApplicantProfile.ProfileData
{
[JsonPolymorphic(TypeDiscriminatorPropertyName = "dataType")]
[JsonDerivedType(typeof(ApplicantContactInfoDto), "CONTACTINFO")]
[JsonDerivedType(typeof(ApplicantOrgInfoDto), "ORGINFO")]
[JsonDerivedType(typeof(ApplicantAddressInfoDto), "ADDRESSINFO")]
[JsonDerivedType(typeof(ApplicantSubmissionInfoDto), "SUBMISSIONINFO")]
[JsonDerivedType(typeof(ApplicantPaymentInfoDto), "PAYMENTINFO")]
public class ApplicantProfileDataDto
{
public virtual string DataType { get; } = "";
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Unity.GrantManager.Applicants.ProfileData
namespace Unity.GrantManager.ApplicantProfile.ProfileData
{
public class ApplicantSubmissionInfoDto : ApplicantProfileDataDto
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System;

namespace Unity.GrantManager.ApplicantProfile.ProfileData
{
public class ContactInfoItemDto
{
public Guid ContactId { get; set; }
public string Name { get; set; } = string.Empty;
public string? Title { get; set; }
public string? Email { get; set; }
public string? HomePhoneNumber { get; set; }
public string? MobilePhoneNumber { get; set; }
public string? WorkPhoneNumber { get; set; }
public string? WorkPhoneExtension { get; set; }
public string? ContactType { get; set; }
public string? Role { get; set; }
public bool IsPrimary { get; set; }
public bool IsEditable { get; set; }
public Guid? ApplicationId { get; set; }
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System;

namespace Unity.GrantManager.Contacts;

/// <summary>
/// Represents a contact linked to an entity, returned by the generic contacts service.
/// </summary>
public class ContactDto
{
/// <summary>The unique identifier of the contact.</summary>
public Guid ContactId { get; set; }

/// <summary>The full name of the contact.</summary>
public string Name { get; set; } = string.Empty;

/// <summary>The job title of the contact.</summary>
public string? Title { get; set; }

/// <summary>The email address of the contact.</summary>
public string? Email { get; set; }

/// <summary>The home phone number of the contact.</summary>
public string? HomePhoneNumber { get; set; }

/// <summary>The mobile phone number of the contact.</summary>
public string? MobilePhoneNumber { get; set; }

/// <summary>The work phone number of the contact.</summary>
public string? WorkPhoneNumber { get; set; }

/// <summary>The work phone extension of the contact.</summary>
public string? WorkPhoneExtension { get; set; }

/// <summary>The role of the contact within the linked entity context.</summary>
public string? Role { get; set; }

/// <summary>Whether this contact is the primary contact for the linked entity.</summary>
public bool IsPrimary { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System;

namespace Unity.GrantManager.Contacts;

/// <summary>
/// Input DTO for creating a new contact and linking it to a related entity.
/// </summary>
public class CreateContactLinkDto
{
/// <summary>The full name of the contact.</summary>
public string Name { get; set; } = string.Empty;

/// <summary>The job title of the contact.</summary>
public string? Title { get; set; }

/// <summary>The email address of the contact.</summary>
public string? Email { get; set; }

/// <summary>The home phone number of the contact.</summary>
public string? HomePhoneNumber { get; set; }

/// <summary>The mobile phone number of the contact.</summary>
public string? MobilePhoneNumber { get; set; }

/// <summary>The work phone number of the contact.</summary>
public string? WorkPhoneNumber { get; set; }

/// <summary>The work phone extension of the contact.</summary>
public string? WorkPhoneExtension { get; set; }

/// <summary>The role of the contact within the linked entity context.</summary>
public string? Role { get; set; }

/// <summary>Whether this contact should be set as the primary contact. Only one primary is allowed per entity type and entity ID.</summary>
public bool IsPrimary { get; set; }

/// <summary>The type of the entity to link the contact to (e.g. "ApplicantProfile").</summary>
public string RelatedEntityType { get; set; } = string.Empty;

/// <summary>The unique identifier of the related entity.</summary>
public Guid RelatedEntityId { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Unity.GrantManager.Contacts;

/// <summary>
/// Generic contact management service. Provides operations for creating, retrieving,
/// and managing contacts linked to any entity type via <see cref="ContactLink"/>.
/// </summary>
public interface IContactAppService
{
/// <summary>
/// Retrieves all active contacts linked to the specified entity.
/// </summary>
/// <param name="entityType">The type of the related entity (e.g. "ApplicantProfile").</param>
/// <param name="entityId">The unique identifier of the related entity.</param>
/// <returns>A list of <see cref="ContactDto"/> for the matching entity.</returns>
Task<List<ContactDto>> GetContactsByEntityAsync(string entityType, Guid entityId);

/// <summary>
/// Creates a new contact and links it to the specified entity.
/// If <see cref="CreateContactLinkDto.IsPrimary"/> is <c>true</c>, any existing primary
/// contact for the same entity type and ID will be cleared first.
/// </summary>
/// <param name="input">The contact and link details.</param>
/// <returns>The created <see cref="ContactDto"/>.</returns>
Task<ContactDto> CreateContactAsync(CreateContactLinkDto input);

/// <summary>
/// Sets the specified contact as the primary contact for the given entity.
/// Only one primary contact is allowed per entity type and entity ID;
/// any existing primary will be cleared before setting the new one.
/// </summary>
/// <param name="entityType">The type of the related entity.</param>
/// <param name="entityId">The unique identifier of the related entity.</param>
/// <param name="contactId">The unique identifier of the contact to set as primary.</param>
/// <exception cref="Volo.Abp.BusinessException">Thrown when no active contact link is found for the given parameters.</exception>
Task SetPrimaryContactAsync(string entityType, Guid entityId, Guid contactId);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using System.Threading.Tasks;
using Unity.GrantManager.Applicants.ProfileData;
using Unity.GrantManager.ApplicantProfile.ProfileData;
using Volo.Abp.DependencyInjection;

namespace Unity.GrantManager.Applicants.ApplicantProfile
namespace Unity.GrantManager.ApplicantProfile
{
[ExposeServices(typeof(IApplicantProfileDataProvider))]
public class AddressInfoDataProvider : IApplicantProfileDataProvider, ITransientDependency
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Unity.GrantManager.Applicants.ApplicantProfile;
using Unity.GrantManager.Applicants;
using Unity.GrantManager.Applications;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.MultiTenancy;
using Volo.Abp.TenantManagement;

namespace Unity.GrantManager.Applicants
namespace Unity.GrantManager.ApplicantProfile
{
[RemoteService(false)]
public class ApplicantProfileAppService(
Expand Down
Loading
Loading