Cross selling (#4185)

Product categories can now be marked as "cross-selling categories", causing them to 
appear in the add-on checkout step as additional recommendations, depending on 
their cross-selling visibility (always, only if certain products are already in the cart, or 
only if they qualify for a discount according to discount rules).

---------

Co-authored-by: Raphael Michel <michel@rami.io>
Co-authored-by: Richard Schreiber <schreiber@rami.io>
This commit is contained in:
Mira
2024-10-14 14:39:49 +02:00
committed by GitHub
parent 7607cc5d2f
commit 359df1f51e
24 changed files with 1737 additions and 218 deletions

View File

@@ -65,6 +65,8 @@ def test_full_clone_same_organizer():
item_meta = event.item_meta_properties.create(name="Bla")
tax_rule = event.tax_rules.create(name="VAT", rate=19)
category = event.categories.create(name="Tickets")
cross_sell_category = event.categories.create(name="Recommendations", cross_selling_mode="only",
cross_selling_condition="products")
q1 = event.quotas.create(name="Quota 1", size=5)
q2 = event.quotas.create(name="Quota 2", size=0, closed=True)
@@ -88,6 +90,7 @@ def test_full_clone_same_organizer():
q1.items.add(item1)
q2.items.add(item2)
q2.variations.add(item2v)
cross_sell_category.cross_selling_match_products.add(item1)
event.discounts.create(internal_name="Fake discount")
question1 = event.questions.create(question="Yes or no", type=Question.TYPE_BOOLEAN)
@@ -156,7 +159,7 @@ def test_full_clone_same_organizer():
copied_item1 = copied_event.items.get(name=item1.name)
copied_item2 = copied_event.items.get(name=item2.name)
assert copied_item1.tax_rule == copied_event.tax_rules.get()
assert copied_item1.category == copied_event.categories.get()
assert copied_item1.category == copied_event.categories.get(name='Tickets')
assert copied_item1.limit_sales_channels.get() == sc
assert copied_item1.meta_data == item1.meta_data
assert copied_item2.variations.get().meta_data == item2v.meta_data
@@ -166,7 +169,7 @@ def test_full_clone_same_organizer():
assert copied_item2.variations.get().limit_sales_channels.get() == sc
assert copied_item2.require_membership_types.count() == 1
assert copied_item2.require_membership_types.get() == membership_type
assert copied_item1.addons.get().addon_category == copied_event.categories.get()
assert copied_item1.addons.get().addon_category == copied_event.categories.get(name='Tickets')
assert copied_item1.bundles.get().bundled_item == copied_item2
assert copied_item1.bundles.get().bundled_variation == copied_item2.variations.get()
assert copied_item2.hidden_if_item_available == copied_item1
@@ -174,6 +177,9 @@ def test_full_clone_same_organizer():
assert copied_q2.items.get() == copied_item2
assert copied_q2.variations.get() == copied_item2.variations.get()
copied_cross_sell_category = copied_event.categories.get(name=cross_sell_category.name)
assert copied_cross_sell_category.cross_selling_match_products.get() == copied_item1
copied_question1 = copied_event.questions.get(type=question1.type)
copied_question2 = copied_event.questions.get(type=question2.type)
assert copied_question2.dependency_question == copied_question1