summaryrefslogtreecommitdiff
path: root/lib/solidus_subscriptions/config.rb
blob: e19c308fc65b2816533b0921e142853489e601e2 (plain)
1
2
3
4
5
6
7
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
71
72
73
74
75
76
77
module SolidusSubscriptions
  module Config
    class << self
      # Maximum number of times a user can skip their subscription before it
      # must be processed
      mattr_accessor(:maximum_successive_skips) { 1 }

      # Limit on the number of times a user can skip thier subscription. Once
      # this limit is reached, no skips are permitted
      mattr_accessor(:maximum_total_skips) { nil }

      # Time between an installment failing to be processed and the system
      # retrying to fulfil it
      mattr_accessor(:reprocessing_interval) { 1.day }

      mattr_accessor(:minimum_cancellation_notice) { 1.day }

      # Which queue is responsible for processing subscriptions
      mattr_accessor(:processing_queue) { :default }

      # SolidusSubscriptions::LineItem attributes which are allowed to
      # be updated from user data
      #
      # This is useful in the case where certain fields should not be allowed to
      # be modified by the user. This locks these attributes from being passed
      # in to the orders controller (or the api controller).

      # Ie. if a store does not want to allow users to configure the number of
      # installments they will receive. Add this to an initializer:

      # ```
      # SolidusSubscriptions::Config.subscription_line_item_attributes = [
      #   :quantity,
      #   :interval_length,
      #   :interval_units,
      #   :subscribable_id
      # ]
      # ```

      # This configuration also easily allows the gem to be customized to track
      # more information on the subcriptions line items.
      mattr_accessor(:subscription_line_item_attributes) do
        [
          :quantity,
          :subscribable_id,
          :interval_length,
          :interval_units,
          :max_installments
        ]
      end

      def default_gateway=(gateway)
        @gateway = gateway
      end

      def default_gateway
        @gateway ||= Spree::Gateway.where(active: true).detect do |gateway|
          gateway.payment_source_class == Spree::CreditCard
        end

        return @gateway if @gateway

        raise <<-MSG.strip
          SolidusSubscriptions requires a Credit Card Gateway

          Make sure at lease one Spree::PaymentMethod exists with a
          #payment_source_class of Spree::CreditCard.

          Alternatively, you can manually set the Gateway you would like to use by
          adding the following to an initializer:

          SolidusSubscription::Config.default_gateway = my_gateway
        MSG
      end
    end
  end
end