Skip to content

Instantly share code, notes, and snippets.

@8vius
Created October 1, 2018 16:26
Show Gist options
  • Save 8vius/236d50ea8e08a2b8e59b2450b81facc6 to your computer and use it in GitHub Desktop.
Save 8vius/236d50ea8e08a2b8e59b2450b81facc6 to your computer and use it in GitHub Desktop.
module PdfGeneration
def pdf_options(report)
{
pdf: "report",
layout: "report_pdf",
template: "reports/show",
orientation: "Landscape",
page_size: "Letter",
print_media_type: true,
margin: { top: 12, bottom: 7, left: 5, right: 5 }
}
end
def add_marginals(doc, project: self.project, description: nil, generated_at: Time.now, portfolio: nil)
doc.number_pages(
number_format: "Page %s of #{doc.pages.size}",
location: :bottom_right,
margin_from_height: 0,
font_size: 7,
)
doc.stamp_pages(
portfolio ? "Portfolio ID: #{portfolio.id}" : "Project ID: #{project.rivur_id.first(5)}",
location: :bottom_left,
margin_from_height: 0,
font_size: 7,
)
title = portfolio ? portfolio.name.upcase : [project.name.upcase, "(#{project.corporate_entity_name})", description].compact.join(' ')
doc.stamp_pages(
title,
location: :top_left,
margin_from_height: 30,
margin_from_side: 0,
font_size: 8,
)
timestamp = Time.use_zone("America/New_York") { generated_at.strftime('%m/%d/%Y at %l:%M %p') }
doc.stamp_pages(
"Generated by Rivur.com on #{timestamp}".squeeze(' '),
location: :top_right,
margin_from_height: 30,
margin_from_side: 0,
font_size: 8,
)
doc
end
def build_draw_report(draw)
draw.project.refresh_pending_costs!
combined = CombinePDF.new
%w(ProjectCostReport AccountCodeDetailReport InvoiceRegister).each do |report_type|
self.report = Report.create(type: report_type, project: draw.project, draw: draw, created_at: draw.updated_at)
combined << CombinePDF.parse(make_pdf(pdf_options(report)))
end
draw.invoices.order(:invoice_number).each do |invoice|
[invoice.document, invoice.conditional_lien_waiver].compact.each do |document|
begin
combined << CombinePDF.parse(document.read).tap { |d| d.pages.each(&:fix_rotation) }
rescue => e
logger.error "Error processing document from invoice #{invoice.id}"
logger.error e
end
end
end
portrait = combined.pages.select { |p| p.orientation == :portrait }
portrait.each { |p| p.rotate_left }
add_marginals(combined, project: draw.project, description: "Draw #{draw.number}")
portrait.each { |p| p.rotate_right }
combined.to_pdf
end
def build_portfolio_report(portfolio)
self.report = portfolio.portfolio_cost_reports.last
pdf = make_pdf(pdf_options(report))
add_marginals(
CombinePDF.parse(pdf),
project: nil,
portfolio: portfolio,
generated_at: report.created_at
).to_pdf
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment