solidus_promotions 4.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (234) hide show
  1. checksums.yaml +7 -0
  2. data/.eslintrc.json +10 -0
  3. data/.github/stale.yml +1 -0
  4. data/MIGRATING.md +184 -0
  5. data/README.md +122 -0
  6. data/Rakefile +20 -0
  7. data/app/assets/config/solidus_promotions/manifest.js +13 -0
  8. data/app/decorators/models/solidus_promotions/adjustment_decorator.rb +11 -0
  9. data/app/decorators/models/solidus_promotions/line_item_decorator.rb +27 -0
  10. data/app/decorators/models/solidus_promotions/order_decorator.rb +42 -0
  11. data/app/decorators/models/solidus_promotions/order_recalculator_decorator.rb +15 -0
  12. data/app/decorators/models/solidus_promotions/shipment_decorator.rb +14 -0
  13. data/app/decorators/models/solidus_promotions/shipping_rate_decorator.rb +29 -0
  14. data/app/helpers/solidus_promotions/admin/benefits_helper.rb +19 -0
  15. data/app/helpers/solidus_promotions/admin/conditions_helper.rb +14 -0
  16. data/app/helpers/solidus_promotions/admin/promotions_helper.rb +15 -0
  17. data/app/javascript/backend/solidus_promotions/controllers/application.js +9 -0
  18. data/app/javascript/backend/solidus_promotions/controllers/calculator_tiers_controller.js +37 -0
  19. data/app/javascript/backend/solidus_promotions/controllers/flash_controller.js +10 -0
  20. data/app/javascript/backend/solidus_promotions/controllers/index.js +8 -0
  21. data/app/javascript/backend/solidus_promotions/controllers/product_option_values_controller.js +62 -0
  22. data/app/javascript/backend/solidus_promotions/web_components/number_with_currency.js +35 -0
  23. data/app/javascript/backend/solidus_promotions/web_components/option_value_picker.js +52 -0
  24. data/app/javascript/backend/solidus_promotions/web_components/product_picker.js +7 -0
  25. data/app/javascript/backend/solidus_promotions/web_components/select_two.js +11 -0
  26. data/app/javascript/backend/solidus_promotions/web_components/taxon_picker.js +7 -0
  27. data/app/javascript/backend/solidus_promotions/web_components/user_picker.js +7 -0
  28. data/app/javascript/backend/solidus_promotions/web_components/variant_picker.js +7 -0
  29. data/app/javascript/backend/solidus_promotions.js +11 -0
  30. data/app/jobs/solidus_promotions/promotion_code_batch_job.rb +26 -0
  31. data/app/mailers/solidus_promotions/promotion_code_batch_mailer.rb +15 -0
  32. data/app/models/concerns/solidus_promotions/benefits/line_item_benefit.rb +15 -0
  33. data/app/models/concerns/solidus_promotions/benefits/order_benefit.rb +15 -0
  34. data/app/models/concerns/solidus_promotions/benefits/shipment_benefit.rb +15 -0
  35. data/app/models/concerns/solidus_promotions/calculators/promotion_calculator.rb +11 -0
  36. data/app/models/concerns/solidus_promotions/conditions/line_item_applicable_order_level_condition.rb +23 -0
  37. data/app/models/concerns/solidus_promotions/conditions/line_item_level_condition.rb +15 -0
  38. data/app/models/concerns/solidus_promotions/conditions/order_level_condition.rb +15 -0
  39. data/app/models/concerns/solidus_promotions/conditions/shipment_level_condition.rb +15 -0
  40. data/app/models/concerns/solidus_promotions/discountable_amount.rb +21 -0
  41. data/app/models/solidus_promotions/benefit.rb +123 -0
  42. data/app/models/solidus_promotions/benefits/adjust_line_item.rb +13 -0
  43. data/app/models/solidus_promotions/benefits/adjust_line_item_quantity_groups.rb +107 -0
  44. data/app/models/solidus_promotions/benefits/adjust_shipment.rb +13 -0
  45. data/app/models/solidus_promotions/benefits/create_discounted_item.rb +49 -0
  46. data/app/models/solidus_promotions/calculators/distributed_amount.rb +31 -0
  47. data/app/models/solidus_promotions/calculators/flat_rate.rb +23 -0
  48. data/app/models/solidus_promotions/calculators/flexi_rate.rb +26 -0
  49. data/app/models/solidus_promotions/calculators/percent.rb +19 -0
  50. data/app/models/solidus_promotions/calculators/tiered_flat_rate.rb +58 -0
  51. data/app/models/solidus_promotions/calculators/tiered_percent.rb +68 -0
  52. data/app/models/solidus_promotions/calculators/tiered_percent_on_eligible_item_quantity.rb +40 -0
  53. data/app/models/solidus_promotions/condition.rb +61 -0
  54. data/app/models/solidus_promotions/condition_product.rb +8 -0
  55. data/app/models/solidus_promotions/condition_store.rb +8 -0
  56. data/app/models/solidus_promotions/condition_taxon.rb +8 -0
  57. data/app/models/solidus_promotions/condition_user.rb +8 -0
  58. data/app/models/solidus_promotions/conditions/discounted_item_total.rb +22 -0
  59. data/app/models/solidus_promotions/conditions/first_order.rb +31 -0
  60. data/app/models/solidus_promotions/conditions/first_repeat_purchase_since.rb +31 -0
  61. data/app/models/solidus_promotions/conditions/item_total.rb +75 -0
  62. data/app/models/solidus_promotions/conditions/line_item_option_value.rb +37 -0
  63. data/app/models/solidus_promotions/conditions/line_item_product.rb +56 -0
  64. data/app/models/solidus_promotions/conditions/line_item_taxon.rb +59 -0
  65. data/app/models/solidus_promotions/conditions/minimum_quantity.rb +42 -0
  66. data/app/models/solidus_promotions/conditions/nth_order.rb +40 -0
  67. data/app/models/solidus_promotions/conditions/one_use_per_user.rb +25 -0
  68. data/app/models/solidus_promotions/conditions/option_value.rb +28 -0
  69. data/app/models/solidus_promotions/conditions/product.rb +85 -0
  70. data/app/models/solidus_promotions/conditions/shipping_method.rb +19 -0
  71. data/app/models/solidus_promotions/conditions/store.rb +26 -0
  72. data/app/models/solidus_promotions/conditions/taxon.rb +98 -0
  73. data/app/models/solidus_promotions/conditions/user.rb +35 -0
  74. data/app/models/solidus_promotions/conditions/user_logged_in.rb +16 -0
  75. data/app/models/solidus_promotions/conditions/user_role.rb +42 -0
  76. data/app/models/solidus_promotions/distributed_amounts_handler.rb +39 -0
  77. data/app/models/solidus_promotions/eligibility_result.rb +5 -0
  78. data/app/models/solidus_promotions/eligibility_results.rb +47 -0
  79. data/app/models/solidus_promotions/item_discount.rb +21 -0
  80. data/app/models/solidus_promotions/migration_support/order_promotion_syncer.rb +54 -0
  81. data/app/models/solidus_promotions/order_adjuster/choose_discounts.rb +21 -0
  82. data/app/models/solidus_promotions/order_adjuster/discount_order.rb +93 -0
  83. data/app/models/solidus_promotions/order_adjuster/load_promotions.rb +53 -0
  84. data/app/models/solidus_promotions/order_adjuster/persist_discounted_order.rb +79 -0
  85. data/app/models/solidus_promotions/order_adjuster.rb +33 -0
  86. data/app/models/solidus_promotions/order_promotion.rb +23 -0
  87. data/app/models/solidus_promotions/permission_sets/solidus_promotion_management.rb +15 -0
  88. data/app/models/solidus_promotions/promotion.rb +163 -0
  89. data/app/models/solidus_promotions/promotion_advertiser.rb +10 -0
  90. data/app/models/solidus_promotions/promotion_category.rb +9 -0
  91. data/app/models/solidus_promotions/promotion_code/batch_builder.rb +73 -0
  92. data/app/models/solidus_promotions/promotion_code.rb +56 -0
  93. data/app/models/solidus_promotions/promotion_code_batch.rb +25 -0
  94. data/app/models/solidus_promotions/promotion_finder.rb +10 -0
  95. data/app/models/solidus_promotions/promotion_handler/coupon.rb +113 -0
  96. data/app/models/solidus_promotions/promotion_handler/page.rb +30 -0
  97. data/app/models/solidus_promotions/shipping_rate_discount.rb +11 -0
  98. data/app/subscribers/solidus_promotions/order_promotion_subscriber.rb +20 -0
  99. data/bin/rails +13 -0
  100. data/config/importmap.rb +14 -0
  101. data/config/locales/en.yml +376 -0
  102. data/config/locales/promotion_categories.en.yml +6 -0
  103. data/config/locales/promotions.en.yml +6 -0
  104. data/config/routes.rb +38 -0
  105. data/db/migrate/20230703101637_create_promotions.rb +25 -0
  106. data/db/migrate/20230703113625_create_promotion_benefits.rb +15 -0
  107. data/db/migrate/20230703141116_create_promotion_categories.rb +14 -0
  108. data/db/migrate/20230703143943_create_promotion_conditions.rb +12 -0
  109. data/db/migrate/20230704083830_add_condition_join_tables.rb +31 -0
  110. data/db/migrate/20230704102444_create_promotion_codes.rb +11 -0
  111. data/db/migrate/20230704102656_create_promotion_code_batches.rb +34 -0
  112. data/db/migrate/20230705171556_create_order_promotions.rb +11 -0
  113. data/db/migrate/20230725074235_create_shipping_rate_discounts.rb +12 -0
  114. data/db/migrate/20231011100059_add_db_comments_to_order_promotions.rb +61 -0
  115. data/db/migrate/20231011120928_add_db_comments_to_condition_taxons.rb +54 -0
  116. data/db/migrate/20231011131324_add_db_comments_to_conditions.rb +60 -0
  117. data/db/migrate/20231011142040_add_db_comments_to_condition_users.rb +53 -0
  118. data/db/migrate/20231011155822_add_db_comments_to_promotions.rb +123 -0
  119. data/db/migrate/20231011163030_add_db_comments_to_promotion_codes.rb +60 -0
  120. data/db/migrate/20231011173312_add_db_comments_to_promotion_code_batches.rb +91 -0
  121. data/db/migrate/20231011184205_add_db_comments_to_condition_stores.rb +53 -0
  122. data/db/migrate/20231011190222_add_db_comments_to_benefits.rb +61 -0
  123. data/db/migrate/20231012020928_add_db_comments_to_condition_products.rb +52 -0
  124. data/db/migrate/20231012120928_add_db_comments_to_promotion_categories.rb +52 -0
  125. data/db/migrate/20231104135812_add_managed_by_order_benefit_to_line_items.rb +5 -0
  126. data/lib/components/admin/solidus_admin/orders/show/adjustments/index/source/solidus_promotions_benefit/component.rb +17 -0
  127. data/lib/components/admin/solidus_promotions/orders/index/component.rb +15 -0
  128. data/lib/components/admin/solidus_promotions/orders/index/component.yml +3 -0
  129. data/lib/components/admin/solidus_promotions/promotion_categories/index/component.rb +60 -0
  130. data/lib/components/admin/solidus_promotions/promotions/index/component.rb +108 -0
  131. data/lib/components/admin/solidus_promotions/promotions/index/component.yml +10 -0
  132. data/lib/controllers/admin/solidus_promotions/promotion_categories_controller.rb +29 -0
  133. data/lib/controllers/admin/solidus_promotions/promotions_controller.rb +46 -0
  134. data/lib/controllers/backend/solidus_promotions/admin/base_controller.rb +15 -0
  135. data/lib/controllers/backend/solidus_promotions/admin/benefits_controller.rb +85 -0
  136. data/lib/controllers/backend/solidus_promotions/admin/conditions_controller.rb +69 -0
  137. data/lib/controllers/backend/solidus_promotions/admin/promotion_categories_controller.rb +13 -0
  138. data/lib/controllers/backend/solidus_promotions/admin/promotion_code_batches_controller.rb +42 -0
  139. data/lib/controllers/backend/solidus_promotions/admin/promotion_codes_controller.rb +58 -0
  140. data/lib/controllers/backend/solidus_promotions/admin/promotions_controller.rb +65 -0
  141. data/lib/generators/solidus_promotions/install/install_generator.rb +56 -0
  142. data/lib/generators/solidus_promotions/install/templates/initializer.rb +6 -0
  143. data/lib/solidus_promotions/configuration.rb +125 -0
  144. data/lib/solidus_promotions/engine.rb +115 -0
  145. data/lib/solidus_promotions/migrate_adjustments.rb +62 -0
  146. data/lib/solidus_promotions/migrate_order_promotions.rb +73 -0
  147. data/lib/solidus_promotions/promotion_map.rb +126 -0
  148. data/lib/solidus_promotions/promotion_migrator.rb +103 -0
  149. data/lib/solidus_promotions/testing_support/factories/completed_order_with_solidus_promotion_factory.rb +20 -0
  150. data/lib/solidus_promotions/testing_support/factories/solidus_order_promotion_factory.rb +8 -0
  151. data/lib/solidus_promotions/testing_support/factories/solidus_promotion_category_factory.rb +7 -0
  152. data/lib/solidus_promotions/testing_support/factories/solidus_promotion_code_factory.rb +8 -0
  153. data/lib/solidus_promotions/testing_support/factories/solidus_promotion_factory.rb +65 -0
  154. data/lib/solidus_promotions/testing_support/factories/solidus_shipping_rate_discount_factory.rb +14 -0
  155. data/lib/solidus_promotions/testing_support/factory_bot.rb +30 -0
  156. data/lib/solidus_promotions.rb +37 -0
  157. data/lib/tasks/solidus_promotions/migrate_adjustments.rake +17 -0
  158. data/lib/tasks/solidus_promotions/migrate_existing_promotions.rake +12 -0
  159. data/lib/tasks/solidus_promotions/migrate_order_promotions.rake +17 -0
  160. data/lib/views/backend/solidus_promotions/admin/benefit_fields/_adjust_line_item.html.erb +6 -0
  161. data/lib/views/backend/solidus_promotions/admin/benefit_fields/_adjust_line_item_quantity_groups.html.erb +13 -0
  162. data/lib/views/backend/solidus_promotions/admin/benefit_fields/_adjust_shipment.html.erb +6 -0
  163. data/lib/views/backend/solidus_promotions/admin/benefit_fields/_calculator_fields.erb +11 -0
  164. data/lib/views/backend/solidus_promotions/admin/benefit_fields/_create_discounted_item.html.erb +21 -0
  165. data/lib/views/backend/solidus_promotions/admin/benefits/_benefit.html.erb +50 -0
  166. data/lib/views/backend/solidus_promotions/admin/benefits/_calculator_select.html.erb +16 -0
  167. data/lib/views/backend/solidus_promotions/admin/benefits/_form.html.erb +3 -0
  168. data/lib/views/backend/solidus_promotions/admin/benefits/_new_benefit.html.erb +33 -0
  169. data/lib/views/backend/solidus_promotions/admin/benefits/_type_select.html.erb +16 -0
  170. data/lib/views/backend/solidus_promotions/admin/benefits/edit.html.erb +19 -0
  171. data/lib/views/backend/solidus_promotions/admin/benefits/new.html.erb +1 -0
  172. data/lib/views/backend/solidus_promotions/admin/calculator_fields/_default_fields.html.erb +6 -0
  173. data/lib/views/backend/solidus_promotions/admin/calculator_fields/distributed_amount/_fields.html.erb +18 -0
  174. data/lib/views/backend/solidus_promotions/admin/calculator_fields/flat_rate/_fields.html.erb +6 -0
  175. data/lib/views/backend/solidus_promotions/admin/calculator_fields/flexi_rate/_fields.html.erb +24 -0
  176. data/lib/views/backend/solidus_promotions/admin/calculator_fields/percent/_fields.html.erb +6 -0
  177. data/lib/views/backend/solidus_promotions/admin/calculator_fields/tiered_flat_rate/_fields.html.erb +32 -0
  178. data/lib/views/backend/solidus_promotions/admin/calculator_fields/tiered_flat_rate/_tier_fields.html.erb +31 -0
  179. data/lib/views/backend/solidus_promotions/admin/calculator_fields/tiered_percent/_fields.html.erb +47 -0
  180. data/lib/views/backend/solidus_promotions/admin/calculator_fields/tiered_percent/_tier_fields.html.erb +33 -0
  181. data/lib/views/backend/solidus_promotions/admin/calculator_fields/tiered_percent_on_eligible_item_quantity/_fields.html.erb +36 -0
  182. data/lib/views/backend/solidus_promotions/admin/calculator_fields/tiered_percent_on_eligible_item_quantity/_tier_fields.html.erb +35 -0
  183. data/lib/views/backend/solidus_promotions/admin/condition_fields/_first_order.html.erb +3 -0
  184. data/lib/views/backend/solidus_promotions/admin/condition_fields/_first_repeat_purchase_since.html.erb +7 -0
  185. data/lib/views/backend/solidus_promotions/admin/condition_fields/_item_total.html.erb +15 -0
  186. data/lib/views/backend/solidus_promotions/admin/condition_fields/_line_item_option_value.html.erb +25 -0
  187. data/lib/views/backend/solidus_promotions/admin/condition_fields/_line_item_product.html.erb +21 -0
  188. data/lib/views/backend/solidus_promotions/admin/condition_fields/_line_item_taxon.html.erb +17 -0
  189. data/lib/views/backend/solidus_promotions/admin/condition_fields/_minimum_quantity.html.erb +5 -0
  190. data/lib/views/backend/solidus_promotions/admin/condition_fields/_nth_order.html.erb +15 -0
  191. data/lib/views/backend/solidus_promotions/admin/condition_fields/_one_use_per_user.html.erb +3 -0
  192. data/lib/views/backend/solidus_promotions/admin/condition_fields/_option_value.html.erb +63 -0
  193. data/lib/views/backend/solidus_promotions/admin/condition_fields/_product.html.erb +27 -0
  194. data/lib/views/backend/solidus_promotions/admin/condition_fields/_shipping_method.html.erb +10 -0
  195. data/lib/views/backend/solidus_promotions/admin/condition_fields/_store.html.erb +9 -0
  196. data/lib/views/backend/solidus_promotions/admin/condition_fields/_taxon.html.erb +27 -0
  197. data/lib/views/backend/solidus_promotions/admin/condition_fields/_user.html.erb +7 -0
  198. data/lib/views/backend/solidus_promotions/admin/condition_fields/_user_logged_in.html.erb +3 -0
  199. data/lib/views/backend/solidus_promotions/admin/condition_fields/_user_role.html.erb +15 -0
  200. data/lib/views/backend/solidus_promotions/admin/condition_fields/line_item_option_value/_option_value_fields.html.erb +21 -0
  201. data/lib/views/backend/solidus_promotions/admin/conditions/_condition.html.erb +26 -0
  202. data/lib/views/backend/solidus_promotions/admin/conditions/_new_condition.html.erb +26 -0
  203. data/lib/views/backend/solidus_promotions/admin/conditions/_type_select.html.erb +20 -0
  204. data/lib/views/backend/solidus_promotions/admin/conditions/new.html.erb +1 -0
  205. data/lib/views/backend/solidus_promotions/admin/promotion_categories/_form.html.erb +14 -0
  206. data/lib/views/backend/solidus_promotions/admin/promotion_categories/edit.html.erb +10 -0
  207. data/lib/views/backend/solidus_promotions/admin/promotion_categories/index.html.erb +47 -0
  208. data/lib/views/backend/solidus_promotions/admin/promotion_categories/new.html.erb +10 -0
  209. data/lib/views/backend/solidus_promotions/admin/promotion_code_batches/_form_fields.html.erb +22 -0
  210. data/lib/views/backend/solidus_promotions/admin/promotion_code_batches/download.csv.ruby +8 -0
  211. data/lib/views/backend/solidus_promotions/admin/promotion_code_batches/index.html.erb +65 -0
  212. data/lib/views/backend/solidus_promotions/admin/promotion_code_batches/new.html.erb +8 -0
  213. data/lib/views/backend/solidus_promotions/admin/promotion_codes/index.csv.ruby +8 -0
  214. data/lib/views/backend/solidus_promotions/admin/promotion_codes/index.html.erb +32 -0
  215. data/lib/views/backend/solidus_promotions/admin/promotion_codes/new.html.erb +31 -0
  216. data/lib/views/backend/solidus_promotions/admin/promotions/_form.html.erb +124 -0
  217. data/lib/views/backend/solidus_promotions/admin/promotions/_table.html.erb +57 -0
  218. data/lib/views/backend/solidus_promotions/admin/promotions/_table_filter.html.erb +78 -0
  219. data/lib/views/backend/solidus_promotions/admin/promotions/edit.html.erb +41 -0
  220. data/lib/views/backend/solidus_promotions/admin/promotions/index.html.erb +23 -0
  221. data/lib/views/backend/solidus_promotions/admin/promotions/new.html.erb +9 -0
  222. data/lib/views/backend/solidus_promotions/admin/shared/_number_with_currency.html.erb +20 -0
  223. data/lib/views/backend/solidus_promotions/admin/shared/_promotion_sub_menu.html.erb +14 -0
  224. data/lib/views/backend/solidus_promotions/admin/shared/preference_fields/_boolean.html.erb +14 -0
  225. data/lib/views/backend/solidus_promotions/admin/shared/preference_fields/_decimal.html.erb +12 -0
  226. data/lib/views/backend/solidus_promotions/admin/shared/preference_fields/_encrypted_string.html.erb +12 -0
  227. data/lib/views/backend/solidus_promotions/admin/shared/preference_fields/_integer.html.erb +12 -0
  228. data/lib/views/backend/solidus_promotions/admin/shared/preference_fields/_password.html.erb +12 -0
  229. data/lib/views/backend/solidus_promotions/admin/shared/preference_fields/_string.html.erb +12 -0
  230. data/lib/views/backend/solidus_promotions/admin/shared/preference_fields/_text.html.erb +12 -0
  231. data/lib/views/backend/solidus_promotions/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +2 -0
  232. data/lib/views/backend/solidus_promotions/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +2 -0
  233. data/solidus_promotions.gemspec +33 -0
  234. metadata +366 -0
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPromotions
4
+ class PromotionCodeBatch < Spree::Base
5
+ class CantProcessStartedBatch < StandardError
6
+ end
7
+
8
+ belongs_to :promotion
9
+ has_many :promotion_codes, dependent: :destroy
10
+
11
+ validates :number_of_codes, numericality: { greater_than: 0 }
12
+ validates :base_code, :number_of_codes, presence: true
13
+
14
+ def finished?
15
+ state == "completed"
16
+ end
17
+
18
+ def process
19
+ raise CantProcessStartedBatch, "Batch #{id} already started" unless state == "pending"
20
+
21
+ update!(state: "processing")
22
+ PromotionCodeBatchJob.perform_later(self)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPromotions
4
+ class PromotionFinder
5
+ def self.by_code_or_id(coupon_code_or_id)
6
+ SolidusPromotions::Promotion.with_coupon_code(coupon_code_or_id.to_s) ||
7
+ SolidusPromotions::Promotion.find(coupon_code_or_id)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPromotions
4
+ module PromotionHandler
5
+ class Coupon
6
+ attr_reader :order, :coupon_code, :errors
7
+ attr_accessor :error, :success, :status_code
8
+
9
+ def initialize(order)
10
+ @order = order
11
+ @errors = []
12
+ @coupon_code = order&.coupon_code&.downcase
13
+ end
14
+
15
+ def apply
16
+ if coupon_code.present?
17
+ if promotion.present? && promotion.active?
18
+ handle_present_promotion
19
+ elsif promotion_code&.promotion&.expired?
20
+ set_error_code :coupon_code_expired
21
+ else
22
+ set_error_code :coupon_code_not_found
23
+ end
24
+ end
25
+
26
+ self
27
+ end
28
+
29
+ def remove
30
+ if promotion.blank?
31
+ set_error_code :coupon_code_not_found
32
+ elsif !promotion_exists_on_order?(order, promotion)
33
+ set_error_code :coupon_code_not_present
34
+ else
35
+ order.solidus_order_promotions.destroy_by(
36
+ promotion: promotion
37
+ )
38
+ order.recalculate
39
+ set_success_code :coupon_code_removed
40
+ end
41
+
42
+ self
43
+ end
44
+
45
+ def successful?
46
+ success.present? && error.blank?
47
+ end
48
+
49
+ def promotion
50
+ @promotion ||= if promotion_code&.promotion&.active?
51
+ promotion_code.promotion
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def set_success_code(status_code)
58
+ @status_code = status_code
59
+ @success = I18n.t(status_code, scope: "solidus_promotions.eligibility_results")
60
+ end
61
+
62
+ def set_error_code(status_code, options = {})
63
+ @status_code = status_code
64
+ @error = options[:error] || I18n.t(status_code, scope: "solidus_promotions.eligibility_errors")
65
+ @errors = options[:errors] || [@error]
66
+ end
67
+
68
+ def promotion_code
69
+ @promotion_code ||= SolidusPromotions::PromotionCode.where(value: coupon_code).first
70
+ end
71
+
72
+ def handle_present_promotion
73
+ return promotion_usage_limit_exceeded if promotion.usage_limit_exceeded? || promotion_code.usage_limit_exceeded?
74
+ return promotion_applied if promotion_exists_on_order?(order, promotion)
75
+
76
+ # Try applying this promotion, with no effects
77
+ Spree::Config.promotions.order_adjuster_class.new(order, dry_run_promotion: promotion).call
78
+
79
+ if promotion.eligibility_results.success?
80
+ order.solidus_order_promotions.create!(
81
+ promotion: promotion,
82
+ promotion_code: promotion_code
83
+ )
84
+ order.recalculate
85
+ set_success_code :coupon_code_applied
86
+ else
87
+ set_promotion_eligibility_error(promotion)
88
+ end
89
+ end
90
+
91
+ def set_promotion_eligibility_error(promotion)
92
+ eligibility_error = promotion.eligibility_results.detect { |result| !result.success }
93
+ set_error_code(eligibility_error.code, error: eligibility_error.message, errors: promotion.eligibility_results.error_messages)
94
+ end
95
+
96
+ def promotion_usage_limit_exceeded
97
+ set_error_code :coupon_code_max_usage
98
+ end
99
+
100
+ def ineligible_for_this_order
101
+ set_error_code :coupon_code_not_eligible
102
+ end
103
+
104
+ def promotion_applied
105
+ set_error_code :coupon_code_already_applied
106
+ end
107
+
108
+ def promotion_exists_on_order?(order, promotion)
109
+ order.solidus_promotions.include? promotion
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPromotions
4
+ module PromotionHandler
5
+ class Page
6
+ attr_reader :order, :path
7
+
8
+ def initialize(order, path)
9
+ @order = order
10
+ @path = path.delete_prefix('/')
11
+ end
12
+
13
+ def activate
14
+ if promotion
15
+ Spree::Config.promotions.order_adjuster_class.new(order, dry_run_promotion: promotion).call
16
+ if promotion.eligibility_results.success?
17
+ order.solidus_promotions << promotion
18
+ order.recalculate
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def promotion
26
+ @promotion ||= SolidusPromotions::Promotion.active.find_by(path: path)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPromotions
4
+ class ShippingRateDiscount < Spree::Base
5
+ belongs_to :shipping_rate, inverse_of: :discounts, class_name: "Spree::ShippingRate"
6
+ belongs_to :benefit, inverse_of: :shipping_rate_discounts
7
+
8
+ extend Spree::DisplayMoney
9
+ money_methods :amount
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPromotions
4
+ # Clears promotions from an emptied order
5
+ class OrderPromotionSubscriber
6
+ include Omnes::Subscriber
7
+
8
+ handle :order_emptied,
9
+ with: :clear_order_promotions,
10
+ id: :solidus_promotions_order_promotion_clear_order_promotions
11
+
12
+ # Clears all promotions from the order
13
+ #
14
+ # @param event [Omnes::UnstructuredEvent]
15
+ def clear_order_promotions(event)
16
+ order = event[:order]
17
+ order.solidus_order_promotions.destroy_all
18
+ end
19
+ end
20
+ end
data/bin/rails ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails gems
3
+ # installed from the root of your application.
4
+
5
+ ENGINE_ROOT = File.expand_path('..', __dir__)
6
+ ENGINE_PATH = File.expand_path('../lib/solidus_promotions/engine', __dir__)
7
+
8
+ # Set up gems listed in the Gemfile.
9
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
10
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
11
+
12
+ require 'rails/all'
13
+ require 'rails/engine/commands'
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true
4
+
5
+ pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
6
+ pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
7
+ pin_all_from SolidusPromotions::Engine.root.join("app/javascript/backend/solidus_promotions/controllers"),
8
+ under: "backend/solidus_promotions/controllers"
9
+ pin_all_from SolidusPromotions::Engine.root.join("app/javascript/backend/solidus_promotions/jquery"),
10
+ under: "backend/solidus_promotions/jquery"
11
+ pin_all_from SolidusPromotions::Engine.root.join("app/javascript/backend/solidus_promotions/web_components"),
12
+ under: "backend/solidus_promotions/web_components"
13
+
14
+ pin "backend/solidus_promotions", to: "backend/solidus_promotions.js", preload: true
@@ -0,0 +1,376 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ spree:
6
+ admin:
7
+ tab:
8
+ promotions: Promotions
9
+ promotion_categories: Promotion Categories
10
+ legacy_promotions: Legacy Promotions
11
+ legacy_promotion_categories: Legacy Promotion Categories
12
+ hints:
13
+ solidus_promotions/promotion:
14
+ expires_at: This determines when the promotion expires. <br> If no value is specified, the promotion will never expire.
15
+ promo_code_will_be_disabled: Selecting this option, promo codes will be disabled for this promotion because all its conditions / benefits will be applied automatically to all orders.
16
+ starts_at: This determines when the promotion can be applied to orders. <br> If no value is specified, the promotion will be immediately available.
17
+ solidus_promotions:
18
+ hints:
19
+ solidus_promotions/benefit:
20
+ conditions: This is used to determine if the benefit should be applied.
21
+ type: This is the type of benefit that will be applied.
22
+ calculator: This is used to determine the promotional discount to be applied to an order, an item, or shipping charges.
23
+ benefits: Benefits
24
+ adjustment_labels:
25
+ line_item: "%{promotion} (%{promotion_customer_label})"
26
+ shipment: "%{promotion} (%{promotion_customer_label})"
27
+ shipping_rate: "%{promotion} (%{promotion_customer_label})"
28
+ adjustment_type: Adjustment type
29
+ add_benefit: Add Benefit
30
+ add_condition: Add Condition
31
+ order_conditions: Order Conditions
32
+ line_item_conditions: Line Item Conditions
33
+ shipment_conditions: Shipment Conditions
34
+ line_item_benefits: Line Item Benefits
35
+ shipment_benefits: Shipment Benefits
36
+ order_benefits: Order Benefits
37
+ invalid_benefit: Invalid promotion benefit.
38
+ invalid_condition: Invalid promotion condition.
39
+ create_promotion_code: Create promotion code
40
+ current_promotion_usage: 'Current Usage: %{count}'
41
+ discount_conditions: Promotion Conditions
42
+ download_promotion_codes_list: Download codes list
43
+ new_promotion: New Promotion
44
+ new_promotion_category: New Promotion Category
45
+ new_promotion_code_batch: New Promotion Code Batch
46
+ number_of_codes: "%{count} codes"
47
+ legacy_promotions: Legacy Promotions
48
+ no_conditions_added: No Conditions Added
49
+ promotion_successfully_created: Promotion has been successfully created!
50
+ promotion_total_changed_before_complete: One or more of the promotions on your order have become ineligible and were removed. Please check the new order amounts and try again.
51
+ promotion_code_batches:
52
+ finished: Finished
53
+ errored: Errored
54
+ view_promotion_codes_list: View codes list
55
+ conditions:
56
+ line_item_product:
57
+ match_policies:
58
+ include: Line item's product is one of the chosen products
59
+ exclude: Line item's product is not one of the chosen products
60
+ line_item_taxon:
61
+ match_policies:
62
+ include: Line item's product has one of the chosen taxons
63
+ exclude: Line item's product does not have one of the chosen taxons
64
+ item_total_condition:
65
+ operators:
66
+ gt: greater than
67
+ gte: greater than or equal to
68
+ user_condition:
69
+ choose_users: Choose Users
70
+ user_role_condition:
71
+ choose_roles: Choose Roles
72
+ label: User must contain %{select} of these roles
73
+ match_all: all
74
+ match_any: at least one
75
+ coupon_code: Coupon code
76
+ eligibility_results:
77
+ coupon_code_applied: The coupon code was successfully applied to your order.
78
+ coupon_code_removed: The coupon code was successfully removed from this order.
79
+ eligibility_errors:
80
+ coupon_code_already_applied: The coupon code has already been applied to this order
81
+ coupon_code_expired: The coupon code is expired
82
+ coupon_code_max_usage: Coupon code usage limit exceeded
83
+ coupon_code_not_eligible: This coupon code is not eligible for this order
84
+ coupon_code_not_found: The coupon code you entered doesn't exist. Please try again.
85
+ coupon_code_not_present: The coupon code you are trying to remove is not present on this order.
86
+ coupon_code_unknown_error: This coupon code could not be applied to the cart at this time.
87
+ solidus_promotions/conditions/first_order:
88
+ not_first_order: This coupon code can only be applied to your first order.
89
+ solidus_promotions/conditions/first_repeat_purchase_since:
90
+ solidus_promotions/conditions/item_total:
91
+ item_total_doesnt_match_with_operator: This coupon code can't be applied to orders %{operator} %{amount}.
92
+ item_total_less_than: This coupon code can't be applied to orders less than %{amount}.
93
+ item_total_less_than_or_equal: This coupon code can't be applied to orders less than or equal to %{amount}.
94
+ solidus_promotions/conditions/discounted_item_total:
95
+ item_total_doesnt_match_with_operator: This coupon code can't be applied to orders %{operator} %{amount}.
96
+ item_total_less_than: This coupon code can't be applied to orders less than %{amount}.
97
+ item_total_less_than_or_equal: This coupon code can't be applied to orders less than or equal to %{amount}.
98
+ solidus_promotions/conditions/landing_page:
99
+ solidus_promotions/conditions/nth_order:
100
+ solidus_promotions/conditions/one_use_per_user:
101
+ no_user_specified: You need to login before applying this coupon code.
102
+ limit_once_per_user: This coupon code can only be used once per user.
103
+ solidus_promotions/conditions/option_value:
104
+ solidus_promotions/conditions/line_item_option_value:
105
+ solidus_promotions/conditions/product:
106
+ has_excluded_product: Your cart contains a product that prevents this coupon code from being applied.
107
+ missing_product: This coupon code can't be applied because you don't have all of the necessary products in your cart.
108
+ no_applicable_products: You need to add an applicable product before applying this coupon code.
109
+ solidus_promotions/conditions/line_item_product:
110
+ has_excluded_product: Your cart contains a product that prevents this coupon code from being applied.
111
+ missing_product: This coupon code can't be applied because you don't have all of the necessary products in your cart.
112
+ no_applicable_products: You need to add an applicable product before applying this coupon code.
113
+ solidus_promotions/conditions/taxon:
114
+ has_excluded_taxon: Your cart contains a product from an excluded category that prevents this coupon code from being applied.
115
+ missing_taxon: You need to add a product from all applicable categories before applying this coupon code.
116
+ no_matching_taxons: You need to add a product from an applicable category before applying this coupon code.
117
+ solidus_promotions/conditions/line_item_taxon:
118
+ has_excluded_taxon: Your cart contains a product from an excluded category that prevents this coupon code from being applied.
119
+ missing_taxon: You need to add a product from all applicable categories before applying this coupon code.
120
+ no_matching_taxons: You need to add a product from an applicable category before applying this coupon code.
121
+ solidus_promotions/conditions/user:
122
+ no_user_specified: You need to login before applying this coupon code.
123
+ solidus_promotions/conditions/user_logged_in:
124
+ no_user_specified: You need to login before applying this coupon code.
125
+ solidus_promotions/conditions/user_role:
126
+ solidus_promotions/conditions/minimum_quantity:
127
+ quantity_less_than_minimum:
128
+ one: "You need to add a least 1 applicable item to your order."
129
+ other: "You need to add a least %{count} applicable items to your order."
130
+ product_condition:
131
+ choose_products: Choose products
132
+ label: Order must contain %{select} these products
133
+ match_all: all of
134
+ match_any: at least one of
135
+ match_none: none of
136
+ match_only: only
137
+ product_source:
138
+ group: From product group
139
+ manual: Manually choose
140
+ taxon_condition:
141
+ choose_taxons: Choose taxons
142
+ label: Order must contain %{select} of these taxons
143
+ match_all: all
144
+ match_any: at least one
145
+ match_none: none
146
+ line_item_option_value_condition:
147
+ add_product: Add product
148
+ option_value_condition:
149
+ add_product: Add product
150
+ crud:
151
+ add: Add
152
+ destroy: Delete
153
+ update: Update
154
+ admin:
155
+ promotions:
156
+ benefits:
157
+ calculator_label: Calculated by
158
+ activations_edit:
159
+ auto: All orders will attempt to use this promotion
160
+ multiple_codes_html: This promotion uses %{count} promotion codes
161
+ single_code_html: 'This promotion uses the promotion code: <code>%{code}</code>'
162
+ activations_new:
163
+ auto: Apply to all orders
164
+ multiple_codes: Multiple promotion codes
165
+ single_code: Single promotion code
166
+ form:
167
+ activation: Activation
168
+ expires_at_placeholder: Never
169
+ general: General
170
+ starts_at_placeholder: Immediately
171
+ codes_present: This promotion has promotion codes defined. You cannot select the apply automatically option.
172
+ edit:
173
+ order_conditions: Order Conditions
174
+ calculator:
175
+ add_tier: Add tier
176
+ promotion_status:
177
+ active: Active
178
+ expired: Expired
179
+ inactive: Inactive
180
+ not_started: Not started
181
+ promotion_code_batch_mailer:
182
+ promotion_code_batch_errored:
183
+ message: 'Promotion code batch errored (%{error}) for promotion: '
184
+ subject: Promotion code batch errored
185
+ promotion_code_batch_finished:
186
+ message: 'All %{number_of_codes} codes have been created for promotion: '
187
+ subject: Promotion code batch finished
188
+ activerecord:
189
+ models:
190
+ solidus_promotions/benefits/adjust_shipment: Discount matching shipments
191
+ solidus_promotions/benefits/adjust_line_item: Discount matching line items
192
+ solidus_promotions/benefits/create_discounted_item: Create discounted line item
193
+ solidus_promotions/benefits/adjust_line_item_quantity_groups: Discount matching line items based on quantity groups
194
+ solidus_promotions/calculators/distributed_amount: Distributed Amount
195
+ solidus_promotions/calculators/percent: Percent
196
+ solidus_promotions/calculators/flat_rate: Flat Rate
197
+ solidus_promotions/calculators/flexi_rate: Flexible Rate
198
+ solidus_promotions/calculators/tiered_flat_rate: Tiered Flat Rate
199
+ solidus_promotions/calculators/tiered_percent: Tiered Percent
200
+ solidus_promotions/calculators/tiered_percent_on_eligible_item_quantity: Tiered Percent based on eligible item quantity
201
+ solidus_promotions/conditions/first_order: First Order
202
+ solidus_promotions/conditions/first_repeat_purchase_since: First Repeat Purchase Since
203
+ solidus_promotions/conditions/item_total: Item Total
204
+ solidus_promotions/conditions/discounted_item_total: Item Total after previous lanes
205
+ solidus_promotions/conditions/landing_page: Landing Page
206
+ solidus_promotions/conditions/minimum_quantity: Minimum Quantity
207
+ solidus_promotions/conditions/nth_order: Nth Order
208
+ solidus_promotions/conditions/one_use_per_user: One Use Per User
209
+ solidus_promotions/conditions/option_value: Option Value(s)
210
+ solidus_promotions/conditions/line_item_option_value: Line Item Option Value(s)
211
+ solidus_promotions/conditions/product: Order Product(s)
212
+ solidus_promotions/conditions/line_item_product: Line Item Product(s)
213
+ solidus_promotions/conditions/taxon: Order Taxon(s)
214
+ solidus_promotions/conditions/line_item_taxon: Line Item Taxon(s)
215
+ solidus_promotions/conditions/user: User
216
+ solidus_promotions/conditions/user_logged_in: User Logged In
217
+ solidus_promotions/conditions/user_role: User Role(s)
218
+ solidus_promotions/promotion_code_batch:
219
+ one: Code batch
220
+ other: Code batches
221
+ attributes:
222
+ solidus_promotions/promotion:
223
+ active: Active
224
+ customer_label: Customer-facing label
225
+ usage: Usage
226
+ lanes:
227
+ pre: Pre
228
+ default: Default
229
+ post: Post
230
+ solidus_promotions/benefit:
231
+ type: Benefit Type
232
+ solidus_promotions/condition:
233
+ type: Condition Type
234
+ solidus_promotions/benefits/adjust_line_item:
235
+ description: Creates a promotion credit on matching line items
236
+ solidus_promotions/benefits/adjust_shipment:
237
+ description: Creates a promotion credit on matching shipments
238
+ solidus_promotions/benefits/create_discounted_item:
239
+ description: Creates a discounted item with the quantity the applicable line items.
240
+ preferred_quantity: Quantity per applicable line item quantity
241
+ preferred_necessary_quantity: Number of items needed for a discounted item
242
+ solidus_promotions/conditions/first_order:
243
+ description: Must be the customer's first order
244
+ solidus_promotions/conditions/first_repeat_purchase_since:
245
+ description: Available only to users who have not purchased in a while
246
+ preferred_days_ago: Last purchase was at least this many days ago
247
+ solidus_promotions/conditions/item_total:
248
+ description: Order total must be greater than or equal to the specified amount
249
+ preferred_operator: Operator
250
+ preferred_amount: Amount
251
+ solidus_promotions/conditions/landing_page:
252
+ description: Customer must have visited the specified page
253
+ solidus_promotions/conditions/nth_order:
254
+ description: Apply a promotion to the nth order a user has completed.
255
+ form_text: 'Apply this promotion on the users Nth order: '
256
+ solidus_promotions/conditions/one_use_per_user:
257
+ description: Only one use per user
258
+ solidus_promotions/conditions/option_value:
259
+ description: Order includes specified product(s) with matching option value(s)
260
+ preferred_line_item_applicable: Should also apply to line items
261
+ solidus_promotions/conditions/line_item_option_value:
262
+ description: Line Item has specified product with matching option value
263
+ solidus_promotions/conditions/minimum_quantity:
264
+ description: Order contains minimum quantity of applicable items
265
+ solidus_promotions/conditions/product:
266
+ description: Order includes specified product(s)
267
+ line_item_level_description: 'Line item matches the specified products:'
268
+ preferred_line_item_applicable: Should also apply to line items
269
+ solidus_promotions/conditions/line_item_product:
270
+ description: Line item matches specified product(s)
271
+ preferred_match_policy: Match Policy
272
+ solidus_promotions/conditions/store:
273
+ description: Available only to the specified stores
274
+ solidus_promotions/conditions/taxon:
275
+ description: Order includes products with specified taxon(s)
276
+ preferred_line_item_applicable: Should also apply to line items
277
+ solidus_promotions/conditions/line_item_taxon:
278
+ description: Line Item has product with specified taxon(s)
279
+ preferred_match_policy: Match Policy
280
+ solidus_promotions/conditions/user:
281
+ description: Available only to the specified users
282
+ solidus_promotions/conditions/user_logged_in:
283
+ description: Available only to logged in users
284
+ solidus_promotions/conditions/user_role:
285
+ description: Order includes User with specified Role(s)
286
+ solidus_promotions/calculators/tiered_flat_rate:
287
+ description: Flat Rate in tiers based on item amount
288
+ preferred_base_amount: Base Amount
289
+ tiers: Tiers
290
+ solidus_promotions/calculators/tiered_percent:
291
+ description: Tiered percentage based on order's item total
292
+ preferred_base_percent: Base Percent
293
+ tiers: Tiers
294
+ order_item_total: Order Item Total
295
+ percent: Percent
296
+ solidus_promotions/calculators/tiered_percent_on_eligible_item_quantity:
297
+ description: Tiered percentage based on eligible item quantity
298
+ preferred_base_percent: Base Percent
299
+ tiers: Tiers
300
+ order_item_total: Order Item Total
301
+ discount: Discount
302
+ solidus_promotions/calculators/flat_rate:
303
+ description: Provides a flat rate discount
304
+ solidus_promotions/calculators/flexi_rate:
305
+ description: Calculates a discount for the first item and (separately) any additional items, with a maximum number of items that can be specified.
306
+ preferred_first_item: Discount for the first item
307
+ preferred_additional_item: Discount for additional items
308
+ preferred_max_items: Maximum number of items
309
+ preferred_currency: Currency
310
+ solidus_promotions/calculators/percent:
311
+ description: Provides a discount calculated by percent of the discountable amount of the item being discounted
312
+ solidus_promotions/calculators/distributed_amount:
313
+ description: Distributes the configured amount among all eligible line items of the order.
314
+ explanation: |
315
+ <p>
316
+ This amount will be distributed to line items weighted relative to
317
+ their price. More expensive line items will receive a greater share
318
+ of the adjustment.
319
+ </p>
320
+ <p>
321
+ For example, with three line items and a preferred amount of $15 we
322
+ would end up with the following distribution:
323
+ </p>
324
+ <table>
325
+ <thead>
326
+ <tr>
327
+ <th></th>
328
+ <th>Price</th>
329
+ <th>Weighted Adj.</th>
330
+ </tr>
331
+ </thead>
332
+ <tbody>
333
+ <tr>
334
+ <td>Socks</td>
335
+ <td>$5</td>
336
+ <td>-$1.5</td>
337
+ </tr>
338
+ <tr>
339
+ <td>Shoes</td>
340
+ <td>$30</td>
341
+ <td>-$9</td>
342
+ </tr>
343
+ <tr>
344
+ <td>Slippers</td>
345
+ <td>$15</td>
346
+ <td>-$4.5</td>
347
+ </tr>
348
+ </tbody>
349
+ </table>
350
+ preferred_amount: Amount
351
+
352
+ errors:
353
+ models:
354
+ solidus_promotions/benefit:
355
+ attributes:
356
+ base:
357
+ cannot_destroy_if_order_completed: Benefit has been applied to complete orders. It cannot be destroyed.
358
+ solidus_promotions/condition:
359
+ attributes:
360
+ benefit:
361
+ already_contains_condition_type: already contains this condition type
362
+ type:
363
+ invalid_condition_type: is not a valid condition type
364
+ solidus_promotions/promotion_code:
365
+ attributes:
366
+ base:
367
+ disallowed_with_apply_automatically: Could not create promotion code on promotion that apply automatically
368
+ spree/line_item:
369
+ attributes:
370
+ quantity:
371
+ cannot_be_changed_for_automated_items: cannot be changed on a line item managed by a promotion benefit
372
+ solidus_promotions/promotion:
373
+ attributes:
374
+ apply_automatically:
375
+ disallowed_with_path: cannot be set to true when path is present
376
+ disallowed_with_promotion_codes: cannot be set to true when promotion code is present
@@ -0,0 +1,6 @@
1
+ en:
2
+ solidus_promotions:
3
+ promotion_categories:
4
+ title: "Promotion Categories"
5
+ destroy:
6
+ success: "Promotion Categories were successfully removed."
@@ -0,0 +1,6 @@
1
+ en:
2
+ solidus_promotions:
3
+ promotions:
4
+ title: "Promotions"
5
+ destroy:
6
+ success: "Promotions were successfully removed."
data/config/routes.rb ADDED
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ SolidusPromotions::Engine.routes.draw do
4
+ if SolidusSupport.admin_available?
5
+ require "solidus_admin/admin_resources"
6
+ extend SolidusAdmin::AdminResources
7
+
8
+ constraints(->(request) {
9
+ request.cookies["solidus_admin"] == "true" ||
10
+ request.params["solidus_admin"] == "true" ||
11
+ SolidusPromotions.config.use_new_admin?
12
+ }) do
13
+ scope :admin do
14
+ scope :solidus do
15
+ admin_resources :promotion_categories, only: [:index, :destroy]
16
+ admin_resources :promotions, only: [:index, :destroy]
17
+ end
18
+ end
19
+ end
20
+ end
21
+ if SolidusSupport.backend_available?
22
+ namespace :admin do
23
+ scope :solidus do
24
+ resources :promotion_categories, except: [:show]
25
+
26
+ resources :promotions do
27
+ resources :benefits do
28
+ resources :conditions
29
+ end
30
+ resources :promotion_codes, only: [:index, :new, :create]
31
+ resources :promotion_code_batches, only: [:index, :new, :create] do
32
+ get "/download", to: "promotion_code_batches#download", defaults: { format: "csv" }
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end