From 72282394206e1cd3e7813c12c4c5b9b1a7ef1e91 Mon Sep 17 00:00:00 2001 From: Phil Davies <203141900+phil-davies-eviden@users.noreply.github.com> Date: Fri, 3 Oct 2025 12:52:51 +0100 Subject: [PATCH 01/10] add feature flag --- src/EPR.RegulatorService.Frontend.Web/Configs/FeatureFlags.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/EPR.RegulatorService.Frontend.Web/Configs/FeatureFlags.cs b/src/EPR.RegulatorService.Frontend.Web/Configs/FeatureFlags.cs index 1c2c0dbb7..1661d2573 100644 --- a/src/EPR.RegulatorService.Frontend.Web/Configs/FeatureFlags.cs +++ b/src/EPR.RegulatorService.Frontend.Web/Configs/FeatureFlags.cs @@ -27,4 +27,6 @@ public static class FeatureFlags public const string ShowFeesWaiveButton = "ShowFeesWaiveButton"; public const string ShowComplianceSchemeMembership = "ShowComplianceSchemeMembership"; + + public const string IncludeSubsidiariesInFeeCalculationsForRegulators = "IncludeSubsidiariesInFeeCalculationsForRegulators"; } \ No newline at end of file From 4f8c32c0ec48817dcc6192ee8e41d9acd00609af Mon Sep 17 00:00:00 2001 From: Phil Davies <203141900+phil-davies-eviden@users.noreply.github.com> Date: Fri, 3 Oct 2025 13:06:35 +0100 Subject: [PATCH 02/10] inject new feature flag --- .../Web/Controllers/SubmissionDetailsTests.cs | 22 ++++++++++++++----- .../Submissions/SubmissionsController.cs | 17 +++++++++++--- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/EPR.RegulatorService.Frontend.UnitTests/Web/Controllers/SubmissionDetailsTests.cs b/src/EPR.RegulatorService.Frontend.UnitTests/Web/Controllers/SubmissionDetailsTests.cs index cd21a7475..365717986 100644 --- a/src/EPR.RegulatorService.Frontend.UnitTests/Web/Controllers/SubmissionDetailsTests.cs +++ b/src/EPR.RegulatorService.Frontend.UnitTests/Web/Controllers/SubmissionDetailsTests.cs @@ -1,19 +1,23 @@ +using EPR.RegulatorService.Frontend.Core.Models.Submissions; using EPR.RegulatorService.Frontend.Core.Sessions; +using EPR.RegulatorService.Frontend.UnitTests.TestData; using EPR.RegulatorService.Frontend.Web.Constants; +using EPR.RegulatorService.Frontend.Web.ViewModels.Submissions; + using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; - -using EPR.RegulatorService.Frontend.Web.ViewModels.Submissions; -using EPR.RegulatorService.Frontend.UnitTests.TestData; -using EPR.RegulatorService.Frontend.Core.Models.Submissions; +using Microsoft.FeatureManagement; namespace EPR.RegulatorService.Frontend.UnitTests.Web.Controllers { + using Frontend.Web.Configs; + [TestClass] public class SubmissionDetailsTests : SubmissionsTestBase { private const string ViewName = "SubmissionDetails"; private int _hashCode; + private Mock _mockFeatureManager; [TestInitialize] public void Setup() @@ -37,6 +41,12 @@ public void Setup() JourneySessionMock.RegulatorSubmissionSession.OrganisationSubmissions[_hashCode] = testSubmission; _sessionManagerMock.Setup(x => x.GetSessionAsync(It.IsAny())) .ReturnsAsync(JourneySessionMock); + + _mockFeatureManager = new Mock(); + + _mockFeatureManager.Setup(fm => + fm.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalculationsForRegulators)) + .ReturnsAsync(false); } [TestMethod] @@ -53,7 +63,7 @@ public async Task GivenOnSubmissionDetailsPage_WhenSubmissionDetailsHttpGetCalle }); // Act - var result = await _systemUnderTest.SubmissionDetails(_hashCode) as ViewResult; + var result = await _systemUnderTest.SubmissionDetails(_hashCode, _mockFeatureManager.Object) as ViewResult; // Assert result.Should().NotBeNull(); @@ -94,7 +104,7 @@ public async Task GivenOnSubmissionDetailsPage_WhenSubmissionDetailsHttpGetCalle }); // Act - var result = await _systemUnderTest.SubmissionDetails(_hashCode) as ViewResult; + var result = await _systemUnderTest.SubmissionDetails(_hashCode, _mockFeatureManager.Object) as ViewResult; // Assert result.Should().NotBeNull(); diff --git a/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs b/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs index 7d0ee6158..266a0bfb4 100644 --- a/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs +++ b/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs @@ -19,6 +19,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; +using Microsoft.FeatureManagement; using Microsoft.FeatureManagement.Mvc; using RegulatorDecision = EPR.RegulatorService.Frontend.Core.Enums.RegulatorDecision; @@ -189,7 +190,9 @@ public async Task Submissions(SubmissionsRequestViewModel viewMod [HttpGet] [Route(PagePath.SubmissionDetails)] - public async Task SubmissionDetails([FromQuery] int submissionHash) + public async Task SubmissionDetails( + [FromQuery] int submissionHash, + [FromServices] IFeatureManager featureManager) { var session = await _sessionManager.GetSessionAsync(HttpContext.Session); var model = GetSubmissionDetailsViewModel(session, submissionHash); @@ -210,8 +213,16 @@ public async Task SubmissionDetails([FromQuery] int submissionHas = model.NationCode = payCalParameters.NationCode; sessionSubmission.ReferenceNumber = model.ReferenceNumber = payCalParameters.Reference; - sessionSubmission.MemberCount - = model.MemberCount = payCalParameters.MemberCount ?? 0; + if (await featureManager.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalculationsForRegulators)) + { + sessionSubmission.MemberCount + = model.MemberCount = payCalParameters.MemberCount ?? 1; + } + else + { + sessionSubmission.MemberCount + = model.MemberCount = payCalParameters.MemberCount ?? 0; + } model.ReferenceFieldNotAvailable = payCalParameters.ReferenceFieldNotAvailable; model.ReferenceNotAvailable = payCalParameters.ReferenceNotAvailable; model.SubmittedDate = payCalParameters.ResubmissionDate ?? model.SubmittedDate; From 1b152f1b65f9a86a61f46456f826fde0c080ebbd Mon Sep 17 00:00:00 2001 From: Phil Davies <203141900+phil-davies-eviden@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:09:04 +0100 Subject: [PATCH 03/10] wip --- .../PackagingProducerPaymentRequest.cs | 2 ++ ...roducerPaymentDetailsViewComponentTests.cs | 20 ++++++++++++++++--- .../Submissions/SubmissionsController.cs | 5 ++++- ...gingProducerPaymentDetailsViewComponent.cs | 16 ++++++++++++++- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/EPR.RegulatorService.Frontend.Core/Models/Submissions/PackagingProducerPaymentRequest.cs b/src/EPR.RegulatorService.Frontend.Core/Models/Submissions/PackagingProducerPaymentRequest.cs index 698f22c6f..a2ad89bf1 100644 --- a/src/EPR.RegulatorService.Frontend.Core/Models/Submissions/PackagingProducerPaymentRequest.cs +++ b/src/EPR.RegulatorService.Frontend.Core/Models/Submissions/PackagingProducerPaymentRequest.cs @@ -7,4 +7,6 @@ public class PackagingProducerPaymentRequest public required string Regulator { get; set; } public required DateTime ResubmissionDate { get; set; } + + public required int MemberCount { get; set; } } \ No newline at end of file diff --git a/src/EPR.RegulatorService.Frontend.UnitTests/Web/ViewComponents/PackagingProducerPaymentDetailsViewComponentTests.cs b/src/EPR.RegulatorService.Frontend.UnitTests/Web/ViewComponents/PackagingProducerPaymentDetailsViewComponentTests.cs index 3fc5974e5..0d41dbcf6 100644 --- a/src/EPR.RegulatorService.Frontend.UnitTests/Web/ViewComponents/PackagingProducerPaymentDetailsViewComponentTests.cs +++ b/src/EPR.RegulatorService.Frontend.UnitTests/Web/ViewComponents/PackagingProducerPaymentDetailsViewComponentTests.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc.ViewComponents; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Microsoft.FeatureManagement; namespace EPR.RegulatorService.Frontend.UnitTests.Web.ViewComponents; @@ -18,6 +19,7 @@ public class PackagingProducerPaymentDetailsViewComponentTests : ViewComponentsT private readonly Mock _paymentFacadeServiceMock = new(); private readonly Mock> _loggerMock = new(); private readonly Mock> _paymentDetailsOptionsMock = new(); + private readonly Mock _mockFeatureManager = new(); [TestInitialize] public void TestInitialize() @@ -29,7 +31,15 @@ public void TestInitialize() }; _loggerMock.Setup(x => x.IsEnabled(It.IsAny())).Returns(true); _paymentDetailsOptionsMock.Setup(r => r.Value).Returns(new PaymentDetailsOptions()); - _sut = new PackagingProducerPaymentDetailsViewComponent(_paymentDetailsOptionsMock.Object, _paymentFacadeServiceMock.Object, _loggerMock.Object); + _mockFeatureManager.Setup(fm => + fm.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalculationsForRegulators)) + .ReturnsAsync(false); + + _sut = new PackagingProducerPaymentDetailsViewComponent( + _paymentDetailsOptionsMock.Object, + _paymentFacadeServiceMock.Object, + _mockFeatureManager.Object, + _loggerMock.Object); } [TestMethod] @@ -119,7 +129,7 @@ public async Task InvokeAsync_Returns_CorrectView_With_Model() } [TestMethod] - public async Task WhenpPoducerPaidInExcessOfTheAmountRequiredThenOutstandingPaymentShouldShowZero() + public async Task WhenProducerPaidInExcessOfTheAmountRequiredThenOutstandingPaymentShouldShowZero() { // Arrange _paymentFacadeServiceMock.Setup(x => x.GetProducerPaymentDetailsForResubmissionAsync( @@ -132,7 +142,11 @@ public async Task WhenpPoducerPaidInExcessOfTheAmountRequiredThenOutstandingPaym }); _loggerMock.Setup(x => x.IsEnabled(It.IsAny())).Returns(true); _paymentDetailsOptionsMock.Setup(r => r.Value).Returns(new PaymentDetailsOptions { ShowZeroFeeForTotalOutstanding = true }); - _sut = new PackagingProducerPaymentDetailsViewComponent(_paymentDetailsOptionsMock.Object, _paymentFacadeServiceMock.Object, _loggerMock.Object); + _sut = new PackagingProducerPaymentDetailsViewComponent( + _paymentDetailsOptionsMock.Object, + _paymentFacadeServiceMock.Object, + _mockFeatureManager.Object, + _loggerMock.Object); // Act var result = await _sut.InvokeAsync(_submissionDetailsViewModel); diff --git a/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs b/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs index 266a0bfb4..514483f83 100644 --- a/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs +++ b/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs @@ -213,15 +213,18 @@ public async Task SubmissionDetails( = model.NationCode = payCalParameters.NationCode; sessionSubmission.ReferenceNumber = model.ReferenceNumber = payCalParameters.Reference; + // this will affect cs too if (await featureManager.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalculationsForRegulators)) { + // what if feature flag enabled and no MemberCount? sessionSubmission.MemberCount = model.MemberCount = payCalParameters.MemberCount ?? 1; } else { + // why in session? sessionSubmission.MemberCount - = model.MemberCount = payCalParameters.MemberCount ?? 0; + = model.MemberCount = 1; //payCalParameters.MemberCount ?? 0; } model.ReferenceFieldNotAvailable = payCalParameters.ReferenceFieldNotAvailable; model.ReferenceNotAvailable = payCalParameters.ReferenceNotAvailable; diff --git a/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs b/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs index 12ff20bf4..3c1f45f84 100644 --- a/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs +++ b/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs @@ -7,10 +7,15 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ViewComponents; using Microsoft.Extensions.Options; +using Microsoft.FeatureManagement; namespace EPR.RegulatorService.Frontend.Web.ViewComponents.Submissions; -public class PackagingProducerPaymentDetailsViewComponent(IOptions options, IPaymentFacadeService paymentFacadeService, ILogger logger) : ViewComponent +public class PackagingProducerPaymentDetailsViewComponent( + IOptions options, + IPaymentFacadeService paymentFacadeService, + IFeatureManager featureManager, + ILogger logger) : ViewComponent { private static readonly Action _logViewComponentError = LoggerMessage.Define( @@ -34,11 +39,20 @@ public async Task InvokeAsync(SubmissionDetailsViewMode return View(default(PackagingProducerPaymentDetailsViewModel)); } + //todo: check feature flag. 1 by default, else from paycalc params + + //todo: check viewModel.MemberCount gets set + int memberCount = + await featureManager.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalculationsForRegulators) + ? viewModel.MemberCount + : 1; + var producerPaymentResponse = await paymentFacadeService .GetProducerPaymentDetailsForResubmissionAsync(new PackagingProducerPaymentRequest { ReferenceNumber = viewModel.ReferenceNumber, Regulator = viewModel.NationCode, + MemberCount = memberCount, ResubmissionDate = TimeZoneInfo.ConvertTimeToUtc(viewModel.SubmittedDate) //payment facade in utc format }); From ed05b3287ad93d1b369434633ce9d8e2d17ff91b Mon Sep 17 00:00:00 2001 From: Phil Davies <203141900+phil-davies-eviden@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:16:30 +0100 Subject: [PATCH 04/10] revert SubmissionController --- .../Web/Controllers/SubmissionDetailsTests.cs | 16 ++-------------- .../Submissions/SubmissionsController.cs | 19 +++---------------- ...gingProducerPaymentDetailsViewComponent.cs | 2 ++ 3 files changed, 7 insertions(+), 30 deletions(-) diff --git a/src/EPR.RegulatorService.Frontend.UnitTests/Web/Controllers/SubmissionDetailsTests.cs b/src/EPR.RegulatorService.Frontend.UnitTests/Web/Controllers/SubmissionDetailsTests.cs index 365717986..e5abd5ba9 100644 --- a/src/EPR.RegulatorService.Frontend.UnitTests/Web/Controllers/SubmissionDetailsTests.cs +++ b/src/EPR.RegulatorService.Frontend.UnitTests/Web/Controllers/SubmissionDetailsTests.cs @@ -1,23 +1,17 @@ -using EPR.RegulatorService.Frontend.Core.Models.Submissions; using EPR.RegulatorService.Frontend.Core.Sessions; using EPR.RegulatorService.Frontend.UnitTests.TestData; using EPR.RegulatorService.Frontend.Web.Constants; using EPR.RegulatorService.Frontend.Web.ViewModels.Submissions; using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.FeatureManagement; namespace EPR.RegulatorService.Frontend.UnitTests.Web.Controllers { - using Frontend.Web.Configs; - [TestClass] public class SubmissionDetailsTests : SubmissionsTestBase { private const string ViewName = "SubmissionDetails"; private int _hashCode; - private Mock _mockFeatureManager; [TestInitialize] public void Setup() @@ -41,12 +35,6 @@ public void Setup() JourneySessionMock.RegulatorSubmissionSession.OrganisationSubmissions[_hashCode] = testSubmission; _sessionManagerMock.Setup(x => x.GetSessionAsync(It.IsAny())) .ReturnsAsync(JourneySessionMock); - - _mockFeatureManager = new Mock(); - - _mockFeatureManager.Setup(fm => - fm.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalculationsForRegulators)) - .ReturnsAsync(false); } [TestMethod] @@ -63,7 +51,7 @@ public async Task GivenOnSubmissionDetailsPage_WhenSubmissionDetailsHttpGetCalle }); // Act - var result = await _systemUnderTest.SubmissionDetails(_hashCode, _mockFeatureManager.Object) as ViewResult; + var result = await _systemUnderTest.SubmissionDetails(_hashCode) as ViewResult; // Assert result.Should().NotBeNull(); @@ -104,7 +92,7 @@ public async Task GivenOnSubmissionDetailsPage_WhenSubmissionDetailsHttpGetCalle }); // Act - var result = await _systemUnderTest.SubmissionDetails(_hashCode, _mockFeatureManager.Object) as ViewResult; + var result = await _systemUnderTest.SubmissionDetails(_hashCode) as ViewResult; // Assert result.Should().NotBeNull(); diff --git a/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs b/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs index 514483f83..7561550b6 100644 --- a/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs +++ b/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs @@ -190,9 +190,7 @@ public async Task Submissions(SubmissionsRequestViewModel viewMod [HttpGet] [Route(PagePath.SubmissionDetails)] - public async Task SubmissionDetails( - [FromQuery] int submissionHash, - [FromServices] IFeatureManager featureManager) + public async Task SubmissionDetails([FromQuery] int submissionHash) { var session = await _sessionManager.GetSessionAsync(HttpContext.Session); var model = GetSubmissionDetailsViewModel(session, submissionHash); @@ -213,19 +211,8 @@ public async Task SubmissionDetails( = model.NationCode = payCalParameters.NationCode; sessionSubmission.ReferenceNumber = model.ReferenceNumber = payCalParameters.Reference; - // this will affect cs too - if (await featureManager.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalculationsForRegulators)) - { - // what if feature flag enabled and no MemberCount? - sessionSubmission.MemberCount - = model.MemberCount = payCalParameters.MemberCount ?? 1; - } - else - { - // why in session? - sessionSubmission.MemberCount - = model.MemberCount = 1; //payCalParameters.MemberCount ?? 0; - } + sessionSubmission.MemberCount + = model.MemberCount = payCalParameters.MemberCount ?? 0; model.ReferenceFieldNotAvailable = payCalParameters.ReferenceFieldNotAvailable; model.ReferenceNotAvailable = payCalParameters.ReferenceNotAvailable; model.SubmittedDate = payCalParameters.ResubmissionDate ?? model.SubmittedDate; diff --git a/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs b/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs index 3c1f45f84..36c6ba39d 100644 --- a/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs +++ b/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs @@ -42,6 +42,8 @@ public async Task InvokeAsync(SubmissionDetailsViewMode //todo: check feature flag. 1 by default, else from paycalc params //todo: check viewModel.MemberCount gets set + //todo: what if feature flag enabled and no MemberCount (which would come through as 0 i think)? throw for safety? check with Pritam + int memberCount = await featureManager.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalculationsForRegulators) ? viewModel.MemberCount From ad1f8a45c2729fe0e477d40c4b8c3c02f6abc190 Mon Sep 17 00:00:00 2001 From: Phil Davies <203141900+phil-davies-eviden@users.noreply.github.com> Date: Mon, 6 Oct 2025 14:37:50 +0100 Subject: [PATCH 05/10] wip --- ...roducerPaymentDetailsViewComponentTests.cs | 54 +++++++++++++++++-- .../appsettings.json | 4 +- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/EPR.RegulatorService.Frontend.UnitTests/Web/ViewComponents/PackagingProducerPaymentDetailsViewComponentTests.cs b/src/EPR.RegulatorService.Frontend.UnitTests/Web/ViewComponents/PackagingProducerPaymentDetailsViewComponentTests.cs index 0d41dbcf6..709a05c79 100644 --- a/src/EPR.RegulatorService.Frontend.UnitTests/Web/ViewComponents/PackagingProducerPaymentDetailsViewComponentTests.cs +++ b/src/EPR.RegulatorService.Frontend.UnitTests/Web/ViewComponents/PackagingProducerPaymentDetailsViewComponentTests.cs @@ -1,12 +1,8 @@ -using EPR.RegulatorService.Frontend.Core.Models.Submissions; -using EPR.RegulatorService.Frontend.Core.Services; using EPR.RegulatorService.Frontend.Web.Configs; using EPR.RegulatorService.Frontend.Web.ViewComponents.Submissions; using EPR.RegulatorService.Frontend.Web.ViewModels.Submissions; using Microsoft.AspNetCore.Mvc.ViewComponents; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; using Microsoft.FeatureManagement; namespace EPR.RegulatorService.Frontend.UnitTests.Web.ViewComponents; @@ -193,4 +189,54 @@ public async Task InvokeAsync_Logs_Error_And_Returns_CorrectView_With_DefaultMod It.IsAny>()), Times.Once); } + + [TestMethod] + public async Task InvokeAsync_WhenFeatureFlagDisabled_PassesMemberCountAsOne() + { + // Arrange + _submissionDetailsViewModel.MemberCount = 25; // should be ignored when flag disabled + _paymentFacadeServiceMock + .Setup(s => s.GetProducerPaymentDetailsForResubmissionAsync(It.IsAny())) + .ReturnsAsync(new PackagingProducerPaymentResponse + { + ResubmissionFee = 0, + PreviousPaymentsReceived = 0, + TotalOutstanding = 0 + }); + + // Act + await _sut.InvokeAsync(_submissionDetailsViewModel); + + // Assert + _paymentFacadeServiceMock.Verify(s => + s.GetProducerPaymentDetailsForResubmissionAsync( + It.Is(r => r.MemberCount == 1)), Times.Once); + } + + [TestMethod] + public async Task InvokeAsync_WhenFeatureFlagEnabled_Passes_ViewModel_MemberCount() + { + // Arrange + _submissionDetailsViewModel.MemberCount = 37; + _mockFeatureManager.Setup(fm => + fm.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalculationsForRegulators)) + .ReturnsAsync(true); + + _paymentFacadeServiceMock + .Setup(s => s.GetProducerPaymentDetailsForResubmissionAsync(It.IsAny())) + .ReturnsAsync(new PackagingProducerPaymentResponse + { + ResubmissionFee = 0, + PreviousPaymentsReceived = 0, + TotalOutstanding = 0 + }); + + // Act + await _sut.InvokeAsync(_submissionDetailsViewModel); + + // Assert + _paymentFacadeServiceMock.Verify(s => + s.GetProducerPaymentDetailsForResubmissionAsync( + It.Is(r => r.MemberCount == 37)), Times.Once); + } } \ No newline at end of file diff --git a/src/EPR.RegulatorService.Frontend.Web/appsettings.json b/src/EPR.RegulatorService.Frontend.Web/appsettings.json index 68bca14fc..f939a3a84 100644 --- a/src/EPR.RegulatorService.Frontend.Web/appsettings.json +++ b/src/EPR.RegulatorService.Frontend.Web/appsettings.json @@ -202,7 +202,9 @@ "EnableCsvDownload": false, "ReprocessorExporter": false, "ShowYourFeedbackFooter": false, - "ShowFeesWaiveButton": false + "ShowFeesWaiveButton": false, + //todo: set to false and enable for dev3 only in config. also runbook + "IncludeSubsidiariesInFeeCalculationsForRegulators": false }, "BehaviourManagement": { "PomSubmissionFilters": { From 7a6672bc11b226695ac5f6144bb4f6020853770f Mon Sep 17 00:00:00 2001 From: Phil Davies <203141900+phil-davies-eviden@users.noreply.github.com> Date: Mon, 6 Oct 2025 14:40:15 +0100 Subject: [PATCH 06/10] tidy up --- .../Controllers/Submissions/SubmissionsController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs b/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs index 7561550b6..7d0ee6158 100644 --- a/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs +++ b/src/EPR.RegulatorService.Frontend.Web/Controllers/Submissions/SubmissionsController.cs @@ -19,7 +19,6 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; -using Microsoft.FeatureManagement; using Microsoft.FeatureManagement.Mvc; using RegulatorDecision = EPR.RegulatorService.Frontend.Core.Enums.RegulatorDecision; From 3bb1d1fec169931e94076cc0a098785bf934f5d6 Mon Sep 17 00:00:00 2001 From: Phil Davies <203141900+phil-davies-eviden@users.noreply.github.com> Date: Mon, 6 Oct 2025 14:41:20 +0100 Subject: [PATCH 07/10] tidy up --- .../PackagingProducerPaymentDetailsViewComponent.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs b/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs index 36c6ba39d..0af4c2a25 100644 --- a/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs +++ b/src/EPR.RegulatorService.Frontend.Web/ViewComponents/Submissions/PackagingProducerPaymentDetailsViewComponent.cs @@ -39,11 +39,6 @@ public async Task InvokeAsync(SubmissionDetailsViewMode return View(default(PackagingProducerPaymentDetailsViewModel)); } - //todo: check feature flag. 1 by default, else from paycalc params - - //todo: check viewModel.MemberCount gets set - //todo: what if feature flag enabled and no MemberCount (which would come through as 0 i think)? throw for safety? check with Pritam - int memberCount = await featureManager.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalculationsForRegulators) ? viewModel.MemberCount From 04db17ae0a004e187cb82038a39307d44b3f0582 Mon Sep 17 00:00:00 2001 From: Phil Davies <203141900+phil-davies-eviden@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:26:32 +0100 Subject: [PATCH 08/10] tidy up --- src/EPR.RegulatorService.Frontend.Web/appsettings.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/EPR.RegulatorService.Frontend.Web/appsettings.json b/src/EPR.RegulatorService.Frontend.Web/appsettings.json index f939a3a84..15d686f5d 100644 --- a/src/EPR.RegulatorService.Frontend.Web/appsettings.json +++ b/src/EPR.RegulatorService.Frontend.Web/appsettings.json @@ -203,7 +203,6 @@ "ReprocessorExporter": false, "ShowYourFeedbackFooter": false, "ShowFeesWaiveButton": false, - //todo: set to false and enable for dev3 only in config. also runbook "IncludeSubsidiariesInFeeCalculationsForRegulators": false }, "BehaviourManagement": { From 29cbabe9e121c635125e8b20635a28d7eb9d256b Mon Sep 17 00:00:00 2001 From: Phil Davies <203141900+phil-davies-eviden@users.noreply.github.com> Date: Thu, 9 Oct 2025 11:33:31 +0100 Subject: [PATCH 09/10] add NumberOfLateSubsidiaries handling wip --- .../FacadeCommonData/ProducerDetailsDto.cs | 2 ++ .../RegistrationSubmissionOrganisationDetailsResponse.cs | 1 + .../Models/RegistrationSubmissions/ProducerPaymentRequest.cs | 2 ++ .../RegistrationSubmissionOrganisationDetails.cs | 1 + .../ProducerPaymentDetailsViewComponent.cs | 1 + 5 files changed, 7 insertions(+) diff --git a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/ProducerDetailsDto.cs b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/ProducerDetailsDto.cs index 742726930..dcca64f89 100644 --- a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/ProducerDetailsDto.cs +++ b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/ProducerDetailsDto.cs @@ -8,6 +8,8 @@ public class ProducerDetailsDto public int NoOfSubsidiaries { get; set; } + public int NoOfLateSubsidiaries { get; set; } + public bool IsLateFeeApplicable { get; set; } public bool IsProducerOnlineMarketplace { get; set; } diff --git a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/RegistrationSubmissionOrganisationDetailsResponse.cs b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/RegistrationSubmissionOrganisationDetailsResponse.cs index f9f6e0f27..bc7753998 100644 --- a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/RegistrationSubmissionOrganisationDetailsResponse.cs +++ b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/RegistrationSubmissionOrganisationDetailsResponse.cs @@ -44,6 +44,7 @@ public class RegistrationSubmissionOrganisationDetailsResponse public bool IsOnlineMarketPlace { get; set; } public int NumberOfSubsidiaries { get; set; } public int NumberOfOnlineSubsidiaries { get; set; } + public int NumberOfLateSubsidiaries { get; set; } public bool IsLateSubmission { get; set; } public string OrganisationSize { get; set; } public bool IsComplianceScheme { get; set; } diff --git a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/ProducerPaymentRequest.cs b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/ProducerPaymentRequest.cs index b3c219c14..7fff6dd96 100644 --- a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/ProducerPaymentRequest.cs +++ b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/ProducerPaymentRequest.cs @@ -8,6 +8,8 @@ public class ProducerPaymentRequest public int NumberOfSubsidiaries { get; set; } + public int NoOfLateSubsidiaries { get; set; } + public bool IsLateFeeApplicable { get; set; } public bool IsProducerOnlineMarketplace { get; set; } diff --git a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/RegistrationSubmissionOrganisationDetails.cs b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/RegistrationSubmissionOrganisationDetails.cs index d27b3a4dc..6852c89a1 100644 --- a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/RegistrationSubmissionOrganisationDetails.cs +++ b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/RegistrationSubmissionOrganisationDetails.cs @@ -163,6 +163,7 @@ public static implicit operator RegistrationSubmissionOrganisationDetails(Regist IsProducerOnlineMarketplace = response.IsOnlineMarketPlace, NoOfSubsidiaries = response.NumberOfSubsidiaries, NoOfSubsidiariesOnlineMarketPlace = response.NumberOfOnlineSubsidiaries, + NoOfLateSubsidiaries = response.NumberOfLateSubsidiaries, ProducerType = response.OrganisationSize } }; diff --git a/src/EPR.RegulatorService.Frontend.Web/ViewComponents/RegistrationSubmissions/ProducerPaymentDetailsViewComponent.cs b/src/EPR.RegulatorService.Frontend.Web/ViewComponents/RegistrationSubmissions/ProducerPaymentDetailsViewComponent.cs index b00bda6c6..852195884 100644 --- a/src/EPR.RegulatorService.Frontend.Web/ViewComponents/RegistrationSubmissions/ProducerPaymentDetailsViewComponent.cs +++ b/src/EPR.RegulatorService.Frontend.Web/ViewComponents/RegistrationSubmissions/ProducerPaymentDetailsViewComponent.cs @@ -28,6 +28,7 @@ public async Task InvokeAsync(RegistrationSubmissionDet ApplicationReferenceNumber = viewModel.ReferenceNumber, NoOfSubsidiariesOnlineMarketplace = viewModel.ProducerDetails.NoOfSubsidiariesOnlineMarketPlace, NumberOfSubsidiaries = viewModel.ProducerDetails.NoOfSubsidiaries, + NoOfLateSubsidiaries = viewModel.ProducerDetails.NoOfLateSubsidiaries, IsLateFeeApplicable = viewModel.ProducerDetails.IsLateFeeApplicable, IsProducerOnlineMarketplace = viewModel.ProducerDetails.IsProducerOnlineMarketplace, ProducerType = viewModel.ProducerDetails.ProducerType, From efcee6f399b55f5d2245559d99c9868f4f11517d Mon Sep 17 00:00:00 2001 From: Phil Davies <203141900+phil-davies-eviden@users.noreply.github.com> Date: Fri, 10 Oct 2025 11:19:01 +0100 Subject: [PATCH 10/10] send NumberOfLateSubsidiaries to paycal for cs's too --- .../RegistrationSubmissions/CompliancePaymentRequest.cs | 2 ++ .../FacadeCommonData/CsoMembershipDetailsDto.cs | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/CompliancePaymentRequest.cs b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/CompliancePaymentRequest.cs index 006f7ebc0..42e047414 100644 --- a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/CompliancePaymentRequest.cs +++ b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/CompliancePaymentRequest.cs @@ -23,5 +23,7 @@ public class ComplianceSchemeMemberRequest public int NumberOfSubsidiaries { get; set; } + public int NumberOfLateSubsidiaries { get; set; } + public int NoOfSubsidiariesOnlineMarketplace { get; set; } } \ No newline at end of file diff --git a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/CsoMembershipDetailsDto.cs b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/CsoMembershipDetailsDto.cs index f28f66800..9fcb258c6 100644 --- a/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/CsoMembershipDetailsDto.cs +++ b/src/EPR.RegulatorService.Frontend.Core/Models/RegistrationSubmissions/FacadeCommonData/CsoMembershipDetailsDto.cs @@ -9,6 +9,7 @@ public class CsoMembershipDetailsDto public bool IsOnlineMarketPlace { get; set; } public bool IsLateFeeApplicable { get; set; } public int NumberOfSubsidiaries { get; set; } + public int NumberOfLateSubsidiaries { get; set; } [JsonPropertyName("NumberOfSubsidiariesOnlineMarketPlace")] public int NoOfSubsidiariesOnlineMarketplace { get; set; } @@ -23,6 +24,7 @@ public class CsoMembershipDetailsDto IsOnlineMarketplace = dto.IsOnlineMarketPlace, IsLateFeeApplicable = dto.IsLateFeeApplicable, NoOfSubsidiariesOnlineMarketplace = dto.NoOfSubsidiariesOnlineMarketplace, - NumberOfSubsidiaries = dto.NumberOfSubsidiaries + NumberOfSubsidiaries = dto.NumberOfSubsidiaries, + NumberOfLateSubsidiaries = dto.NumberOfLateSubsidiaries }; }