コード例 #1
0
        private static void ValidateEndorsements(int billId, IReadOnlyList <EndorsementDto> endorsements,
                                                 BillOfExchange bill)
        {
            int endorsementCount = endorsements.Count();

            for (var a = 0; a < endorsementCount; a++)
            {
                EndorsementDto endorsementDto = endorsements[a];
                if (a == 0 && endorsementDto.NewBeneficiaryId == bill.BeneficiaryId)
                {
                    throw new BillIssuedToItselfException(
                              $"First endorsement for bill id: {billId} has same new beneficiary id as bill's beneficiary id: {bill.BeneficiaryId}.");
                }

                if ((a + 1 < endorsementCount) &&
                    (endorsementDto.NewBeneficiaryId == endorsements[a + 1].NewBeneficiaryId))
                {
                    throw new BillIssuedToItselfException(
                              $"There are two endorsements for bill id: {billId} that has same new beneficiary id: {bill.BeneficiaryId}.");
                }

                if (endorsementDto.PreviousEndorsementId != null &&
                    endorsementDto.PreviousEndorsementId > endorsementDto.Id)
                {
                    throw new CantReferenceOldEndorsementsException(
                              $"Endorsement for bill id: {billId} references older endorsement.");
                }
            }

            if (endorsements.Count(a => a.PreviousEndorsementId == null) > 1)
            {
                throw new MoreThanOnePreviousEndorsementIsNotSetException(
                          $"Endorsements for bill id: {billId} has more than one cases where previous endorsement is not set.");
            }
        }
        public HttpResponseMessage GetEndorsement([FromBody] EndorsementDto endorsement)
        {
            if (endorsement == null)
            {
                return(ReturnErrorResponseMessage(HttpStatusCode.BadRequest, "Endorsement payload is invalid"));
            }

            try
            {
                _logger.LogTrace("GetEndorsement :: GetPath started.");
                var endorsementPath = _generateDocumentService.GenerateEndorsement(endorsement);
                _logger.LogTrace("GetEndorsement :: GetPath done. :: EndorsementPath :: " + endorsementPath);

                if (string.IsNullOrWhiteSpace(endorsementPath))
                {
                    _logger.LogTrace("GetEndorsement :: EndorsementPath is null or empty.");
                    return(ReturnErrorResponseMessage(HttpStatusCode.InternalServerError, "Endorsement generation failed :: TemplateUrl: " + endorsement.TemplatePdfUrl + " :: EmptyParse: " + endorsement.ParseEmptyText));
                }

                if (_fileService.IsValidPdf(endorsementPath) == false)
                {
                    _logger.LogTrace("GetEndorsement :: EndorsementPath is invalid pdf::" + endorsementPath);
                    return(ReturnErrorResponseMessage(HttpStatusCode.InternalServerError, "Endorsement generation failed :: invalid pdf :: TemplateUrl: " + endorsement.TemplatePdfUrl + " :: EmptyParse: " + endorsement.ParseEmptyText));
                }

                HttpResponseMessage response = new HttpResponseMessage
                {
                    StatusCode = HttpStatusCode.OK
                };

                _logger.LogTrace("GetEndorsement :: Get memomry stream from endorsment at ." + endorsementPath);

                var responseStream = _fileService.GetMemoryStream(endorsementPath);

                _logger.LogTrace("GetEndorsement :: Get memomry stream done .");

                response.Content = new StreamContent(responseStream);

                return(response);
            }
            catch (IOException ex)
            {
                _logger.LogException(ex);
                var errorResponse = ReturnErrorResponseMessage(HttpStatusCode.InternalServerError, ex.Message + "::InnerException::" + ex.InnerException?.Message + " :: TemplateUrl: " + endorsement.TemplatePdfUrl);
                throw new HttpResponseException(errorResponse);
            }
            catch (Exception ex)
            {
                _logger.LogException(ex);
                var errorResponse = ReturnErrorResponseMessage(HttpStatusCode.InternalServerError, ex.Message + "::InnerException::" + ex.InnerException?.Message + " :: TemplateUrl: " + endorsement.TemplatePdfUrl);
                throw new HttpResponseException(errorResponse);
            }
        }
        public string GenerateEndorsement(EndorsementDto endorsement)
        {
            if (endorsement == null)
            {
                return(null);
            }

            _logger.LogTrace("GenerateEndorsement invoked. ");

            var templatePath = GetResource(endorsement.TemplatePdfUrl, EndorsementConstant.S_TEMPLATE_PDF_PATH);

            _logger.LogTrace("GetResource done. TemplatePath: " + templatePath);

            if (!File.Exists(templatePath))
            {
                _logger.LogTrace("Endorsement file does not exist at path: " + templatePath);
                throw new Exception("Template pdf file not exists! :: Path: " + templatePath + " :: templatePdfUrl: " + endorsement.TemplatePdfUrl);
            }

            if (_fileService.IsValidPdf(templatePath) == false)
            {
                _logger.LogTrace("IsValidPdf is false :: TemplatePath: " + templatePath);
                throw new Exception("Template pdf file is invalid! :: Path: " + templatePath + " :: templatePdfUrl: " + endorsement.TemplatePdfUrl);
            }

            var filename          = string.Empty;
            var folderEndorsement = string.Empty;
            var endorsementPath   = string.Empty;

            _logger.LogTrace("Endorsement is set to parseemptytext: " + endorsement.ParseEmptyText);

            if (endorsement.ParseEmptyText)
            {
                filename = string.Format(CertificateConstant.S_DOCUMENT_FILENAME_EMPTY_FORMAT, EndorsementConstant.S_DOCUMENT_FILENAME_EMPTY, endorsement.EndorsementCode);

                _logger.LogTrace("Empty Endorsement filename: " + filename);

                folderEndorsement = HttpContext.Current.Server.MapPath(EndorsementConstant.S_OUTPUT_PATH_EMPTY);

                _logger.LogTrace("Empty Endorsement folder: " + folderEndorsement);

                endorsementPath = folderEndorsement + filename;

                _logger.LogTrace("Empty Endorsement path: " + endorsementPath);

                //Cleanup once a week.
                CleanUpFile(folderEndorsement, TimeSpan.FromDays(7));

                if (File.Exists(endorsementPath))
                {
                    _logger.LogTrace("Empty Endorsement exists already. Return path. " + endorsementPath);
                    return(endorsementPath);
                }
            }
            else
            {
                filename = _fileService.GetFileName("endorsement", endorsement.ApplicationId, endorsement.ProductId);

                _logger.LogTrace("Endorsement file: " + filename);

                folderEndorsement = HttpContext.Current.Server.MapPath(EndorsementConstant.S_OUTPUT_PATH);

                _logger.LogTrace("Endorsement folder: " + folderEndorsement);

                CleanUpFile(folderEndorsement, TimeSpan.FromDays(1));
                endorsementPath = folderEndorsement + filename;

                _logger.LogTrace("Endorsement path: " + endorsementPath);
            }

            if (File.Exists(endorsementPath))
            {
                File.Delete(endorsementPath);
                _logger.LogTrace("Endorsement exists already. Delete file. " + endorsementPath);
            }

            var reader  = new PdfReader(templatePath);
            var stamper = new PdfStamper(reader, new FileStream(endorsementPath, FileMode.Create));

            try
            {
                _logger.LogTrace("Parse actual pdf document start. ");
                stamper.SetEncryption(PdfWriter.STRENGTH128BITS, string.Empty, endorsement.PdfPassword, PdfWriter.AllowPrinting | PdfWriter.AllowCopy | PdfWriter.AllowScreenReaders);
                var pdfFormFields   = stamper.AcroFields;
                var imageExtensions = new string[] { EndorsementConstant.S_IMAGE_FILE_EXTENSION_PNG, EndorsementConstant.S_IMAGE_FILE_EXTENSION_JPG };

                if (endorsement.VariableValues != null)
                {
                    foreach (var variableValue in endorsement.VariableValues)
                    {
                        if (imageExtensions.Contains(Path.GetExtension(variableValue.Value)))
                        {
                            var signatureFile = GetResource(variableValue.Value, EndorsementConstant.S_SIGNATURE_IMAGE_PATH);

                            if (!string.IsNullOrWhiteSpace(signatureFile))
                            {
                                stamper.SetImage(variableValue.Key, signatureFile);
                            }
                        }
                        else
                        {
                            pdfFormFields.SetField(variableValue.Key, variableValue.Value);
                        }
                    }
                }

                _logger.LogTrace("Parse actual pdf document done.");

                return(endorsementPath);
            }
            catch (Exception exception)
            {
                _logger.LogException(exception);
                throw;
            }
            finally
            {
                // flatten form fields and close document
                stamper.FormFlattening = true;
                stamper.Close();
                stamper.Dispose();
                reader.Close();
                reader.Dispose();
            }
        }