Class: Pdf::Document::LetterMaterials
- Inherits:
-
BaseService
- Object
- BaseService
- Pdf::Document::LetterMaterials
- Includes:
- Base
- Defined in:
- app/services/pdf/document/letter_materials.rb
Defined Under Namespace
Classes: Result
Constant Summary
Constants included from Base
Base::FONT, Base::NIMBUS_SANS_PATH, Base::NIMBUS_SANS_PATH_BOLD, Base::WY_LOGO_PATH
Instance Method Summary collapse
- #adjust_column_widths(column_widths_array, column_header_widths) ⇒ Object
- #call ⇒ Object
- #defineStyles(composer) ⇒ Object
-
#initialize(quote, options) ⇒ LetterMaterials
constructor
A new instance of LetterMaterials.
- #show_materials_only(composer) ⇒ Object
- #text_width(composer, text, font_size = 12) ⇒ Object
Constructor Details
#initialize(quote, options) ⇒ LetterMaterials
Returns a new instance of LetterMaterials.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'app/services/pdf/document/letter_materials.rb', line 7 def initialize(quote, ) @quote = quote if quote @salutation = begin quote.primary_party.name rescue StandardError nil end || begin quote.shipping_address.person_name rescue StandardError nil end || quote.customer.name @quote_recipient = begin quote.customer.full_name rescue StandardError nil end @line_grouped = quote.line_items_grouped_by_room_configuration(group_by_item_category: false) end |
Instance Method Details
#adjust_column_widths(column_widths_array, column_header_widths) ⇒ Object
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
# File 'app/services/pdf/document/letter_materials.rb', line 189 def adjust_column_widths(column_widths_array, column_header_widths) column_widths_array.each_with_index do |width, i| next if i.zero? max_column_width = column_widths_array.max max_column_index = column_widths_array.index(max_column_width) next unless width < column_header_widths[i] difference = column_header_widths[i] - width column_widths_array[i] += difference column_widths_array[max_column_index] -= difference end column_widths_array end |
#call ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'app/services/pdf/document/letter_materials.rb', line 26 def call composer = build_composer(margin: [80, 25, 50, 25]) defineStyles(composer) show_materials_only(composer) composer.document.pages.each do |page| canvas = page.canvas page_width = page.box(:media).width page_height = page.box(:media).height logo_path = Rails.public_path.join('images', 'pdf', 'new-wylogo.png').to_s support_path = Rails.public_path.join('images', 'pdf', '247.png').to_s canvas.image(logo_path, at: [17.5, page_height - 65], width: 200) canvas.composer.formatted_text( [ { text: "Materials list for ##{@quote.reference_number}\n", style: { font: FONT, font_size: 14.5, line_height: 14, fill_color: '333' } }, { text: "Job: #{@quote.opportunity.name}", style: { font: FONT, font_size: 11, line_height: 14, fill_color: '999' } } ], align: :right, padding: [20, 30], style: { text_align: :right }, width: 305 ) canvas.composer.formatted_text([ { text: @quote.company.legal_name, style: :regularNim }, { text: ' | ', style: :regularNim }, { box: [:image, support_path], height: 12, valign: :text, padding: [0, 0, -3, 0] }, { text: ' Technical Support', style: :regularNim }, { text: ' | ', style: :regularNim }, { text: '(800) 875-5285', style: :regularNim }, { text: ' | ', style: :regularNim }, { link: 'www.WarmlyYours.com/support', style: :regularNim } ], align: :center, valign: :bottom, style: { padding: [0, 0, 3, 0] }) end buffer = StringIO.new composer.write(buffer, optimize: true) Result.new(pdf: buffer.string, file_name: "materials_#{@quote.reference_number}.pdf") end |
#defineStyles(composer) ⇒ Object
162 163 164 165 166 |
# File 'app/services/pdf/document/letter_materials.rb', line 162 def defineStyles(composer) composer.style(:regularNim, font: FONT, font_size: 12) composer.style(:regularNimBold, font: "#{FONT} bold", font_size: 12) composer.style(:lineItem, font: FONT, font_size: 11) end |
#show_materials_only(composer) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'app/services/pdf/document/letter_materials.rb', line 69 def show_materials_only(composer) l = composer.document.layout defineStyles(composer) return if @line_grouped.blank? unless @quote_recipient.nil? composer.container do |container| container.text('Exclusively prepared for:', style: { font: FONT, font_size: 12, fill_color: '666' }, padding: [0, 0, 2, 0]) container.text(@quote_recipient, style: { font: FONT, font_size: 15, fill_color: '222' }, padding: [0, 0, 10, 0]) end end table_data = [] table_data << [l.text('Date:', style: :regularNimBold), l.text(Date.current.to_fs(:long), style: :regularNim)] table_data << [l.text('Contact:', style: :regularNimBold), l.text(@quote.contact.full_name, style: :regularNim)] if @quote.contact table_data << [l.text('Job Summary:', style: :regularNimBold), l.text(@quote.opportunity.summary, style: :regularNim)] if @quote.opportunity.summary.present? table_data << [l.text('Reference:', style: :regularNimBold), l.text(@quote.suffix, style: :regularNim)] if @quote.suffix.present? composer.table(table_data, column_widths: [120, 160], cell_style: { border: { width: 0 }, padding: [3, 2], font: FONT, font_size: 12, fill_color: '444' }) @line_grouped.each do |rc, line_items| next if line_items.empty? long_name = rc.is_a?(String) ? rc : rc.name_with_config plan = rc.is_a?(String) ? nil : "Plan ##{rc.reference_number}" composer.text(long_name, style: { font: FONT, font_size: 14, fill_color: '222', padding: [10, 0, 2, 0] }) composer.text(plan, style: { font: FONT, font_size: 11, fill_color: '777', padding: [0, 0, 5, 0] }) if plan table_data = [] table_data << ['Part #', 'Description', 'Qty'].map do |header| composer.document.layout.text(header, style: { font: "#{FONT} bold", font_size: 12, text_align: :center, fill_color: '333' }) end max_widths = { sku: 0, qty: 0 } LineItem.group_by_category(line_items).each do |category, category_items| table_data << [ { content: composer.document.layout.text(category.pluralize, style: { font: "#{FONT} bold", font_size: 12, fill_color: '000' }), col_span: 3 } ] category_items.each do |item| sku = item.sku.to_s qty = item.quantities_indicator_visible? ? item.quantity : '' max_widths[:sku] = [max_widths[:sku], text_width(composer, sku, 11)].max max_widths[:qty] = [max_widths[:qty], text_width(composer, qty.to_s, 11)].max table_data << [ composer.document.layout.text(sku, style: :lineItem), composer.document.layout.text(item.description || item.name, style: :lineItem), composer.document.layout.text(qty.to_s, style: { font: FONT, font_size: 11, text_align: :center }) ] next unless @show_detailed_description table_data << [ composer.document.layout.text(item.item.detailed_description_html.to_s, style: { font: FONT, font_size: 10 }), '', '' ] end end max_widths[:sku] = [max_widths[:sku], text_width(composer, 'Part #', 12)].max max_widths[:qty] = [max_widths[:qty], text_width(composer, 'Qty', 12)].max sku_col_width = max_widths[:sku].ceil + 10 qty_col_width = max_widths[:qty].ceil + 10 desc_col_width = 561 - sku_col_width - qty_col_width column_widths = [sku_col_width, desc_col_width, qty_col_width] composer.table(table_data, column_widths: column_widths, style: { font: FONT, font_size: 11 }, cell_style: { border: { width: [0.5, 0, 0, 0], color: 'CDCDCD' }, padding: [6, 4, 4, 4] }) end end |
#text_width(composer, text, font_size = 12) ⇒ Object
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'app/services/pdf/document/letter_materials.rb', line 168 def text_width(composer, text, font_size = 12) return 0 if text.nil? font_size = font_size.to_f layout = HexaPDF::Layout::TextLayouter.new layout.style.font = FONT layout.style.font_size = font_size text_fragments = composer.document.layout.text_fragments(text, style: { font: FONT, font_size: font_size }) text_box = HexaPDF::Layout::TextBox.new(items: text_fragments) frame_width = 1000 frame = HexaPDF::Layout::Frame.new(0, 1000, frame_width, 5000) result = frame.fit(text_box) result.box.width end |