Skip to content

Commit e037140

Browse files
Merge pull request #1718 from TransactionProcessing/refactor/#1666_reduce_complexity_in_buildstatement
Refactor BuildStatement with improved validation and flow
2 parents 06db5f6 + 232f646 commit e037140

1 file changed

Lines changed: 64 additions & 1 deletion

File tree

TransactionProcessor.BusinessLogic/Services/MerchantStatementDomainService.cs

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ static String EncodeTo64(String toEncode)
258258
return returnValue;
259259
}
260260

261-
public async Task<Result> BuildStatement(MerchantStatementCommands.BuildMerchantStatementCommand command,
261+
/*public async Task<Result> BuildStatement(MerchantStatementCommands.BuildMerchantStatementCommand command,
262262
CancellationToken cancellationToken) {
263263
try {
264264
// Work out the next statement date
@@ -300,6 +300,69 @@ public async Task<Result> BuildStatement(MerchantStatementCommands.BuildMerchant
300300
catch (Exception ex) {
301301
return Result.Failure(ex.GetExceptionMessages());
302302
}
303+
}*/
304+
305+
public async Task<Result> BuildStatement(MerchantStatementCommands.BuildMerchantStatementCommand command,
306+
CancellationToken cancellationToken)
307+
{
308+
try
309+
{
310+
Result<MerchantStatementAggregate> statementAggregate = await GetStatementAggregate(command, cancellationToken);
311+
if (statementAggregate.IsFailed) return ResultHelpers.CreateFailure(statementAggregate);
312+
313+
Result<Merchant> merchant = await GetValidMerchant(statementAggregate.Data, cancellationToken);
314+
if (merchant.IsFailed) return ResultHelpers.CreateFailure(merchant);
315+
316+
Result<String> htmlResult = await this.StatementBuilder.GetStatementHtml(statementAggregate.Data, merchant.Data, cancellationToken);
317+
if (htmlResult.IsFailed) return ResultHelpers.CreateFailure(htmlResult);
318+
319+
String base64 = EncodeTo64(htmlResult.Data);
320+
321+
Result buildResult = statementAggregate.Data.BuildStatement(DateTime.Now, base64);
322+
if (buildResult.IsFailed) return buildResult;
323+
324+
Result saveResult = await this.AggregateService.Save(statementAggregate.Data, cancellationToken);
325+
if (saveResult.IsFailed) return saveResult;
326+
327+
return Result.Success();
328+
}
329+
catch (Exception ex)
330+
{
331+
return Result.Failure(ex.GetExceptionMessages());
332+
}
333+
}
334+
335+
private async Task<Result<MerchantStatementAggregate>> GetStatementAggregate(MerchantStatementCommands.BuildMerchantStatementCommand command,
336+
CancellationToken ct)
337+
{
338+
return await DomainServiceHelper.GetAggregateOrFailure(
339+
c => this.AggregateService.GetLatest<MerchantStatementAggregate>(command.MerchantStatementId, c),
340+
command.MerchantStatementId,
341+
ct);
342+
}
343+
344+
private async Task<Result<Merchant>> GetValidMerchant(MerchantStatementAggregate statementAggregate,
345+
CancellationToken ct)
346+
{
347+
MerchantStatement statement = statementAggregate.GetStatement();
348+
349+
Result<MerchantAggregate> merchantResult = await DomainServiceHelper.GetAggregateOrFailure(
350+
c => this.AggregateService.Get<MerchantAggregate>(statement.MerchantId, c),
351+
statement.MerchantId,
352+
ct);
353+
354+
if (merchantResult.IsFailed)
355+
return ResultHelpers.CreateFailure(merchantResult);
356+
357+
if (!merchantResult.Data.IsCreated)
358+
return Result.Invalid("Merchant must be created to build a statement");
359+
360+
Merchant merchant = merchantResult.Data.GetMerchant();
361+
362+
if (!merchant.Addresses.Any())
363+
return Result.Invalid("Merchant must have an address to build a statement");
364+
365+
return Result.Success(merchant);
303366
}
304367

305368
public async Task<Result> RecordActivityDateOnMerchantStatement(MerchantStatementCommands.RecordActivityDateOnMerchantStatementCommand command,

0 commit comments

Comments
 (0)