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
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\InstantPurchase\Model;
use Magento\Customer\Model\Customer;
use Magento\InstantPurchase\Model\PaymentMethodChoose\PaymentTokenChooserInterface;
use Magento\InstantPurchase\Model\ShippingAddressChoose\ShippingAddressChooserInterface;
use Magento\InstantPurchase\Model\BillingAddressChoose\BillingAddressChooserInterface;
use Magento\InstantPurchase\Model\ShippingMethodChoose\ShippingMethodChooserInterface;
use Magento\Store\Model\Store;
/**
* Choose instant purchase option programmatically based on configured implementation.
*
* Provide implementations of injected chooser interfaces to customize behavior.
*/
class InstantPurchaseChooser implements InstantPurchaseInterface
{
/**
* @var InstantPurchaseOptionFactory
*/
private $instantPurchaseOptionFactory;
/**
* @var Config
*/
private $config;
/**
* @var PaymentTokenChooserInterface
*/
private $paymentTokenChooser;
/**
* @var ShippingAddressChooserInterface
*/
private $shippingAddressChooser;
/**
* @var BillingAddressChooserInterface
*/
private $billingAddressChooser;
/**
* @var ShippingMethodChooserInterface
*/
private $shippingMethodChooser;
/**
* InstantPurchase constructor.
* @param InstantPurchaseOptionFactory $instantPurchaseOptionFactory
* @param Config $config
* @param PaymentTokenChooserInterface $paymentTokenChooser
* @param ShippingAddressChooserInterface $shippingAddressChooser
* @param BillingAddressChooserInterface $billingAddressChooser
* @param ShippingMethodChooserInterface $shippingMethodChooser
*/
public function __construct(
InstantPurchaseOptionFactory $instantPurchaseOptionFactory,
Config $config,
PaymentTokenChooserInterface $paymentTokenChooser,
ShippingAddressChooserInterface $shippingAddressChooser,
BillingAddressChooserInterface $billingAddressChooser,
ShippingMethodChooserInterface $shippingMethodChooser
) {
$this->instantPurchaseOptionFactory = $instantPurchaseOptionFactory;
$this->config = $config;
$this->paymentTokenChooser = $paymentTokenChooser;
$this->shippingAddressChooser = $shippingAddressChooser;
$this->billingAddressChooser = $billingAddressChooser;
$this->shippingMethodChooser = $shippingMethodChooser;
}
/**
* @inheritdoc
*/
public function getOption(
Store $store,
Customer $customer
): InstantPurchaseOption {
if (!$this->isInstantPurchaseButtonEnabled($store)) {
return $this->instantPurchaseOptionFactory->createDisabledOption();
}
$paymentToken = $this->paymentTokenChooser->choose($store, $customer);
$shippingAddress = $this->shippingAddressChooser->choose($customer);
$billingAddress = $this->billingAddressChooser->choose($customer);
if ($shippingAddress) {
$shippingMethod = $this->shippingMethodChooser->choose($shippingAddress);
} else {
$shippingMethod = null;
}
$option = $this->instantPurchaseOptionFactory->create(
$paymentToken,
$shippingAddress,
$billingAddress,
$shippingMethod
);
return $option;
}
/**
* Checks if button available.
*
* @param Store $store
* @return bool
*/
private function isInstantPurchaseButtonEnabled(Store $store): bool
{
return $this->config->isModuleEnabled($store->getId());
}
}