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
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Quote\Model\QuoteRepository;
use Magento\Quote\Api\Data\CartInterface;
use Magento\Customer\Api\AddressRepositoryInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Exception\InputException;
class SaveHandler
{
/**
* @var \Magento\Quote\Model\Quote\Item\CartItemPersister
*/
private $cartItemPersister;
/**
* @var \Magento\Quote\Model\Quote\Address\BillingAddressPersister
*/
private $billingAddressPersister;
/**
* @var \Magento\Quote\Model\ResourceModel\Quote
*/
private $quoteResourceModel;
/**
* @var \Magento\Quote\Model\Quote\ShippingAssignment\ShippingAssignmentPersister
*/
private $shippingAssignmentPersister;
/**
* @var AddressRepositoryInterface
*/
private $addressRepository;
/**
* @param \Magento\Quote\Model\ResourceModel\Quote $quoteResource
* @param \Magento\Quote\Model\Quote\Item\CartItemPersister $cartItemPersister
* @param \Magento\Quote\Model\Quote\Address\BillingAddressPersister $billingAddressPersister
* @param \Magento\Quote\Model\Quote\ShippingAssignment\ShippingAssignmentPersister $shippingAssignmentPersister
* @param AddressRepositoryInterface $addressRepository
*/
public function __construct(
\Magento\Quote\Model\ResourceModel\Quote $quoteResource,
\Magento\Quote\Model\Quote\Item\CartItemPersister $cartItemPersister,
\Magento\Quote\Model\Quote\Address\BillingAddressPersister $billingAddressPersister,
\Magento\Quote\Model\Quote\ShippingAssignment\ShippingAssignmentPersister $shippingAssignmentPersister,
AddressRepositoryInterface $addressRepository = null
) {
$this->quoteResourceModel = $quoteResource;
$this->cartItemPersister = $cartItemPersister;
$this->billingAddressPersister = $billingAddressPersister;
$this->shippingAssignmentPersister = $shippingAssignmentPersister;
$this->addressRepository = $addressRepository
?: ObjectManager::getInstance()->get(AddressRepositoryInterface::class);
}
/**
* Process and save quote data
*
* @param CartInterface $quote
* @return CartInterface
* @throws InputException
* @throws \Magento\Framework\Exception\CouldNotSaveException
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function save(CartInterface $quote)
{
/** @var \Magento\Quote\Model\Quote $quote */
// Quote Item processing
$items = $quote->getItems();
if ($items) {
foreach ($items as $item) {
/** @var \Magento\Quote\Model\Quote\Item $item */
if (!$item->isDeleted()) {
$quote->setLastAddedItem($this->cartItemPersister->save($quote, $item));
}
}
}
// Billing Address processing
$billingAddress = $quote->getBillingAddress();
if ($billingAddress) {
if ($billingAddress->getCustomerAddressId()) {
try {
$this->addressRepository->getById($billingAddress->getCustomerAddressId());
} catch (NoSuchEntityException $e) {
$billingAddress->setCustomerAddressId(null);
}
}
$this->billingAddressPersister->save($quote, $billingAddress);
}
$this->processShippingAssignment($quote);
$this->quoteResourceModel->save($quote->collectTotals());
return $quote;
}
/**
* Process shipping assignment
*
* @param \Magento\Quote\Model\Quote $quote
* @return void
* @throws InputException
*/
private function processShippingAssignment($quote)
{
// Shipping Assignments processing
$extensionAttributes = $quote->getExtensionAttributes();
if (!$quote->isVirtual() && $extensionAttributes && $extensionAttributes->getShippingAssignments()) {
$shippingAssignments = $extensionAttributes->getShippingAssignments();
if (count($shippingAssignments) > 1) {
throw new InputException(__('Only 1 shipping assignment can be set'));
}
$this->shippingAssignmentPersister->save($quote, $shippingAssignments[0]);
}
}
}