Class: Stall::CreditUsageService
Defined Under Namespace
Classes: CartAlreadyPaidError
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
Returns a new instance of CreditUsageService.
7
8
9
10
|
# File 'app/services/stall/credit_usage_service.rb', line 7
def initialize(cart, params = {})
@cart = cart
@params = params
end
|
Instance Attribute Details
#cart ⇒ Object
Returns the value of attribute cart.
5
6
7
|
# File 'app/services/stall/credit_usage_service.rb', line 5
def cart
@cart
end
|
#params ⇒ Object
Returns the value of attribute params.
5
6
7
|
# File 'app/services/stall/credit_usage_service.rb', line 5
def params
@params
end
|
Instance Method Details
#amount ⇒ Object
29
30
31
32
33
34
35
36
37
38
39
40
|
# File 'app/services/stall/credit_usage_service.rb', line 29
def amount
@amount ||= begin
amount = if params[:amount]
cents = BigDecimal.new(params[:amount]) * 100
Money.new(cents, cart.currency)
else
credit
end
[amount, cart.total_price].min
end
end
|
#available? ⇒ Boolean
FIXME: Ducktyping ShippingFeeCalculatorService and use this method in CartUpdateService#refresh_associated_services! to test if credit notes exists
64
65
66
|
# File 'app/services/stall/credit_usage_service.rb', line 64
def available?
cart.respond_to?(:adjustments)
end
|
#call ⇒ Object
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# File 'app/services/stall/credit_usage_service.rb', line 12
def call
ensure_cart_paid!('Cannot udpate credit note from paid cart')
return false unless enough_credit?
clean_credit_note_adjustments!
available_credit_notes.reduce(amount) do |missing_amount, credit_note|
break true if missing_amount.to_d == 0
used_amount = [credit_note.remaining_amount, missing_amount].min
add_adjustment(used_amount, credit_note)
missing_amount - used_amount
end
end
|
#clean_credit_note_adjustments! ⇒ Object
53
54
55
56
57
58
59
|
# File 'app/services/stall/credit_usage_service.rb', line 53
def clean_credit_note_adjustments!
ensure_cart_paid!('Cannot remove credit note from paid cart')
credit_note_adjustments.each do |adjustment|
cart.adjustments.destroy(adjustment)
end
end
|
#credit ⇒ Object
42
43
44
45
46
47
|
# File 'app/services/stall/credit_usage_service.rb', line 42
def credit
@credit ||= begin
credit = cart.customer.try(:credit, cart.currency) || Money.new(0, cart.currency)
Money.new(credit + credit_note_adjustments.map(&:price).sum.abs, cart.currency)
end
end
|
#credit_used ⇒ Object
72
73
74
|
# File 'app/services/stall/credit_usage_service.rb', line 72
def credit_used
credit_note_adjustments.map(&:price).sum
end
|
#credit_used? ⇒ Boolean
68
69
70
|
# File 'app/services/stall/credit_usage_service.rb', line 68
def credit_used?
credit_note_adjustments.any?
end
|
#enough_credit? ⇒ Boolean
49
50
51
|
# File 'app/services/stall/credit_usage_service.rb', line 49
def enough_credit?
amount <= credit
end
|
#ensure_valid_or_remove! ⇒ Object
76
77
78
79
80
81
82
83
|
# File 'app/services/stall/credit_usage_service.rb', line 76
def ensure_valid_or_remove!
if !enough_credit?
clean_credit_note_adjustments!
elsif cart.total_price.to_d < 0
@amount = credit_used
call
end
end
|