Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Expand Up @@ -110,8 +110,8 @@ public void ContractsIndex_DisplaysProductCount()
OperatorId = Guid.NewGuid(),
Products = new List<ContractProductModel>
{
new ContractProductModel { ContractProductId = Guid.NewGuid(), ProductName = "Product 1" },
new ContractProductModel { ContractProductId = Guid.NewGuid(), ProductName = "Product 2" }
new ContractProductModel { ContractProductId = Guid.NewGuid(), ProductName = "Product 1", ProductType = "NotSet"},
new ContractProductModel { ContractProductId = Guid.NewGuid(), ProductName = "Product 2", ProductType = "NotSet" }
}
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ else
try
{
isLoading = true;
var result = await Mediator.Send(new ContractQueries.GetContractQuery(CorrelationIdHelper.New(), "stubbed-token", Guid.Parse("11111111-1111-1111-1111-111111111111"), ContractId));
var result = await Mediator.Send(new ContractQueries.GetContractQuery(CorrelationIdHelper.New(), Guid.Parse("11111111-1111-1111-1111-111111111111"), ContractId));

if (result.IsSuccess && result.Data != null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,40 +136,3 @@
</div>
}
</div>

@code {
[Parameter]
public Guid ContractId { get; set; }

private ContractModel? contractModel;
private bool isLoading = true;

protected override async Task OnInitializedAsync()
{
await RequirePermission(PermissionSection.Contract, PermissionFunction.View);
await LoadContract();
}

private async Task LoadContract()
{
try
{
isLoading = true;
var result = await Mediator.Send(new ContractQueries.GetContractQuery(CorrelationIdHelper.New(), "stubbed-token", Guid.Parse("11111111-1111-1111-1111-111111111111"), ContractId));

if (result.IsSuccess && result.Data != null)
{
contractModel = ModelFactory.ConvertFrom(result.Data);
}
}
finally
{
isLoading = false;
}
}

private void BackToList()
{
NavigationManager.NavigateTo("/contracts");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using EstateManagementUI.BlazorServer.Factories;
using EstateManagementUI.BlazorServer.Models;
using EstateManagementUI.BlazorServer.Permissions;
using EstateManagementUI.BusinessLogic.Requests;
using Microsoft.AspNetCore.Components;

namespace EstateManagementUI.BlazorServer.Components.Pages.Contracts
{
public partial class View
{
[Parameter]
public Guid ContractId { get; set; }

private ContractModel? contractModel;
private bool isLoading = true;

protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (!firstRender)
{
await base.OnAfterRenderAsync(firstRender);
return;
}

try
{
await RequirePermission(PermissionSection.Contract, PermissionFunction.View);
await LoadContract();
}
finally
{
isLoading = false;
this.StateHasChanged();
}
}

private async Task LoadContract()
{
try
{
isLoading = true;
var estateId = await this.GetEstateId();
var result = await Mediator.Send(new ContractQueries.GetContractQuery(CorrelationIdHelper.New(), estateId, ContractId));

if (result.IsSuccess && result.Data != null)
{
contractModel = ModelFactory.ConvertFrom(result.Data);
}
}
finally
{
isLoading = false;
}
}

private void BackToList()
{
NavigationManager.NavigateTo("/contracts");
}
}
}
7 changes: 4 additions & 3 deletions EstateManagementUI.BlazorServer/Factories/ModelFactory.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@

using EstateManagementUI.BlazorServer.Models;
using TransactionProcessor.DataTransferObjects.Responses.Contract;

namespace EstateManagementUI.BlazorServer.Factories {
public static class ModelFactory {
Expand Down Expand Up @@ -107,7 +108,7 @@ public static ContractProductModel ConvertFrom(BusinessLogic.Models.ContractProd
DisplayText = model.DisplayText,
Value = model.Value,
NumberOfFees = model.NumberOfFees,
ProductType = model.ProductType,
ProductType = Enum.Parse<ProductType>(model.ProductType),
TransactionFees = new List<ContractProductTransactionFeeModel>()
};
if (model.TransactionFees != null && model.TransactionFees.Any()) {
Expand All @@ -119,9 +120,9 @@ public static ContractProductModel ConvertFrom(BusinessLogic.Models.ContractProd

public static ContractProductTransactionFeeModel ConvertFrom(BusinessLogic.Models.ContractProductTransactionFeeModel model) {
return new ContractProductTransactionFeeModel() {
CalculationType = model.CalculationType,
CalculationType = (CalculationType)model.CalculationType,
Description = model.Description,
FeeType = model.FeeType,
FeeType = (FeeType)model.FeeType,
TransactionFeeId = model.TransactionFeeId,
Value = model.Value
};
Expand Down
8 changes: 5 additions & 3 deletions EstateManagementUI.BlazorServer/Models/Models.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using TransactionProcessor.DataTransferObjects.Responses.Contract;

namespace EstateManagementUI.BlazorServer.Models;

// Estate Models
Expand Down Expand Up @@ -96,7 +98,7 @@ public class ContractProductModel
public Guid ContractProductId { get; set; }
public string? ProductName { get; set; }
public string? DisplayText { get; set; }
public string? ProductType { get; set; }
public ProductType ProductType { get; set; }
// Changed from decimal? to string? to support displaying "Variable" for variable-value products
// This aligns with how the backend represents variable vs fixed value products
public string? Value { get; set; }
Expand All @@ -108,8 +110,8 @@ public class ContractProductTransactionFeeModel
{
public Guid TransactionFeeId { get; set; }
public string? Description { get; set; }
public Int32 CalculationType { get; set; }
public Int32 FeeType { get; set; }
public CalculationType CalculationType { get; set; }
public FeeType FeeType { get; set; }
public decimal Value { get; set; }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@

Task<Result<List<Contract>>> GetContracts(String accessToken,
Guid estateId, CancellationToken cancellationToken);

Task<Result<Contract>> GetContract(String accessToken,
Guid estateId,
Guid contractId,
CancellationToken cancellationToken);
Task<Result<TodaysSales>> GetTodaysSales(String accessToken,
Guid estateId,
Int32 merchantReportingId,
Expand Down Expand Up @@ -477,6 +482,34 @@
}
}

public async Task<Result<Contract>> GetContract(String accessToken,
Guid estateId,
Guid contractId,
CancellationToken cancellationToken)
{
String requestUri = this.BuildRequestUrl($"/api/contracts/{contractId}");

try
{
List<(String headerName, String headerValue)> additionalHeaders = [
(EstateIdHeaderName, estateId.ToString())
];
Result<Contract> result = await this.SendHttpGetRequest<Contract>(requestUri, accessToken, additionalHeaders, cancellationToken);

if (result.IsFailed)
return ResultHelpers.CreateFailure(result);

return result;
}
catch (Exception ex)
{
// An exception has occurred, add some additional information to the message
Exception exception = new Exception($"Error getting contracts for estate {estateId}.", ex);

return Result.Failure(exception.Message);
}
}

public async Task<Result<List<Contract>>> GetRecentContracts(String accessToken,
Guid estateId,
CancellationToken cancellationToken) {
Expand Down Expand Up @@ -606,24 +639,24 @@
if (alwaysInclude)
return false;

Object? defaultValue = GetDefault(value.GetType());

Check warning on line 642 in EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs

View workflow job for this annotation

GitHub Actions / Build and Unit Test

Dereference of a possibly null reference.

if (defaultValue == null && value.GetType() == typeof(String))
{
defaultValue = String.Empty;
}
return defaultValue.Equals(value);

Check warning on line 648 in EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs

View workflow job for this annotation

GitHub Actions / Build and Unit Test

Dereference of a possibly null reference.
}

public static object GetDefault(Type t)
{
Func<object> f = GetDefault<object>;
return f.Method.GetGenericMethodDefinition().MakeGenericMethod(t).Invoke(null, null);

Check warning on line 654 in EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs

View workflow job for this annotation

GitHub Actions / Build and Unit Test

Possible null reference return.
}

private static T GetDefault<T>()
{
return default(T);

Check warning on line 659 in EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs

View workflow job for this annotation

GitHub Actions / Build and Unit Test

Possible null reference return.
}

public string BuildQueryString()
Expand All @@ -644,7 +677,7 @@
queryString.Append("&");
}

queryString.Append($"{Uri.EscapeDataString(kvp.Key)}={Uri.EscapeDataString(kvp.Value.ToString())}");

Check warning on line 680 in EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs

View workflow job for this annotation

GitHub Actions / Build and Unit Test

Possible null reference argument for parameter 'stringToEscape' in 'string Uri.EscapeDataString(string stringToEscape)'.
}

return queryString.ToString();
Expand Down
68 changes: 35 additions & 33 deletions EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -329,44 +329,46 @@ public static List<ContractModel> ToContract(this List<Contract> apiResultData)
{
List<ContractModel> contracts = new();

foreach (Contract contract in apiResultData)
{
var c = new ContractModel
{
ContractId = contract.ContractId,
Description = contract.Description,
OperatorName = contract.OperatorName,
OperatorId = contract.OperatorId,
Products = new List<ContractProductModel>()
foreach (Contract contract in apiResultData) {
contracts.Add(contract.ToContract());
}

return contracts;
}

public static ContractModel ToContract(this Contract apiResultData) {
var contract = new ContractModel {
ContractId = apiResultData.ContractId,
Description = apiResultData.Description,
OperatorName = apiResultData.OperatorName,
OperatorId = apiResultData.OperatorId,
Products = new List<ContractProductModel>()
};

foreach (var contractProduct in apiResultData.Products) {
var cp = new ContractProductModel {
ProductType = ((ProductType)contractProduct.ProductType).ToString(),
Value = contractProduct.Value.HasValue ? contractProduct.Value.Value.ToString("F2") : "Variable",
DisplayText = contractProduct.DisplayText,
ProductName = contractProduct.ProductName,
ContractProductId = contractProduct.ProductId,
NumberOfFees = contractProduct.TransactionFees.Count,
TransactionFees = new List<ContractProductTransactionFeeModel>()
};

foreach (var contractProduct in contract.Products) {
var cp = new ContractProductModel {
ProductType = ((ProductType)contractProduct.ProductType).ToString(),
Value = contractProduct.Value.HasValue ? contractProduct.Value.Value.ToString("F2") : "Variable",
DisplayText = contractProduct.DisplayText,
ProductName = contractProduct.ProductName,
ContractProductId = contractProduct.ProductId,
NumberOfFees = contractProduct.TransactionFees.Count,
TransactionFees = new List<ContractProductTransactionFeeModel>()
};

foreach (ContractProductTransactionFee contractProductTransactionFee in contractProduct.TransactionFees) {
cp.TransactionFees.Add(new ContractProductTransactionFeeModel {
Value = contractProductTransactionFee.Value,
Description = contractProductTransactionFee.Description,
CalculationType = contractProductTransactionFee.CalculationType,
FeeType = contractProductTransactionFee.FeeType,
TransactionFeeId = contractProductTransactionFee.TransactionFeeId
});
}

c.Products.Add(cp);
foreach (ContractProductTransactionFee contractProductTransactionFee in contractProduct.TransactionFees) {
cp.TransactionFees.Add(new ContractProductTransactionFeeModel {
Value = contractProductTransactionFee.Value,
Description = contractProductTransactionFee.Description,
CalculationType = contractProductTransactionFee.CalculationType,
FeeType = contractProductTransactionFee.FeeType,
TransactionFeeId = contractProductTransactionFee.TransactionFeeId
});
}

contracts.Add(c);
contract.Products.Add(cp);
}

return contracts;
return contract;
}
}
19 changes: 19 additions & 0 deletions EstateManagmentUI.BusinessLogic/Client/ContractMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ Task<Result<List<ContractDropDownModel>>> GetContracts(ContractQueries.GetContra
CancellationToken cancellationToken);
Task<Result<List<ContractModel>>> GetContracts(ContractQueries.GetContractsQuery request,
CancellationToken cancellationToken);
Task<Result<ContractModel>> GetContract(ContractQueries.GetContractQuery request,
CancellationToken cancellationToken);
}

public partial class ApiClient : IApiClient {
Expand Down Expand Up @@ -68,5 +70,22 @@ public async Task<Result<List<ContractModel>>> GetContracts(ContractQueries.GetC

return Result.Success(contractModels);
}

public async Task<Result<ContractModel>> GetContract(ContractQueries.GetContractQuery request,
CancellationToken cancellationToken)
{
Result<String> token = await this.GetToken(cancellationToken);
if (token.IsFailed)
return ResultHelpers.CreateFailure(token);

Result<Contract> apiResult = await this.EstateReportingApiClient.GetContract(token.Data, request.EstateId, request.ContractId, cancellationToken);

if (apiResult.IsFailed)
return ResultHelpers.CreateFailure(apiResult);

ContractModel contractModel = apiResult.Data.ToContract();

return Result.Success(contractModel);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ public async Task<Result<List<ContractModel>>> Handle(ContractQueries.GetContrac

public async Task<Result<ContractModel>> Handle(ContractQueries.GetContractQuery request,
CancellationToken cancellationToken) {
return Result.Success(StubTestData.GetMockContract());
return await this.ApiClient.GetContract(request, cancellationToken);
}

public async Task<Result> Handle(Commands.CreateContractCommand request,
Expand Down
2 changes: 1 addition & 1 deletion EstateManagmentUI.BusinessLogic/Requests/Requests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public static class ContractQueries {
public record GetRecentContractsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest<Result<List<RecentContractModel>>>;
public record GetContractsForDropDownQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest<Result<List<ContractDropDownModel>>>;
public record GetContractsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest<Result<List<ContractModel>>>;
public record GetContractQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid ContractId) : IRequest<Result<ContractModel>>;
public record GetContractQuery(CorrelationId CorrelationId, Guid EstateId, Guid ContractId) : IRequest<Result<ContractModel>>;
}

public class OperatorQueries {
Expand Down
Loading