Class: Spina::Shop::InvoiceGenerator

Inherits:
Object
  • Object
show all
Defined in:
app/services/spina/shop/invoice_generator.rb

Instance Method Summary collapse

Constructor Details

#initialize(order) ⇒ InvoiceGenerator

Returns a new instance of InvoiceGenerator.



3
4
5
6
# File 'app/services/spina/shop/invoice_generator.rb', line 3

def initialize(order)
  @order = order
  @account = Spina::Account.first
end

Instance Method Details

#generate!Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
68
69
70
# File 'app/services/spina/shop/invoice_generator.rb', line 8

def generate!
  @customer = @order.customer

  number = InvoiceNumberGenerator.generate!

  invoice = Invoice.new(
    order_id: @order.id,
    customer_id: @customer.id,
    vat_id: @customer.vat_id,
    company_name: @customer.company,
    prices_include_tax: @order.prices_include_tax,
    vat_reverse_charge: @order.vat_reverse_charge?,
    country_id: @order.billing_country.id,
    country_name: @order.billing_country.name,
    order_number: @order.number,
    customer_number: @customer.number,
    customer_name: @customer.full_name,
    address_1: @order.billing_address,
    postal_code: @order.billing_postal_code,
    city: @order.billing_city,
    number: number,
    invoice_number: "#{number}",
    date: Date.today,
    identity_name: @account.name,
    identity_details: "#{@account.address}
    #{@account.postal_code}, #{@account.city}

    #{@account.phone}
    #{@account.email}"
  )

  @order.order_items.each do |order_item|
    invoice.invoice_lines << InvoiceLine.new(
      quantity: order_item.quantity,
      description: order_item.description,
      unit_price: order_item.unit_price,
      tax_rate: invoice.vat_reverse_charge? ? BigDecimal.new(0) : order_item.tax_rate,
      metadata: order_item.
    )
    
    if order_item.discount_amount > 0
      invoice.invoice_lines << InvoiceLine.new(
        quantity: -1,
        description: "Korting #{order_item.description}",
        unit_price: order_item.discount_amount,
        tax_rate: invoice.vat_reverse_charge? ? BigDecimal.new(0) : order_item.tax_rate,
        metadata: order_item.
      )
    end
  end

  if @order.delivery_option.present?
    invoice.invoice_lines << InvoiceLine.new(
      quantity: 1,
      description: "Verzendkosten",
      unit_price: @order.delivery_price,
      tax_rate: invoice.vat_reverse_charge? ? BigDecimal.new(0) : @order.delivery_tax_rate,
      metadata: @order.
    )
  end

  return invoice if invoice.save!
end