-
Notifications
You must be signed in to change notification settings - Fork 257
Expand file tree
/
Copy pathGetDistanceToSources.php
More file actions
136 lines (120 loc) · 3.93 KB
/
GetDistanceToSources.php
File metadata and controls
136 lines (120 loc) · 3.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\InventoryInStorePickup\Model\SearchRequest\Area;
use Magento\Framework\Exception\LocalizedException;
use Magento\InventoryDistanceBasedSourceSelectionApi\Api\GetLatsLngsFromAddressInterface;
use Magento\InventoryInStorePickup\Model\ResourceModel\Source\GetOrderedDistanceToSources;
use Magento\InventoryInStorePickupApi\Api\Data\SearchRequest\AreaInterface;
use Magento\InventoryInStorePickupApi\Model\SearchRequest\Area\Pipeline;
use Magento\InventorySourceSelectionApi\Api\Data\AddressInterface;
use Magento\InventorySourceSelectionApi\Api\Data\AddressInterfaceFactory;
/**
* Provide associated list of Source codes and distance to them in KM.
*/
class GetDistanceToSources
{
/**
* Cached list of already calculated distances to Sources.
*
* @var float
*/
private $calculatedRequests = [];
/**
* @var GetLatsLngsFromAddressInterface
*/
private $getLatsLngsFromAddress;
/**
* @var GetOrderedDistanceToSources
*/
private $getOrderedDistanceToSources;
/**
* @var AddressInterfaceFactory
*/
private $addressInterfaceFactory;
/**
* @var Pipeline
*/
private $searchTermPipeline;
/**
* @param GetLatsLngsFromAddressInterface $getLatsLngsFromAddress
* @param GetOrderedDistanceToSources $getOrderedDistanceToSources
* @param AddressInterfaceFactory $addressInterfaceFactory
* @param Pipeline $searchTermPipeline
*/
public function __construct(
GetLatsLngsFromAddressInterface $getLatsLngsFromAddress,
GetOrderedDistanceToSources $getOrderedDistanceToSources,
AddressInterfaceFactory $addressInterfaceFactory,
Pipeline $searchTermPipeline
) {
$this->getLatsLngsFromAddress = $getLatsLngsFromAddress;
$this->getOrderedDistanceToSources = $getOrderedDistanceToSources;
$this->addressInterfaceFactory = $addressInterfaceFactory;
$this->searchTermPipeline = $searchTermPipeline;
}
/**
* Get sourted by distance associated pair of Source Code and Distance to it.
*
* @param AreaInterface $area
*
* @return float[]
*/
public function execute(AreaInterface $area): array
{
$key = $this->getKey($area);
if (!isset($this->calculatedRequests[$key])) {
$this->calculatedRequests[$key] = $this->getDistanceToSources($area);
}
return $this->calculatedRequests[$key];
}
/**
* Get key, based on filter state.
*
* @param AreaInterface $area
*
* @return string
*/
private function getKey(AreaInterface $area): string
{
return $area->getRadius() . $area->getSearchTerm();
}
/**
* Get Distance to Sources.
*
* @param AreaInterface $area
*
* @return float[]
*/
private function getDistanceToSources(AreaInterface $area): array
{
$sourceSelectionAddress = $this->toSourceSelectionAddress($area);
try {
$latsLngs = $this->getLatsLngsFromAddress->execute($sourceSelectionAddress);
} catch (LocalizedException $exception) {
return [];
}
return $this->getOrderedDistanceToSources->execute($latsLngs, $area->getRadius());
}
/**
* Create Source Selection Address based on Distance Filter from Search Request.
*
* @param AreaInterface $area
*
* @return AddressInterface
*/
private function toSourceSelectionAddress(AreaInterface $area): AddressInterface
{
$data = [
'postcode' => '',
'region' => '',
'city' => '',
'street' => ''
];
$searchTermData = $this->searchTermPipeline->execute($area->getSearchTerm());
return $this->addressInterfaceFactory->create(array_merge($data, $searchTermData->getData()));
}
}