Passed
Push — master ( 64e7d7...5c5569 )
by Aimeos
04:35
created

Base::saveServices()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 21
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 9
c 1
b 0
f 0
dl 0
loc 21
rs 9.9666
cc 4
nc 4
nop 1
1
<?php
2
3
/**
4
 * @license LGPLv3, https://opensource.org/licenses/LGPL-3.0
5
 * @copyright Aimeos (aimeos.org), 2015-2024
6
 * @package MShop
7
 * @subpackage Order
8
 */
9
10
11
namespace Aimeos\MShop\Order\Manager;
12
13
14
/**
15
 * Basic methods and constants for order items (shopping basket).
16
 *
17
 * @package MShop
18
 * @subpackage Order
19
 */
20
abstract class Base extends \Aimeos\MShop\Common\Manager\Base
21
{
22
	/**
23
	 * Returns the address item map for the given order IDs
24
	 *
25
	 * @param string[] $ids List of order IDs
26
	 * @param array $ref List of referenced domains that should be fetched too
27
	 * @return \Aimeos\Map Multi-dimensional associative list of order IDs as keys and order address ID/item pairs as values
28
	 */
29
	protected function getAddresses( array $ids, array $ref ) : \Aimeos\Map
30
	{
31
		$manager = $this->object()->getSubManager( 'address' );
32
33
		$filter = $manager->filter()
34
			->add( 'order.address.parentid', '==', $ids )
35
			->order( ['order.address.type', 'order.address.position', 'order.address.id'] )
36
			->slice( 0, 0x7fffffff );
37
38
		return $manager->search( $filter, $ref )->groupBy( 'order.address.parentid' );
39
	}
40
41
42
	/**
43
	 * Returns the coupon map for the given order IDs
44
	 *
45
	 * @param string[] $ids List of order IDs
46
	 * @param array $ref List of referenced domains that should be fetched too
47
	 * @return \Aimeos\Map Multi-dimensional associative list of order IDs as keys and order coupon ID/item pairs as values
48
	 */
49
	protected function getCoupons( array $ids, array $ref ) : \Aimeos\Map
50
	{
51
		$manager = $this->object()->getSubManager( 'coupon' );
52
53
		$filter = $manager->filter()
54
			->add( 'order.coupon.parentid', '==', $ids )
55
			->order( 'order.coupon.code' )
56
			->slice( 0, 0x7fffffff );
57
58
		return $manager->search( $filter, $ref )->groupBy( 'order.coupon.parentid' );
59
	}
60
61
62
	/**
63
	 * Retrieves the ordered products from the storage.
64
	 *
65
	 * @param string[] $ids List of order IDs
66
	 * @param array $ref List of referenced domains that should be fetched too
67
	 * @return \Aimeos\Map Multi-dimensional associative list of order IDs as keys and order product ID/item pairs as values
68
	 */
69
	protected function getProducts( array $ids, array $ref ) : \Aimeos\Map
70
	{
71
		$manager = $this->object()->getSubManager( 'product' );
72
73
		$filter = $manager->filter()
74
			->add( 'order.product.parentid', '==', $ids )
75
			->order( 'order.product.position' )
76
			->slice( 0, 0x7fffffff );
77
		$items = $manager->search( $filter, $ref );
78
		$map = $items->groupBy( 'order.product.orderproductid' );
79
80
		foreach( $map as $id => $list ) {
81
			$items[$id]?->setProducts( $list );
82
		}
83
84
		return map( $map->get( '' ) )->groupBy( 'order.product.parentid' );
85
	}
86
87
88
	/**
89
	 * Retrieves the order services from the storage.
90
	 *
91
	 * @param string[] $ids List of order IDs
92
	 * @param array $ref List of referenced domains that should be fetched too
93
	 * @return \Aimeos\Map Multi-dimensional associative list of order IDs as keys and service ID/item pairs as values
94
	 */
95
	protected function getServices( array $ids, array $ref ) : \Aimeos\Map
96
	{
97
		$manager = $this->object()->getSubManager( 'service' );
98
99
		$filter = $manager->filter()
100
			->add( 'order.service.parentid', '==', $ids )
101
			->order( ['order.service.type', 'order.service.position', 'order.service.id'] )
102
			->slice( 0, 0x7fffffff );
103
104
		return $manager->search( $filter, $ref )->groupBy( 'order.service.parentid' );
105
	}
106
107
108
	/**
109
	 * Retrieves the order statuses from the storage.
110
	 *
111
	 * @param string[] $ids List of order IDs
112
	 * @param array $ref List of referenced domains that should be fetched too
113
	 * @return \Aimeos\Map Multi-dimensional associative list of order IDs as keys and order status ID/item pairs as values
114
	 */
115
	protected function getStatuses( array $ids, array $ref ) : \Aimeos\Map
116
	{
117
		$manager = $this->object()->getSubManager( 'status' );
118
119
		$filter = $manager->filter()
120
			->add( 'order.status.parentid', '==', $ids )
121
			->slice( 0, 0x7fffffff );
122
123
		return $manager->search( $filter, $ref )->groupBy( 'order.status.parentid' );
124
	}
125
126
127
	/**
128
	 * Saves the addresses of the order to the storage.
129
	 *
130
	 * @param \Aimeos\MShop\Order\Item\Iface $item Order containing address items
131
	 * @return \Aimeos\MShop\Order\Manager\Iface Manager object for chaining method calls
132
	 */
133
	protected function saveAddresses( \Aimeos\MShop\Order\Item\Iface $item ) : \Aimeos\MShop\Order\Manager\Iface
134
	{
135
		$addresses = $item->getAddresses();
136
137
		foreach( $addresses as $type => $list )
138
		{
139
			$pos = 0;
140
141
			foreach( $list as $address )
142
			{
143
				if( $address->getParentId() != $item->getId() ) {
144
					$address->setId( null ); // create new item if copied
145
				}
146
147
				$address->setParentId( $item->getId() )->setPosition( ++$pos );
148
			}
149
		}
150
151
		$this->object()->getSubManager( 'address' )->save( $addresses->flat( 1 ) );
152
153
		return $this;
154
	}
155
156
157
	/**
158
	 * Saves the coupons of the order to the storage.
159
	 *
160
	 * @param \Aimeos\MShop\Order\Item\Iface $basket Order containing coupon items
161
	 * @return \Aimeos\MShop\Order\Manager\Iface Manager object for chaining method calls
162
	 */
163
	protected function saveCoupons( \Aimeos\MShop\Order\Item\Iface $basket ) : \Aimeos\MShop\Order\Manager\Iface
164
	{
165
		$manager = $this->object()->getSubManager( 'coupon' );
166
		$filter = $manager->filter()->add( 'order.coupon.parentid', '==', $basket->getId() )->slice( 0, 0x7fffffff );
167
		$items = $manager->search( $filter )->groupBy( 'order.coupon.code' );
168
169
		foreach( $basket->getCoupons() as $code => $products )
170
		{
171
			if( empty( $products ) )
172
			{
173
				$item = !empty( $items[$code] ) ? current( $items[$code] ) : $manager->create()->setParentId( $basket->getId() );
0 ignored issues
show
Bug introduced by
It seems like $items[$code] can also be of type null; however, parameter $array of current() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

173
				$item = !empty( $items[$code] ) ? current( /** @scrutinizer ignore-type */ $items[$code] ) : $manager->create()->setParentId( $basket->getId() );
Loading history...
174
				$manager->save( $item->setCode( $code ) );
175
				continue;
176
			}
177
178
			foreach( $products as $product )
179
			{
180
				foreach( $items[$code] ?? [] as $prodItem )
181
				{
182
					if( $product->getId() === $prodItem->getId() ) {
183
						continue 2;
184
					}
185
				}
186
187
				$manager->save( $manager->create()->setParentId( $basket->getId() )->setCode( $code )->setProductId( $product->getId() ) );
188
			}
189
		}
190
191
		return $this;
192
	}
193
194
195
	/**
196
	 * Saves the ordered products to the storage.
197
	 *
198
	 * @param \Aimeos\MShop\Order\Item\Iface $basket Order containing ordered products or bundles
199
	 * @return \Aimeos\MShop\Order\Manager\Iface Manager object for chaining method calls
200
	 */
201
	protected function saveProducts( \Aimeos\MShop\Order\Item\Iface $basket ) : \Aimeos\MShop\Order\Manager\Iface
202
	{
203
		$pos = 0;
204
		$products = $basket->getProducts();
205
206
		foreach( $products as $product )
207
		{
208
			if( $product->getParentId() != $basket->getId() ) {
209
				$product->setId( null ); // create new item if copied
210
			}
211
212
			$product->setParentId( $basket->getId() )->setPosition( ++$pos );
213
214
			foreach( $product->getProducts() as $subProduct )
215
			{
216
				if( $subProduct->getParentId() != $basket->getId() ) {
217
					$subProduct->setId( null ); // create new item if copied
218
				}
219
220
				$subProduct->setParentId( $basket->getId() )->setPosition( ++$pos );
221
			}
222
		}
223
224
		$this->object()->getSubManager( 'product' )->save( $products );
225
226
		return $this;
227
	}
228
229
230
	/**
231
	 * Saves the services of the order to the storage.
232
	 *
233
	 * @param \Aimeos\MShop\Order\Item\Iface $item Order containing service items
234
	 * @return \Aimeos\MShop\Order\Manager\Iface Manager object for chaining method calls
235
	 */
236
	protected function saveServices( \Aimeos\MShop\Order\Item\Iface $item ) : \Aimeos\MShop\Order\Manager\Iface
237
	{
238
		$services = $item->getServices();
239
240
		foreach( $services as $type => $list )
241
		{
242
			$pos = 0;
243
244
			foreach( $list as $service )
245
			{
246
				if( $service->getParentId() != $item->getId() ) {
247
					$service->setId( null ); // create new item if copied
248
				}
249
250
				$service->setParentId( $item->getId() )->setPosition( ++$pos );
251
			}
252
		}
253
254
		$this->object()->getSubManager( 'service' )->save( $services->flat( 1 ) );
255
256
		return $this;
257
	}
258
259
260
	/**
261
	 * Saves the statuses of the order to the storage.
262
	 *
263
	 * @param \Aimeos\MShop\Order\Item\Iface $item Order containing status items
264
	 * @return \Aimeos\MShop\Order\Manager\Iface Manager object for chaining method calls
265
	 */
266
	protected function saveStatuses( \Aimeos\MShop\Order\Item\Iface $item ) : \Aimeos\MShop\Order\Manager\Iface
267
	{
268
		$list = $item->getStatusItems();
269
270
		foreach( $list as $status )
271
		{
272
			if( $status->getParentId() != $item->getId() ) {
273
				$status->setId( null ); // create new item if copied
274
			}
275
276
			$status->setParentId( $item->getId() );
277
		}
278
279
		$this->object()->getSubManager( 'status' )->save( $list );
280
281
		return $this;
282
	}
283
}
284