@@ -67,46 +67,77 @@ public function execute(Order $subject, bool $increment)
6767 if (!$ subject || !$ subject ->getAppliedRuleIds ()) {
6868 return $ subject ;
6969 }
70-
7170 // lookup rule ids
7271 $ ruleIds = explode (', ' , $ subject ->getAppliedRuleIds ());
7372 $ ruleIds = array_unique ($ ruleIds );
74-
75- $ ruleCustomer = null ;
76- $ customerId = $ subject ->getCustomerId ();
77-
73+ $ customerId = (int )$ subject ->getCustomerId ();
7874 // use each rule (and apply to customer, if applicable)
7975 foreach ($ ruleIds as $ ruleId ) {
8076 if (!$ ruleId ) {
8177 continue ;
8278 }
83- /** @var \Magento\SalesRule\Model\Rule $rule */
84- $ rule = $ this ->ruleFactory ->create ();
85- $ rule ->load ($ ruleId );
86- if ($ rule ->getId ()) {
87- $ rule ->loadCouponCode ();
88- if ($ increment || $ rule ->getTimesUsed () > 0 ) {
89- $ rule ->setTimesUsed ($ rule ->getTimesUsed () + ($ increment ? 1 : -1 ));
90- $ rule ->save ();
91- }
79+ $ this ->updateRuleUsages ($ increment , (int )$ ruleId , $ customerId );
80+ }
81+ $ this ->updateCouponUsages ($ subject , $ increment , $ customerId );
9282
93- if ($ customerId ) {
94- /** @var \Magento\SalesRule\Model\Rule\Customer $ruleCustomer */
95- $ ruleCustomer = $ this ->ruleCustomerFactory ->create ();
96- $ ruleCustomer ->loadByCustomerRule ($ customerId , $ ruleId );
83+ return $ subject ;
84+ }
9785
98- if ($ ruleCustomer ->getId ()) {
99- if ($ increment || $ ruleCustomer ->getTimesUsed () > 0 ) {
100- $ ruleCustomer ->setTimesUsed ($ ruleCustomer ->getTimesUsed () + ($ increment ? 1 : -1 ));
101- }
102- } elseif ($ increment ) {
103- $ ruleCustomer ->setCustomerId ($ customerId )->setRuleId ($ ruleId )->setTimesUsed (1 );
104- }
105- $ ruleCustomer ->save ();
106- }
86+ /**
87+ * Update the number of rule usages.
88+ *
89+ * @param bool $increment
90+ * @param int $ruleId
91+ * @param int $customerId
92+ */
93+ private function updateRuleUsages (bool $ increment , int $ ruleId , int $ customerId )
94+ {
95+ /** @var \Magento\SalesRule\Model\Rule $rule */
96+ $ rule = $ this ->ruleFactory ->create ();
97+ $ rule ->load ($ ruleId );
98+ if ($ rule ->getId ()) {
99+ $ rule ->loadCouponCode ();
100+ if ($ increment || $ rule ->getTimesUsed () > 0 ) {
101+ $ rule ->setTimesUsed ($ rule ->getTimesUsed () + ($ increment ? 1 : -1 ));
102+ $ rule ->save ();
103+ }
104+ if ($ customerId ) {
105+ $ this ->updateCustomerRuleUsages ($ increment , $ ruleId , $ customerId );
107106 }
108107 }
108+ }
109109
110+ /**
111+ * Update the number of rule usages per customer.
112+ *
113+ * @param bool $increment
114+ * @param int $ruleId
115+ * @param int $customerId
116+ */
117+ private function updateCustomerRuleUsages (bool $ increment , int $ ruleId , int $ customerId )
118+ {
119+ /** @var \Magento\SalesRule\Model\Rule\Customer $ruleCustomer */
120+ $ ruleCustomer = $ this ->ruleCustomerFactory ->create ();
121+ $ ruleCustomer ->loadByCustomerRule ($ customerId , $ ruleId );
122+ if ($ ruleCustomer ->getId ()) {
123+ if ($ increment || $ ruleCustomer ->getTimesUsed () > 0 ) {
124+ $ ruleCustomer ->setTimesUsed ($ ruleCustomer ->getTimesUsed () + ($ increment ? 1 : -1 ));
125+ }
126+ } elseif ($ increment ) {
127+ $ ruleCustomer ->setCustomerId ($ customerId )->setRuleId ($ ruleId )->setTimesUsed (1 );
128+ }
129+ $ ruleCustomer ->save ();
130+ }
131+
132+ /**
133+ * Update the number of coupon usages.
134+ *
135+ * @param Order $subject
136+ * @param bool $increment
137+ * @param int $customerId
138+ */
139+ private function updateCouponUsages (Order $ subject , bool $ increment , int $ customerId )
140+ {
110141 $ this ->coupon ->load ($ subject ->getCouponCode (), 'code ' );
111142 if ($ this ->coupon ->getId ()) {
112143 if ($ increment || $ this ->coupon ->getTimesUsed () > 0 ) {
@@ -117,7 +148,5 @@ public function execute(Order $subject, bool $increment)
117148 $ this ->couponUsage ->updateCustomerCouponTimesUsed ($ customerId , $ this ->coupon ->getId (), $ increment );
118149 }
119150 }
120-
121- return $ subject ;
122151 }
123152}
0 commit comments