2023-07-24 10:50:35 +02:00
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
2023-08-11 15:01:22 +02:00
if contact [ :phone ] . present?
2023-07-24 10:50:35 +02:00
text " #{ Supplier . human_attribute_name :phone } : #{ contact [ :phone ] } " , size : fontsize ( 9 ) , align : :left
move_down 5
end
2023-08-11 15:01:22 +02:00
text " #{ Supplier . human_attribute_name :email } : #{ contact [ :email ] } " , size : fontsize ( 9 ) , align : :left if contact [ :email ] . present?
2023-07-24 10:50:35 +02:00
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
2023-08-11 15:01:22 +02:00
if ordergroup . contact_address . present?
2023-07-24 10:50:35 +02:00
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
2023-08-11 15:01:22 +02:00
if ordergroup . contact_phone . present?
2023-07-24 10:50:35 +02:00
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
2023-08-11 15:01:22 +02:00
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
2023-07-24 10:50:35 +02:00
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 )
2023-08-11 15:01:22 +02:00
2023-07-24 10:50:35 +02:00
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 )
2023-08-11 15:01:22 +02:00
separate_deposits = FoodsoftConfig [ :group_order_invoices ] & . [] ( :separate_deposits )
2023-07-24 10:50:35 +02:00
group_order_articles . each do | goa |
# if no unit is received, nothing is to be charged
next if goa . result . to_i == 0
2023-08-11 15:01:22 +02:00
goa_total_price = separate_deposits ? goa . total_price_without_deposit : goa . total_price
2023-07-24 10:50:35 +02:00
data << [ goa . order_article . article . name ,
goa . result . to_i ,
2023-08-11 15:01:22 +02:00
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
2023-07-24 10:50:35 +02:00
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
2023-08-11 15:01:22 +02:00
separate_deposits = FoodsoftConfig [ :group_order_invoices ] & . [] ( :separate_deposits )
2023-07-24 10:50:35 +02:00
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
2023-08-11 15:01:22 +02:00
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
2023-07-24 10:50:35 +02:00
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
2023-08-11 15:01:22 +02:00
goa_total_gross = separate_deposits ? goa . total_price_without_deposit : goa . total_price
2023-07-24 10:50:35 +02:00
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 + '%' ,
2023-08-11 15:01:22 +02:00
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
2023-07-24 10:50:35 +02:00
tax_hash_net [ tax . to_i ] += goa_total_net
tax_hash_gross [ tax . to_i ] += goa_total_gross
2023-08-11 15:01:22 +02:00
2023-07-24 10:50:35 +02:00
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'
2023-08-11 15:01:22 +02:00
table . row ( 0 ) . columns ( 0 .. 6 ) . style ( background_color : 'cccccc' , font_style : :bold )
table . rows ( 0 .. - 1 ) . columns ( 0 .. 6 ) . width = 80
2023-07-24 10:50:35 +02:00
table . row ( 0 ) . border_bottom_width = 2
table . columns ( 1 ) . align = :right
table . columns ( 1 .. 6 ) . align = :right
end
2023-08-11 15:01:22 +02:00
# 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
2023-07-24 10:50:35 +02:00
end
2023-08-11 15:01:22 +02:00
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)]
2023-07-24 10:50:35 +02:00
# table for sum
2023-08-11 15:01:22 +02:00
# 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
2023-07-24 10:50:35 +02:00
end
2023-08-11 15:01:22 +02:00
if FoodsoftConfig [ :group_order_invoices ] [ :vat_exempt ]
2023-07-24 10:50:35 +02:00
move_down 15
text I18n . t ( 'documents.group_order_invoice_pdf.small_business_regulation' )
end
move_down 10
end
end