3434use Magento \SalesRule \Model \Rule ;
3535use Magento \SalesRule \Model \Rule \Condition \Combine as CombineCondition ;
3636use Magento \SalesRule \Model \Rule \Condition \Product as ProductCondition ;
37- use Magento \SalesRule \Test \Fixture \AddressCondition ;
3837use Magento \SalesRule \Test \Fixture \ProductCondition as ProductConditionFixture ;
3938use Magento \SalesRule \Test \Fixture \Rule as RuleFixture ;
4039use Magento \TestFramework \Fixture \AppIsolation ;
@@ -868,11 +867,6 @@ public function testDiscountOnSimpleProductWhenBuyXGetYRuleHasDiscountQtyStepSpe
868867
869868 #[
870869 DataFixture(ProductFixture::class, ['price ' => 100 ], 'p1 ' ),
871- DataFixture(
872- AddressCondition::class,
873- ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '> ' , 'value ' => 75 ],
874- 'cond1 '
875- ),
876870 DataFixture(
877871 RuleFixture::class,
878872 [
@@ -892,7 +886,9 @@ public function testDiscountOnSimpleProductWhenBuyXGetYRuleHasDiscountQtyStepSpe
892886 'simple_action ' => Rule::BY_FIXED_ACTION ,
893887 'sort_order ' => 2 ,
894888 'apply_to_shipping ' => 1 ,
895- 'conditions ' => ['$cond1$ ' ],
889+ 'conditions ' => [
890+ ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '> ' , 'value ' => 75 ]
891+ ],
896892 ],
897893 'rule2 '
898894 ),
@@ -943,17 +939,6 @@ public function testSubtotalWithDiscountShouldReflectPreviouslyAppliedRules(): v
943939
944940 #[
945941 DataFixture(ProductFixture::class, ['price ' => 100 ], 'p1 ' ),
946- DataFixture(
947- AddressCondition::class,
948- ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '> ' , 'value ' => 75 ],
949- 'cond1 '
950- ),
951- DataFixture(
952- ProductConditionFixture::class,
953- // Ensures that the discount is applied to shipping only
954- ['attribute ' => 'quote_item_price ' , 'operator ' => '< ' , 'value ' => 0 ],
955- 'cond2 '
956- ),
957942 DataFixture(
958943 RuleFixture::class,
959944 [
@@ -973,8 +958,13 @@ public function testSubtotalWithDiscountShouldReflectPreviouslyAppliedRules(): v
973958 'simple_action ' => Rule::BY_FIXED_ACTION ,
974959 'sort_order ' => 2 ,
975960 'apply_to_shipping ' => 1 ,
976- 'conditions ' => ['$cond1$ ' ],
977- 'actions ' => ['$cond2$ ' ],
961+ 'conditions ' => [
962+ ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '> ' , 'value ' => 75 ]
963+ ],
964+ 'actions ' => [
965+ // Ensures that the discount is applied to shipping only
966+ ['attribute ' => 'quote_item_price ' , 'operator ' => '< ' , 'value ' => 0 ],
967+ ],
978968 ],
979969 'rule2 '
980970 ),
@@ -1023,4 +1013,94 @@ public function testSubtotalWithDiscountShouldReflectPreviouslyAppliedRulesForSh
10231013 $ this ->assertEquals ([$ rule1Id ], explode (', ' , $ cart ->getAppliedRuleIds ()));
10241014 $ this ->assertEquals ([$ rule1Id ], explode (', ' , current ($ cart ->getItems ())->getAppliedRuleIds ()));
10251015 }
1016+
1017+ #[
1018+ DataFixture(ProductFixture::class, ['price ' => 100 ], 'p1 ' ),
1019+ DataFixture(ProductFixture::class, ['price ' => 100 ], 'p2 ' ),
1020+ DataFixture(ProductFixture::class, ['price ' => 100 ], 'p3 ' ),
1021+ DataFixture(
1022+ RuleFixture::class,
1023+ [
1024+ 'stop_rules_processing ' => 1 ,
1025+ 'discount_amount ' => 50 ,
1026+ 'simple_action ' => Rule::BY_PERCENT_ACTION ,
1027+ 'sort_order ' => 1 ,
1028+ 'actions ' => [
1029+ ['attribute ' => 'sku ' , 'value ' => '$p1.sku$ ' ]
1030+ ],
1031+ ],
1032+ 'rule1 '
1033+ ),
1034+ DataFixture(
1035+ RuleFixture::class,
1036+ [
1037+ 'stop_rules_processing ' => 0 ,
1038+ 'discount_amount ' => 25 ,
1039+ 'simple_action ' => Rule::BY_PERCENT_ACTION ,
1040+ 'sort_order ' => 2 ,
1041+ 'apply_to_shipping ' => 0 ,
1042+ 'conditions ' => [
1043+ ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '< ' , 'value ' => 300 ]
1044+ ],
1045+ 'actions ' => [
1046+ ['attribute ' => 'sku ' , 'value ' => '$p2.sku$ ' ]
1047+ ],
1048+ ],
1049+ 'rule2 '
1050+ ),
1051+ DataFixture(
1052+ RuleFixture::class,
1053+ [
1054+ 'stop_rules_processing ' => 0 ,
1055+ 'discount_amount ' => 30 ,
1056+ 'simple_action ' => Rule::BY_FIXED_ACTION ,
1057+ 'sort_order ' => 3 ,
1058+ 'conditions ' => [
1059+ ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '> ' , 'value ' => 250 ]
1060+ ],
1061+ ],
1062+ 'rule3 '
1063+ ),
1064+ DataFixture(GuestCartFixture::class, as: 'cart1 ' ),
1065+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart1.id$ ' , 'product_id ' => '$p1.id$ ' ]),
1066+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart1.id$ ' , 'product_id ' => '$p2.id$ ' ]),
1067+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart1.id$ ' , 'product_id ' => '$p3.id$ ' ]),
1068+ ]
1069+ public function testSubtotalWithDiscountShouldReflectPreviouslyAppliedRulesWithStopRulesProcessing (): void
1070+ {
1071+ $ rule1Id = (int )$ this ->fixtures ->get ('rule1 ' )->getId ();
1072+ $ rule2Id = (int )$ this ->fixtures ->get ('rule2 ' )->getId ();
1073+ $ p1Id = (int )$ this ->fixtures ->get ('p1 ' )->getId ();
1074+ $ p2Id = (int )$ this ->fixtures ->get ('p2 ' )->getId ();
1075+ $ p3Id = (int )$ this ->fixtures ->get ('p3 ' )->getId ();
1076+ // Reset the state of the rule validator to ensure that it does not cache any previous state
1077+ $ this ->objectManager ->get (\Magento \SalesRule \Model \Validator::class)->_resetState ();
1078+ $ cart = $ this ->quoteRepository ->get ((int )$ this ->fixtures ->get ('cart1 ' )->getId ());
1079+ $ cart ->collectTotals ();
1080+
1081+ $ this ->assertEquals (225 , $ cart ->getSubtotalWithDiscount ());
1082+ $ this ->assertEquals (225 , $ cart ->getBaseSubtotalWithDiscount ());
1083+ // Bypass getter methods for subtotal_with_discount and base_subtotal_with_discount to retrieve stored values
1084+ $ this ->assertEquals (225 , $ cart ->getShippingAddress ()->getData ('subtotal_with_discount ' ));
1085+ $ this ->assertEquals (225 , $ cart ->getShippingAddress ()->getData ('base_subtotal_with_discount ' ));
1086+ $ this ->assertEquals (-75 , $ cart ->getShippingAddress ()->getBaseDiscountAmount ());
1087+ $ this ->assertEquals (-75 , $ cart ->getShippingAddress ()->getDiscountAmount ());
1088+ $ this ->assertEquals (0 , $ cart ->getShippingAddress ()->getShippingDiscountAmount ());
1089+ $ this ->assertEquals (0 , $ cart ->getShippingAddress ()->getBaseShippingDiscountAmount ());
1090+ // Check that rule3 is not applied because it requires subtotal with discount to be greater than 250
1091+ $ this ->assertEquals ([$ rule1Id , $ rule2Id ], explode (', ' , $ cart ->getAppliedRuleIds ()));
1092+ // rule2 is applied shipping only
1093+ $ items = [];
1094+ foreach ($ cart ->getAllItems () as $ item ) {
1095+ $ items [$ item ->getProductId ()] = $ item ;
1096+ }
1097+ $ this ->assertEquals ([$ rule1Id ], explode (', ' , $ items [$ p1Id ]->getAppliedRuleIds ()));
1098+ $ this ->assertEquals (50 , $ items [$ p1Id ]->getBaseDiscountAmount ());
1099+
1100+ $ this ->assertEquals ([$ rule2Id ], explode (', ' , $ items [$ p2Id ]->getAppliedRuleIds ()));
1101+ $ this ->assertEquals (25 , $ items [$ p2Id ]->getBaseDiscountAmount ());
1102+
1103+ $ this ->assertEmpty ($ items [$ p3Id ]->getAppliedRuleIds ());
1104+ $ this ->assertEquals (0 , $ items [$ p3Id ]->getBaseDiscountAmount ());
1105+ }
10261106}
0 commit comments