class GroupOrderInvoicePdf < RenderPdf def filename I18n.t('documents.group_order_invoice_pdf.filename', :number => @options[:invoice_number]) + '.pdf' end def title I18n.t('documents.group_order_invoice_pdf.title', :supplier => @options[:supplier]) end def body contact = FoodsoftConfig[:contact].symbolize_keys ordergroup = @options[:ordergroup] # From paragraph bounding_box [margin_box.right - 200, margin_box.top - 20], width: 200 do text I18n.t('documents.group_order_invoice_pdf.invoicer') move_down 7 text FoodsoftConfig[:name], size: fontsize(9), align: :left move_down 5 text contact[:street], size: fontsize(9), align: :left move_down 5 text "#{contact[:zip_code]} #{contact[:city]}", size: fontsize(9), align: :left move_down 5 if contact[:phone].present? text "#{Supplier.human_attribute_name :phone}: #{contact[:phone]}", size: fontsize(9), align: :left move_down 5 end text "#{Supplier.human_attribute_name :email}: #{contact[:email]}", size: fontsize(9), align: :left if contact[:email].present? move_down 5 text I18n.t('documents.group_order_invoice_pdf.tax_number', :number => @options[:tax_number]), size: fontsize(9), align: :left end # Receiving Ordergroup bounding_box [margin_box.left, margin_box.top - 20], width: 200 do text I18n.t('documents.group_order_invoice_pdf.invoicee') move_down 7 text I18n.t('documents.group_order_invoice_pdf.ordergroup.name', ordergroup: ordergroup.name.to_s), size: fontsize(9) move_down 5 if ordergroup.contact_address.present? text I18n.t('documents.group_order_invoice_pdf.ordergroup.contact_address', contact_address: ordergroup.contact_address.to_s), size: fontsize(9) move_down 5 end if ordergroup.contact_phone.present? text I18n.t('documents.group_order_invoice_pdf.ordergroup.contact_phone', contact_phone: ordergroup.contact_phone.to_s), size: fontsize(9) move_down 5 end if ordergroup.customer_number.present? text I18n.t('documents.group_order_invoice_pdf.ordergroup.customer_number', customer_number: ordergroup.customer_number.to_s), size: fontsize(9) move_down 5 end end # invoice Date and nnvoice number bounding_box [margin_box.right - 200, margin_box.top - 150], width: 200 do text I18n.t('documents.group_order_invoice_pdf.invoice_date', invoice_date: @options[:invoice_date].strftime(I18n.t('date.formats.default'))), align: :left move_down 5 text I18n.t('documents.group_order_invoice_pdf.invoice_number', invoice_number: @options[:invoice_number]), align: :left end move_down 15 # kind of the "body" of the invoice text I18n.t('documents.group_order_invoice_pdf.payment_method', payment_method: @options[:payment_method]) move_down 15 text I18n.t('documents.group_order_invoice_pdf.table_headline') move_down 5 #------------- Table Data ----------------------- @group_order = GroupOrder.find(@options[:group_order].id) if FoodsoftConfig[:group_order_invoices][:vat_exempt] body_for_vat_exempt else body_with_vat end end def body_for_vat_exempt total_gross = 0 data = [I18n.t('documents.group_order_invoice_pdf.vat_exempt_rows')] move_down 10 group_order_articles = GroupOrderArticle.where(group_order_id: @group_order.id) separate_deposits = FoodsoftConfig[:group_order_invoices]&.[](:separate_deposits) group_order_articles.each do |goa| # if no unit is received, nothing is to be charged next if goa.result.to_i == 0 goa_total_price = separate_deposits ? goa.total_price_without_deposit : goa.total_price data << [goa.order_article.article.name, goa.result.to_i, number_to_currency(goa.order_article.price.fc_price_without_deposit), number_to_currency(goa_total_price)] total_gross += goa_total_price next unless separate_deposits && goa.order_article.price.deposit > 0.0 goa_total_deposit = goa.result * goa.order_article.price.fc_deposit_price data << ["zzgl. Pfand", goa.result.to_i, number_to_currency(goa.order_article.article.fc_deposit_price), number_to_currency(goa_total_deposit)] total_gross += goa_total_deposit end table data, position: :left, cell_style: { size: fontsize(8), overflow: :shrink_to_fit } do |table| table.header = true table.position = :center table.cells.border_width = 1 table.cells.border_color = '666666' table.row(0).column(1).width = 40 table.row(0).border_bottom_width = 2 table.columns(1).align = :right table.columns(1..6).align = :right end move_down 5 sum = [] sum << [nil, nil, I18n.t('documents.group_order_invoice_pdf.sum_to_pay'), number_to_currency(total_gross)] # table for sum indent(200) do table sum, position: :center, cell_style: { size: fontsize(8), overflow: :shrink_to_fit } do |table| sum.length.times do |count| table.row(count).columns(0..3).borders = [] end table.row(sum.length - 1).columns(0..2).borders = [] table.row(sum.length - 1).border_bottom_width = 2 table.row(sum.length - 1).columns(3).borders = [:bottom] end end move_down 25 text I18n.t('documents.group_order_invoice_pdf.small_business_regulation') move_down 10 end def body_with_vat separate_deposits = FoodsoftConfig[:group_order_invoices]&.[](:separate_deposits) total_gross = 0 total_net = 0 # Articles tax_hash_net = Hash.new(0) # for summing up article net prices grouped into vat percentage tax_hash_gross = Hash.new(0) # same here with gross prices if separate_deposits total_deposit = 0 total_deposit_gross = 0 tax_hash_deposit_gross = Hash.new(0) # for summing up deposit gross prices grouped into vat percentage tax_hash_deposit_net = Hash.new(0) # same here with gross prices end marge = FoodsoftConfig[:price_markup] # data table looks different when price_markup > 0 data = if marge == 0 [I18n.t('documents.group_order_invoice_pdf.no_price_markup_rows')] else [I18n.t('documents.group_order_invoice_pdf.price_markup_rows', marge: marge)] end goa_tax_hash = GroupOrderArticle.where(group_order_id: @group_order.id).find_each.group_by { |oat| oat.order_article.price.tax } goa_tax_hash.each do |tax, group_order_articles| group_order_articles.each do |goa| # if no unit is received, nothing is to be charged next if goa.result.to_i == 0 order_article = goa.order_article goa_total_net = goa.result * order_article.price.price goa_total_gross = separate_deposits ? goa.total_price_without_deposit : goa.total_price data << [order_article.article.name, goa.result.to_i, number_to_currency(order_article.price.price), number_to_currency(goa_total_net), tax.to_s + '%', number_to_currency(goa_total_gross)] if separate_deposits && order_article.price.deposit > 0.0 goa_deposit = goa.result * order_article.price.deposit goa_total_deposit = goa.result * order_article.price.fc_deposit_price data << ["zzgl. Pfand", goa.result.to_i, number_to_currency(order_article.price.deposit), number_to_currency(goa_deposit), tax.to_s + '%', number_to_currency(goa_total_deposit)] total_deposit += goa_deposit total_deposit_gross += goa_total_deposit tax_hash_deposit_net[tax.to_i] += goa_deposit tax_hash_deposit_gross[tax.to_i] += goa_total_deposit end tax_hash_net[tax.to_i] += goa_total_net tax_hash_gross[tax.to_i] += goa_total_gross total_net += goa_total_net total_gross += goa_total_gross end end # Two separate tables for sum and individual data # article information + data table data, cell_style: { size: fontsize(8), overflow: :shrink_to_fit } do |table| table.header = true table.position = :center table.cells.border_width = 1 table.cells.border_color = '666666' table.row(0).columns(0..6).style(background_color: 'cccccc', font_style: :bold) table.rows(0..-1).columns(0..6).width = 80 table.row(0).border_bottom_width = 2 table.columns(1).align = :right table.columns(1..6).align = :right end # 4 spalten Netto, MwSt, Brutto # Produkte mit 7% MwSt # Pfand mit 7% MwSt # Produkte mit 19% MwSt # Pfand mit 19% MwSt # # x,x,GESAMT; SUMME sum = [[nil, nil, nil, "Netto", "MwSt", "Brutto"]] [7, 19].each do |key| sum << [nil, nil, "Produkte mit #{key}%", number_to_currency(tax_hash_net[key]), number_to_currency(tax_hash_gross[key] - tax_hash_net[key]), number_to_currency(tax_hash_gross[key])] sum << [nil, nil, "Pfand mit #{key}%", number_to_currency(tax_hash_deposit_net[key]), number_to_currency(tax_hash_deposit_gross[key] - tax_hash_deposit_net[key]), number_to_currency(tax_hash_deposit_gross[key])] if separate_deposits end total_deposit_gross ||= 0 sum << [nil, nil, nil, nil, I18n.t('documents.group_order_invoice_pdf.sum_to_pay_gross'), number_to_currency(total_gross + total_deposit_gross)] # tax_hash_net.each_key.each do |tax| # sum << [nil, nil, nil, nil, I18n.t('documents.group_order_invoice_pdf.tax_included', tax: tax), number_to_currency(tax_hash_gross[tax] - tax_hash_net[tax])] # end # unless marge == 0 # sum << [nil, nil, nil, nil, I18n.t('documents.group_order_invoice_pdf.markup_included', marge: marge), number_to_currency(total_gross * marge / 100.0)] # end # end_sum = total_gross * (1 + marge / 100.0) # sum << [nil, nil, nil, nil, I18n.t('documents.group_order_invoice_pdf.sum_to_pay_gross'), number_to_currency(end_sum)] # table for sum # table sum, position: :right, cell_style: { size: fontsize(8), overflow: :shrink_to_fit } do |table| # sum.length.times do |count| # table.row(count).columns(0..5).borders = [] # end # table.row(sum.length - 1).columns(0..4).borders = [] # table.row(sum.length - 1).border_bottom_width = 2 # table.row(sum.length - 1).columns(5).borders = [:bottom] # end move_down 10 table sum, cell_style: { size: fontsize(8), overflow: :shrink_to_fit } do |table| table.header = true table.position = :center table.cells.border_width = 1 table.cells.border_color = '666666' table.row(0).columns(2..6).style(align: :bottom) table.row(0).border_bottom_width = 2 table.row(0..-1).columns(0..1).border_width = 0 table.rows(0..-1).columns(0..6).width = 80 table.row(-1).column(-1).style(font_style: :bold) table.row(-1).column(-2).style(font_style: :bold) table.row(-1).column(-1).size = fontsize(10) table.row(-1).column(-2).size = fontsize(10) table.columns(1).align = :right table.columns(1..6).align = :right end if FoodsoftConfig[:group_order_invoices][:vat_exempt] move_down 15 text I18n.t('documents.group_order_invoice_pdf.small_business_regulation') end move_down 10 end end