Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ public class CompliancePaymentRequest
{
public required string ApplicationReferenceNumber { get; set; }

public string? FileId { get; set; }

public required string Regulator { get; set; }

public DateTime SubmissionDate { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ public class OfflinePaymentRequest

public required string Description { get; set; }

public Guid? FileId { get; set; }

public DateTime? PaymentDate { get; set; }

public string? Comments { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ public class ProducerPaymentRequest
{
public required string ApplicationReferenceNumber { get; set; }

public string? FileId { get; set; }

public int NoOfSubsidiariesOnlineMarketplace { get; set; }

public int NumberOfSubsidiaries { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ public class PackagingCompliancePaymentRequest
public required string Regulator { get; set; }

public DateTime ResubmissionDate { get; set; }

public Guid? FileId { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ public class PackagingProducerPaymentRequest
public required DateTime ResubmissionDate { get; set; }

public required int MemberCount { get; set; }

public Guid? FileId { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -2375,7 +2375,7 @@ public async Task ConfirmOfflinePaymentSubmission_RedirectsTo_ServiceNotAvailabl
// Veryify the redirect URL
result.RouteName.Should().Be("ServiceNotAvailable");
result.RouteValues.First().Value.Should().Be($"{PagePath.RegistrationSubmissionDetails}/{submissionId}");
_paymentFacadeServiceMock.Verify(r => r.SubmitOfflinePaymentAsync(It.IsAny<OfflinePaymentRequest>()), Times.AtMostOnce);
_paymentFacadeServiceMock.Verify(r => r.SubmitOfflinePaymentAsync(It.Is<OfflinePaymentRequest>(c=>c.FileId.ToString() == submissionDetails.ResubmissionFileId)), Times.AtMostOnce);
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ protected static RegistrationSubmissionDetailsViewModel GenerateTestSubmissionDe
Files =
[
],
ResubmissionFileId = Guid.NewGuid().ToString()
},
ProducerComments = "producer comment",
RegulatorComments = "regulator comment",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -949,12 +949,14 @@ public async Task ConfirmOfflinePaymentSubmission_POST_RedirectsToSubmissionDeta
{
// Arrange
var submissionId = Guid.NewGuid();
var fileId = Guid.NewGuid();
JourneySessionMock.RegulatorSubmissionSession.OrganisationSubmissions[_hashCode] = new Submission
{
SubmissionId = submissionId,
UserId = Guid.NewGuid(),
ReferenceNumber = "degreg",
NationCode = "GB-ENG"
NationCode = "GB-ENG",
FileId = fileId
};

JourneySessionMock.UserData.Organisations =
Expand All @@ -981,7 +983,7 @@ public async Task ConfirmOfflinePaymentSubmission_POST_RedirectsToSubmissionDeta

_paymentFacadeServiceMock.Verify(r =>
r.SubmitOfflinePaymentAsync(
It.IsAny<OfflinePaymentRequest>()),
It.Is<OfflinePaymentRequest>(req => req.FileId == fileId)),
Times.AtMostOnce);

_facadeServiceMock.Verify(r =>
Expand All @@ -990,15 +992,53 @@ public async Task ConfirmOfflinePaymentSubmission_POST_RedirectsToSubmissionDeta
Times.AtMostOnce);
}

[TestMethod]
public async Task ConfirmOfflinePaymentSubmission_POST_PassesNullFileId_WhenFileIdIsEmpty()
{
// Arrange
var submissionId = Guid.NewGuid();
JourneySessionMock.RegulatorSubmissionSession.OrganisationSubmissions[_hashCode] = new Submission
{
SubmissionId = submissionId,
UserId = Guid.NewGuid(),
ReferenceNumber = "degreg",
NationCode = "GB-ENG",
FileId = Guid.Empty
};

JourneySessionMock.UserData.Organisations =
[
new() { NationId = 1 }
];

var model = new ConfirmOfflinePaymentSubmissionViewModel
{
SubmissionHash = _hashCode,
IsOfflinePaymentConfirmed = true,
OfflinePaymentAmount = DefaultOfflinePaymentAmount,
};

// Act
await _systemUnderTest.ConfirmOfflinePaymentSubmission(model);

// Assert
_paymentFacadeServiceMock.Verify(r =>
r.SubmitOfflinePaymentAsync(
It.Is<OfflinePaymentRequest>(req => req.FileId == null)),
Times.AtMostOnce);
}

[TestMethod]
public async Task ConfirmOfflinePaymentSubmission_POST_RedirectsToServiceNotAvailable_WhenPaymentFacade_ReturnsNonSuccess()
{
// Arrange
var submissionId = Guid.NewGuid();
var fileId = Guid.NewGuid();
JourneySessionMock.RegulatorSubmissionSession.OrganisationSubmissions[_hashCode] = new Submission
{
SubmissionId = submissionId,
UserId = Guid.NewGuid()
UserId = Guid.NewGuid(),
FileId = fileId
};

JourneySessionMock.UserData.Organisations =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public async Task InvokeAsync_Returns_CorrectView_With_Model(bool isResubmission
_paymentFacadeServiceMock.Setup(x => x.GetCompliancePaymentDetailsAsync(It.IsAny<CompliancePaymentRequest>()))
.ReturnsAsync(new CompliancePaymentResponse // all values in pence
{
ApplicationProcessingFee = 100.00M,
ApplicationProcessingFee = 100.00M,
TotalChargeableItems = 1000.00M,
PreviousPaymentsReceived = 500.00M,
TotalOutstanding = 500.00M,
Expand All @@ -102,7 +102,9 @@ public async Task InvokeAsync_Returns_CorrectView_With_Model(bool isResubmission
model.LateProducerCount.Should().Be(0);
model.OnlineMarketPlaceCount.Should().Be(0);
model.SubsidiariesCompanyCount.Should().Be(0);
_paymentFacadeServiceMock.Verify(r => r.GetCompliancePaymentDetailsAsync(It.IsAny<CompliancePaymentRequest>()), Times.AtMostOnce);
_paymentFacadeServiceMock.Verify(
r => r.GetCompliancePaymentDetailsAsync(It.Is<CompliancePaymentRequest>(c =>
c.FileId == _registrationSumissionDetailsViewModel.ResubmissionFileId)), Times.AtMostOnce);
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public async Task InvokeAsync_Returns_CorrectView_With_DefaultModel_When_Service
var model = result.ViewData.Model as ProducerPaymentResponse;
model.Should().BeNull();
_paymentFacadeServiceMock.Verify(r => r.GetProducerPaymentDetailsAsync(
It.IsAny<ProducerPaymentRequest>()), Times.AtMostOnce);
It.Is<ProducerPaymentRequest>(c=>c.FileId == _registrationSumissionDetailsViewModel.ResubmissionFileId)), Times.AtMostOnce);
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -912,7 +912,8 @@ private async Task<IActionResult> ProcessOfflinePaymentAsync(RegistrationSubmiss
Description = "Registration fee",
Reference = existingModel.ReferenceNumber,
Regulator = regulator,
UserId = (Guid)_currentSession.UserData.Id
UserId = (Guid)_currentSession.UserData.Id,
FileId = existingModel.IsResubmission && Guid.TryParse(existingModel.ResubmissionFileId, out var fileId) ? fileId : null
});

if (response == EndpointResponseStatus.Fail)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,7 @@ public async Task<IActionResult> ConfirmOfflinePaymentSubmission(ConfirmOfflineP
}

TempData.Remove("OfflinePaymentAmount");
Guid? fileId = submission.FileId == Guid.Empty ? null : submission.FileId;
return string.IsNullOrWhiteSpace(model.OfflinePaymentAmount)
? RedirectToAction(
PagePath.Error,
Expand All @@ -311,7 +312,8 @@ public async Task<IActionResult> ConfirmOfflinePaymentSubmission(ConfirmOfflineP
model.OfflinePaymentAmount,
submission.UserId.Value,
submission.SubmissionId,
model.SubmissionHash.Value);
model.SubmissionHash.Value,
fileId);
}

[HttpGet]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,8 @@ private ViewModels.Submissions.SubmissionDetailsViewModel GetSubmissionDetailsVi
NationCode = submission.NationCode,
ReferenceNumber = submission.ReferenceNumber,
MemberCount = submission.MemberCount,
ComplianceSchemeId = submission.ComplianceSchemeId
ComplianceSchemeId = submission.ComplianceSchemeId,
FileId = submission.FileId == Guid.Empty ? null : submission.FileId
};

return model;
Expand All @@ -174,15 +175,17 @@ private async Task<IActionResult> ProcessOfflinePaymentAsync(
string offlinePaymentAmount,
Guid userId,
Guid submissionId,
int submissionHash)
int submissionHash,
Guid? fileId)
{
var response = await _paymentFacadeService.SubmitOfflinePaymentAsync(new OfflinePaymentRequest
{
Amount = (int)(decimal.Parse(offlinePaymentAmount, CultureInfo.InvariantCulture) * 100),
Description = "Packaging data resubmission fee",
Reference = referenceNumber,
Regulator = nationCode,
UserId = userId
UserId = userId,
FileId = fileId
});

if (response == EndpointResponseStatus.Fail)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public async Task<ViewViewComponentResult> InvokeAsync(RegistrationSubmissionDet
new CompliancePaymentRequest
{
ApplicationReferenceNumber = viewModel.ReferenceNumber,
FileId = viewModel.IsResubmission ? viewModel.ResubmissionFileId : null,
Regulator = viewModel.NationCode,
ComplianceSchemeMembers = viewModel.CSOMembershipDetails.Select(x => (ComplianceSchemeMemberRequest)x),
SubmissionDate = TimeZoneInfo.ConvertTimeToUtc(viewModel.IsResubmission
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public async Task<ViewViewComponentResult> InvokeAsync(RegistrationSubmissionDet
var producerPaymentResponse = await paymentFacadeService.GetProducerPaymentDetailsAsync(new ProducerPaymentRequest
{
ApplicationReferenceNumber = viewModel.ReferenceNumber,
FileId = viewModel.IsResubmission ? viewModel.ResubmissionFileId : null,
NoOfSubsidiariesOnlineMarketplace = viewModel.ProducerDetails.NoOfSubsidiariesOnlineMarketPlace,
NumberOfSubsidiaries = viewModel.ProducerDetails.NoOfSubsidiaries,
IsLateFeeApplicable = viewModel.ProducerDetails.IsLateFeeApplicable,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ public async Task<ViewViewComponentResult> InvokeAsync(SubmissionDetailsViewMode
ReferenceNumber = viewModel.ReferenceNumber,
MemberCount = viewModel.MemberCount,
Regulator = viewModel.NationCode,
ResubmissionDate = TimeZoneInfo.ConvertTimeToUtc(viewModel.SubmittedDate) //payment facade in utc format
ResubmissionDate = TimeZoneInfo.ConvertTimeToUtc(viewModel.SubmittedDate), //payment facade in utc format
FileId = viewModel.FileId
});

if (compliancePaymentResponse is null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ await featureManager.IsEnabledAsync(FeatureFlags.IncludeSubsidiariesInFeeCalcula
ReferenceNumber = viewModel.ReferenceNumber,
Regulator = viewModel.NationCode,
MemberCount = memberCount,
ResubmissionDate = TimeZoneInfo.ConvertTimeToUtc(viewModel.SubmittedDate) //payment facade in utc format
ResubmissionDate = TimeZoneInfo.ConvertTimeToUtc(viewModel.SubmittedDate), //payment facade in utc format
FileId = viewModel.FileId
});

if (producerPaymentResponse is null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ public class SubmissionDetailsViewModel : BaseSubmissionDetailsViewModel
public DateTime SubmittedDate { get; set; }
public string SubmissionBlobName { get; set; }
public Guid? ComplianceSchemeId { get; set; }
public Guid? FileId { get; set; }
}
58 changes: 58 additions & 0 deletions src/IntegrationTests/Builders/ProducerPaymentResponseBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
namespace IntegrationTests.Builders;

public class ProducerPaymentResponseBuilder
{
private int _producerRegistrationFee = 165800;
private readonly int _producerOnlineMarketPlaceFee = 0;
private readonly int _producerLateRegistrationFee = 0;
private int _totalFee = 165800;
private int _previousPayment = 0;
private int _outstandingPayment = 165800;
private readonly int _subsidiariesFee = 0;

private ProducerPaymentResponseBuilder()
{
}

public static ProducerPaymentResponseBuilder Default() => new();

public ProducerPaymentResponseBuilder WithProducerRegistrationFee(int feeInPence)
{
_producerRegistrationFee = feeInPence;
return this;
}

public ProducerPaymentResponseBuilder WithTotalFee(int feeInPence)
{
_totalFee = feeInPence;
return this;
}

public ProducerPaymentResponseBuilder WithPreviousPayment(int amountInPence)
{
_previousPayment = amountInPence;
return this;
}

public ProducerPaymentResponseBuilder WithOutstandingPayment(int amountInPence)
{
_outstandingPayment = amountInPence;
return this;
}

public object Build() => new
{
producerRegistrationFee = _producerRegistrationFee,
producerOnlineMarketPlaceFee = _producerOnlineMarketPlaceFee,
producerLateRegistrationFee = _producerLateRegistrationFee,
totalFee = _totalFee,
previousPayment = _previousPayment,
outstandingPayment = _outstandingPayment,
subsidiariesFee = _subsidiariesFee,
subsidiariesFeeBreakdown = new
{
totalSubsidiariesOMPFees = 0,
countOfOMPSubsidiaries = 0
}
};
}
Loading