initial commit
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Submissions
|
||||
module GenerateResultAttachments
|
||||
module_function
|
||||
|
||||
def call(submission)
|
||||
zip_file = Tempfile.new
|
||||
zip_stream = Zip::ZipOutputStream.open(zip_file)
|
||||
|
||||
submission.flow.schema.map do |item|
|
||||
document = submission.flow.documents.find { |e| e.uuid == item['attachment_uuid'] }
|
||||
field_area_index = Flows.build_field_areas_index(submission.flow)
|
||||
|
||||
document.open do |tempfile|
|
||||
pdf = CombinePDF.load(tempfile.path)
|
||||
|
||||
pdf.pages.each_with_index do |page, index|
|
||||
blocks = field_area_index.dig(document.uuid, index)
|
||||
|
||||
next if blocks.blank?
|
||||
|
||||
scale = page.page_size[2] / 1400.0
|
||||
|
||||
blocks.each do |block|
|
||||
area, field = block.values_at(:area, :field)
|
||||
page.textbox(submission.values[field['uuid']],
|
||||
x: (area['x'] * scale) - 10,
|
||||
y: page.page_size[2] - (area['y'] * scale) + 150,
|
||||
width: area['w'] * scale,
|
||||
height: area['h'] * scale)
|
||||
end
|
||||
end
|
||||
|
||||
string = pdf.to_pdf
|
||||
io = StringIO.new(string)
|
||||
|
||||
zip_stream.put_next_entry("#{item['name']}.pdf")
|
||||
zip_stream.write(string)
|
||||
|
||||
ActiveStorage::Attachment.create!(
|
||||
blob: ActiveStorage::Blob.create_and_upload!(
|
||||
io:, filename: "#{item['name']}.pdf"
|
||||
),
|
||||
name: 'documents',
|
||||
record: submission
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
zip_stream.close
|
||||
|
||||
submission.archive.attach(io: zip_file, filename: 'submission.zip')
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user