Ejemplo n.º 1
0
        public async Task <Result> Handle(GenerateDeliveryBatchFormsCommand request, CancellationToken token)
        {
            var deliveryBatch = await _context.DeliveryBatches.SingleOrDefaultAsync(d => d.Id == request.DeliveryBatchId, token);

            if (deliveryBatch == null)
            {
                return(Result.Failure($"DeliveryBatch {request.DeliveryBatchId} was not found."));
            }

            var             outputDocument = new PdfDocument();
            Result <byte[]> blobResult     = null;

            foreach (var delivery in deliveryBatch.Deliveries)
            {
                blobResult = await _blobService.DownloadDeliveryAsync(delivery.DeliveryFormUrl, token);

                if (!blobResult.Succeeded)
                {
                    break;
                }

                using (var stream = new MemoryStream(blobResult.Data))
                {
                    var inputDocument = PdfReader.Open(stream, PdfDocumentOpenMode.Import);
                    for (var idx = 0; idx < inputDocument.PageCount; idx++)
                    {
                        var page = inputDocument.Pages[idx];
                        outputDocument.AddPage(page);
                    }
                }
            }

            if (!blobResult.Succeeded)
            {
                return(Failure(blobResult));
            }

            outputDocument.Info.Subject = $"{deliveryBatch.Name} du {deliveryBatch.ScheduledOn:yyyyMMdd}";

            using (var stream = new MemoryStream())
            {
                outputDocument.Save(stream);
                var result = await _blobService.UploadProducerDeliveryBatchAsync(deliveryBatch.AssignedToId,
                                                                                 deliveryBatch.Id, $"{deliveryBatch.Name}_{deliveryBatch.ScheduledOn:yyyyMMdd}.pdf", stream.ToArray(), token);

                if (!result.Succeeded)
                {
                    return(Failure(result));
                }

                deliveryBatch.SetDeliveryFormsUrl(result.Data);
                await _context.SaveChangesAsync(token);
            }

            return(Success());
        }