app/models/invoice/e_invoice_generator.rb
class Invoice
class EInvoiceGenerator
attr_reader :invoice, :payable
def initialize(invoice, payable)
@invoice = invoice
@payable = payable
end
def generate
seller = EInvoice::Seller.new
seller.name = invoice.seller_name
seller.registration_number = invoice.seller_reg_no
seller.vat_number = invoice.seller_vat_no
seller_legal_address = EInvoice::Address.new
seller_legal_address.line1 = invoice.seller_street
seller_legal_address.line2 = invoice.seller_state
seller_legal_address.postal_code = invoice.seller_zip
seller_legal_address.city = invoice.seller_city
seller_legal_address.country = invoice.seller_country
seller.legal_address = seller_legal_address
buyer = EInvoice::Buyer.new
buyer.name = invoice.buyer_name
buyer.registration_number = invoice.buyer_reg_no
buyer.vat_number = invoice.buyer_vat_no
buyer.email = invoice.buyer.billing_email
buyer_bank_account = EInvoice::BankAccount.new
buyer_bank_account.number = invoice.buyer.e_invoice_iban
buyer.bank_account = buyer_bank_account
buyer_legal_address = EInvoice::Address.new
buyer_legal_address.line1 = invoice.buyer_street
buyer_legal_address.line2 = invoice.buyer_state
buyer_legal_address.postal_code = invoice.buyer_zip
buyer_legal_address.city = invoice.buyer_city
buyer_legal_address.country = invoice.buyer_country
buyer.legal_address = buyer_legal_address
e_invoice_invoice_items = []
invoice.each do |invoice_item|
e_invoice_invoice_item = generate_invoice_item(invoice, invoice_item)
e_invoice_invoice_items << e_invoice_invoice_item
end
e_invoice_name_item = e_invoice_invoice_items.shift if invoice.monthly_invoice
e_invoice_invoice = EInvoice::Invoice.new.tap do |i|
i.seller = seller
i.buyer = buyer
i.name = e_invoice_name_item&.description
i.items = e_invoice_invoice_items
i.number = invoice.number
i.date = invoice.issue_date
i.recipient_id_code = invoice.buyer_reg_no
i.reference_number = invoice.reference_no
i.due_date = invoice.due_date
i.beneficiary_name = invoice.seller_name
i.beneficiary_account_number = invoice.seller_iban
i.payer_name = invoice.buyer_name
i.subtotal = invoice.subtotal
i.vat_amount = invoice.vat_amount
i.total = invoice.total
i.currency = invoice.currency
i.delivery_channel = %i[internet_bank portal]
i.payable = payable
i.monthly_invoice = invoice.monthly_invoice
end
EInvoice::EInvoice.new(date: Time.zone.today, invoice: e_invoice_invoice)
end
private
def generate_invoice_item(invoice, item)
EInvoice::InvoiceItem.new.tap do |i|
i.description = item.description
i.unit = item.unit
i.price = item.price
i.quantity = item.quantity
if invoice.monthly_invoice && item.price && item.quantity
i.product_id = item.product_id
i.vat_rate = invoice.vat_rate
i.subtotal = (item.price * item.quantity).round(3)
i.vat_amount = i.subtotal * (i.vat_rate / 100)
i.total = i.subtotal + i.vat_amount
else
i.subtotal = item.subtotal
i.vat_rate = item.vat_rate
i.vat_amount = item.vat_amount
i.total = item.total
end
end
end
end
end