solidus_friendly_promotions 1.0.0 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +4 -4
- data/CHANGELOG.md +31 -0
- data/Gemfile +2 -7
- data/MIGRATING.md +1 -1
- data/README.md +22 -16
- data/app/assets/config/solidus_friendly_promotions/manifest.js +7 -1
- data/app/controllers/solidus_friendly_promotions/admin/benefits_controller.rb +85 -0
- data/app/controllers/solidus_friendly_promotions/admin/conditions_controller.rb +69 -0
- data/app/controllers/solidus_friendly_promotions/admin/promotions_controller.rb +4 -3
- data/app/decorators/models/solidus_friendly_promotions/adjustment_decorator.rb +4 -4
- data/app/decorators/models/solidus_friendly_promotions/line_item_decorator.rb +2 -2
- data/app/decorators/models/solidus_friendly_promotions/order_decorator.rb +6 -6
- data/app/helpers/solidus_friendly_promotions/admin/benefits_helper.rb +19 -0
- data/app/helpers/solidus_friendly_promotions/admin/conditions_helper.rb +12 -0
- data/app/helpers/solidus_friendly_promotions/admin/promotions_helper.rb +15 -0
- data/app/javascript/solidus_friendly_promotions/controllers/product_option_values_controller.js +1 -1
- data/app/javascript/solidus_friendly_promotions/web_components/number_with_currency.js +35 -0
- data/app/javascript/solidus_friendly_promotions/{jquery → web_components}/option_value_picker.js +8 -0
- data/app/javascript/solidus_friendly_promotions/web_components/product_picker.js +7 -0
- data/app/javascript/solidus_friendly_promotions/web_components/select_two.js +11 -0
- data/app/javascript/solidus_friendly_promotions/web_components/taxon_picker.js +7 -0
- data/app/javascript/solidus_friendly_promotions/web_components/user_picker.js +7 -0
- data/app/javascript/solidus_friendly_promotions/web_components/variant_picker.js +7 -0
- data/app/javascript/solidus_friendly_promotions.js +7 -11
- data/app/models/concerns/solidus_friendly_promotions/{actions/order_level_action.rb → benefits/order_benefit.rb} +2 -2
- data/app/models/concerns/solidus_friendly_promotions/{rules/line_item_applicable_order_rule.rb → conditions/line_item_applicable_order_condition.rb} +2 -2
- data/app/models/concerns/solidus_friendly_promotions/{rules/line_item_level_rule.rb → conditions/line_item_level_condition.rb} +2 -2
- data/app/models/concerns/solidus_friendly_promotions/{rules/order_level_rule.rb → conditions/order_level_condition.rb} +2 -2
- data/app/models/concerns/solidus_friendly_promotions/{rules/shipment_level_rule.rb → conditions/shipment_level_condition.rb} +2 -2
- data/app/models/solidus_friendly_promotions/{promotion_action.rb → benefit.rb} +48 -10
- data/app/models/solidus_friendly_promotions/{actions → benefits}/adjust_line_item.rb +6 -2
- data/app/models/solidus_friendly_promotions/{actions → benefits}/adjust_line_item_quantity_groups.rb +3 -3
- data/app/models/solidus_friendly_promotions/{actions → benefits}/adjust_shipment.rb +6 -2
- data/app/models/solidus_friendly_promotions/{actions → benefits}/create_discounted_item.rb +6 -7
- data/app/models/solidus_friendly_promotions/calculators/distributed_amount.rb +1 -1
- data/app/models/solidus_friendly_promotions/calculators/tiered_flat_rate.rb +1 -1
- data/app/models/solidus_friendly_promotions/calculators/tiered_percent.rb +1 -1
- data/app/models/solidus_friendly_promotions/calculators/tiered_percent_on_eligible_item_quantity.rb +4 -2
- data/app/models/solidus_friendly_promotions/{promotion_rule.rb → condition.rb} +13 -7
- data/app/models/solidus_friendly_promotions/condition_product.rb +8 -0
- data/app/models/solidus_friendly_promotions/condition_store.rb +8 -0
- data/app/models/solidus_friendly_promotions/condition_taxon.rb +8 -0
- data/app/models/solidus_friendly_promotions/{promotion_rules_user.rb → condition_user.rb} +2 -2
- data/app/models/solidus_friendly_promotions/{rules → conditions}/discounted_item_total.rb +3 -3
- data/app/models/solidus_friendly_promotions/{rules → conditions}/first_order.rb +3 -3
- data/app/models/solidus_friendly_promotions/{rules → conditions}/first_repeat_purchase_since.rb +3 -3
- data/app/models/solidus_friendly_promotions/{rules → conditions}/item_total.rb +5 -5
- data/app/models/solidus_friendly_promotions/{rules → conditions}/line_item_option_value.rb +3 -3
- data/app/models/solidus_friendly_promotions/{rules → conditions}/line_item_product.rb +8 -8
- data/app/models/solidus_friendly_promotions/{rules → conditions}/line_item_taxon.rb +8 -8
- data/app/models/solidus_friendly_promotions/{rules → conditions}/minimum_quantity.rb +8 -8
- data/app/models/solidus_friendly_promotions/{rules → conditions}/nth_order.rb +5 -5
- data/app/models/solidus_friendly_promotions/{rules → conditions}/one_use_per_user.rb +3 -3
- data/app/models/solidus_friendly_promotions/{rules → conditions}/option_value.rb +3 -3
- data/app/models/solidus_friendly_promotions/{rules → conditions}/product.rb +9 -9
- data/app/models/solidus_friendly_promotions/{rules → conditions}/shipping_method.rb +3 -3
- data/app/models/solidus_friendly_promotions/{rules → conditions}/store.rb +6 -6
- data/app/models/solidus_friendly_promotions/{rules → conditions}/taxon.rb +12 -12
- data/app/models/solidus_friendly_promotions/{rules → conditions}/user.rb +7 -7
- data/app/models/solidus_friendly_promotions/{rules → conditions}/user_logged_in.rb +3 -3
- data/app/models/solidus_friendly_promotions/{rules → conditions}/user_role.rb +3 -3
- data/app/models/solidus_friendly_promotions/eligibility_result.rb +1 -1
- data/app/models/solidus_friendly_promotions/eligibility_results.rb +7 -7
- data/app/models/solidus_friendly_promotions/friendly_promotion_adjuster/discount_order.rb +28 -29
- data/app/models/solidus_friendly_promotions/friendly_promotion_adjuster/load_promotions.rb +10 -11
- data/app/models/solidus_friendly_promotions/friendly_promotion_adjuster/persist_discounted_order.rb +2 -2
- data/app/models/solidus_friendly_promotions/order_promotion.rb +1 -1
- data/app/models/solidus_friendly_promotions/permission_sets/friendly_promotion_management.rb +1 -1
- data/app/models/solidus_friendly_promotions/promotion.rb +26 -42
- data/app/models/solidus_friendly_promotions/promotion_advertiser.rb +10 -0
- data/app/models/solidus_friendly_promotions/promotion_code.rb +1 -1
- data/app/models/solidus_friendly_promotions/shipping_rate_discount.rb +1 -1
- data/app/views/solidus_friendly_promotions/admin/benefit_fields/_adjust_line_item.html.erb +6 -0
- data/app/views/solidus_friendly_promotions/admin/{promotion_actions/actions → benefit_fields}/_adjust_line_item_quantity_groups.html.erb +4 -4
- data/app/views/solidus_friendly_promotions/admin/benefit_fields/_adjust_shipment.html.erb +6 -0
- data/app/views/solidus_friendly_promotions/admin/benefit_fields/_calculator_fields.erb +11 -0
- data/app/views/solidus_friendly_promotions/admin/{promotion_actions/actions → benefit_fields}/_create_discounted_item.html.erb +8 -6
- data/app/views/solidus_friendly_promotions/admin/benefits/_benefit.html.erb +50 -0
- data/app/views/solidus_friendly_promotions/admin/benefits/_calculator_select.html.erb +16 -0
- data/app/views/solidus_friendly_promotions/admin/benefits/_form.html.erb +3 -0
- data/app/views/solidus_friendly_promotions/admin/benefits/_new_benefit.html.erb +33 -0
- data/app/views/solidus_friendly_promotions/admin/benefits/_type_select.html.erb +16 -0
- data/app/views/solidus_friendly_promotions/admin/benefits/edit.html.erb +19 -0
- data/app/views/solidus_friendly_promotions/admin/benefits/new.html.erb +1 -0
- data/app/views/solidus_friendly_promotions/admin/{promotion_actions/calculators → calculator_fields}/_default_fields.html.erb +1 -1
- data/app/views/solidus_friendly_promotions/admin/{promotion_actions/calculators → calculator_fields}/distributed_amount/_fields.html.erb +3 -3
- data/app/views/solidus_friendly_promotions/admin/calculator_fields/flat_rate/_fields.html.erb +6 -0
- data/app/views/solidus_friendly_promotions/admin/calculator_fields/flexi_rate/_fields.html.erb +24 -0
- data/app/views/solidus_friendly_promotions/admin/calculator_fields/percent/_fields.html.erb +6 -0
- data/app/views/solidus_friendly_promotions/admin/calculator_fields/tiered_flat_rate/_fields.html.erb +32 -0
- data/app/views/solidus_friendly_promotions/admin/{promotion_actions/calculators → calculator_fields}/tiered_flat_rate/_tier_fields.html.erb +7 -8
- data/app/views/solidus_friendly_promotions/admin/calculator_fields/tiered_percent/_fields.html.erb +47 -0
- data/app/views/solidus_friendly_promotions/admin/{promotion_actions/calculators → calculator_fields}/tiered_percent/_tier_fields.html.erb +8 -7
- data/app/views/solidus_friendly_promotions/admin/{promotion_actions/calculators → calculator_fields}/tiered_percent_on_eligible_item_quantity/_fields.html.erb +11 -9
- data/app/views/solidus_friendly_promotions/admin/calculator_fields/tiered_percent_on_eligible_item_quantity/_tier_fields.html.erb +35 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_first_order.html.erb +3 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_first_repeat_purchase_since.html.erb +7 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_item_total.html.erb +15 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_line_item_option_value.html.erb +25 -0
- data/app/views/solidus_friendly_promotions/admin/{promotion_rules/rules → condition_fields}/_line_item_product.html.erb +7 -7
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_line_item_taxon.html.erb +17 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_minimum_quantity.html.erb +5 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_nth_order.html.erb +15 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_one_use_per_user.html.erb +3 -0
- data/app/views/solidus_friendly_promotions/admin/{promotion_rules/rules → condition_fields}/_option_value.html.erb +10 -10
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_product.html.erb +28 -0
- data/app/views/solidus_friendly_promotions/admin/{promotion_rules/rules → condition_fields}/_shipping_method.html.erb +3 -3
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_store.html.erb +9 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_taxon.html.erb +28 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_user.html.erb +7 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_user_logged_in.html.erb +3 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/_user_role.html.erb +15 -0
- data/app/views/solidus_friendly_promotions/admin/condition_fields/line_item_option_value/_option_value_fields.html.erb +21 -0
- data/app/views/solidus_friendly_promotions/admin/conditions/_condition.html.erb +26 -0
- data/app/views/solidus_friendly_promotions/admin/conditions/_new_condition.html.erb +26 -0
- data/app/views/solidus_friendly_promotions/admin/conditions/_type_select.html.erb +20 -0
- data/app/views/solidus_friendly_promotions/admin/conditions/new.html.erb +1 -0
- data/app/views/solidus_friendly_promotions/admin/promotion_code_batches/_form_fields.html.erb +5 -5
- data/app/views/solidus_friendly_promotions/admin/promotion_code_batches/new.html.erb +3 -3
- data/app/views/solidus_friendly_promotions/admin/promotions/_form.html.erb +36 -8
- data/app/views/solidus_friendly_promotions/admin/promotions/_table_filter.html.erb +6 -6
- data/app/views/solidus_friendly_promotions/admin/promotions/edit.html.erb +7 -41
- data/app/views/solidus_friendly_promotions/admin/shared/_number_with_currency.html.erb +20 -0
- data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_boolean.html.erb +14 -0
- data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_decimal.html.erb +12 -0
- data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_encrypted_string.html.erb +12 -0
- data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_integer.html.erb +12 -0
- data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_password.html.erb +12 -0
- data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_string.html.erb +12 -0
- data/app/views/solidus_friendly_promotions/admin/shared/preference_fields/_text.html.erb +12 -0
- data/bin/sandbox +3 -3
- data/config/importmap.rb +2 -0
- data/config/locales/en.yml +139 -91
- data/config/routes.rb +3 -2
- data/db/migrate/20231011120928_add_db_comments_to_friendly_promotion_rules_taxons.rb +2 -2
- data/db/migrate/20231011142040_add_db_comments_to_friendly_promotion_rules_users.rb +1 -1
- data/db/migrate/20231011190222_add_db_comments_to_friendly_promotion_actions.rb +1 -1
- data/db/migrate/20240409093831_add_action_reference_to_rules.rb +34 -0
- data/db/migrate/20240506142650_remove_promotion_rules_promotion_id.rb +5 -0
- data/db/migrate/20240508080834_rename_promotion_rules_to_conditions.rb +19 -0
- data/db/migrate/20240508131514_rename_friendly_promotion_actions_to_friendly_benefits.rb +19 -0
- data/db/migrate/20240612113608_update_column_comments_for_benefits.rb +31 -0
- data/db/migrate/20240612114132_update_column_comments_for_conditions.rb +30 -0
- data/db/migrate/20240612115209_update_column_comments_for_condition_stores.rb +23 -0
- data/db/migrate/20240612115749_update_column_comments_for_condition_products.rb +22 -0
- data/db/migrate/20240612120411_update_column_comments_for_condition_taxons.rb +24 -0
- data/db/migrate/20240612121049_update_column_comments_for_condition_users.rb +23 -0
- data/lib/generators/solidus_friendly_promotions/install/templates/initializer.rb +30 -30
- data/lib/solidus_friendly_promotions/configuration.rb +11 -3
- data/lib/solidus_friendly_promotions/migrate_adjustments.rb +11 -11
- data/lib/solidus_friendly_promotions/promotion_map.rb +17 -17
- data/lib/solidus_friendly_promotions/promotion_migrator.rb +16 -16
- data/lib/solidus_friendly_promotions/testing_support/factories/friendly_promotion_factory.rb +8 -34
- data/lib/solidus_friendly_promotions/testing_support/factories/friendly_shipping_rate_discount_factory.rb +2 -2
- data/lib/solidus_friendly_promotions/version.rb +1 -1
- data/lib/tasks/solidus_friendly_promotions/migrate_adjustments.rake +2 -2
- data/solidus_friendly_promotions.gemspec +2 -2
- metadata +115 -88
- data/.rubocop_todo.yml +0 -157
- data/app/controllers/solidus_friendly_promotions/admin/promotion_actions_controller.rb +0 -103
- data/app/controllers/solidus_friendly_promotions/admin/promotion_rules_controller.rb +0 -105
- data/app/helpers/solidus_friendly_promotions/admin/promotion_actions_helper.rb +0 -23
- data/app/helpers/solidus_friendly_promotions/admin/promotion_rules_helper.rb +0 -25
- data/app/models/solidus_friendly_promotions/products_promotion_rule.rb +0 -8
- data/app/models/solidus_friendly_promotions/promotion_rules_store.rb +0 -8
- data/app/models/solidus_friendly_promotions/promotion_rules_taxon.rb +0 -8
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/_calculator_select.html.erb +0 -16
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/_form.html.erb +0 -3
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/_promotion_action.html.erb +0 -29
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/_type_select.html.erb +0 -14
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/actions/_adjust_line_item.html.erb +0 -6
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/actions/_adjust_shipment.html.erb +0 -6
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/actions/_calculator_fields.erb +0 -9
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/calculators/flat_rate/_fields.html.erb +0 -6
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/calculators/tiered_flat_rate/_fields.html.erb +0 -34
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/calculators/tiered_percent/_fields.html.erb +0 -34
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/calculators/tiered_percent_on_eligible_item_quantity/_tier_fields.html.erb +0 -27
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/edit.html.erb +0 -23
- data/app/views/solidus_friendly_promotions/admin/promotion_actions/new.html.erb +0 -26
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/_promotion_rule.html.erb +0 -22
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/_type_select.html.erb +0 -20
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/new.html.erb +0 -24
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_first_order.html.erb +0 -3
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_first_repeat_purchase_since.html.erb +0 -6
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_item_total.html.erb +0 -17
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_line_item_option_value.html.erb +0 -25
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_line_item_taxon.html.erb +0 -17
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_minimum_quantity.html.erb +0 -5
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_nth_order.html.erb +0 -15
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_one_use_per_user.html.erb +0 -3
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_product.html.erb +0 -44
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_store.html.erb +0 -9
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_taxon.html.erb +0 -44
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_user.html.erb +0 -7
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_user_logged_in.html.erb +0 -3
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/_user_role.html.erb +0 -15
- data/app/views/solidus_friendly_promotions/admin/promotion_rules/rules/line_item_option_value/_option_value_fields.html.erb +0 -17
- data/app/views/solidus_friendly_promotions/admin/promotions/_activations_edit.html.erb +0 -22
- data/app/views/solidus_friendly_promotions/admin/promotions/_activations_new.html.erb +0 -43
@@ -1,19 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module SolidusFriendlyPromotions
|
4
|
-
module
|
5
|
-
# A
|
4
|
+
module Conditions
|
5
|
+
# A condition to limit a promotion based on products in the order. Can
|
6
6
|
# require all or any of the products to be present. Valid products
|
7
7
|
# either come from assigned product group or are assingned directly to
|
8
|
-
# the
|
9
|
-
class Product <
|
10
|
-
include
|
8
|
+
# the condition.
|
9
|
+
class Product < Condition
|
10
|
+
include LineItemApplicableOrderCondition
|
11
11
|
|
12
|
-
has_many :
|
12
|
+
has_many :condition_products,
|
13
13
|
dependent: :destroy,
|
14
|
-
foreign_key: :
|
15
|
-
class_name: "SolidusFriendlyPromotions::
|
16
|
-
has_many :products, class_name: "Spree::Product", through: :
|
14
|
+
foreign_key: :condition_id,
|
15
|
+
class_name: "SolidusFriendlyPromotions::ConditionProduct"
|
16
|
+
has_many :products, class_name: "Spree::Product", through: :condition_products
|
17
17
|
|
18
18
|
def preload_relations
|
19
19
|
[:products]
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module SolidusFriendlyPromotions
|
4
|
-
module
|
5
|
-
class ShippingMethod <
|
6
|
-
include
|
4
|
+
module Conditions
|
5
|
+
class ShippingMethod < Condition
|
6
|
+
include ShipmentLevelCondition
|
7
7
|
|
8
8
|
preference :shipping_method_ids, type: :array, default: []
|
9
9
|
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module SolidusFriendlyPromotions
|
4
|
-
module
|
5
|
-
class Store <
|
6
|
-
include
|
4
|
+
module Conditions
|
5
|
+
class Store < Condition
|
6
|
+
include OrderLevelCondition
|
7
7
|
|
8
|
-
has_many :
|
9
|
-
foreign_key: :
|
8
|
+
has_many :condition_stores, class_name: "SolidusFriendlyPromotions::ConditionStore",
|
9
|
+
foreign_key: :condition_id,
|
10
10
|
dependent: :destroy
|
11
|
-
has_many :stores, through: :
|
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
|
5
|
-
class Taxon <
|
6
|
-
include
|
4
|
+
module Conditions
|
5
|
+
class Taxon < Condition
|
6
|
+
include LineItemApplicableOrderCondition
|
7
7
|
|
8
|
-
has_many :
|
8
|
+
has_many :condition_taxons, class_name: "SolidusFriendlyPromotions::ConditionTaxon", foreign_key: :condition_id,
|
9
9
|
dependent: :destroy
|
10
|
-
has_many :taxons, through: :
|
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 |
|
28
|
-
order_taxons.where(id:
|
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:
|
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:
|
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:
|
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
|
93
|
-
def
|
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
|
5
|
-
class User <
|
6
|
-
include
|
4
|
+
module Conditions
|
5
|
+
class User < Condition
|
6
|
+
include OrderLevelCondition
|
7
7
|
|
8
|
-
has_many :
|
9
|
-
class_name: "SolidusFriendlyPromotions::
|
10
|
-
foreign_key: :
|
8
|
+
has_many :condition_users,
|
9
|
+
class_name: "SolidusFriendlyPromotions::ConditionUser",
|
10
|
+
foreign_key: :condition_id,
|
11
11
|
dependent: :destroy
|
12
|
-
has_many :users, through: :
|
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
|
5
|
-
class UserLoggedIn <
|
6
|
-
include
|
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
|
5
|
-
class UserRole <
|
6
|
-
include
|
4
|
+
module Conditions
|
5
|
+
class UserRole < Condition
|
6
|
+
include OrderLevelCondition
|
7
7
|
|
8
8
|
preference :role_ids, :array, default: []
|
9
9
|
|
@@ -9,10 +9,10 @@ module SolidusFriendlyPromotions
|
|
9
9
|
@results = []
|
10
10
|
end
|
11
11
|
|
12
|
-
def add(item:,
|
12
|
+
def add(item:, condition:, success:, code:, message:)
|
13
13
|
results << EligibilityResult.new(
|
14
14
|
item: item,
|
15
|
-
|
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.
|
25
|
-
|
26
|
-
|
27
|
-
|
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(&:
|
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 =
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
34
|
-
|
35
|
-
|
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(&:
|
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.
|
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.
|
47
|
+
line_item.managed_by_order_benefit.remove_from(order)
|
47
48
|
end
|
48
49
|
end
|
49
50
|
|
50
|
-
def adjust_line_items(
|
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(
|
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(
|
61
|
+
def adjust_shipments(benefits)
|
61
62
|
order.shipments.map do |shipment|
|
62
|
-
discounts = generate_discounts(
|
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(
|
69
|
+
def adjust_shipping_rates(benefits)
|
69
70
|
order.shipments.flat_map(&:shipping_rates).select(&:cost).map do |rate|
|
70
|
-
discounts = generate_discounts(
|
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
|
77
|
-
|
78
|
-
candidate.
|
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(
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
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(&:
|
15
|
-
preload(records:
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
:
|
49
|
-
|
50
|
-
]
|
47
|
+
{
|
48
|
+
benefits: :conditions
|
49
|
+
}
|
51
50
|
end
|
52
51
|
end
|
53
52
|
end
|
data/app/models/solidus_friendly_promotions/friendly_promotion_adjuster/persist_discounted_order.rb
CHANGED
@@ -22,7 +22,7 @@ module SolidusFriendlyPromotions
|
|
22
22
|
shipping_rate: shipping_rate,
|
23
23
|
amount: discount.amount,
|
24
24
|
label: discount.label,
|
25
|
-
|
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
|
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?
|
data/app/models/solidus_friendly_promotions/permission_sets/friendly_promotion_management.rb
CHANGED
@@ -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::
|
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 :
|
11
|
-
has_many :
|
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
|
@@ -19,8 +19,12 @@ module SolidusFriendlyPromotions
|
|
19
19
|
validates :per_code_usage_limit, numericality: {greater_than_or_equal_to: 0, allow_nil: true}
|
20
20
|
validates :description, length: {maximum: 255}
|
21
21
|
validate :apply_automatically_disallowed_with_paths
|
22
|
+
validate :apply_automatically_disallowed_with_promotion_codes
|
22
23
|
|
23
|
-
|
24
|
+
before_save :normalize_blank_values
|
25
|
+
after_discard :delete_cart_connections
|
26
|
+
|
27
|
+
scope :active, ->(time = Time.current) { has_benefits.started_and_unexpired(time) }
|
24
28
|
scope :advertised, -> { where(advertise: true) }
|
25
29
|
scope :coupons, -> { joins(:codes).distinct }
|
26
30
|
scope :started_and_unexpired, ->(time = Time.current) do
|
@@ -29,8 +33,8 @@ module SolidusFriendlyPromotions
|
|
29
33
|
where(table[:starts_at].eq(nil).or(table[:starts_at].lt(time)))
|
30
34
|
.where(table[:expires_at].eq(nil).or(table[:expires_at].gt(time)))
|
31
35
|
end
|
32
|
-
scope :
|
33
|
-
joins(:
|
36
|
+
scope :has_benefits, -> do
|
37
|
+
joins(:benefits).distinct
|
34
38
|
end
|
35
39
|
|
36
40
|
enum lane: SolidusFriendlyPromotions.config.preferred_lanes
|
@@ -59,8 +63,8 @@ module SolidusFriendlyPromotions
|
|
59
63
|
.joins(:all_adjustments)
|
60
64
|
.where(
|
61
65
|
spree_adjustments: {
|
62
|
-
source_type: "SolidusFriendlyPromotions::
|
63
|
-
source_id:
|
66
|
+
source_type: "SolidusFriendlyPromotions::Benefit",
|
67
|
+
source_id: benefits.map(&:id),
|
64
68
|
eligible: true
|
65
69
|
}
|
66
70
|
).distinct
|
@@ -110,7 +114,7 @@ module SolidusFriendlyPromotions
|
|
110
114
|
end
|
111
115
|
|
112
116
|
def active?(time = Time.current)
|
113
|
-
started?(time) && not_expired?(time) &&
|
117
|
+
started?(time) && not_expired?(time) && benefits.present?
|
114
118
|
end
|
115
119
|
|
116
120
|
def inactive?(time = Time.current)
|
@@ -122,53 +126,33 @@ module SolidusFriendlyPromotions
|
|
122
126
|
end
|
123
127
|
|
124
128
|
def products
|
125
|
-
|
129
|
+
conditions.where(type: "SolidusFriendlyPromotions::Conditions::Product").flat_map(&:products).uniq
|
126
130
|
end
|
127
131
|
|
128
132
|
def eligibility_results
|
129
133
|
@eligibility_results ||= SolidusFriendlyPromotions::EligibilityResults.new(self)
|
130
134
|
end
|
131
135
|
|
132
|
-
|
133
|
-
applicable_rules = rules.select do |rule|
|
134
|
-
rule.applicable?(promotable)
|
135
|
-
end
|
136
|
-
|
137
|
-
applicable_rules.map do |applicable_rule|
|
138
|
-
eligible = applicable_rule.eligible?(promotable)
|
139
|
-
|
140
|
-
break [false] if !eligible && !dry_run
|
141
|
-
|
142
|
-
if dry_run
|
143
|
-
if applicable_rule.eligibility_errors.details[:base].first
|
144
|
-
code = applicable_rule.eligibility_errors.details[:base].first[:error_code]
|
145
|
-
message = applicable_rule.eligibility_errors.full_messages.first
|
146
|
-
end
|
147
|
-
eligibility_results.add(
|
148
|
-
item: promotable,
|
149
|
-
rule: applicable_rule,
|
150
|
-
success: eligible,
|
151
|
-
code: eligible ? nil : (code || :coupon_code_unknown_error),
|
152
|
-
message: eligible ? nil : (message || I18n.t(:coupon_code_unknown_error, scope: [:solidus_friendly_promotions, :eligibility_errors]))
|
153
|
-
)
|
154
|
-
end
|
155
|
-
|
156
|
-
eligible
|
157
|
-
end.all?
|
158
|
-
end
|
136
|
+
private
|
159
137
|
|
160
|
-
def
|
161
|
-
|
162
|
-
eligible_by_applicable_rules?(line_item)
|
163
|
-
end
|
138
|
+
def normalize_blank_values
|
139
|
+
self[:path] = nil if self[:path].blank?
|
164
140
|
end
|
165
141
|
|
166
|
-
private
|
167
|
-
|
168
142
|
def apply_automatically_disallowed_with_paths
|
169
143
|
return unless apply_automatically
|
170
144
|
|
171
145
|
errors.add(:apply_automatically, :disallowed_with_path) if path.present?
|
172
146
|
end
|
147
|
+
|
148
|
+
def apply_automatically_disallowed_with_promotion_codes
|
149
|
+
return unless apply_automatically
|
150
|
+
|
151
|
+
errors.add(:apply_automatically, :disallowed_with_promotion_codes) if codes.present?
|
152
|
+
end
|
153
|
+
|
154
|
+
def delete_cart_connections
|
155
|
+
order_promotions.where(order: Spree::Order.incomplete).destroy_all
|
156
|
+
end
|
173
157
|
end
|
174
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 :
|
6
|
+
belongs_to :benefit, inverse_of: :shipping_rate_discounts
|
7
7
|
|
8
8
|
extend Spree::DisplayMoney
|
9
9
|
money_methods :amount
|
@@ -1,13 +1,13 @@
|
|
1
|
-
<%= fields_for param_prefix,
|
2
|
-
<div class="
|
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/
|
10
|
-
|
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,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 %>
|