2023-07-24 10:50:35 +02:00
class GroupOrderInvoicePdf < RenderPdf
def filename
ordergroup_name = @options [ :ordergroup ] . name || " OrderGroup "
" #{ ordergroup_name } _ " + 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 , 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 ( 0 .. 4 ) . width = 80
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_gross' ) , number_to_currency ( total_gross ) ]
# table for sum
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 .. 4 ) . 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 .. 4 ) . width = 80
table . row ( 0 ) . column ( - 1 ) . style ( font_style : :bold )
table . row ( 0 ) . column ( - 2 ) . style ( font_style : :bold )
table . row ( 0 ) . column ( - 1 ) . size = fontsize ( 10 )
table . row ( 0 ) . column ( - 2 ) . size = fontsize ( 10 )
table . columns ( 1 ) . align = :right
table . columns ( 1 .. 6 ) . align = :right
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
2023-09-28 22:42:52 +02:00
goa_deposit = goa . result * order_article . price . net_deposit_price
2023-07-24 10:50:35 +02:00
goa_total_deposit = goa . result * order_article . price . fc_deposit_price
data << [ " zzgl. Pfand " ,
goa . result . to_i ,
2023-09-28 22:42:52 +02:00
number_to_currency ( order_article . price . net_deposit_price ) ,
2023-07-24 10:50:35 +02:00
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
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 ) ]
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