11<?php
22/**
3- * Copyright © Magento, Inc. All rights reserved.
4- * See COPYING.txt for license details .
3+ * Copyright 2022 Adobe
4+ * All Rights Reserved .
55 */
66declare (strict_types=1 );
77
1616use Magento \TestFramework \Fixture \Data \ProcessorInterface ;
1717use Magento \TestFramework \Fixture \RevertibleDataFixtureInterface ;
1818
19+ /**
20+ * Cart price rule fixture
21+ *
22+ * Example 1: Using array list: (base_subtotal > 1000) AND (sku in (simple1,simple3))
23+ *
24+ * ```php
25+ * #[
26+ * DataFixture(
27+ * RuleFixture::class,
28+ * [
29+ * 'discount_amount' => 25,
30+ * 'conditions' => [
31+ * [
32+ * 'attribute' => 'base_subtotal',
33+ * 'operator' => '>',
34+ * 'value' => 1000
35+ * ],
36+ * ],
37+ * 'actions' => [
38+ * [
39+ * 'attribute' => 'sku',
40+ * 'operator' => '()',
41+ * 'value' => 'simple1,simple3'
42+ * ]
43+ * ]
44+ * ],
45+ * 'rule'
46+ * )
47+ * ]
48+ * ```
49+ *
50+ * Example 2: Using associative conditions: (category_ids in (1, 2) AND attribute_set_id=default) OR (sku=simple3)
51+ *
52+ * ```php
53+ * #[
54+ * DataFixture(
55+ * RuleFixture::class,
56+ * [
57+ * 'discount_amount' => 25,
58+ * 'actions' => [
59+ * 'aggregator' => 'any',
60+ * 'conditions' => [
61+ * [
62+ * [
63+ * 'attribute' => 'category_ids',
64+ * 'operator' => '()',
65+ * 'value' => '1,2',
66+ * ],
67+ * [
68+ * 'attribute' => 'attribute_set_id',
69+ * 'value' => 'default',
70+ * ],
71+ * ],
72+ * [
73+ * 'attribute' => 'sku',
74+ * 'value' => 'simple3'
75+ * ]
76+ * ],
77+ * ],
78+ * ],
79+ * 'rule'
80+ * )
81+ * ]
82+ * ```
83+ */
1984class Rule implements RevertibleDataFixtureInterface
2085{
2186 private const DEFAULT_DATA = [
@@ -145,32 +210,17 @@ public function revert(DataObject $data): void
145210 private function prepareData (array $ data ): array
146211 {
147212 $ data = array_merge ($ this ->prepareDefaultData (), $ data );
148- $ data ['conditions ' ] = $ data ['conditions ' ] ?? [];
149- $ data ['actions ' ] = $ data ['actions ' ] ?? [];
150-
151- if ($ data ['conditions ' ] instanceof DataObject) {
152- $ data ['conditions ' ] = $ data ['conditions ' ]->toArray ();
153- } else {
154- $ conditions = $ data ['conditions ' ];
155- $ data ['conditions ' ] = Conditions::DEFAULT_DATA ;
156- foreach ($ conditions as $ condition ) {
157- $ data ['conditions ' ]['conditions ' ][] = $ condition instanceof DataObject
158- ? $ condition ->toArray ()
159- : $ condition ;
160- }
161- }
162213
163- if ($ data ['actions ' ] instanceof DataObject) {
164- $ data ['actions ' ] = $ data ['actions ' ]->toArray ();
165- } else {
166- $ conditions = $ data ['actions ' ];
167- $ data ['actions ' ] = ProductConditions::DEFAULT_DATA ;
168- foreach ($ conditions as $ condition ) {
169- $ data ['actions ' ]['conditions ' ][] = $ condition instanceof DataObject
170- ? $ condition ->toArray ()
171- : $ condition ;
172- }
173- }
214+ $ data ['conditions ' ] = $ this ->prepareConditionsData (
215+ $ data ['conditions ' ] instanceof DataObject ? $ data ['conditions ' ]->toArray () : $ data ['conditions ' ],
216+ Conditions::DEFAULT_DATA ,
217+ AddressCondition::DEFAULT_DATA
218+ );
219+ $ data ['actions ' ] = $ this ->prepareConditionsData (
220+ $ data ['actions ' ] instanceof DataObject ? $ data ['actions ' ]->toArray () : $ data ['actions ' ],
221+ ProductConditions::DEFAULT_DATA ,
222+ ProductCondition::DEFAULT_DATA
223+ );
174224
175225 if (!empty ($ data ['coupon_code ' ])) {
176226 $ data ['coupon_type ' ] = \Magento \SalesRule \Model \Rule::COUPON_TYPE_SPECIFIC ;
@@ -179,6 +229,44 @@ private function prepareData(array $data): array
179229 return $ this ->dataProcessor ->process ($ this , $ data );
180230 }
181231
232+ /**
233+ * Prepare conditions data
234+ *
235+ * @param array $conditions
236+ * @param array $defaultConditionsData
237+ * @param array $defaultConditionData
238+ * @return array
239+ */
240+ private function prepareConditionsData (
241+ array $ conditions ,
242+ array $ defaultConditionsData ,
243+ array $ defaultConditionData
244+ ): array {
245+ $ conditionsArray = array_is_list ($ conditions )
246+ ? ['conditions ' => $ conditions ]
247+ : $ conditions ;
248+ $ conditionsArray += $ defaultConditionsData ;
249+ $ subConditions = $ conditionsArray ['conditions ' ];
250+ $ conditionsArray ['conditions ' ] = [];
251+ foreach ($ subConditions as $ condition ) {
252+ $ conditionArray = $ condition instanceof DataObject
253+ ? $ condition ->toArray ()
254+ : $ condition ;
255+ // Condition is a combine
256+ if (array_is_list ($ conditionArray ) || isset ($ conditionArray ['conditions ' ])) {
257+ $ conditionArray = $ this ->prepareConditionsData (
258+ $ conditionArray ,
259+ $ defaultConditionsData ,
260+ $ defaultConditionData
261+ );
262+ } else {
263+ $ conditionArray += $ defaultConditionData ;
264+ }
265+ $ conditionsArray ['conditions ' ][] = $ conditionArray ;
266+ }
267+ return $ conditionsArray ;
268+ }
269+
182270 /**
183271 * Prepares rule default data
184272 *
0 commit comments