Passed
Push — master ( 62fc03...bcc204 )
by Aimeos
04:26
created

Base::getServices()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 6
c 1
b 0
f 0
dl 0
loc 10
rs 10
cc 1
nc 1
nop 2
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 type/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 product items 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 IDs/items 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 type/items 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
	 * Saves the addresses of the order to the storage.
110
	 *
111
	 * @param \Aimeos\MShop\Order\Item\Iface $item Basket containing address items
112
	 * @return \Aimeos\MShop\Order\Manager\Iface Manager object for chaining method calls
113
	 */
114
	protected function saveAddresses( \Aimeos\MShop\Order\Item\Iface $item ) : \Aimeos\MShop\Order\Manager\Iface
115
	{
116
		$addresses = $item->getAddresses();
117
118
		foreach( $addresses as $type => $list )
119
		{
120
			$pos = 0;
121
122
			foreach( $list as $address )
123
			{
124
				if( $address->getParentId() != $item->getId() ) {
125
					$address->setId( null ); // create new item if copied
126
				}
127
128
				$address->setParentId( $item->getId() )->setPosition( ++$pos );
129
			}
130
		}
131
132
		$this->object()->getSubManager( 'address' )->save( $addresses->flat( 1 ) );
133
134
		return $this;
135
	}
136
137
138
	/**
139
	 * Saves the coupons of the order to the storage.
140
	 *
141
	 * @param \Aimeos\MShop\Order\Item\Iface $basket Basket containing coupon items
142
	 * @return \Aimeos\MShop\Order\Manager\Iface Manager object for chaining method calls
143
	 */
144
	protected function saveCoupons( \Aimeos\MShop\Order\Item\Iface $basket ) : \Aimeos\MShop\Order\Manager\Iface
145
	{
146
		$manager = $this->object()->getSubManager( 'coupon' );
147
		$filter = $manager->filter()->add( 'order.coupon.parentid', '==', $basket->getId() )->slice( 0, 0x7fffffff );
148
		$items = $manager->search( $filter )->groupBy( 'order.coupon.code' );
149
150
		foreach( $basket->getCoupons() as $code => $products )
151
		{
152
			if( empty( $products ) )
153
			{
154
				$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

154
				$item = !empty( $items[$code] ) ? current( /** @scrutinizer ignore-type */ $items[$code] ) : $manager->create()->setParentId( $basket->getId() );
Loading history...
155
				$manager->save( $item->setCode( $code ) );
156
				continue;
157
			}
158
159
			foreach( $products as $product )
160
			{
161
				foreach( $items[$code] ?? [] as $prodItem )
162
				{
163
					if( $product->getId() === $prodItem->getId() ) {
164
						continue 2;
165
					}
166
				}
167
168
				$manager->save( $manager->create()->setParentId( $basket->getId() )->setCode( $code )->setProductId( $product->getId() ) );
169
			}
170
		}
171
172
		return $this;
173
	}
174
175
176
	/**
177
	 * Saves the ordered products to the storage.
178
	 *
179
	 * @param \Aimeos\MShop\Order\Item\Iface $basket Basket containing ordered products or bundles
180
	 * @return \Aimeos\MShop\Order\Manager\Iface Manager object for chaining method calls
181
	 */
182
	protected function saveProducts( \Aimeos\MShop\Order\Item\Iface $basket ) : \Aimeos\MShop\Order\Manager\Iface
183
	{
184
		$pos = 0;
185
		$products = $basket->getProducts();
186
187
		foreach( $products as $product )
188
		{
189
			if( $product->getParentId() != $basket->getId() ) {
190
				$product->setId( null ); // create new item if copied
191
			}
192
193
			$product->setParentId( $basket->getId() )->setPosition( ++$pos );
194
195
			foreach( $product->getProducts() as $subProduct )
196
			{
197
				if( $subProduct->getParentId() != $basket->getId() ) {
198
					$subProduct->setId( null ); // create new item if copied
199
				}
200
201
				$subProduct->setParentId( $basket->getId() )->setPosition( ++$pos );
202
			}
203
		}
204
205
		$this->object()->getSubManager( 'product' )->save( $products );
206
207
		return $this;
208
	}
209
210
211
	/**
212
	 * Saves the services of the order to the storage.
213
	 *
214
	 * @param \Aimeos\MShop\Order\Item\Iface $item Basket containing service items
215
	 * @return \Aimeos\MShop\Order\Manager\Iface Manager object for chaining method calls
216
	 */
217
	protected function saveServices( \Aimeos\MShop\Order\Item\Iface $item ) : \Aimeos\MShop\Order\Manager\Iface
218
	{
219
		$services = $item->getServices();
220
221
		foreach( $services as $type => $list )
222
		{
223
			$pos = 0;
224
225
			foreach( $list as $service )
226
			{
227
				if( $service->getParentId() != $item->getId() ) {
228
					$service->setId( null ); // create new item if copied
229
				}
230
231
				$service->setParentId( $item->getId() )->setPosition( ++$pos );
232
			}
233
		}
234
235
		$this->object()->getSubManager( 'service' )->save( $services->flat( 1 ) );
236
237
		return $this;
238
	}
239
}
240