@@ -485,4 +485,225 @@ public function testFixedAmountWholeCartDiscountOnBundleProduct(): void
485
485
$ this ->assertEquals (32.5 , $ quote ->getSubtotalWithDiscount ());
486
486
$ this ->assertEquals (82.5 , $ quote ->getSubtotal ());
487
487
}
488
+
489
+ /**
490
+ * @return void
491
+ * @throws NoSuchEntityException
492
+ */
493
+ #[
494
+ DataFixture(CategoryFixture::class, as: 'c1 ' ),
495
+ DataFixture(ProductFixture::class, [
496
+ 'price ' => 123 ,
497
+ 'sku ' => 'p1 ' ,
498
+ 'category_ids ' => ['$c1.id$ ' ]
499
+ ], 'p1 ' ),
500
+ DataFixture(
501
+ RuleFixture::class,
502
+ [
503
+ 'stop_rules_processing ' => 0 ,
504
+ 'discount_amount ' => 10 ,
505
+ 'simple_action ' => Rule::BY_FIXED_ACTION ,
506
+ 'sort_order ' => 0
507
+ ],
508
+ 'rule1 '
509
+ ),
510
+ DataFixture(
511
+ RuleFixture::class,
512
+ [
513
+ 'stop_rules_processing ' => 0 ,
514
+ 'discount_amount ' => 20 ,
515
+ 'simple_action ' => Rule::BY_PERCENT_ACTION ,
516
+ 'discount_step ' => 3 ,
517
+ 'sort_order ' => 2
518
+ ],
519
+ 'rule2 '
520
+ ),
521
+ DataFixture(
522
+ RuleFixture::class,
523
+ [
524
+ 'discount_amount ' => 3 ,
525
+ 'simple_action ' => Rule::BUY_X_GET_Y_ACTION ,
526
+ 'discount_step ' => 5 ,
527
+ 'sort_order ' => 4
528
+ ],
529
+ 'rule3 '
530
+ ),
531
+ DataFixture(GuestCartFixture::class, as: 'cart1 ' ),
532
+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart1.id$ ' , 'product_id ' => '$p1.id$ ' ]),
533
+ DataFixture(GuestCartFixture::class, as: 'cart2 ' ),
534
+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart2.id$ ' , 'product_id ' => '$p1.id$ ' , 'qty ' => 3 ]),
535
+ DataFixture(GuestCartFixture::class, as: 'cart3 ' ),
536
+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart3.id$ ' , 'product_id ' => '$p1.id$ ' , 'qty ' => 9 ]),
537
+ ]
538
+ public function testDiscountOnSimpleProductWhenFurtherRulesHaveDiscountQtyStepSpecified (): void
539
+ {
540
+ $ cart1Id = (int )$ this ->fixtures ->get ('cart1 ' )->getId ();
541
+ $ cart2Id = (int )$ this ->fixtures ->get ('cart2 ' )->getId ();
542
+ $ cart3Id = (int )$ this ->fixtures ->get ('cart3 ' )->getId ();
543
+ $ quote1 = $ this ->quote ->get ($ cart1Id );
544
+ $ quote2 = $ this ->quote ->get ($ cart2Id );
545
+ $ quote3 = $ this ->quote ->get ($ cart3Id );
546
+ $ rule1Id = (int )$ this ->fixtures ->get ('rule1 ' )->getId ();
547
+ $ rule2Id = (int )$ this ->fixtures ->get ('rule2 ' )->getId ();
548
+ $ rule3Id = (int )$ this ->fixtures ->get ('rule3 ' )->getId ();
549
+
550
+ $ quote1 ->setStoreId (1 )->setIsActive (true );
551
+ $ address = $ quote1 ->getShippingAddress ();
552
+ $ this ->shipping ->setAddress ($ address );
553
+ $ this ->shippingAssignment ->setShipping ($ this ->shipping );
554
+ $ this ->shippingAssignment ->setItems ($ address ->getAllItems ());
555
+
556
+ $ this ->subtotalCollector ->collect ($ quote1 , $ this ->shippingAssignment , $ this ->total );
557
+ $ this ->discountCollector ->collect ($ quote1 , $ this ->shippingAssignment , $ this ->total );
558
+
559
+ $ this ->assertEquals (-10 , $ this ->total ->getDiscountAmount ());
560
+ $ this ->assertEqualsCanonicalizing ([$ rule1Id ], explode (', ' , $ quote1 ->getAppliedRuleIds ()));
561
+
562
+ $ quote2 ->setStoreId (1 )->setIsActive (true );
563
+ $ address = $ quote2 ->getShippingAddress ();
564
+ $ this ->shipping ->setAddress ($ address );
565
+ $ this ->shippingAssignment ->setShipping ($ this ->shipping );
566
+ $ this ->shippingAssignment ->setItems ($ address ->getAllItems ());
567
+
568
+ $ this ->subtotalCollector ->collect ($ quote2 , $ this ->shippingAssignment , $ this ->total );
569
+ $ this ->discountCollector ->collect ($ quote2 , $ this ->shippingAssignment , $ this ->total );
570
+
571
+ $ this ->assertEquals (-97.8 , $ this ->total ->getDiscountAmount ());
572
+ $ this ->assertEqualsCanonicalizing ([$ rule1Id ,$ rule2Id ], explode (', ' , $ quote2 ->getAppliedRuleIds ()));
573
+
574
+ $ quote3 ->setStoreId (1 )->setIsActive (true );
575
+ $ address = $ quote3 ->getShippingAddress ();
576
+ $ this ->shipping ->setAddress ($ address );
577
+ $ this ->shippingAssignment ->setShipping ($ this ->shipping );
578
+ $ this ->shippingAssignment ->setItems ($ address ->getAllItems ());
579
+
580
+ $ this ->subtotalCollector ->collect ($ quote3 , $ this ->shippingAssignment , $ this ->total );
581
+ $ this ->discountCollector ->collect ($ quote3 , $ this ->shippingAssignment , $ this ->total );
582
+
583
+ $ this ->assertEquals (-662.4 , $ this ->total ->getDiscountAmount ());
584
+ $ this ->assertEqualsCanonicalizing ([$ rule1Id ,$ rule2Id ,$ rule3Id ], explode (', ' , $ quote3 ->getAppliedRuleIds ()));
585
+ }
586
+
587
+ /**
588
+ * @return void
589
+ * @throws NoSuchEntityException
590
+ */
591
+ #[
592
+ DataFixture(CategoryFixture::class, as: 'c1 ' ),
593
+ DataFixture(ProductFixture::class, [
594
+ 'price ' => 123 ,
595
+ 'sku ' => 'p1 ' ,
596
+ 'category_ids ' => ['$c1.id$ ' ]
597
+ ], 'p1 ' ),
598
+ DataFixture(
599
+ RuleFixture::class,
600
+ [
601
+ 'stop_rules_processing ' => 0 ,
602
+ 'discount_amount ' => 33 ,
603
+ 'simple_action ' => Rule::CART_FIXED_ACTION ,
604
+ 'discount_step ' => 3 ,
605
+ 'sort_order ' => 0
606
+ ],
607
+ 'rule1 '
608
+ ),
609
+ DataFixture(GuestCartFixture::class, as: 'cart1 ' ),
610
+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart1.id$ ' , 'product_id ' => '$p1.id$ ' ]),
611
+ DataFixture(GuestCartFixture::class, as: 'cart2 ' ),
612
+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart2.id$ ' , 'product_id ' => '$p1.id$ ' , 'qty ' => 5 ]),
613
+ ]
614
+ public function testFixedAmountDiscountForWholeCartOnSimpleProductWhenStepQtyIsSpecified (): void
615
+ {
616
+ $ cart1Id = (int )$ this ->fixtures ->get ('cart1 ' )->getId ();
617
+ $ cart2Id = (int )$ this ->fixtures ->get ('cart2 ' )->getId ();
618
+ $ quote1 = $ this ->quote ->get ($ cart1Id );
619
+ $ quote2 = $ this ->quote ->get ($ cart2Id );
620
+ $ rule1Id = (int )$ this ->fixtures ->get ('rule1 ' )->getId ();
621
+
622
+ $ quote1 ->setStoreId (1 )->setIsActive (true );
623
+ $ address = $ quote1 ->getShippingAddress ();
624
+ $ this ->shipping ->setAddress ($ address );
625
+ $ this ->shippingAssignment ->setShipping ($ this ->shipping );
626
+ $ this ->shippingAssignment ->setItems ($ address ->getAllItems ());
627
+
628
+ $ this ->subtotalCollector ->collect ($ quote1 , $ this ->shippingAssignment , $ this ->total );
629
+ $ this ->discountCollector ->collect ($ quote1 , $ this ->shippingAssignment , $ this ->total );
630
+
631
+ $ this ->assertEquals (-33 , $ this ->total ->getDiscountAmount ());
632
+ $ this ->assertEqualsCanonicalizing ([$ rule1Id ], explode (', ' , $ quote1 ->getAppliedRuleIds ()));
633
+
634
+ $ quote2 ->setStoreId (1 )->setIsActive (true );
635
+ $ address = $ quote2 ->getShippingAddress ();
636
+ $ this ->shipping ->setAddress ($ address );
637
+ $ this ->shippingAssignment ->setShipping ($ this ->shipping );
638
+ $ this ->shippingAssignment ->setItems ($ address ->getAllItems ());
639
+
640
+ $ this ->subtotalCollector ->collect ($ quote2 , $ this ->shippingAssignment , $ this ->total );
641
+ $ this ->discountCollector ->collect ($ quote2 , $ this ->shippingAssignment , $ this ->total );
642
+
643
+ $ this ->assertEquals (-33 , $ this ->total ->getDiscountAmount ());
644
+ $ this ->assertEqualsCanonicalizing ([$ rule1Id ], explode (', ' , $ quote2 ->getAppliedRuleIds ()));
645
+ }
646
+
647
+ /**
648
+ * @return void
649
+ * @throws NoSuchEntityException
650
+ */
651
+ #[
652
+ DataFixture(CategoryFixture::class, as: 'c1 ' ),
653
+ DataFixture(
654
+ ProductFixture::class,
655
+ [
656
+ 'price ' => 123 ,
657
+ 'sku ' => 'p1 ' ,
658
+ 'category_ids ' => ['$c1.id$ ' ]
659
+ ], 'p1 '
660
+ ),
661
+ DataFixture(
662
+ RuleFixture::class,
663
+ [
664
+ 'discount_amount ' => 1 ,
665
+ 'simple_action ' => Rule::BUY_X_GET_Y_ACTION ,
666
+ 'discount_step ' => 3 ,
667
+ ],
668
+ 'rule1 '
669
+ ),
670
+ DataFixture(GuestCartFixture::class, as: 'cart1 ' ),
671
+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart1.id$ ' , 'product_id ' => '$p1.id$ ' , 'qty ' => 3 ]),
672
+ DataFixture(GuestCartFixture::class, as: 'cart2 ' ),
673
+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart2.id$ ' , 'product_id ' => '$p1.id$ ' , 'qty ' => 4 ]),
674
+ ]
675
+ public function testDiscountOnSimpleProductWhenBuyXGetYRuleHasDiscountQtyStepSpecified (): void
676
+ {
677
+ $ cart1Id = (int )$ this ->fixtures ->get ('cart1 ' )->getId ();
678
+ $ quote1 = $ this ->quote ->get ($ cart1Id );
679
+ $ rule1Id = (int )$ this ->fixtures ->get ('rule1 ' )->getId ();
680
+
681
+ $ quote1 ->setStoreId (1 )->setIsActive (true );
682
+ $ address = $ quote1 ->getShippingAddress ();
683
+ $ this ->shipping ->setAddress ($ address );
684
+ $ this ->shippingAssignment ->setShipping ($ this ->shipping );
685
+ $ this ->shippingAssignment ->setItems ($ address ->getAllItems ());
686
+
687
+ $ this ->subtotalCollector ->collect ($ quote1 , $ this ->shippingAssignment , $ this ->total );
688
+ $ this ->discountCollector ->collect ($ quote1 , $ this ->shippingAssignment , $ this ->total );
689
+
690
+ $ this ->assertEquals (0 , $ this ->total ->getDiscountAmount ());
691
+ $ this ->assertNull ($ quote1 ->getAppliedRuleIds ());
692
+
693
+ $ quote1 ->addProduct ($ this ->fixtures ->get ('p1 ' ), 1 );
694
+
695
+ $ this ->subtotalCollector ->collect ($ quote1 , $ this ->shippingAssignment , $ this ->total );
696
+ $ this ->discountCollector ->collect ($ quote1 , $ this ->shippingAssignment , $ this ->total );
697
+
698
+ $ this ->assertEquals (-123 , $ this ->total ->getDiscountAmount ());
699
+ $ this ->assertEqualsCanonicalizing ([$ rule1Id ], explode (', ' , $ quote1 ->getAppliedRuleIds ()));
700
+
701
+ $ quote1 ->setItemQty ($ this ->fixtures ->get ('p1 ' )->getId (), 3 );
702
+
703
+ $ this ->subtotalCollector ->collect ($ quote1 , $ this ->shippingAssignment , $ this ->total );
704
+ $ this ->discountCollector ->collect ($ quote1 , $ this ->shippingAssignment , $ this ->total );
705
+
706
+ $ this ->assertEquals (-123 , $ this ->total ->getDiscountAmount ());
707
+ $ this ->assertEqualsCanonicalizing ([$ rule1Id ], explode (', ' , $ quote1 ->getAppliedRuleIds ()));
708
+ }
488
709
}
0 commit comments