1
1
<?php
2
2
/**
3
- * Copyright © Magento, Inc. All rights reserved.
4
- * See COPYING.txt for license details .
3
+ * Copyright 2022 Adobe
4
+ * All Rights Reserved .
5
5
*/
6
6
declare (strict_types=1 );
7
7
16
16
use Magento \TestFramework \Fixture \Data \ProcessorInterface ;
17
17
use Magento \TestFramework \Fixture \RevertibleDataFixtureInterface ;
18
18
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
+ */
19
84
class Rule implements RevertibleDataFixtureInterface
20
85
{
21
86
private const DEFAULT_DATA = [
@@ -145,32 +210,17 @@ public function revert(DataObject $data): void
145
210
private function prepareData (array $ data ): array
146
211
{
147
212
$ 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
- }
162
213
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
+ );
174
224
175
225
if (!empty ($ data ['coupon_code ' ])) {
176
226
$ data ['coupon_type ' ] = \Magento \SalesRule \Model \Rule::COUPON_TYPE_SPECIFIC ;
@@ -179,6 +229,44 @@ private function prepareData(array $data): array
179
229
return $ this ->dataProcessor ->process ($ this , $ data );
180
230
}
181
231
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
+
182
270
/**
183
271
* Prepares rule default data
184
272
*
0 commit comments