solidus_subscriptions 1.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +41 -0
  3. data/.gem_release.yml +5 -0
  4. data/.github/stale.yml +17 -0
  5. data/.github_changelog_generator +2 -0
  6. data/.gitignore +20 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +12 -0
  9. data/.rubocop_todo.yml +86 -0
  10. data/CHANGELOG.md +191 -0
  11. data/Gemfile +33 -0
  12. data/LICENSE +26 -0
  13. data/README.md +221 -0
  14. data/Rakefile +6 -0
  15. data/app/assets/javascripts/spree/backend/solidus_subscriptions.js +1 -0
  16. data/app/assets/javascripts/spree/backend/solidus_subscriptions/edit_subscription_payment.js +32 -0
  17. data/app/controllers/solidus_subscriptions/api/v1/base_controller.rb +13 -0
  18. data/app/controllers/solidus_subscriptions/api/v1/line_items_controller.rb +48 -0
  19. data/app/controllers/solidus_subscriptions/api/v1/subscriptions_controller.rb +100 -0
  20. data/app/controllers/spree/admin/installments_controller.rb +25 -0
  21. data/app/controllers/spree/admin/subscription_events_controller.rb +37 -0
  22. data/app/controllers/spree/admin/subscription_orders_controller.rb +35 -0
  23. data/app/controllers/spree/admin/subscriptions_controller.rb +100 -0
  24. data/app/controllers/spree/admin/users/subscriptions_controller.rb +17 -0
  25. data/app/decorators/controllers/solidus_subscriptions/spree/api/line_items_controller/create_subscription_line_items.rb +36 -0
  26. data/app/decorators/controllers/solidus_subscriptions/spree/orders_controller/create_subscription_line_items.rb +35 -0
  27. data/app/decorators/models/solidus_subscriptions/spree/line_item/subscription_line_items_association.rb +26 -0
  28. data/app/decorators/models/solidus_subscriptions/spree/order/after_create.rb +19 -0
  29. data/app/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb +23 -0
  30. data/app/decorators/models/solidus_subscriptions/spree/order/installment_details_association.rb +15 -0
  31. data/app/decorators/models/solidus_subscriptions/spree/order/subscription_association.rb +15 -0
  32. data/app/decorators/models/solidus_subscriptions/spree/order/subscription_line_items_association.rb +19 -0
  33. data/app/decorators/models/solidus_subscriptions/spree/product/delegate_subscribable.rb +17 -0
  34. data/app/decorators/models/solidus_subscriptions/spree/user/have_many_subscriptions.rb +30 -0
  35. data/app/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions.rb +20 -0
  36. data/app/decorators/models/solidus_subscriptions/spree/variant/variant_pretty_name.rb +17 -0
  37. data/app/decorators/models/solidus_subscriptions/spree/wallet_payment_source/report_default_change_to_subscriptions.rb +28 -0
  38. data/app/jobs/solidus_subscriptions/process_installment_job.rb +13 -0
  39. data/app/jobs/solidus_subscriptions/process_subscription_job.rb +31 -0
  40. data/app/models/solidus_subscriptions/installment.rb +135 -0
  41. data/app/models/solidus_subscriptions/installment_detail.rb +28 -0
  42. data/app/models/solidus_subscriptions/interval.rb +26 -0
  43. data/app/models/solidus_subscriptions/line_item.rb +42 -0
  44. data/app/models/solidus_subscriptions/promotion/rules/subscription_creation_order.rb +44 -0
  45. data/app/models/solidus_subscriptions/promotion/rules/subscription_installment_order.rb +31 -0
  46. data/app/models/solidus_subscriptions/subscription.rb +392 -0
  47. data/app/models/solidus_subscriptions/subscription_event.rb +11 -0
  48. data/app/overrides/views/admin_subscribable_product_checkbox.rb +8 -0
  49. data/app/overrides/views/admin_subscribable_variant_checkbox.rb +8 -0
  50. data/app/overrides/views/admin_subscriptions_menu_link.rb +10 -0
  51. data/app/overrides/views/admin_users_subscriptions_tab.rb +8 -0
  52. data/app/overrides/views/subscription_line_item_fields.rb +8 -0
  53. data/app/subscribers/solidus_subscriptions/churn_buster_subscriber.rb +39 -0
  54. data/app/subscribers/solidus_subscriptions/event_storage_subscriber.rb +64 -0
  55. data/app/views/spree/admin/installments/_state_pill.html.erb +8 -0
  56. data/app/views/spree/admin/installments/index.html.erb +42 -0
  57. data/app/views/spree/admin/products/_subscribable_checkbox.html.erb +8 -0
  58. data/app/views/spree/admin/promotions/rules/_subscription_creation_order.html.erb +0 -0
  59. data/app/views/spree/admin/promotions/rules/_subscription_installment_order.html.erb +0 -0
  60. data/app/views/spree/admin/shared/_subscription_actions.html.erb +35 -0
  61. data/app/views/spree/admin/shared/_subscription_breadcrumbs.html.erb +4 -0
  62. data/app/views/spree/admin/shared/_subscription_sidebar.html.erb +18 -0
  63. data/app/views/spree/admin/shared/_subscription_tab.html.erb +3 -0
  64. data/app/views/spree/admin/shared/_subscription_tabs.html.erb +18 -0
  65. data/app/views/spree/admin/subscription_events/_state_pill.html.erb +8 -0
  66. data/app/views/spree/admin/subscription_events/index.html.erb +42 -0
  67. data/app/views/spree/admin/subscription_orders/index.html.erb +93 -0
  68. data/app/views/spree/admin/subscriptions/_form.html.erb +150 -0
  69. data/app/views/spree/admin/subscriptions/_processing_state_pill.html.erb +9 -0
  70. data/app/views/spree/admin/subscriptions/_state_pill.html.erb +10 -0
  71. data/app/views/spree/admin/subscriptions/edit.html.erb +10 -0
  72. data/app/views/spree/admin/subscriptions/index.html.erb +176 -0
  73. data/app/views/spree/admin/subscriptions/new.html.erb +5 -0
  74. data/app/views/spree/admin/users/_subscription_tab.html.erb +5 -0
  75. data/app/views/spree/admin/users/subscriptions/index.html.erb +44 -0
  76. data/app/views/spree/admin/variants/_subscribable_checkbox.html.erb +6 -0
  77. data/app/views/spree/frontend/products/_subscription_line_item_fields.html.erb +30 -0
  78. data/bin/console +17 -0
  79. data/bin/rails +7 -0
  80. data/bin/rails-engine +13 -0
  81. data/bin/rails-sandbox +16 -0
  82. data/bin/rake +7 -0
  83. data/bin/sandbox +86 -0
  84. data/bin/setup +8 -0
  85. data/config/initializers/permission_sets.rb +11 -0
  86. data/config/initializers/subscribers.rb +9 -0
  87. data/config/locales/en.yml +129 -0
  88. data/config/routes.rb +34 -0
  89. data/db/migrate/20160825164850_create_solidus_subscriptions_subscriptions.rb +11 -0
  90. data/db/migrate/20160825173548_create_solidus_subscriptions_line_items.rb +17 -0
  91. data/db/migrate/20160825202248_create_solidus_subscriptions_installments.rb +23 -0
  92. data/db/migrate/20160825211202_create_solidus_subscriptions_installment_details.rb +22 -0
  93. data/db/migrate/20160825214240_add_subscribable_to_spree_variants.rb +5 -0
  94. data/db/migrate/20160829201653_change_subscription_line_items_installments_to_max_installments.rb +5 -0
  95. data/db/migrate/20160902220242_remove_state_from_solidus_susbscriptions_installment_details.rb +5 -0
  96. data/db/migrate/20160902220604_add_successful_to_solidus_subscriptions_installment_details.rb +5 -0
  97. data/db/migrate/20160902221218_add_message_to_solidus_subscriptions_installment_details.rb +5 -0
  98. data/db/migrate/20160922164101_add_interval_length_and_units_to_subscription_line_items.rb +8 -0
  99. data/db/migrate/20161006191003_add_skip_count_to_solidus_subscriptions_subscriptions.rb +5 -0
  100. data/db/migrate/20161006191127_add_successive_skip_count_to_solidus_subscriptions_subscriptions.rb +5 -0
  101. data/db/migrate/20161014212649_allow_spree_line_item_id_to_be_null.rb +5 -0
  102. data/db/migrate/20161017155749_add_order_id_to_solidus_subscriptions_installment_details.rb +6 -0
  103. data/db/migrate/20161017175509_remove_order_id_from_solidus_subscriptions_installments.rb +5 -0
  104. data/db/migrate/20161017201944_add_subscription_order_to_spree_orders.rb +5 -0
  105. data/db/migrate/20161221155142_add_store_to_solidus_subscriptions_subscriptions.rb +6 -0
  106. data/db/migrate/20161223152905_add_address_id_to_solidus_subscriptions_subscriptions.rb +7 -0
  107. data/db/migrate/20170106224713_change_line_item_max_installments_to_end_date.rb +6 -0
  108. data/db/migrate/20170111224458_change_subscription_actionable_date_to_datetime.rb +5 -0
  109. data/db/migrate/20170111232801_change_inteval_actionable_date_to_datetime.rb +5 -0
  110. data/db/migrate/20170112012407_add_config_options_to_subscriptions.rb +7 -0
  111. data/db/migrate/20200617102749_add_billing_address_to_subscriptions.rb +11 -0
  112. data/db/migrate/20200617155042_add_payment_source_to_subscriptions.rb +6 -0
  113. data/db/migrate/20200618092951_add_payment_method_to_subscriptions.rb +11 -0
  114. data/db/migrate/20200730101242_create_solidus_subscriptions_subscription_events.rb +22 -0
  115. data/db/migrate/20200917072152_add_subscription_reference_to_orders.rb +11 -0
  116. data/db/migrate/20201007140032_add_guest_token_to_subscriptions.rb +6 -0
  117. data/db/migrate/20201123171026_change_actionable_date_to_date.rb +15 -0
  118. data/db/migrate/20210205140422_add_currency_to_subscription.rb +5 -0
  119. data/db/migrate/20210323165714_update_promotion_rule_names.rb +22 -0
  120. data/lib/generators/solidus_subscriptions/install/install_generator.rb +32 -0
  121. data/lib/generators/solidus_subscriptions/install/templates/initializer.rb +99 -0
  122. data/lib/solidus_subscriptions.rb +49 -0
  123. data/lib/solidus_subscriptions/checkout.rb +74 -0
  124. data/lib/solidus_subscriptions/churn_buster/client.rb +48 -0
  125. data/lib/solidus_subscriptions/churn_buster/order_serializer.rb +19 -0
  126. data/lib/solidus_subscriptions/churn_buster/serializer.rb +23 -0
  127. data/lib/solidus_subscriptions/churn_buster/subscription_customer_serializer.rb +28 -0
  128. data/lib/solidus_subscriptions/churn_buster/subscription_payment_method_serializer.rb +37 -0
  129. data/lib/solidus_subscriptions/churn_buster/subscription_serializer.rb +17 -0
  130. data/lib/solidus_subscriptions/configuration.rb +84 -0
  131. data/lib/solidus_subscriptions/dispatcher/base.rb +18 -0
  132. data/lib/solidus_subscriptions/dispatcher/failure_dispatcher.rb +13 -0
  133. data/lib/solidus_subscriptions/dispatcher/out_of_stock_dispatcher.rb +11 -0
  134. data/lib/solidus_subscriptions/dispatcher/payment_failed_dispatcher.rb +19 -0
  135. data/lib/solidus_subscriptions/dispatcher/success_dispatcher.rb +17 -0
  136. data/lib/solidus_subscriptions/engine.rb +56 -0
  137. data/lib/solidus_subscriptions/permission_sets/default_customer.rb +19 -0
  138. data/lib/solidus_subscriptions/permission_sets/subscription_management.rb +12 -0
  139. data/lib/solidus_subscriptions/permitted_attributes.rb +20 -0
  140. data/lib/solidus_subscriptions/processor.rb +17 -0
  141. data/lib/solidus_subscriptions/subscription_generator.rb +77 -0
  142. data/lib/solidus_subscriptions/subscription_line_item_builder.rb +23 -0
  143. data/lib/solidus_subscriptions/testing_support/factories/installment_detail_factory.rb +11 -0
  144. data/lib/solidus_subscriptions/testing_support/factories/installment_factory.rb +29 -0
  145. data/lib/solidus_subscriptions/testing_support/factories/line_item_factory.rb +20 -0
  146. data/lib/solidus_subscriptions/testing_support/factories/spree/line_item_factory.rb +17 -0
  147. data/lib/solidus_subscriptions/testing_support/factories/spree/order_factory.rb +17 -0
  148. data/lib/solidus_subscriptions/testing_support/factories/spree_modification_factory.rb +10 -0
  149. data/lib/solidus_subscriptions/testing_support/factories/subscription_event_factory.rb +8 -0
  150. data/lib/solidus_subscriptions/testing_support/factories/subscription_factory.rb +56 -0
  151. data/lib/solidus_subscriptions/version.rb +5 -0
  152. data/lib/tasks/process_subscriptions.rake +8 -0
  153. data/reference/solidus_subscriptions.v1.yaml +290 -0
  154. data/solidus_subscriptions.gemspec +47 -0
  155. data/spec/controllers/spree/admin/subscriptions_controller_spec.rb +202 -0
  156. data/spec/controllers/spree/api/line_items_controller_spec.rb +103 -0
  157. data/spec/controllers/spree/api/orders_controller_spec.rb +57 -0
  158. data/spec/controllers/spree/api/users_controller_spec.rb +48 -0
  159. data/spec/decorators/controllers/solidus_subscriptions/spree/orders_controller/create_subscription_line_items_spec.rb +80 -0
  160. data/spec/decorators/models/solidus_subscriptions/spree/line_item/subscription_line_items_association_spec.rb +10 -0
  161. data/spec/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions_spec.rb +32 -0
  162. data/spec/decorators/models/solidus_subscriptions/spree/order/installment_details_association_spec.rb +9 -0
  163. data/spec/decorators/models/solidus_subscriptions/spree/order/subscription_line_items_association_spec.rb +9 -0
  164. data/spec/decorators/models/solidus_subscriptions/spree/user/have_many_subscriptions_spec.rb +22 -0
  165. data/spec/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions_spec.rb +25 -0
  166. data/spec/features/admin/subscription_orders_spec.rb +35 -0
  167. data/spec/features/admin/subscriptions_spec.rb +63 -0
  168. data/spec/features/admin_users_subscription_tabs_spec.rb +61 -0
  169. data/spec/fixtures/cassettes/churn_buster.yml +229 -0
  170. data/spec/jobs/solidus_subscriptions/process_installment_job_spec.rb +38 -0
  171. data/spec/jobs/solidus_subscriptions/process_subscription_job_spec.rb +83 -0
  172. data/spec/lib/solidus_subscriptions/checkout_spec.rb +125 -0
  173. data/spec/lib/solidus_subscriptions/churn_buster/client_spec.rb +59 -0
  174. data/spec/lib/solidus_subscriptions/dispatcher/failure_dispatcher_spec.rb +29 -0
  175. data/spec/lib/solidus_subscriptions/dispatcher/out_of_stock_dispatcher_spec.rb +15 -0
  176. data/spec/lib/solidus_subscriptions/dispatcher/payment_failed_dispatcher_spec.rb +44 -0
  177. data/spec/lib/solidus_subscriptions/dispatcher/success_dispatcher_spec.rb +30 -0
  178. data/spec/lib/solidus_subscriptions/permission_sets/default_customer_spec.rb +95 -0
  179. data/spec/lib/solidus_subscriptions/permission_sets/subscription_management_spec.rb +26 -0
  180. data/spec/lib/solidus_subscriptions/processor_spec.rb +34 -0
  181. data/spec/lib/solidus_subscriptions/promotion/rules/subscription_creation_order_spec.rb +57 -0
  182. data/spec/lib/solidus_subscriptions/promotion/rules/subscription_installment_order_spec.rb +39 -0
  183. data/spec/lib/solidus_subscriptions/subscription_generator_spec.rb +83 -0
  184. data/spec/lib/solidus_subscriptions_spec.rb +30 -0
  185. data/spec/models/solidus_subscriptions/installment_detail_spec.rb +23 -0
  186. data/spec/models/solidus_subscriptions/installment_spec.rb +201 -0
  187. data/spec/models/solidus_subscriptions/line_item_spec.rb +29 -0
  188. data/spec/models/solidus_subscriptions/subscription_spec.rb +814 -0
  189. data/spec/models/spree/variant_spec.rb +16 -0
  190. data/spec/models/spree/wallet_payment_source_spec.rb +20 -0
  191. data/spec/requests/api/v1/line_items_spec.rb +116 -0
  192. data/spec/requests/api/v1/subscriptions_spec.rb +255 -0
  193. data/spec/spec_helper.rb +30 -0
  194. data/spec/subscribers/solidus_subscriptions/churn_buster_subscriber_spec.rb +76 -0
  195. data/spec/support/active_model_mocks.rb +1 -0
  196. data/spec/support/cancancan.rb +1 -0
  197. data/spec/support/factories.rb +1 -0
  198. data/spec/support/helpers/checkout_infrastructure.rb +18 -0
  199. data/spec/support/helpers/config.rb +13 -0
  200. data/spec/support/shoulda.rb +7 -0
  201. data/spec/support/timecop.rb +1 -0
  202. data/spec/support/vcr.rb +10 -0
  203. data/spec/support/version_cake.rb +8 -0
  204. metadata +498 -0
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module ChurnBuster
5
+ class Client
6
+ BASE_API_URL = 'https://api.churnbuster.io/v1'
7
+
8
+ attr_reader :account_id, :api_key
9
+
10
+ def initialize(account_id:, api_key:)
11
+ @account_id = account_id
12
+ @api_key = api_key
13
+ end
14
+
15
+ def report_failed_payment(order)
16
+ post('/failed_payments', OrderSerializer.serialize(order))
17
+ end
18
+
19
+ def report_successful_payment(order)
20
+ post('/successful_payments', OrderSerializer.serialize(order))
21
+ end
22
+
23
+ def report_subscription_cancellation(subscription)
24
+ post('/cancellations', SubscriptionSerializer.serialize(subscription))
25
+ end
26
+
27
+ def report_payment_method_change(subscription)
28
+ post('/payment_methods', SubscriptionPaymentMethodSerializer.serialize(subscription))
29
+ end
30
+
31
+ private
32
+
33
+ def post(path, body)
34
+ HTTParty.post(
35
+ "#{BASE_API_URL}#{path}",
36
+ body: body.to_json,
37
+ headers: {
38
+ 'Content-Type' => 'application/json',
39
+ },
40
+ basic_auth: {
41
+ username: account_id,
42
+ password: api_key,
43
+ },
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module ChurnBuster
5
+ class OrderSerializer < Serializer
6
+ def to_h
7
+ {
8
+ payment: {
9
+ source: 'in_house',
10
+ source_id: object.number,
11
+ amount_in_cents: object.display_total.cents,
12
+ currency: object.currency,
13
+ },
14
+ customer: SubscriptionCustomerSerializer.serialize(object.subscription),
15
+ }
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module ChurnBuster
5
+ class Serializer
6
+ attr_reader :object
7
+
8
+ class << self
9
+ def serialize(object)
10
+ new(object).to_h
11
+ end
12
+ end
13
+
14
+ def initialize(object)
15
+ @object = object
16
+ end
17
+
18
+ def to_h
19
+ raise NotImplementedError
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module ChurnBuster
5
+ class SubscriptionCustomerSerializer < Serializer
6
+ def to_h
7
+ {
8
+ source: 'in_house',
9
+ source_id: object.id,
10
+ email: object.user.email,
11
+ properties: {
12
+ name: name
13
+ },
14
+ }
15
+ end
16
+
17
+ private
18
+
19
+ def name
20
+ if ::Spree.solidus_gem_version < Gem::Version.new('2.11.0')
21
+ "#{object.shipping_address_to_use.first_name} #{object.shipping_address_to_use.last_name}"
22
+ else
23
+ object.shipping_address_to_use.name
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module ChurnBuster
5
+ class SubscriptionPaymentMethodSerializer < Serializer
6
+ def to_h
7
+ {
8
+ payment_method: {
9
+ source: 'in_house',
10
+ source_id: [
11
+ object.payment_method_to_use&.id,
12
+ object.payment_source_to_use&.id
13
+ ].compact.join('-'),
14
+ type: 'card',
15
+ properties: payment_source_properties,
16
+ },
17
+ customer: SubscriptionCustomerSerializer.serialize(object),
18
+ }
19
+ end
20
+
21
+ private
22
+
23
+ def payment_source_properties
24
+ if object.payment_source.is_a?(::Spree::CreditCard)
25
+ {
26
+ brand: object.payment_source.cc_type,
27
+ last4: object.payment_source.last_digits,
28
+ exp_month: object.payment_source.month,
29
+ exp_year: object.payment_source.year,
30
+ }
31
+ else
32
+ {}
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module ChurnBuster
5
+ class SubscriptionSerializer < Serializer
6
+ def to_h
7
+ {
8
+ subscription: {
9
+ source: 'in_house',
10
+ source_id: object.id
11
+ },
12
+ customer: SubscriptionCustomerSerializer.serialize(object),
13
+ }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ class Configuration
5
+ attr_accessor(
6
+ :maximum_total_skips, :maximum_reprocessing_time, :churn_buster_account_id,
7
+ :churn_buster_api_key, :clear_past_installments, :processing_error_handler,
8
+ )
9
+
10
+ attr_writer(
11
+ :success_dispatcher_class, :failure_dispatcher_class, :payment_failed_dispatcher_class,
12
+ :out_of_stock_dispatcher, :maximum_successive_skips, :reprocessing_interval,
13
+ :minimum_cancellation_notice, :processing_queue, :subscription_line_item_attributes,
14
+ :subscription_attributes, :subscribable_class,
15
+ )
16
+
17
+ def success_dispatcher_class
18
+ @success_dispatcher_class ||= 'SolidusSubscriptions::Dispatcher::SuccessDispatcher'
19
+ @success_dispatcher_class.constantize
20
+ end
21
+
22
+ def failure_dispatcher_class
23
+ @failure_dispatcher_class ||= 'SolidusSubscriptions::Dispatcher::FailureDispatcher'
24
+ @failure_dispatcher_class.constantize
25
+ end
26
+
27
+ def payment_failed_dispatcher_class
28
+ @payment_failed_dispatcher_class ||= 'SolidusSubscriptions::Dispatcher::PaymentFailedDispatcher'
29
+ @payment_failed_dispatcher_class.constantize
30
+ end
31
+
32
+ def out_of_stock_dispatcher_class
33
+ @out_of_stock_dispatcher_class ||= 'SolidusSubscriptions::Dispatcher::OutOfStockDispatcher'
34
+ @out_of_stock_dispatcher_class.constantize
35
+ end
36
+
37
+ def maximum_successive_skips
38
+ @maximum_successive_skips ||= 1
39
+ end
40
+
41
+ def reprocessing_interval
42
+ @reprocessing_interval ||= 1.day
43
+ end
44
+
45
+ def minimum_cancellation_notice
46
+ @minimum_cancellation_notice ||= 0.days
47
+ end
48
+
49
+ def processing_queue
50
+ @processing_queue ||= :default
51
+ end
52
+
53
+ def subscription_line_item_attributes
54
+ @subscription_line_item_attributes ||= [
55
+ :quantity,
56
+ :subscribable_id,
57
+ :interval_length,
58
+ :interval_units,
59
+ :end_date,
60
+ ]
61
+ end
62
+
63
+ def subscription_attributes
64
+ @subscription_attributes ||= [
65
+ :interval_length,
66
+ :interval_units,
67
+ :end_date,
68
+ {
69
+ shipping_address_attributes: Spree::PermittedAttributes.address_attributes,
70
+ billing_address_attributes: Spree::PermittedAttributes.address_attributes
71
+ },
72
+ ]
73
+ end
74
+
75
+ def subscribable_class
76
+ @subscribable_class ||= 'Spree::Variant'
77
+ @subscribable_class.constantize
78
+ end
79
+
80
+ def churn_buster?
81
+ churn_buster_account_id.present? && churn_buster_api_key.present?
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module Dispatcher
5
+ class Base
6
+ attr_reader :installment, :order
7
+
8
+ def initialize(installment, order)
9
+ @installment = installment
10
+ @order = order
11
+ end
12
+
13
+ def dispatch
14
+ raise NotImplementedError
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module Dispatcher
5
+ class FailureDispatcher < Base
6
+ def dispatch
7
+ order.touch(:completed_at)
8
+ order.cancel
9
+ installment.failed!(order)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module Dispatcher
5
+ class OutOfStockDispatcher < Base
6
+ def dispatch
7
+ installment.out_of_stock
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module Dispatcher
5
+ class PaymentFailedDispatcher < Base
6
+ def dispatch
7
+ order.touch(:completed_at)
8
+ order.cancel
9
+ installment.payment_failed!(order)
10
+
11
+ ::Spree::Event.fire(
12
+ 'solidus_subscriptions.installment_failed_payment',
13
+ installment: installment,
14
+ order: order,
15
+ )
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module Dispatcher
5
+ class SuccessDispatcher < Base
6
+ def dispatch
7
+ installment.success!(order)
8
+
9
+ ::Spree::Event.fire(
10
+ 'solidus_subscriptions.installment_succeeded',
11
+ installment: installment,
12
+ order: order,
13
+ )
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spree/core'
4
+
5
+ require 'solidus_subscriptions'
6
+ require 'solidus_subscriptions/permitted_attributes'
7
+ require 'solidus_subscriptions/configuration'
8
+ require 'solidus_subscriptions/processor'
9
+
10
+ module SolidusSubscriptions
11
+ class Engine < Rails::Engine
12
+ include SolidusSupport::EngineExtensions
13
+
14
+ isolate_namespace SolidusSubscriptions
15
+
16
+ engine_name 'solidus_subscriptions'
17
+
18
+ # use rspec for tests
19
+ config.generators do |g|
20
+ g.test_framework :rspec
21
+ end
22
+
23
+ initializer 'solidus_subscriptions.update_permitted_attributes' do
24
+ ::Spree::PermittedAttributes.line_item_attributes << {
25
+ subscription_line_items_attributes: PermittedAttributes.subscription_line_item_attributes | [:id],
26
+ }
27
+
28
+ ::Spree::PermittedAttributes.user_attributes << {
29
+ subscriptions_attributes: PermittedAttributes.subscription_attributes | [:id],
30
+ }
31
+ end
32
+
33
+ initializer 'solidus_subscriptions.register_promotion_rules', after: 'spree.promo.register.promotion.rules' do |app|
34
+ app.config.spree.promotions.rules << 'SolidusSubscriptions::Promotion::Rules::SubscriptionCreationOrder'
35
+ app.config.spree.promotions.rules << 'SolidusSubscriptions::Promotion::Rules::SubscriptionInstallmentOrder'
36
+ end
37
+
38
+ initializer 'solidus_subscriptions.configure_backend' do
39
+ next unless ::Spree::Backend::Config.respond_to?(:menu_items)
40
+
41
+ ::Spree::Backend::Config.configure do |config|
42
+ config.menu_items << config.class::MenuItem.new(
43
+ [:subscriptions],
44
+ 'repeat',
45
+ url: :admin_subscriptions_path,
46
+ condition: ->{ can?(:admin, SolidusSubscriptions::Subscription) },
47
+ match_path: '/subscriptions'
48
+ )
49
+ end
50
+ end
51
+ end
52
+
53
+ def self.table_name_prefix
54
+ 'solidus_subscriptions_'
55
+ end
56
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module PermissionSets
5
+ class DefaultCustomer < ::Spree::PermissionSets::Base
6
+ def activate!
7
+ can [:show, :display, :update, :skip, :cancel], Subscription, ['user_id = ?', user.id] do |subscription, guest_token|
8
+ (subscription.guest_token.present? && subscription.guest_token == guest_token) ||
9
+ (subscription.user && subscription.user == user)
10
+ end
11
+
12
+ can [:show, :display, :update, :destroy], LineItem do |line_item, guest_token|
13
+ (line_item.subscription&.guest_token.present? && line_item.subscription.guest_token == guest_token) ||
14
+ (line_item.subscription&.user && line_item.subscription.user == user)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusSubscriptions
4
+ module PermissionSets
5
+ class SubscriptionManagement < ::Spree::PermissionSets::Base
6
+ def activate!
7
+ can :manage, Subscription
8
+ can :manage, LineItem
9
+ end
10
+ end
11
+ end
12
+ end