solidus_friendly_promotions 1.0.1 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/Gemfile +1 -1
  4. data/MIGRATING.md +1 -1
  5. data/README.md +22 -16
  6. data/app/assets/config/solidus_friendly_promotions/manifest.js +7 -1
  7. data/app/controllers/solidus_friendly_promotions/admin/benefits_controller.rb +85 -0
  8. data/app/controllers/solidus_friendly_promotions/admin/conditions_controller.rb +69 -0
  9. data/app/controllers/solidus_friendly_promotions/admin/promotions_controller.rb +3 -3
  10. data/app/decorators/models/solidus_friendly_promotions/adjustment_decorator.rb +4 -4
  11. data/app/decorators/models/solidus_friendly_promotions/line_item_decorator.rb +2 -2
  12. data/app/decorators/models/solidus_friendly_promotions/order_decorator.rb +6 -6
  13. data/app/helpers/solidus_friendly_promotions/admin/benefits_helper.rb +19 -0
  14. data/app/helpers/solidus_friendly_promotions/admin/conditions_helper.rb +12 -0
  15. data/app/javascript/solidus_friendly_promotions/controllers/product_option_values_controller.js +1 -1
  16. data/app/javascript/solidus_friendly_promotions/web_components/number_with_currency.js +35 -0
  17. data/app/javascript/solidus_friendly_promotions/{jquery → web_components}/option_value_picker.js +8 -0
  18. data/app/javascript/solidus_friendly_promotions/web_components/product_picker.js +7 -0
  19. data/app/javascript/solidus_friendly_promotions/web_components/select_two.js +11 -0
  20. data/app/javascript/solidus_friendly_promotions/web_components/taxon_picker.js +7 -0
  21. data/app/javascript/solidus_friendly_promotions/web_components/user_picker.js +7 -0
  22. data/app/javascript/solidus_friendly_promotions/web_components/variant_picker.js +7 -0
  23. data/app/javascript/solidus_friendly_promotions.js +7 -11
  24. data/app/models/concerns/solidus_friendly_promotions/{actions/order_level_action.rb → benefits/order_benefit.rb} +2 -2
  25. data/app/models/concerns/solidus_friendly_promotions/{rules/line_item_applicable_order_rule.rb → conditions/line_item_applicable_order_condition.rb} +2 -2
  26. data/app/models/concerns/solidus_friendly_promotions/{rules/line_item_level_rule.rb → conditions/line_item_level_condition.rb} +2 -2
  27. data/app/models/concerns/solidus_friendly_promotions/{rules/order_level_rule.rb → conditions/order_level_condition.rb} +2 -2
  28. data/app/models/concerns/solidus_friendly_promotions/{rules/shipment_level_rule.rb → conditions/shipment_level_condition.rb} +2 -2
  29. data/app/models/solidus_friendly_promotions/{promotion_action.rb → benefit.rb} +48 -11
  30. data/app/models/solidus_friendly_promotions/{actions → benefits}/adjust_line_item.rb +6 -2
  31. data/app/models/solidus_friendly_promotions/{actions → benefits}/adjust_line_item_quantity_groups.rb +3 -3
  32. data/app/models/solidus_friendly_promotions/{actions → benefits}/adjust_shipment.rb +6 -2
  33. data/app/models/solidus_friendly_promotions/{actions → benefits}/create_discounted_item.rb +6 -7
  34. data/app/models/solidus_friendly_promotions/calculators/distributed_amount.rb +1 -1
  35. data/app/models/solidus_friendly_promotions/calculators/tiered_flat_rate.rb +1 -1
  36. data/app/models/solidus_friendly_promotions/calculators/tiered_percent.rb +1 -1
  37. data/app/models/solidus_friendly_promotions/calculators/tiered_percent_on_eligible_item_quantity.rb +4 -2
  38. data/app/models/solidus_friendly_promotions/{promotion_rule.rb → condition.rb} +13 -7
  39. data/app/models/solidus_friendly_promotions/condition_product.rb +8 -0
  40. data/app/models/solidus_friendly_promotions/condition_store.rb +8 -0
  41. data/app/models/solidus_friendly_promotions/condition_taxon.rb +8 -0
  42. data/app/models/solidus_friendly_promotions/{promotion_rules_user.rb → condition_user.rb} +2 -2
  43. data/app/models/solidus_friendly_promotions/{rules → conditions}/discounted_item_total.rb +3 -3
  44. data/app/models/solidus_friendly_promotions/{rules → conditions}/first_order.rb +3 -3
  45. data/app/models/solidus_friendly_promotions/{rules → conditions}/first_repeat_purchase_since.rb +3 -3
  46. data/app/models/solidus_friendly_promotions/{rules → conditions}/item_total.rb +5 -5
  47. data/app/models/solidus_friendly_promotions/{rules → conditions}/line_item_option_value.rb +3 -3
  48. data/app/models/solidus_friendly_promotions/{rules → conditions}/line_item_product.rb +8 -8
  49. data/app/models/solidus_friendly_promotions/{rules → conditions}/line_item_taxon.rb +8 -8
  50. data/app/models/solidus_friendly_promotions/{rules → conditions}/minimum_quantity.rb +8 -8
  51. data/app/models/solidus_friendly_promotions/{rules → conditions}/nth_order.rb +5 -5
  52. data/app/models/solidus_friendly_promotions/{rules → conditions}/one_use_per_user.rb +3 -3
  53. data/app/models/solidus_friendly_promotions/{rules → conditions}/option_value.rb +3 -3
  54. data/app/models/solidus_friendly_promotions/{rules → conditions}/product.rb +9 -9
  55. data/app/models/solidus_friendly_promotions/{rules → conditions}/shipping_method.rb +3 -3
  56. data/app/models/solidus_friendly_promotions/{rules → conditions}/store.rb +6 -6
  57. data/app/models/solidus_friendly_promotions/{rules → conditions}/taxon.rb +12 -12
  58. data/app/models/solidus_friendly_promotions/{rules → conditions}/user.rb +7 -7
  59. data/app/models/solidus_friendly_promotions/{rules → conditions}/user_logged_in.rb +3 -3
  60. data/app/models/solidus_friendly_promotions/{rules → conditions}/user_role.rb +3 -3
  61. data/app/models/solidus_friendly_promotions/eligibility_result.rb +1 -1
  62. data/app/models/solidus_friendly_promotions/eligibility_results.rb +7 -7
  63. data/app/models/solidus_friendly_promotions/friendly_promotion_adjuster/discount_order.rb +28 -29
  64. data/app/models/solidus_friendly_promotions/friendly_promotion_adjuster/load_promotions.rb +10 -11
  65. data/app/models/solidus_friendly_promotions/friendly_promotion_adjuster/persist_discounted_order.rb +2 -2
  66. data/app/models/solidus_friendly_promotions/order_promotion.rb +1 -1
  67. data/app/models/solidus_friendly_promotions/permission_sets/friendly_promotion_management.rb +1 -1
  68. data/app/models/solidus_friendly_promotions/promotion.rb +14 -43
  69. data/app/models/solidus_friendly_promotions/promotion_advertiser.rb +10 -0
  70. data/app/models/solidus_friendly_promotions/promotion_code.rb +1 -1
  71. data/app/models/solidus_friendly_promotions/shipping_rate_discount.rb +1 -1
  72. data/app/views/solidus_friendly_promotions/admin/benefit_fields/_adjust_line_item.html.erb +6 -0
  73. data/app/views/solidus_friendly_promotions/admin/{promotion_actions/actions → benefit_fields}/_adjust_line_item_quantity_groups.html.erb +4 -4
  74. data/app/views/solidus_friendly_promotions/admin/benefit_fields/_adjust_shipment.html.erb +6 -0
  75. data/app/views/solidus_friendly_promotions/admin/benefit_fields/_calculator_fields.erb +11 -0
  76. data/app/views/solidus_friendly_promotions/admin/{promotion_actions/actions → benefit_fields}/_create_discounted_item.html.erb +8 -6
  77. data/app/views/solidus_friendly_promotions/admin/benefits/_benefit.html.erb +50 -0
  78. data/app/views/solidus_friendly_promotions/admin/benefits/_calculator_select.html.erb +16 -0
  79. data/app/views/solidus_friendly_promotions/admin/benefits/_form.html.erb +3 -0
  80. data/app/views/solidus_friendly_promotions/admin/benefits/_new_benefit.html.erb +33 -0
  81. data/app/views/solidus_friendly_promotions/admin/benefits/_type_select.html.erb +16 -0
  82. data/app/views/solidus_friendly_promotions/admin/benefits/edit.html.erb +19 -0
  83. data/app/views/solidus_friendly_promotions/admin/benefits/new.html.erb +1 -0
  84. data/app/views/solidus_friendly_promotions/admin/{promotion_actions/calculators → calculator_fields}/_default_fields.html.erb +1 -1
  85. data/app/views/solidus_friendly_promotions/admin/{promotion_actions/calculators → calculator_fields}/distributed_amount/_fields.html.erb +3 -3
  86. data/app/views/solidus_friendly_promotions/admin/calculator_fields/flat_rate/_fields.html.erb +6 -0
  87. data/app/views/solidus_friendly_promotions/admin/calculator_fields/flexi_rate/_fields.html.erb +24 -0
  88. data/app/views/solidus_friendly_promotions/admin/calculator_fields/percent/_fields.html.erb +6 -0
  89. data/app/views/solidus_friendly_promotions/admin/calculator_fields/tiered_flat_rate/_fields.html.erb +32 -0
  90. data/app/views/solidus_friendly_promotions/admin/{promotion_actions/calculators → calculator_fields}/tiered_flat_rate/_tier_fields.html.erb +7 -8
  91. data/app/views/solidus_friendly_promotions/admin/calculator_fields/tiered_percent/_fields.html.erb +47 -0
  92. data/app/views/solidus_friendly_promotions/admin/{promotion_actions/calculators → calculator_fields}/tiered_percent/_tier_fields.html.erb +8 -7
  93. data/app/views/solidus_friendly_promotions/admin/{promotion_actions/calculators → calculator_fields}/tiered_percent_on_eligible_item_quantity/_fields.html.erb +11 -9
  94. data/app/views/solidus_friendly_promotions/admin/calculator_fields/tiered_percent_on_eligible_item_quantity/_tier_fields.html.erb +35 -0
  95. data/app/views/solidus_friendly_promotions/admin/condition_fields/_first_order.html.erb +3 -0
  96. data/app/views/solidus_friendly_promotions/admin/condition_fields/_first_repeat_purchase_since.html.erb +7 -0
  97. data/app/views/solidus_friendly_promotions/admin/condition_fields/_item_total.html.erb +15 -0
  98. data/app/views/solidus_friendly_promotions/admin/condition_fields/_line_item_option_value.html.erb +25 -0
  99. data/app/views/solidus_friendly_promotions/admin/{promotion_rules/rules → condition_fields}/_line_item_product.html.erb +7 -7
  100. data/app/views/solidus_friendly_promotions/admin/condition_fields/_line_item_taxon.html.erb +17 -0
  101. data/app/views/solidus_friendly_promotions/admin/condition_fields/_minimum_quantity.html.erb +5 -0
  102. data/app/views/solidus_friendly_promotions/admin/condition_fields/_nth_order.html.erb +15 -0
  103. data/app/views/solidus_friendly_promotions/admin/condition_fields/_one_use_per_user.html.erb +3 -0
  104. data/app/views/solidus_friendly_promotions/admin/{promotion_rules/rules → condition_fields}/_option_value.html.erb +10 -10
  105. data/app/views/solidus_friendly_promotions/admin/condition_fields/_product.html.erb +28 -0
  106. data/app/views/solidus_friendly_promotions/admin/{promotion_rules/rules → condition_fields}/_shipping_method.html.erb +3 -3
  107. data/app/views/solidus_friendly_promotions/admin/condition_fields/_store.html.erb +9 -0
  108. data/app/views/solidus_friendly_promotions/admin/condition_fields/_taxon.html.erb +28 -0
  109. data/app/views/solidus_friendly_promotions/admin/condition_fields/_user.html.erb +7 -0
  110. data/app/views/solidus_friendly_promotions/admin/condition_fields/_user_logged_in.html.erb +3 -0
  111. data/app/views/solidus_friendly_promotions/admin/condition_fields/_user_role.html.erb +15 -0
  112. data/app/views/solidus_friendly_promotions/admin/condition_fields/line_item_option_value/_option_value_fields.html.erb +21 -0
  113. data/app/views/solidus_friendly_promotions/admin/conditions/_condition.html.erb +26 -0
  114. data/app/views/solidus_friendly_promotions/admin/conditions/_new_condition.html.erb +26 -0
  115. data/app/views/solidus_friendly_promotions/admin/conditions/_type_select.html.erb +20 -0
  116. data/app/views/solidus_friendly_promotions/admin/conditions/new.html.erb +1 -0
  117. data/app/views/solidus_friendly_promotions/admin/promotion_code_batches/_form_fields.html.erb +5 -5
  118. data/app/views/solidus_friendly_promotions/admin/promotions/_form.html.erb +4 -4
  119. data/app/views/solidus_friendly_promotions/admin/promotions/_table_filter.html.erb +6 -6
  120. data/app/views/solidus_friendly_promotions/admin/promotions/edit.html.erb +7 -41
  121. data/app/views/solidus_friendly_promotions/admin/shared/_number_with_currency.html.erb +20 -0
  122. data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_boolean.html.erb +14 -0
  123. data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_decimal.html.erb +12 -0
  124. data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_encrypted_string.html.erb +12 -0
  125. data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_integer.html.erb +12 -0
  126. data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_password.html.erb +12 -0
  127. data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_string.html.erb +12 -0
  128. data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_text.html.erb +12 -0
  129. data/bin/sandbox +3 -3
  130. data/config/importmap.rb +2 -0
  131. data/config/locales/en.yml +128 -94
  132. data/config/routes.rb +3 -2
  133. data/db/migrate/20231011120928_add_db_comments_to_friendly_promotion_rules_taxons.rb +2 -2
  134. data/db/migrate/20231011142040_add_db_comments_to_friendly_promotion_rules_users.rb +1 -1
  135. data/db/migrate/20231011190222_add_db_comments_to_friendly_promotion_actions.rb +1 -1
  136. data/db/migrate/20240409093831_add_action_reference_to_rules.rb +34 -0
  137. data/db/migrate/20240506142650_remove_promotion_rules_promotion_id.rb +5 -0
  138. data/db/migrate/20240508080834_rename_promotion_rules_to_conditions.rb +19 -0
  139. data/db/migrate/20240508131514_rename_friendly_promotion_actions_to_friendly_benefits.rb +19 -0
  140. data/db/migrate/20240612113608_update_column_comments_for_benefits.rb +31 -0
  141. data/db/migrate/20240612114132_update_column_comments_for_conditions.rb +30 -0
  142. data/db/migrate/20240612115209_update_column_comments_for_condition_stores.rb +23 -0
  143. data/db/migrate/20240612115749_update_column_comments_for_condition_products.rb +22 -0
  144. data/db/migrate/20240612120411_update_column_comments_for_condition_taxons.rb +24 -0
  145. data/db/migrate/20240612121049_update_column_comments_for_condition_users.rb +23 -0
  146. data/lib/generators/solidus_friendly_promotions/install/templates/initializer.rb +30 -30
  147. data/lib/solidus_friendly_promotions/configuration.rb +11 -3
  148. data/lib/solidus_friendly_promotions/migrate_adjustments.rb +11 -11
  149. data/lib/solidus_friendly_promotions/promotion_map.rb +17 -17
  150. data/lib/solidus_friendly_promotions/promotion_migrator.rb +16 -16
  151. data/lib/solidus_friendly_promotions/testing_support/factories/friendly_promotion_factory.rb +8 -34
  152. data/lib/solidus_friendly_promotions/testing_support/factories/friendly_shipping_rate_discount_factory.rb +2 -2
  153. data/lib/solidus_friendly_promotions/version.rb +1 -1
  154. data/lib/tasks/solidus_friendly_promotions/migrate_adjustments.rake +2 -2
  155. data/solidus_friendly_promotions.gemspec +2 -2
  156. metadata +114 -86
  157. data/.rubocop_todo.yml +0 -157
  158. data/app/controllers/solidus_friendly_promotions/admin/promotion_actions_controller.rb +0 -103
  159. data/app/controllers/solidus_friendly_promotions/admin/promotion_rules_controller.rb +0 -105
  160. data/app/helpers/solidus_friendly_promotions/admin/promotion_actions_helper.rb +0 -23
  161. data/app/helpers/solidus_friendly_promotions/admin/promotion_rules_helper.rb +0 -25
  162. data/app/models/solidus_friendly_promotions/products_promotion_rule.rb +0 -8
  163. data/app/models/solidus_friendly_promotions/promotion_rules_store.rb +0 -8
  164. data/app/models/solidus_friendly_promotions/promotion_rules_taxon.rb +0 -8
  165. data/app/views/solidus_friendly_promotions/admin/promotion_actions/_calculator_select.html.erb +0 -16
  166. data/app/views/solidus_friendly_promotions/admin/promotion_actions/_form.html.erb +0 -3
  167. data/app/views/solidus_friendly_promotions/admin/promotion_actions/_promotion_action.html.erb +0 -29
  168. data/app/views/solidus_friendly_promotions/admin/promotion_actions/_type_select.html.erb +0 -14
  169. data/app/views/solidus_friendly_promotions/admin/promotion_actions/actions/_adjust_line_item.html.erb +0 -6
  170. data/app/views/solidus_friendly_promotions/admin/promotion_actions/actions/_adjust_shipment.html.erb +0 -6
  171. data/app/views/solidus_friendly_promotions/admin/promotion_actions/actions/_calculator_fields.erb +0 -9
  172. data/app/views/solidus_friendly_promotions/admin/promotion_actions/calculators/flat_rate/_fields.html.erb +0 -6
  173. data/app/views/solidus_friendly_promotions/admin/promotion_actions/calculators/tiered_flat_rate/_fields.html.erb +0 -34
  174. data/app/views/solidus_friendly_promotions/admin/promotion_actions/calculators/tiered_percent/_fields.html.erb +0 -34
  175. data/app/views/solidus_friendly_promotions/admin/promotion_actions/calculators/tiered_percent_on_eligible_item_quantity/_tier_fields.html.erb +0 -27
  176. data/app/views/solidus_friendly_promotions/admin/promotion_actions/edit.html.erb +0 -23
  177. data/app/views/solidus_friendly_promotions/admin/promotion_actions/new.html.erb +0 -26
  178. data/app/views/solidus_friendly_promotions/admin/promotion_rules/_promotion_rule.html.erb +0 -22
  179. data/app/views/solidus_friendly_promotions/admin/promotion_rules/_type_select.html.erb +0 -20
  180. data/app/views/solidus_friendly_promotions/admin/promotion_rules/new.html.erb +0 -24
  181. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_first_order.html.erb +0 -3
  182. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_first_repeat_purchase_since.html.erb +0 -6
  183. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_item_total.html.erb +0 -17
  184. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_line_item_option_value.html.erb +0 -25
  185. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_line_item_taxon.html.erb +0 -17
  186. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_minimum_quantity.html.erb +0 -5
  187. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_nth_order.html.erb +0 -15
  188. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_one_use_per_user.html.erb +0 -3
  189. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_product.html.erb +0 -44
  190. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_store.html.erb +0 -9
  191. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_taxon.html.erb +0 -44
  192. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_user.html.erb +0 -7
  193. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_user_logged_in.html.erb +0 -3
  194. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_user_role.html.erb +0 -15
  195. data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/line_item_option_value/_option_value_fields.html.erb +0 -17
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusFriendlyPromotions
4
- module Rules
5
- class Store < PromotionRule
6
- include OrderLevelRule
4
+ module Conditions
5
+ class Store < Condition
6
+ include OrderLevelCondition
7
7
 
8
- has_many :promotion_rules_stores, class_name: "SolidusFriendlyPromotions::PromotionRulesStore",
9
- foreign_key: :promotion_rule_id,
8
+ has_many :condition_stores, class_name: "SolidusFriendlyPromotions::ConditionStore",
9
+ foreign_key: :condition_id,
10
10
  dependent: :destroy
11
- has_many :stores, through: :promotion_rules_stores, class_name: "Spree::Store"
11
+ has_many :stores, through: :condition_stores, class_name: "Spree::Store"
12
12
 
13
13
  def preload_relations
14
14
  [:stores]
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusFriendlyPromotions
4
- module Rules
5
- class Taxon < PromotionRule
6
- include LineItemApplicableOrderRule
4
+ module Conditions
5
+ class Taxon < Condition
6
+ include LineItemApplicableOrderCondition
7
7
 
8
- has_many :promotion_rules_taxons, class_name: "SolidusFriendlyPromotions::PromotionRulesTaxon", foreign_key: :promotion_rule_id,
8
+ has_many :condition_taxons, class_name: "SolidusFriendlyPromotions::ConditionTaxon", foreign_key: :condition_id,
9
9
  dependent: :destroy
10
- has_many :taxons, through: :promotion_rules_taxons, class_name: "Spree::Taxon"
10
+ has_many :taxons, through: :condition_taxons, class_name: "Spree::Taxon"
11
11
 
12
12
  def preload_relations
13
13
  [:taxons]
@@ -24,15 +24,15 @@ module SolidusFriendlyPromotions
24
24
 
25
25
  case preferred_match_policy
26
26
  when "all"
27
- matches_all = taxons.all? do |rule_taxon|
28
- order_taxons.where(id: rule_taxon.self_and_descendants.ids).exists?
27
+ matches_all = taxons.all? do |condition_taxon|
28
+ order_taxons.where(id: condition_taxon.self_and_descendants.ids).exists?
29
29
  end
30
30
 
31
31
  unless matches_all
32
32
  eligibility_errors.add(:base, eligibility_error_message(:missing_taxon), error_code: :missing_taxon)
33
33
  end
34
34
  when "any"
35
- unless order_taxons.where(id: rule_taxon_ids_with_children).exists?
35
+ unless order_taxons.where(id: condition_taxon_ids_with_children).exists?
36
36
  eligibility_errors.add(
37
37
  :base,
38
38
  eligibility_error_message(:no_matching_taxons),
@@ -40,7 +40,7 @@ module SolidusFriendlyPromotions
40
40
  )
41
41
  end
42
42
  when "none"
43
- if order_taxons.where(id: rule_taxon_ids_with_children).exists?
43
+ if order_taxons.where(id: condition_taxon_ids_with_children).exists?
44
44
  eligibility_errors.add(
45
45
  :base,
46
46
  eligibility_error_message(:has_excluded_taxon),
@@ -63,7 +63,7 @@ module SolidusFriendlyPromotions
63
63
 
64
64
  Spree::Classification.where(
65
65
  product_id: line_item.variant.product_id,
66
- taxon_id: rule_taxon_ids_with_children
66
+ taxon_id: condition_taxon_ids_with_children
67
67
  ).exists?
68
68
  end
69
69
 
@@ -89,8 +89,8 @@ module SolidusFriendlyPromotions
89
89
  .distinct
90
90
  end
91
91
 
92
- # ids of taxons rules and taxons rules children
93
- def rule_taxon_ids_with_children
92
+ # ids of taxons conditions and taxons conditions children
93
+ def condition_taxon_ids_with_children
94
94
  taxons.flat_map { |taxon| taxon.self_and_descendants.ids }.uniq
95
95
  end
96
96
  end
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusFriendlyPromotions
4
- module Rules
5
- class User < PromotionRule
6
- include OrderLevelRule
4
+ module Conditions
5
+ class User < Condition
6
+ include OrderLevelCondition
7
7
 
8
- has_many :promotion_rules_users,
9
- class_name: "SolidusFriendlyPromotions::PromotionRulesUser",
10
- foreign_key: :promotion_rule_id,
8
+ has_many :condition_users,
9
+ class_name: "SolidusFriendlyPromotions::ConditionUser",
10
+ foreign_key: :condition_id,
11
11
  dependent: :destroy
12
- has_many :users, through: :promotion_rules_users, class_name: Spree::UserClassHandle.new
12
+ has_many :users, through: :condition_users, class_name: Spree::UserClassHandle.new
13
13
 
14
14
  def preload_relations
15
15
  [:users]
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusFriendlyPromotions
4
- module Rules
5
- class UserLoggedIn < PromotionRule
6
- include OrderLevelRule
4
+ module Conditions
5
+ class UserLoggedIn < Condition
6
+ include OrderLevelCondition
7
7
 
8
8
  def eligible?(order, _options = {})
9
9
  if order.user.blank?
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusFriendlyPromotions
4
- module Rules
5
- class UserRole < PromotionRule
6
- include OrderLevelRule
4
+ module Conditions
5
+ class UserRole < Condition
6
+ include OrderLevelCondition
7
7
 
8
8
  preference :role_ids, :array, default: []
9
9
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusFriendlyPromotions
4
- EligibilityResult = Struct.new(:item, :rule, :success, :code, :message, keyword_init: true)
4
+ EligibilityResult = Struct.new(:item, :condition, :success, :code, :message, keyword_init: true)
5
5
  end
@@ -9,10 +9,10 @@ module SolidusFriendlyPromotions
9
9
  @results = []
10
10
  end
11
11
 
12
- def add(item:, rule:, success:, code:, message:)
12
+ def add(item:, condition:, success:, code:, message:)
13
13
  results << EligibilityResult.new(
14
14
  item: item,
15
- rule: rule,
15
+ condition: condition,
16
16
  success: success,
17
17
  code: code,
18
18
  message: message
@@ -21,17 +21,17 @@ module SolidusFriendlyPromotions
21
21
 
22
22
  def success?
23
23
  return true if results.empty?
24
- promotion.actions.any? do |action|
25
- action.relevant_rules.all? do |rule|
26
- results_for_rule = results.select { |result| result.rule == rule }
27
- results_for_rule.any?(&:success)
24
+ promotion.benefits.any? do |benefit|
25
+ benefit.conditions.all? do |condition|
26
+ results_for_condition = results.select { |result| result.condition == condition }
27
+ results_for_condition.any?(&:success)
28
28
  end
29
29
  end
30
30
  end
31
31
 
32
32
  def error_messages
33
33
  return [] if results.empty?
34
- results.group_by(&:rule).map do |rule, results|
34
+ results.group_by(&:condition).map do |condition, results|
35
35
  next if results.any?(&:success)
36
36
  results.detect { |r| !r.success }&.message
37
37
  end.compact
@@ -15,11 +15,12 @@ module SolidusFriendlyPromotions
15
15
  return order if order.shipped?
16
16
 
17
17
  SolidusFriendlyPromotions::Promotion.ordered_lanes.each do |lane, _index|
18
- lane_promotions = eligible_promotions_for_promotable(promotions.select { |promotion| promotion.lane == lane }, order)
19
- perform_order_actions(lane_promotions, lane) unless dry_run
20
- line_item_discounts = adjust_line_items(lane_promotions)
21
- shipment_discounts = adjust_shipments(lane_promotions)
22
- shipping_rate_discounts = adjust_shipping_rates(lane_promotions)
18
+ lane_promotions = promotions.select { |promotion| promotion.lane == lane }
19
+ lane_benefits = eligible_benefits_for_promotable(lane_promotions.flat_map(&:benefits), order)
20
+ perform_order_benefits(lane_benefits, lane) unless dry_run
21
+ line_item_discounts = adjust_line_items(lane_benefits)
22
+ shipment_discounts = adjust_shipments(lane_benefits)
23
+ shipping_rate_discounts = adjust_shipping_rates(lane_benefits)
23
24
  (line_item_discounts + shipment_discounts + shipping_rate_discounts).each do |item, chosen_discounts|
24
25
  item.current_discounts.concat(chosen_discounts)
25
26
  end
@@ -30,64 +31,62 @@ module SolidusFriendlyPromotions
30
31
 
31
32
  private
32
33
 
33
- def perform_order_actions(lane_promotions, lane)
34
- lane_promotions.each do |promotion|
35
- promotion.actions.select { |action| action.level == :order }.each { |action| action.perform(order) }
34
+ def perform_order_benefits(lane_benefits, lane)
35
+ lane_benefits.select { |benefit| benefit.level == :order }.each do |benefit|
36
+ benefit.perform(order)
36
37
  end
37
38
 
38
- automated_line_items = order.line_items.select(&:managed_by_order_action)
39
+ automated_line_items = order.line_items.select(&:managed_by_order_benefit)
39
40
  return if automated_line_items.empty?
40
41
 
41
42
  ineligible_line_items = automated_line_items.select do |line_item|
42
- line_item.managed_by_order_action.promotion.lane == lane && !line_item.managed_by_order_action.in?(lane_promotions.flat_map(&:actions))
43
+ line_item.managed_by_order_benefit.promotion.lane == lane && !line_item.managed_by_order_benefit.in?(lane_benefits)
43
44
  end
44
45
 
45
46
  ineligible_line_items.each do |line_item|
46
- line_item.managed_by_order_action.remove_from(order)
47
+ line_item.managed_by_order_benefit.remove_from(order)
47
48
  end
48
49
  end
49
50
 
50
- def adjust_line_items(promotions)
51
+ def adjust_line_items(benefits)
51
52
  order.discountable_line_items.select do |line_item|
52
53
  line_item.variant.product.promotionable?
53
54
  end.map do |line_item|
54
- discounts = generate_discounts(promotions, line_item)
55
+ discounts = generate_discounts(benefits, line_item)
55
56
  chosen_item_discounts = SolidusFriendlyPromotions.config.discount_chooser_class.new(discounts).call
56
57
  [line_item, chosen_item_discounts]
57
58
  end
58
59
  end
59
60
 
60
- def adjust_shipments(promotions)
61
+ def adjust_shipments(benefits)
61
62
  order.shipments.map do |shipment|
62
- discounts = generate_discounts(promotions, shipment)
63
+ discounts = generate_discounts(benefits, shipment)
63
64
  chosen_item_discounts = SolidusFriendlyPromotions.config.discount_chooser_class.new(discounts).call
64
65
  [shipment, chosen_item_discounts]
65
66
  end
66
67
  end
67
68
 
68
- def adjust_shipping_rates(promotions)
69
+ def adjust_shipping_rates(benefits)
69
70
  order.shipments.flat_map(&:shipping_rates).select(&:cost).map do |rate|
70
- discounts = generate_discounts(promotions, rate)
71
+ discounts = generate_discounts(benefits, rate)
71
72
  chosen_item_discounts = SolidusFriendlyPromotions.config.discount_chooser_class.new(discounts).call
72
73
  [rate, chosen_item_discounts]
73
74
  end
74
75
  end
75
76
 
76
- def eligible_promotions_for_promotable(possible_promotions, promotable)
77
- possible_promotions.select do |candidate|
78
- candidate.eligible_by_applicable_rules?(promotable, dry_run: dry_run)
77
+ def eligible_benefits_for_promotable(possible_benefits, promotable)
78
+ possible_benefits.select do |candidate|
79
+ candidate.eligible_by_applicable_conditions?(promotable, dry_run: dry_run)
79
80
  end
80
81
  end
81
82
 
82
- def generate_discounts(possible_promotions, item)
83
- eligible_promotions = eligible_promotions_for_promotable(possible_promotions, item)
84
- eligible_promotions.flat_map do |promotion|
85
- promotion.actions.select do |action|
86
- action.can_discount?(item)
87
- end.map do |action|
88
- action.discount(item)
89
- end.compact
90
- end
83
+ def generate_discounts(possible_benefits, item)
84
+ eligible_benefits = eligible_benefits_for_promotable(possible_benefits, item)
85
+ eligible_benefits.select do |benefit|
86
+ benefit.can_discount?(item)
87
+ end.map do |benefit|
88
+ benefit.discount(item)
89
+ end.compact
91
90
  end
92
91
  end
93
92
  end
@@ -11,11 +11,11 @@ module SolidusFriendlyPromotions
11
11
  def call
12
12
  promos = connected_order_promotions | sale_promotions
13
13
  promos << dry_run_promotion if dry_run_promotion
14
- promos.flat_map(&:actions).group_by(&:preload_relations).each do |preload_relations, actions|
15
- preload(records: actions, associations: preload_relations)
16
- end
17
- promos.flat_map(&:rules).group_by(&:preload_relations).each do |preload_relations, rules|
18
- preload(records: rules, associations: preload_relations)
14
+ promos.flat_map(&:benefits).group_by(&:preload_relations).each do |preload_relations, benefits|
15
+ preload(records: benefits, associations: preload_relations)
16
+ benefits.flat_map(&:conditions).group_by(&:preload_relations).each do |preload_relations, conditions|
17
+ preload(records: conditions, associations: preload_relations)
18
+ end
19
19
  end
20
20
  promos.reject { |promotion| promotion.usage_limit_exceeded?(excluded_orders: [order]) }
21
21
  end
@@ -30,13 +30,13 @@ module SolidusFriendlyPromotions
30
30
 
31
31
  def connected_order_promotions
32
32
  eligible_connected_promotion_ids = order.friendly_order_promotions.select do |order_promotion|
33
- order_promotion.promotion_code.nil? || !order_promotion.promotion_code.usage_limit_exceeded?(excluded_orders: [order])
33
+ order_promotion.promotion.kept? && (order_promotion.promotion_code.nil? || !order_promotion.promotion_code.usage_limit_exceeded?(excluded_orders: [order]))
34
34
  end.map(&:promotion_id)
35
35
  order.friendly_promotions.active(reference_time).where(id: eligible_connected_promotion_ids).includes(promotion_includes)
36
36
  end
37
37
 
38
38
  def sale_promotions
39
- SolidusFriendlyPromotions::Promotion.where(apply_automatically: true).active(reference_time).includes(promotion_includes)
39
+ SolidusFriendlyPromotions::Promotion.kept.where(apply_automatically: true).active(reference_time).includes(promotion_includes)
40
40
  end
41
41
 
42
42
  def reference_time
@@ -44,10 +44,9 @@ module SolidusFriendlyPromotions
44
44
  end
45
45
 
46
46
  def promotion_includes
47
- [
48
- :rules,
49
- :actions
50
- ]
47
+ {
48
+ benefits: :conditions
49
+ }
51
50
  end
52
51
  end
53
52
  end
@@ -22,7 +22,7 @@ module SolidusFriendlyPromotions
22
22
  shipping_rate: shipping_rate,
23
23
  amount: discount.amount,
24
24
  label: discount.label,
25
- promotion_action: discount.source
25
+ benefit: discount.source
26
26
  )
27
27
  end
28
28
  end
@@ -49,7 +49,7 @@ module SolidusFriendlyPromotions
49
49
  update_adjustment(item, item_discount)
50
50
  end
51
51
  item.update(promo_total: active_adjustments.sum(&:amount))
52
- # Remove any tax adjustments tied to promotion actions which no longer match.
52
+ # Remove any tax adjustments tied to promotion benefits which no longer match.
53
53
  unmatched_adjustments = promotion_adjustments - active_adjustments
54
54
 
55
55
  item.adjustments.destroy(unmatched_adjustments)
@@ -7,7 +7,7 @@ module SolidusFriendlyPromotions
7
7
  # 2. The specific code that they used
8
8
  class OrderPromotion < Spree::Base
9
9
  belongs_to :order, class_name: "Spree::Order"
10
- belongs_to :promotion, class_name: "SolidusFriendlyPromotions::Promotion"
10
+ belongs_to :promotion, -> { with_discarded }, class_name: "SolidusFriendlyPromotions::Promotion"
11
11
  belongs_to :promotion_code, class_name: "SolidusFriendlyPromotions::PromotionCode", optional: true
12
12
 
13
13
  validates :promotion_code, presence: true, if: :require_promotion_code?
@@ -6,7 +6,7 @@ module SolidusFriendlyPromotions
6
6
  def activate!
7
7
  can :manage, SolidusFriendlyPromotions::Promotion
8
8
  can :manage, SolidusFriendlyPromotions::PromotionRule
9
- can :manage, SolidusFriendlyPromotions::PromotionAction
9
+ can :manage, SolidusFriendlyPromotions::Benefit
10
10
  can :manage, SolidusFriendlyPromotions::PromotionCategory
11
11
  can :manage, SolidusFriendlyPromotions::PromotionCode
12
12
  end
@@ -7,8 +7,8 @@ module SolidusFriendlyPromotions
7
7
  belongs_to :category, class_name: "SolidusFriendlyPromotions::PromotionCategory",
8
8
  foreign_key: :promotion_category_id, optional: true
9
9
  belongs_to :original_promotion, class_name: "Spree::Promotion", optional: true
10
- has_many :rules, class_name: "SolidusFriendlyPromotions::PromotionRule", dependent: :destroy
11
- has_many :actions, class_name: "SolidusFriendlyPromotions::PromotionAction", dependent: :destroy
10
+ has_many :benefits, class_name: "SolidusFriendlyPromotions::Benefit", dependent: :destroy
11
+ has_many :conditions, through: :benefits
12
12
  has_many :codes, class_name: "SolidusFriendlyPromotions::PromotionCode", dependent: :destroy
13
13
  has_many :code_batches, class_name: "SolidusFriendlyPromotions::PromotionCodeBatch", dependent: :destroy
14
14
  has_many :order_promotions, class_name: "SolidusFriendlyPromotions::OrderPromotion", dependent: :destroy
@@ -22,8 +22,9 @@ module SolidusFriendlyPromotions
22
22
  validate :apply_automatically_disallowed_with_promotion_codes
23
23
 
24
24
  before_save :normalize_blank_values
25
+ after_discard :delete_cart_connections
25
26
 
26
- scope :active, ->(time = Time.current) { has_actions.started_and_unexpired(time) }
27
+ scope :active, ->(time = Time.current) { has_benefits.started_and_unexpired(time) }
27
28
  scope :advertised, -> { where(advertise: true) }
28
29
  scope :coupons, -> { joins(:codes).distinct }
29
30
  scope :started_and_unexpired, ->(time = Time.current) do
@@ -32,8 +33,8 @@ module SolidusFriendlyPromotions
32
33
  where(table[:starts_at].eq(nil).or(table[:starts_at].lt(time)))
33
34
  .where(table[:expires_at].eq(nil).or(table[:expires_at].gt(time)))
34
35
  end
35
- scope :has_actions, -> do
36
- joins(:actions).distinct
36
+ scope :has_benefits, -> do
37
+ joins(:benefits).distinct
37
38
  end
38
39
 
39
40
  enum lane: SolidusFriendlyPromotions.config.preferred_lanes
@@ -62,8 +63,8 @@ module SolidusFriendlyPromotions
62
63
  .joins(:all_adjustments)
63
64
  .where(
64
65
  spree_adjustments: {
65
- source_type: "SolidusFriendlyPromotions::PromotionAction",
66
- source_id: actions.map(&:id),
66
+ source_type: "SolidusFriendlyPromotions::Benefit",
67
+ source_id: benefits.map(&:id),
67
68
  eligible: true
68
69
  }
69
70
  ).distinct
@@ -113,7 +114,7 @@ module SolidusFriendlyPromotions
113
114
  end
114
115
 
115
116
  def active?(time = Time.current)
116
- started?(time) && not_expired?(time) && actions.present?
117
+ started?(time) && not_expired?(time) && benefits.present?
117
118
  end
118
119
 
119
120
  def inactive?(time = Time.current)
@@ -125,47 +126,13 @@ module SolidusFriendlyPromotions
125
126
  end
126
127
 
127
128
  def products
128
- rules.where(type: "SolidusFriendlyPromotions::Rules::Product").flat_map(&:products).uniq
129
+ conditions.where(type: "SolidusFriendlyPromotions::Conditions::Product").flat_map(&:products).uniq
129
130
  end
130
131
 
131
132
  def eligibility_results
132
133
  @eligibility_results ||= SolidusFriendlyPromotions::EligibilityResults.new(self)
133
134
  end
134
135
 
135
- def eligible_by_applicable_rules?(promotable, dry_run: false)
136
- applicable_rules = rules.select do |rule|
137
- rule.applicable?(promotable)
138
- end
139
-
140
- applicable_rules.map do |applicable_rule|
141
- eligible = applicable_rule.eligible?(promotable)
142
-
143
- break [false] if !eligible && !dry_run
144
-
145
- if dry_run
146
- if applicable_rule.eligibility_errors.details[:base].first
147
- code = applicable_rule.eligibility_errors.details[:base].first[:error_code]
148
- message = applicable_rule.eligibility_errors.full_messages.first
149
- end
150
- eligibility_results.add(
151
- item: promotable,
152
- rule: applicable_rule,
153
- success: eligible,
154
- code: eligible ? nil : (code || :coupon_code_unknown_error),
155
- message: eligible ? nil : (message || I18n.t(:coupon_code_unknown_error, scope: [:solidus_friendly_promotions, :eligibility_errors]))
156
- )
157
- end
158
-
159
- eligible
160
- end.all?
161
- end
162
-
163
- def applicable_line_items(order)
164
- order.discountable_line_items.select do |line_item|
165
- eligible_by_applicable_rules?(line_item)
166
- end
167
- end
168
-
169
136
  private
170
137
 
171
138
  def normalize_blank_values
@@ -183,5 +150,9 @@ module SolidusFriendlyPromotions
183
150
 
184
151
  errors.add(:apply_automatically, :disallowed_with_promotion_codes) if codes.present?
185
152
  end
153
+
154
+ def delete_cart_connections
155
+ order_promotions.where(order: Spree::Order.incomplete).destroy_all
156
+ end
186
157
  end
187
158
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusFriendlyPromotions
4
+ class PromotionAdvertiser
5
+ def self.for_product(product)
6
+ promotion_ids = ConditionProduct.joins(condition: :benefit).where(product: product).select(:promotion_id).distinct
7
+ SolidusFriendlyPromotions::Promotion.advertised.where(id: promotion_ids).reject(&:inactive?)
8
+ end
9
+ end
10
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module SolidusFriendlyPromotions
4
4
  class PromotionCode < Spree::Base
5
- belongs_to :promotion, inverse_of: :codes
5
+ belongs_to :promotion, -> { with_discarded }, inverse_of: :codes
6
6
  belongs_to :promotion_code_batch, inverse_of: :promotion_codes, optional: true
7
7
 
8
8
  has_many :order_promotions, class_name: "SolidusFriendlyPromotions::OrderPromotion", dependent: :destroy
@@ -3,7 +3,7 @@
3
3
  module SolidusFriendlyPromotions
4
4
  class ShippingRateDiscount < Spree::Base
5
5
  belongs_to :shipping_rate, inverse_of: :discounts, class_name: "Spree::ShippingRate"
6
- belongs_to :promotion_action, inverse_of: :shipping_rate_discounts
6
+ belongs_to :benefit, inverse_of: :shipping_rate_discounts
7
7
 
8
8
  extend Spree::DisplayMoney
9
9
  money_methods :amount
@@ -0,0 +1,6 @@
1
+ <%= render(
2
+ "solidus_friendly_promotions/admin/benefit_fields/calculator_fields",
3
+ benefit: benefit,
4
+ param_prefix: param_prefix,
5
+ form: form
6
+ ) %>
@@ -1,13 +1,13 @@
1
- <%= fields_for param_prefix, promotion_action do |form| %>
2
- <div class="field">
1
+ <%= fields_for param_prefix, benefit do |form| %>
2
+ <div class="form-group">
3
3
  <%= form.label :preferred_group_size %>
4
4
  <%= form.number_field :preferred_group_size, class: "fullwidth", min: 1 %>
5
5
  </div>
6
6
  <% end %>
7
7
 
8
8
  <%= render(
9
- "solidus_friendly_promotions/admin/promotion_actions/actions/calculator_fields",
10
- promotion_action: promotion_action,
9
+ "solidus_friendly_promotions/admin/benefit_fields/calculator_fields",
10
+ benefit: benefit,
11
11
  param_prefix: param_prefix,
12
12
  form: form
13
13
  ) %>
@@ -0,0 +1,6 @@
1
+ <%= render(
2
+ "solidus_friendly_promotions/admin/benefit_fields/calculator_fields",
3
+ benefit: benefit,
4
+ param_prefix: param_prefix,
5
+ form: form
6
+ ) %>
@@ -0,0 +1,11 @@
1
+
2
+ <% calculator = benefit.calculator %>
3
+ <% type_name = calculator.type.demodulize.underscore %>
4
+ <p>
5
+ <%= calculator.description %>
6
+ </p>
7
+ <% if lookup_context.exists?("fields", ["solidus_friendly_promotions/admin/calculator_fields/#{type_name}"], true) %>
8
+ <%= render "solidus_friendly_promotions/admin/calculator_fields/#{type_name}/fields", calculator: calculator, prefix: param_prefix, form: form %>
9
+ <% else %>
10
+ <%= render "solidus_friendly_promotions/admin/calculator_fields/default_fields", calculator: calculator, prefix: param_prefix, form: form %>
11
+ <% end %>
@@ -1,19 +1,21 @@
1
- <%= fields_for param_prefix, promotion_action do |form| %>
2
- <div class="field">
1
+ <%= fields_for param_prefix, benefit do |form| %>
2
+ <div class="form-group">
3
3
  <%= form.label :preferred_variant_id %>
4
- <%= form.text_field :preferred_variant_id, class: "variant_autocomplete fullwidth" %>
4
+ <%= form.text_field :preferred_variant_id, is: "variant-picker", class: "fullwidth" %>
5
+ </div>
6
+ <div class="form-group">
5
7
  <%= form.label :preferred_quantity %>
6
8
  <%= form.number_field :preferred_quantity, class: "fullwidth" %>
7
9
  </div>
8
- <div class="field">
10
+ <div class="form-group">
9
11
  <%= form.label :preferred_necessary_quantity %>
10
12
  <%= form.number_field :preferred_necessary_quantity, class: "fullwidth" %>
11
13
  </div>
12
14
  <% end %>
13
15
 
14
16
  <%= render(
15
- "solidus_friendly_promotions/admin/promotion_actions/actions/calculator_fields",
16
- promotion_action: promotion_action,
17
+ "solidus_friendly_promotions/admin/benefit_fields/calculator_fields",
18
+ benefit: benefit,
17
19
  param_prefix: param_prefix,
18
20
  form: form
19
21
  ) %>
@@ -0,0 +1,50 @@
1
+ <div class="card bg-light primary mb-3">
2
+ <div id="<%= dom_id(benefit) %>_header" class="card-header">
3
+ <%= benefit.model_name.human %>
4
+
5
+ <span class="float-right text-dark">
6
+ <% if can?(:destroy, benefit) %>
7
+ <%= link_to_with_icon 'trash', '', solidus_friendly_promotions.admin_promotion_benefit_path(@promotion, benefit), method: :delete, class: 'delete' %>
8
+ <% end %>
9
+ </span>
10
+ </div>
11
+ <div class="card-body">
12
+ <div class="row">
13
+ <div class="col-md-6">
14
+ <%= turbo_frame_tag @promotion, dom_id(benefit) do %>
15
+
16
+ <%= render "solidus_friendly_promotions/admin/benefits/calculator_select",
17
+ path: solidus_friendly_promotions.edit_admin_promotion_benefit_path(@promotion, benefit),
18
+ benefit: benefit %>
19
+
20
+ <%=
21
+ form_with(
22
+ model: benefit,
23
+ scope: :benefit,
24
+ url: solidus_friendly_promotions.admin_promotion_benefit_path(@promotion, benefit),
25
+ data: { turbo: false }
26
+ ) do |form| %>
27
+ <%= render 'solidus_friendly_promotions/admin/benefits/form', form: form %>
28
+ <div class="row">
29
+ <div class="col-12">
30
+ <%= button_tag t(:update, scope: [:solidus_friendly_promotions, :crud]), class: "btn btn-secondary float-right" %>
31
+ </div>
32
+ </div>
33
+ <% end %>
34
+ <% end %>
35
+ </div>
36
+ <div class="col-md-6">
37
+ <div class="form-group">
38
+ <%= label_tag :conditions %>
39
+ <div id="<%= dom_id(benefit) %>_conditions" class="bg-white rounded border p-3">
40
+ <%= render partial: 'solidus_friendly_promotions/admin/conditions/condition', collection: benefit.conditions %>
41
+
42
+ <%= turbo_frame_tag benefit, "new_condition" do %>
43
+ <%= link_to t(:add_condition, scope: :solidus_friendly_promotions), solidus_friendly_promotions.new_admin_promotion_benefit_condition_path(@promotion, benefit), class: 'btn btn-secondary' %>
44
+ <% end %>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </div>
50
+ </div>