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 @@ -60,5 +60,22 @@ public void MerchantStatementRequestHandler_AddSettledFeeToMerchantStatementRequ
});

}

[Fact]
public void MerchantStatementRequestHandler_GenerateMerchantStatementRequest_IsHandled()
{
Mock<IMerchantStatementDomainService> merchantDomainService = new Mock<IMerchantStatementDomainService>(MockBehavior.Strict);
merchantDomainService.Setup(m => m.GenerateStatement(It.IsAny<Guid>(), It.IsAny<Guid>(), It.IsAny<DateTime>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(TestData.MerchantStatementId);
MerchantStatementRequestHandler handler = new MerchantStatementRequestHandler(merchantDomainService.Object);

GenerateMerchantStatementRequest request = TestData.GenerateMerchantStatementRequest;

Should.NotThrow(async () =>
{
await handler.Handle(request, CancellationToken.None);
});

}
}
}
13 changes: 13 additions & 0 deletions EstateManagement.BusinessLogic.Tests/Requests/RequestsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -289,5 +289,18 @@ public void AddSettledFeeToMerchantStatementRequest_CanBeCreated_IsCreated()
addSettledFeeToMerchantStatementRequest.EstateId.ShouldBe(TestData.EstateId);
addSettledFeeToMerchantStatementRequest.MerchantId.ShouldBe(TestData.MerchantId);
}

[Fact]
public void GenerateMerchantStatementRequest_CanBeCreated_IsCreated()
{
GenerateMerchantStatementRequest generateMerchantStatementRequest = GenerateMerchantStatementRequest.Create(TestData.EstateId,
TestData.MerchantId,
TestData.StatementCreateDate);

generateMerchantStatementRequest.ShouldNotBeNull();
generateMerchantStatementRequest.EstateId.ShouldBe(TestData.EstateId);
generateMerchantStatementRequest.MerchantId.ShouldBe(TestData.MerchantId);
generateMerchantStatementRequest.StatementDate.ShouldBe(TestData.StatementCreateDate);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -234,5 +234,31 @@ await merchantStatementDomainService.AddSettledFeeToStatement(TestData.EstateId,
statementLines.ShouldNotBeEmpty();
statementLines.Count.ShouldBe(1);
}

[Fact]
public async Task MerchantStatementDomainService_GenerateStatement_StatementGenerated()
{
Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>> merchantAggregateRepository =
new Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>>();

MerchantStatementAggregate merchantStatementAggregate = TestData.MerchantStatementAggregateWithTransactionLineAndSettledFeeAdded();

Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>> merchantStatementAggregateRepository =
new Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>>();
merchantStatementAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(merchantStatementAggregate);
MerchantStatementDomainService merchantStatementDomainService =
new MerchantStatementDomainService(merchantAggregateRepository.Object, merchantStatementAggregateRepository.Object);

Should.NotThrow(async () =>
{
await merchantStatementDomainService.GenerateStatement(TestData.EstateId,
TestData.MerchantId,
TestData.StatementCreateDate,
CancellationToken.None);
});

var merchantStatement = merchantStatementAggregate.GetStatement(false);
merchantStatement.IsGenerated.ShouldBeTrue();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
namespace EstateManagement.BusinessLogic.RequestHandlers
{
using System;
using System.Threading;
using System.Threading.Tasks;
using MediatR;
Expand All @@ -12,7 +13,9 @@
/// <seealso cref="MediatR.IRequestHandler&lt;EstateManagement.BusinessLogic.Requests.AddTransactionToMerchantStatementRequest&gt;" />
/// <seealso cref="MediatR.IRequestHandler&lt;EstateManagement.BusinessLogic.Requests.AddSettledFeeToMerchantStatementRequest&gt;" />
/// <seealso cref="MediatR.IRequestHandler&lt;EstateManagement.BusinessLogic.Requests.AddTransactionToMerchantStatementRequest&gt;" />
public class MerchantStatementRequestHandler : IRequestHandler<AddTransactionToMerchantStatementRequest>, IRequestHandler<AddSettledFeeToMerchantStatementRequest>
public class MerchantStatementRequestHandler : IRequestHandler<AddTransactionToMerchantStatementRequest>,
IRequestHandler<AddSettledFeeToMerchantStatementRequest>,
IRequestHandler<GenerateMerchantStatementRequest, Guid>
{
#region Fields

Expand Down Expand Up @@ -79,5 +82,11 @@ await this.MerchantStatementDomainService.AddSettledFeeToStatement(request.Estat
}

#endregion

public async Task<Guid> Handle(GenerateMerchantStatementRequest request,
CancellationToken cancellationToken)
{
return await this.MerchantStatementDomainService.GenerateStatement(request.EstateId, request.MerchantId, request.StatementDate, cancellationToken);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
namespace EstateManagement.BusinessLogic.Requests
{
using System;
using MediatR;

public class GenerateMerchantStatementRequest : IRequest<Guid>
{
#region Constructors

/// <summary>
/// Initializes a new instance of the <see cref="GenerateMerchantStatementRequest" /> class.
/// </summary>
/// <param name="estateId">The estate identifier.</param>
/// <param name="merchantId">The merchant identifier.</param>
/// <param name="statementDate">The statement date.</param>
private GenerateMerchantStatementRequest(Guid estateId,
Guid merchantId,
DateTime statementDate)
{
this.EstateId = estateId;
this.MerchantId = merchantId;
this.StatementDate = statementDate;
}

#endregion

#region Properties

/// <summary>
/// Gets the estate identifier.
/// </summary>
/// <value>
/// The estate identifier.
/// </value>
public Guid EstateId { get; }

/// <summary>
/// Gets the merchant identifier.
/// </summary>
/// <value>
/// The merchant identifier.
/// </value>
public Guid MerchantId { get; }

/// <summary>
/// Gets the statement date time.
/// </summary>
/// <value>
/// The statement date time.
/// </value>
public DateTime StatementDate { get; }

#endregion

#region Methods

/// <summary>
/// Creates the specified merchant statement identifier.
/// </summary>
/// <param name="estateId">The estate identifier.</param>
/// <param name="merchantId">The merchant identifier.</param>
/// <param name="statementDate">The statement date.</param>
/// <returns></returns>
public static GenerateMerchantStatementRequest Create(Guid estateId,
Guid merchantId,
DateTime statementDate)
{
return new GenerateMerchantStatementRequest(estateId, merchantId, statementDate);
}

#endregion
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,19 @@ Task AddSettledFeeToStatement(Guid estateId,
Guid settledFeeId,
CancellationToken cancellationToken);

/// <summary>
/// Generates the statement.
/// </summary>
/// <param name="estateId">The estate identifier.</param>
/// <param name="merchantId">The merchant identifier.</param>
/// <param name="statementDate">The statement date.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
Task<Guid> GenerateStatement(Guid estateId,
Guid merchantId,
DateTime statementDate,
CancellationToken cancellationToken);

#endregion
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,29 @@ public async Task AddSettledFeeToStatement(Guid estateId,
await this.MerchantStatementAggregateRepository.SaveChanges(merchantStatementAggregate, cancellationToken);
}

/// <summary>
/// Generates the statement.
/// </summary>
/// <param name="estateId">The estate identifier.</param>
/// <param name="merchantId">The merchant identifier.</param>
/// <param name="statementDate">The statement date.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
public async Task<Guid> GenerateStatement(Guid estateId,
Guid merchantId,
DateTime statementDate,
CancellationToken cancellationToken)
{
MerchantStatementAggregate merchantStatementAggregate =
await this.MerchantStatementAggregateRepository.GetLatestVersion(statementDate.ToGuid(), cancellationToken);

merchantStatementAggregate.GenerateStatement(DateTime.Now);

await this.MerchantStatementAggregateRepository.SaveChanges(merchantStatementAggregate, cancellationToken);

return merchantStatementAggregate.AggregateId;
}

/// <summary>
/// Adds the transaction to statement.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace EstateManagement.DataTransferObjects.Requests
{
using System;
using Newtonsoft.Json;

public class GenerateMerchantStatementRequest
{
#region Properties

/// <summary>
/// Gets or sets the statement date.
/// </summary>
/// <value>
/// The statement date.
/// </value>
[JsonProperty("merchant_statement_date")]
public DateTime MerchantStatementDate { get; set; }

#endregion
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace EstateManagement.DataTransferObjects.Responses
{
using System;
using Newtonsoft.Json;

public class GenerateMerchantStatementResponse
{
[JsonProperty("merchant_statement_id")]
public Guid MerchantStatementId { get; set; }
[JsonProperty("merchant_id")]
public Guid MerchantId { get; set; }
[JsonProperty("estate_id")]
public Guid EstateId { get; set; }
}
}
25 changes: 25 additions & 0 deletions EstateManagement.Testing/TestData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1118,6 +1118,9 @@ public static ContractAggregate CreatedContractAggregateWithAProductAndTransacti
TestData.TransactionId1,
TestData.SettledFeeId1);

public static GenerateMerchantStatementRequest GenerateMerchantStatementRequest =
GenerateMerchantStatementRequest.Create(TestData.EstateId, TestData.MerchantId, TestData.StatementCreateDate);

public static MerchantStatementAggregate CreatedMerchantStatementAggregate()
{
MerchantStatementAggregate merchantStatementAggregate = MerchantStatementAggregate.Create(TestData.MerchantStatementId);
Expand All @@ -1141,6 +1144,28 @@ public static MerchantStatementAggregate MerchantStatementAggregateWithTransacti

return merchantStatementAggregate;
}

public static MerchantStatementAggregate MerchantStatementAggregateWithTransactionLineAndSettledFeeAdded()
{
MerchantStatementAggregate merchantStatementAggregate = MerchantStatementAggregate.Create(TestData.MerchantStatementId);
merchantStatementAggregate.CreateStatement(TestData.EstateId, TestData.MerchantId,
TestData.StatementCreateDate);
merchantStatementAggregate.AddTransactionToStatement(new Transaction
{
Amount = TestData.TransactionAmount1.Value,
DateTime = TestData.TransactionDateTime1,
TransactionId = TestData.TransactionId1
});
merchantStatementAggregate.AddSettledFeeToStatement(new SettledFee
{
Amount = TestData.SettledFeeAmount1,
DateTime = TestData.SettledFeeDateTime1,
SettledFeeId = TestData.SettledFeeId1,
TransactionId = TestData.TransactionId1
});

return merchantStatementAggregate;
}
}


Expand Down
5 changes: 4 additions & 1 deletion EstateManagement/Common/Examples/ExampleData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ namespace EstateManagement.Common.Examples
internal static class ExampleData
{
internal static String BalanceHistoryReference = "Example Reference";

internal static Decimal BalanceHistoryChangeAmount = 100.00m;
internal static DateTime BalanceHistoryEntryDateTime = new DateTime(2021, 4, 13, 17, 5, 0);
internal static Guid EventId = Guid.Parse("4A696C27-6517-4EB1-B3BF-20B3AF632159");
Expand Down Expand Up @@ -102,5 +101,9 @@ internal static class ExampleData
internal static Decimal? ProductValue = 10.00m;

internal static String MerchantName = "Example Merchant";

internal static DateTime MerchantStatementDateTime = new DateTime(2021, 4, 13, 17, 5, 0);

internal static Guid MerchantStatementId = Guid.Parse("5B56D47F-11BA-4B81-98C6-EB376FAA4B3E");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
namespace EstateManagement.Common.Examples
{
using System.Diagnostics.CodeAnalysis;
using DataTransferObjects.Requests;
using Swashbuckle.AspNetCore.Filters;

[ExcludeFromCodeCoverage]
public class GenerateMerchantStatementRequestExample : IExamplesProvider<GenerateMerchantStatementRequest>
{
public GenerateMerchantStatementRequest GetExamples()
{
return new GenerateMerchantStatementRequest
{
MerchantStatementDate = ExampleData.MerchantStatementDateTime
};
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace EstateManagement.Common.Examples
{
using System.Diagnostics.CodeAnalysis;
using DataTransferObjects.Responses;
using Swashbuckle.AspNetCore.Filters;

[ExcludeFromCodeCoverage]
public class GenerateMerchantStatementResponseExample : IExamplesProvider<GenerateMerchantStatementResponse>
{
public GenerateMerchantStatementResponse GetExamples()
{
return new GenerateMerchantStatementResponse
{
EstateId = ExampleData.EstateId,
MerchantId = ExampleData.MerchantId,
MerchantStatementId = ExampleData.MerchantStatementId
};
}
}
}
Loading