mirror of https://github.com/docusealco/docuseal
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							63 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							63 lines
						
					
					
						
							1.6 KiB
						
					
					
				| # frozen_string_literal: true
 | |
| 
 | |
| module Submissions
 | |
|   module GenerateCombinedAttachment
 | |
|     module_function
 | |
| 
 | |
|     def call(submitter)
 | |
|       pdf = build_combined_pdf(submitter)
 | |
| 
 | |
|       submission = submitter.submission
 | |
|       account = submission.account
 | |
| 
 | |
|       pkcs = Accounts.load_signing_pkcs(account)
 | |
|       tsa_url = Accounts.load_timeserver_url(account)
 | |
| 
 | |
|       io = StringIO.new
 | |
| 
 | |
|       pdf.trailer.info[:Creator] = "#{Docuseal.product_name} (#{Docuseal::PRODUCT_URL})"
 | |
| 
 | |
|       sign_params = {
 | |
|         reason: sign_reason,
 | |
|         **Submissions::GenerateResultAttachments.build_signing_params(pkcs, tsa_url)
 | |
|       }
 | |
| 
 | |
|       pdf.sign(io, **sign_params)
 | |
| 
 | |
|       ActiveStorage::Attachment.create!(
 | |
|         blob: ActiveStorage::Blob.create_and_upload!(
 | |
|           io: StringIO.new(io.string), filename: "#{submission.template.name}.pdf"
 | |
|         ),
 | |
|         name: 'combined_document',
 | |
|         record: submission
 | |
|       )
 | |
|     end
 | |
| 
 | |
|     def build_combined_pdf(submitter)
 | |
|       pdfs_index = Submissions::GenerateResultAttachments.generate_pdfs(submitter)
 | |
| 
 | |
|       audit_trail = Submissions::GenerateAuditTrail.build_audit_trail(submitter.submission)
 | |
| 
 | |
|       audit_trail.dispatch_message(:complete_objects)
 | |
| 
 | |
|       result = HexaPDF::Document.new
 | |
| 
 | |
|       submitter.submission.template_schema.each do |item|
 | |
|         pdf = pdfs_index[item['attachment_uuid']]
 | |
| 
 | |
|         pdf.dispatch_message(:complete_objects)
 | |
| 
 | |
|         pdf.pages.each { |page| result.pages << result.import(page) }
 | |
|       end
 | |
| 
 | |
|       audit_trail.pages.each { |page| result.pages << result.import(page) }
 | |
| 
 | |
|       result
 | |
|     end
 | |
| 
 | |
|     def sign_reason
 | |
|       'Signed with DocuSeal.co'
 | |
|     end
 | |
|   end
 | |
| end
 |