Class: Uomi::CreditNote

Inherits:
Invoice
  • Object
show all
Defined in:
lib/uomi/credit_note.rb

Instance Method Summary collapse

Methods inherited from Invoice

#add_credit_transaction, #add_debit_transaction, #add_line_item, #add_payment_reference, #adjust, #balance_zero?, #calculate_balance, #calculate_totals, #credit_notes, #credit_transactions, #debit_transactions, #decorate_with, draft, #due, #due_date_past?, for_payment_reference, #from, issued, #line_item, #mark_items_invoiced!, #mark_items_uninvoiced!, #net_total, #numbered, #overdue?, owing, #owing?, #payment_reference, #remove_line_item, #remove_payment_reference, #set_invoice_number!, settled, #should_settle?, #to, voided

Instance Method Details

#against_invoice(invoice) ⇒ Object

Raises:

  • (RuntimeError)


52
53
54
55
56
57
58
59
# File 'lib/uomi/credit_note.rb', line 52

def against_invoice(invoice)
  raise RuntimeError, "You must allocate a credit note against an invoice" if invoice.blank?
  raise RuntimeError, "You must allocate a credit note against an issued invoice" unless invoice.issued?
  
  self.credit_note_invoices << CreditNoteInvoice.new(invoice_id: invoice.id)
  self.buyer = invoice.buyer
  self.seller = invoice.seller
end

#annul(params = {}) ⇒ Object



76
77
78
# File 'lib/uomi/credit_note.rb', line 76

def annul(params={})
  record_amount_against_invoice(params[:amount], params[:against_invoice]) if params[:against_invoice]
end

#annul_remaining_amount!Object



119
120
121
# File 'lib/uomi/credit_note.rb', line 119

def annul_remaining_amount!
  add_debit_transaction amount: balance.abs
end

#create_initial_transaction!Object



84
85
86
87
88
89
90
91
92
# File 'lib/uomi/credit_note.rb', line 84

def create_initial_transaction!
  if total > 0
    add_credit_transaction amount: total
  else
    add_debit_transaction amount: total
  end

  save!
end

#credit(options = {}) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/uomi/credit_note.rb', line 43

def credit(options={})
  add_line_item(
    invoiceable: options[:line_item].andand.invoiceable,
    amount: options[:amount] || 0,
    tax: options[:tax] || 0,
    description: options[:description] || "Credit note against #{options[:line_item].andand.description}" #?
  )
end

#default_numbering_prefixObject



80
81
82
# File 'lib/uomi/credit_note.rb', line 80

def default_numbering_prefix
  "CN"
end

#issue(issued_at = Time.now) ⇒ Object



27
28
29
30
31
32
33
# File 'lib/uomi/credit_note.rb', line 27

def issue(issued_at = Time.now)
  self.issued_at = issued_at
  create_initial_transaction!
  record_transaction_against_invoice! unless self.invoices.blank?
  record_credit_notes!
  record_transaction!
end

#record_credit_notes!Object



67
68
69
70
71
72
73
74
# File 'lib/uomi/credit_note.rb', line 67

def record_credit_notes!
  line_items.each do |line_item|
    invoiceable = line_item.invoiceable
    next if invoiceable.blank?
    invoiceable.handle_credit(line_item.amount) if invoiceable.respond_to?(:handle_credit)
    invoiceable.save!
  end
end

#record_transaction!Object



61
62
63
64
65
# File 'lib/uomi/credit_note.rb', line 61

def record_transaction!
  unless self.invoices.blank?
    add_debit_transaction(amount: total)
  end
end

#record_transaction_against_invoice!Object



35
36
37
38
39
40
41
# File 'lib/uomi/credit_note.rb', line 35

def record_transaction_against_invoice!
  invoice = invoices.first
  validate(invoice: invoice, amount: self.total)
  invoice.add_credit_transaction(amount: total)
  invoice.save!
  CreditNoteCreditTransaction.create!(transaction: invoice.transactions.last, credit_note_id: self.id)
end

#refund(&block) ⇒ Object

Refund section



102
103
104
105
# File 'lib/uomi/credit_note.rb', line 102

def refund(&block)
  instance_eval(&block)
  save!
end

#reverse_transactions_against_invoiceObject



129
130
131
132
133
134
135
# File 'lib/uomi/credit_note.rb', line 129

def reverse_transactions_against_invoice
  credit_note_credit_transactions.each do |cnct|
    invoice = cnct.transaction.invoice
    invoice.add_debit_transaction(amount: cnct.transaction.amount)
    invoice.save!
  end
end

#set_balance_off(options = {}) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
# File 'lib/uomi/credit_note.rb', line 107

def set_balance_off(options={})
  validate(options)
  invoice = options[:invoice]

  invoice.add_credit_transaction(amount: options[:amount])
  against_invoice(invoice)
  invoice.save!

  self.add_debit_transaction(amount: options[:amount])
  CreditNoteCreditTransaction.create!(transaction: invoice.transactions.last, credit_note_id: self.id)
end

#validate(options = {}) ⇒ Object

Raises:

  • (RuntimeError)


94
95
96
97
98
# File 'lib/uomi/credit_note.rb', line 94

def validate(options={})
  raise RuntimeError, "You must allocate this credit against an invoice" if options[:invoice].blank?
  raise RuntimeError, "You must allocate this credit against a Uomi Invoice" unless options[:invoice].is_a?(Uomi::Invoice)
  raise RuntimeError, "You cannot allocate nothing to the invoice" if (options[:amount].blank? || options[:amount].zero?)
end

#voidObject



123
124
125
126
127
# File 'lib/uomi/credit_note.rb', line 123

def void
  annul_remaining_amount! unless self.draft?
  reverse_transactions_against_invoice
  self
end