Class: Stall::CreditUsageService

Inherits:
BaseService show all
Defined in:
app/services/stall/credit_usage_service.rb

Defined Under Namespace

Classes: CartAlreadyPaidError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cart, params = {}) ⇒ CreditUsageService

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

#cartObject (readonly)

Returns the value of attribute cart.



5
6
7
# File 'app/services/stall/credit_usage_service.rb', line 5

def cart
  @cart
end

#paramsObject (readonly)

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

#amountObject



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

Returns:

  • (Boolean)


64
65
66
# File 'app/services/stall/credit_usage_service.rb', line 64

def available?
  cart.respond_to?(:adjustments)
end

#callObject



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

#creditObject



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_usedObject



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

Returns:

  • (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

Returns:

  • (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