@@ -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