PluginProbe ʕ •ᴥ•ʔ
WooCommerce PayPal Payments / 3.3.2
WooCommerce PayPal Payments v3.3.2
4.0.4 4.0.3 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.1.0 1.2.0 1.2.1 1.3.0 1.3.1 1.3.2 1.4.0 1.5.0 1.5.1 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.7.0 1.7.1 1.8.0 1.8.1 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.1.0 2.2.0 2.2.1 2.2.2 2.3.0 2.3.1 2.4.0 2.4.1 2.4.2 2.4.3 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.6.0 2.6.1 2.7.0 2.7.1 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.3.0 3.3.1 3.3.2 3.4.0 3.4.1 4.0.0 4.0.1 4.0.2
woocommerce-paypal-payments / modules / ppcp-settings / services.php
woocommerce-paypal-payments / modules / ppcp-settings Last commit date
assets 7 months ago docs 1 year ago fonts 1 year ago images 7 months ago resources 11 months ago src 4 months ago module.php 1 year ago services.php 5 months ago
services.php
480 lines
1 <?php
2
3 /**
4 * The Settings module services.
5 *
6 * @package WooCommerce\PayPalCommerce\Settings
7 */
8 declare (strict_types=1);
9 namespace WooCommerce\PayPalCommerce\Settings;
10
11 use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
12 use WooCommerce\PayPalCommerce\Applepay\ApplePayGateway;
13 use WooCommerce\PayPalCommerce\Axo\Gateway\AxoGateway;
14 use WooCommerce\PayPalCommerce\Button\Helper\MessagesApply;
15 use WooCommerce\PayPalCommerce\Googlepay\GooglePayGateway;
16 use WooCommerce\PayPalCommerce\LocalAlternativePaymentMethods\BancontactGateway;
17 use WooCommerce\PayPalCommerce\LocalAlternativePaymentMethods\BlikGateway;
18 use WooCommerce\PayPalCommerce\LocalAlternativePaymentMethods\EPSGateway;
19 use WooCommerce\PayPalCommerce\LocalAlternativePaymentMethods\IDealGateway;
20 use WooCommerce\PayPalCommerce\LocalAlternativePaymentMethods\MultibancoGateway;
21 use WooCommerce\PayPalCommerce\LocalAlternativePaymentMethods\MyBankGateway;
22 use WooCommerce\PayPalCommerce\LocalAlternativePaymentMethods\P24Gateway;
23 use WooCommerce\PayPalCommerce\LocalAlternativePaymentMethods\PWCGateway;
24 use WooCommerce\PayPalCommerce\LocalAlternativePaymentMethods\TrustlyGateway;
25 use WooCommerce\PayPalCommerce\Settings\Ajax\SwitchSettingsUiEndpoint;
26 use WooCommerce\PayPalCommerce\Settings\Data\Definition\FeaturesDefinition;
27 use WooCommerce\PayPalCommerce\Settings\Data\Definition\PaymentMethodsDependenciesDefinition;
28 use WooCommerce\PayPalCommerce\Settings\Data\GeneralSettings;
29 use WooCommerce\PayPalCommerce\Settings\Data\OnboardingProfile;
30 use WooCommerce\PayPalCommerce\Settings\Data\PaymentSettings;
31 use WooCommerce\PayPalCommerce\Settings\Data\SettingsModel;
32 use WooCommerce\PayPalCommerce\Settings\Data\StylingSettings;
33 use WooCommerce\PayPalCommerce\Settings\Data\TodosModel;
34 use WooCommerce\PayPalCommerce\Settings\Data\Definition\TodosDefinition;
35 use WooCommerce\PayPalCommerce\Settings\Endpoint\AuthenticationRestEndpoint;
36 use WooCommerce\PayPalCommerce\Settings\Endpoint\CommonRestEndpoint;
37 use WooCommerce\PayPalCommerce\Settings\Endpoint\FeaturesRestEndpoint;
38 use WooCommerce\PayPalCommerce\Settings\Endpoint\LoginLinkRestEndpoint;
39 use WooCommerce\PayPalCommerce\Settings\Endpoint\OnboardingRestEndpoint;
40 use WooCommerce\PayPalCommerce\Settings\Endpoint\PayLaterMessagingEndpoint;
41 use WooCommerce\PayPalCommerce\Settings\Endpoint\PaymentRestEndpoint;
42 use WooCommerce\PayPalCommerce\Settings\Endpoint\RefreshFeatureStatusEndpoint;
43 use WooCommerce\PayPalCommerce\Settings\Endpoint\WebhookSettingsEndpoint;
44 use WooCommerce\PayPalCommerce\Settings\Endpoint\SettingsRestEndpoint;
45 use WooCommerce\PayPalCommerce\Settings\Endpoint\StylingRestEndpoint;
46 use WooCommerce\PayPalCommerce\Settings\Endpoint\TodosRestEndpoint;
47 use WooCommerce\PayPalCommerce\Settings\Handler\ConnectionListener;
48 use WooCommerce\PayPalCommerce\Settings\Service\AuthenticationManager;
49 use WooCommerce\PayPalCommerce\Settings\Service\BrandedExperience\ActivationDetector;
50 use WooCommerce\PayPalCommerce\Settings\Service\BrandedExperience\PathRepository;
51 use WooCommerce\PayPalCommerce\Settings\Service\ConnectionUrlGenerator;
52 use WooCommerce\PayPalCommerce\Settings\Service\FeaturesEligibilityService;
53 use WooCommerce\PayPalCommerce\Settings\Service\GatewayRedirectService;
54 use WooCommerce\PayPalCommerce\Settings\Service\LoadingScreenService;
55 use WooCommerce\PayPalCommerce\Settings\Service\Migration\SettingsMigration;
56 use WooCommerce\PayPalCommerce\Settings\Service\Migration\MigrationManager;
57 use WooCommerce\PayPalCommerce\Settings\Service\Migration\PaymentSettingsMigration;
58 use WooCommerce\PayPalCommerce\Settings\Service\Migration\SettingsTabMigration;
59 use WooCommerce\PayPalCommerce\Settings\Service\Migration\StylingSettingsMigration;
60 use WooCommerce\PayPalCommerce\Settings\Service\OnboardingUrlManager;
61 use WooCommerce\PayPalCommerce\Settings\Service\ScriptDataHandler;
62 use WooCommerce\PayPalCommerce\Settings\Service\TodosEligibilityService;
63 use WooCommerce\PayPalCommerce\Settings\Service\TodosSortingAndFilteringService;
64 use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface;
65 use WooCommerce\PayPalCommerce\Settings\Service\DataSanitizer;
66 use WooCommerce\PayPalCommerce\Settings\Service\SettingsDataManager;
67 use WooCommerce\PayPalCommerce\Settings\Data\Definition\PaymentMethodsDefinition;
68 use WooCommerce\PayPalCommerce\PayLaterConfigurator\Factory\ConfigFactory;
69 use WooCommerce\PayPalCommerce\WcGateway\Gateway\CardButtonGateway;
70 use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
71 use WooCommerce\PayPalCommerce\WcGateway\Gateway\OXXO\OXXO;
72 use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
73 use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayUponInvoice\PayUponInvoiceGateway;
74 use WooCommerce\PayPalCommerce\WcGateway\Helper\PWCProductStatus;
75 use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
76 use WooCommerce\PayPalCommerce\PayLaterConfigurator\Endpoint\SaveConfig;
77 use WooCommerce\PayPalCommerce\WcGateway\Helper\Environment;
78 use WooCommerce\PayPalCommerce\WcGateway\Helper\ConnectionState;
79 use WooCommerce\PayPalCommerce\Settings\Service\InternalRestService;
80 use WooCommerce\PayPalCommerce\WcGateway\Helper\MerchantDetails;
81 $services = array(
82 'settings.url' => static function (ContainerInterface $container): string {
83 return plugins_url('/modules/ppcp-settings/', $container->get('ppcp.path-to-plugin-main-file'));
84 },
85 'settings.data.onboarding' => static function (ContainerInterface $container): OnboardingProfile {
86 $can_use_casual_selling = $container->get('settings.casual-selling.eligible');
87 $can_use_vaulting = $container->has('save-payment-methods.eligible') && $container->get('save-payment-methods.eligible');
88 $can_use_card_payments = $container->has('card-fields.eligible') && $container->get('card-fields.eligible');
89 $can_use_subscriptions = $container->has('wc-subscriptions.helper') && $container->get('wc-subscriptions.helper')->plugin_is_active();
90 $should_skip_payment_methods = class_exists('\WC_Payments');
91 $can_use_fastlane = $container->get('axo.eligible');
92 $can_use_pay_later = $container->get('button.helper.messages-apply');
93 return new OnboardingProfile($can_use_casual_selling, $can_use_vaulting, $can_use_card_payments, $can_use_subscriptions, $should_skip_payment_methods, $can_use_fastlane, $can_use_pay_later->for_country());
94 },
95 'settings.data.general' => static function (ContainerInterface $container): GeneralSettings {
96 return new GeneralSettings($container->get('api.shop.country'), $container->get('api.shop.currency.getter')->get(), $container->get('wcgateway.is-send-only-country'));
97 },
98 'settings.data.styling' => static function (ContainerInterface $container): StylingSettings {
99 return new StylingSettings($container->get('settings.service.sanitizer'));
100 },
101 'settings.data.payment' => static function (ContainerInterface $container): PaymentSettings {
102 return new PaymentSettings();
103 },
104 'settings.data.settings' => static function (ContainerInterface $container): SettingsModel {
105 $environment = $container->get('settings.environment');
106 assert($environment instanceof Environment);
107 return new SettingsModel($container->get('settings.service.sanitizer'), $environment->is_sandbox() ? $container->get('wcgateway.settings.invoice-prefix-random') : $container->get('wcgateway.settings.invoice-prefix'));
108 },
109 'settings.data.paylater-messaging' => static function (ContainerInterface $container): array {
110 // TODO: Create an AbstractDataModel wrapper for this configuration!
111 $config_factors = $container->get('paylater-configurator.factory.config');
112 assert($config_factors instanceof ConfigFactory);
113 $save_config = $container->get('paylater-configurator.endpoint.save-config');
114 assert($save_config instanceof SaveConfig);
115 $settings = $container->get('wcgateway.settings');
116 assert($settings instanceof Settings);
117 $pay_later_config = $config_factors->from_settings($settings);
118 return array('read' => $pay_later_config, 'save' => $save_config);
119 },
120 /**
121 * Returns details about the connected environment (production/sandbox).
122 *
123 * @deprecated Directly use 'settings.connection-state' instead of this.
124 */
125 'settings.environment' => static function (ContainerInterface $container): Environment {
126 $state = $container->get('settings.connection-state');
127 assert($state instanceof ConnectionState);
128 return $state->get_environment();
129 },
130 /**
131 * Checks if the onboarding process is completed and the merchant API can be used.
132 * This service only resolves the connection status once per request.
133 *
134 * @deprecated Use 'settings.connection-state' instead.
135 */
136 'settings.flag.is-connected' => static function (ContainerInterface $container): bool {
137 $state = $container->get('settings.connection-state');
138 assert($state instanceof ConnectionState);
139 return $state->is_connected();
140 },
141 /**
142 * Determines whether the merchant is connected to a sandbox account.
143 * This service only resolves the sandbox flag once per request.
144 *
145 * @deprecated Use 'settings.connection-state' instead.
146 */
147 'settings.flag.is-sandbox' => static function (ContainerInterface $container): bool {
148 $state = $container->get('settings.connection-state');
149 assert($state instanceof ConnectionState);
150 return $state->is_sandbox();
151 },
152 'settings.rest.onboarding' => static function (ContainerInterface $container): OnboardingRestEndpoint {
153 return new OnboardingRestEndpoint($container->get('settings.data.onboarding'));
154 },
155 'settings.rest.common' => static function (ContainerInterface $container): CommonRestEndpoint {
156 return new CommonRestEndpoint($container->get('settings.data.general'), $container->get('api.endpoint.partners'));
157 },
158 'settings.rest.payment' => static function (ContainerInterface $container): PaymentRestEndpoint {
159 return new PaymentRestEndpoint($container->get('settings.data.payment'), $container->get('settings.data.definition.methods'), $container->get('settings.data.definition.method_dependencies'));
160 },
161 'settings.rest.styling' => static function (ContainerInterface $container): StylingRestEndpoint {
162 return new StylingRestEndpoint($container->get('settings.data.styling'), $container->get('settings.service.sanitizer'));
163 },
164 'settings.rest.refresh_feature_status' => static function (ContainerInterface $container): RefreshFeatureStatusEndpoint {
165 return new RefreshFeatureStatusEndpoint($container->get('wcgateway.settings'), new Cache('ppcp-timeout'), $container->get('woocommerce.logger.woocommerce'));
166 },
167 'settings.rest.authentication' => static function (ContainerInterface $container): AuthenticationRestEndpoint {
168 return new AuthenticationRestEndpoint($container->get('settings.service.authentication_manager'), $container->get('settings.service.data-manager'));
169 },
170 'settings.rest.login_link' => static function (ContainerInterface $container): LoginLinkRestEndpoint {
171 return new LoginLinkRestEndpoint($container->get('settings.service.connection-url-generator'));
172 },
173 'settings.rest.webhooks' => static function (ContainerInterface $container): WebhookSettingsEndpoint {
174 return new WebhookSettingsEndpoint($container->get('api.endpoint.webhook'), $container->get('webhook.registrar'), $container->get('webhook.status.simulation'));
175 },
176 'settings.rest.pay_later_messaging' => static function (ContainerInterface $container): PayLaterMessagingEndpoint {
177 return new PayLaterMessagingEndpoint($container->get('wcgateway.settings'), $container->get('paylater-configurator.endpoint.save-config'));
178 },
179 'settings.rest.settings' => static function (ContainerInterface $container): SettingsRestEndpoint {
180 return new SettingsRestEndpoint($container->get('settings.data.settings'));
181 },
182 'settings.casual-selling.supported-countries' => static function (ContainerInterface $container): array {
183 return array('AR', 'AU', 'AT', 'BE', 'BR', 'CA', 'CL', 'CN', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'GR', 'HU', 'ID', 'IE', 'IT', 'JP', 'LV', 'LI', 'LU', 'MY', 'MT', 'NL', 'NZ', 'NO', 'PH', 'PL', 'PT', 'RO', 'RU', 'SM', 'SA', 'SG', 'SK', 'SI', 'ZA', 'KR', 'ES', 'SE', 'TW', 'GB', 'US', 'VN');
184 },
185 'settings.casual-selling.eligible' => static function (ContainerInterface $container): bool {
186 $country = $container->get('api.shop.country');
187 $eligible_countries = $container->get('settings.casual-selling.supported-countries');
188 return in_array($country, $eligible_countries, \true);
189 },
190 'settings.handler.connection-listener' => static function (ContainerInterface $container): ConnectionListener {
191 $page_id = $container->has('wcgateway.current-ppcp-settings-page-id') ? $container->get('wcgateway.current-ppcp-settings-page-id') : '';
192 return new ConnectionListener($page_id, $container->get('settings.service.onboarding-url-manager'), $container->get('settings.service.authentication_manager'), $container->get('http.redirector'), $container->get('woocommerce.logger.woocommerce'));
193 },
194 'settings.service.signup-link-cache' => static function (ContainerInterface $container): Cache {
195 return new Cache('ppcp-paypal-signup-link');
196 },
197 'settings.service.onboarding-url-manager' => static function (ContainerInterface $container): OnboardingUrlManager {
198 return new OnboardingUrlManager($container->get('settings.service.signup-link-cache'), $container->get('woocommerce.logger.woocommerce'));
199 },
200 'settings.service.connection-url-generator' => static function (ContainerInterface $container): ConnectionUrlGenerator {
201 return new ConnectionUrlGenerator($container->get('api.env.endpoint.partner-referrals'), $container->get('api.repository.partner-referrals-data'), $container->get('settings.service.onboarding-url-manager'), $container->get('woocommerce.logger.woocommerce'));
202 },
203 'settings.service.authentication_manager' => static function (ContainerInterface $container): AuthenticationManager {
204 return new AuthenticationManager($container->get('settings.data.general'), $container->get('api.env.paypal-host'), $container->get('api.env.endpoint.login-seller'), $container->get('api.repository.partner-referrals-data'), $container->get('settings.connection-state'), $container->get('settings.service.rest-service'), $container->get('woocommerce.logger.woocommerce'));
205 },
206 'settings.service.rest-service' => static function (ContainerInterface $container): InternalRestService {
207 return new InternalRestService($container->get('woocommerce.logger.woocommerce'));
208 },
209 'settings.service.sanitizer' => static function (ContainerInterface $container): DataSanitizer {
210 return new DataSanitizer();
211 },
212 'settings.service.data-manager' => static function (ContainerInterface $container): SettingsDataManager {
213 return new SettingsDataManager($container->get('settings.data.definition.methods'), $container->get('settings.data.onboarding'), $container->get('settings.data.general'), $container->get('settings.data.settings'), $container->get('settings.data.styling'), $container->get('settings.data.payment'), $container->get('settings.data.paylater-messaging'), $container->get('settings.data.todos'));
214 },
215 'settings.service.script-data-handler' => static function (ContainerInterface $container): ScriptDataHandler {
216 $settings = $container->get('wcgateway.settings');
217 $settings_url = $container->get('settings.url');
218 $paylater_is_available = $container->get('paylater-configurator.is-available');
219 $store_country = $container->get('wcgateway.store-country');
220 $merchant_id = $container->get('api.partner_merchant_id');
221 $button_language_choices = $container->get('wcgateway.wp-paypal-locales-map');
222 $partner_attribution = $container->get('api.helper.partner-attribution');
223 $path_to_module_assets_folder = $container->get('ppcp.path-to-plugin-folder') . 'modules/ppcp-settings/assets';
224 return new ScriptDataHandler($settings, $settings_url, $paylater_is_available, $store_country, $merchant_id, $button_language_choices, $partner_attribution, $path_to_module_assets_folder);
225 },
226 'settings.service.data-migration' => static fn(ContainerInterface $c): MigrationManager => new MigrationManager($c->get('settings.service.data-migration.general-settings'), $c->get('settings.service.data-migration.settings-tab'), $c->get('settings.service.data-migration.styling'), $c->get('settings.service.data-migration.payment-settings')),
227 'settings.service.data-migration.settings-tab' => static fn(ContainerInterface $c): SettingsTabMigration => new SettingsTabMigration($c->get('wcgateway.settings'), $c->get('settings.data.settings'), $c->get('compat.settings.settings_tab_map_helper')),
228 'settings.service.data-migration.styling' => static fn(ContainerInterface $c): StylingSettingsMigration => new StylingSettingsMigration($c->get('wcgateway.settings'), $c->get('settings.data.styling')),
229 'settings.service.data-migration.payment-settings' => static fn(ContainerInterface $c): PaymentSettingsMigration => new PaymentSettingsMigration($c->get('wcgateway.settings'), $c->get('settings.data.payment'), $c->get('api.helpers.dccapplies'), $c->get('wcgateway.helper.dcc-product-status'), $c->get('wcgateway.configuration.card-configuration'), $c->get('ppcp-local-apms.payment-methods')),
230 'settings.service.data-migration.general-settings' => static fn(ContainerInterface $c): SettingsMigration => new SettingsMigration($c->get('wcgateway.settings'), $c->get('settings.data.general'), $c->get('api.endpoint.partners')),
231 'settings.ajax.switch_ui' => static fn(ContainerInterface $c): SwitchSettingsUiEndpoint => new SwitchSettingsUiEndpoint($c->get('woocommerce.logger.woocommerce'), $c->get('button.request-data'), $c->get('settings.data.onboarding'), $c->get('settings.service.data-migration'), $c->get('api.merchant_id') !== ''),
232 'settings.rest.todos' => static function (ContainerInterface $container): TodosRestEndpoint {
233 return new TodosRestEndpoint($container->get('settings.data.todos'), $container->get('settings.data.definition.todos'), $container->get('settings.rest.settings'), $container->get('settings.service.todos_sorting'));
234 },
235 'settings.data.todos' => static function (ContainerInterface $container): TodosModel {
236 return new TodosModel();
237 },
238 'settings.data.definition.todos' => static function (ContainerInterface $container): TodosDefinition {
239 return new TodosDefinition($container->get('settings.service.todos_eligibilities'), $container->get('settings.data.general'), $container->get('settings.data.todos'));
240 },
241 'settings.data.definition.methods' => static function (ContainerInterface $container): PaymentMethodsDefinition {
242 $axo_checkout_config_notice = $container->get('axo.checkout-config-notice.raw');
243 $axo_incompatible_plugins_notice = $container->get('axo.incompatible-plugins-notice.raw');
244 // Combine the notices - only include non-empty ones.
245 $axo_notices = array_filter(array($axo_checkout_config_notice, $axo_incompatible_plugins_notice));
246 return new PaymentMethodsDefinition($container->get('settings.data.payment'), $container->get('settings.data.general'), $axo_notices);
247 },
248 'settings.data.definition.method_dependencies' => static function (ContainerInterface $container): PaymentMethodsDependenciesDefinition {
249 return new PaymentMethodsDependenciesDefinition($container->get('wcgateway.settings'));
250 },
251 'settings.service.pay_later_status' => static function (ContainerInterface $container): array {
252 $pay_later_endpoint = $container->get('settings.rest.pay_later_messaging');
253 $pay_later_settings = $pay_later_endpoint->get_details()->get_data();
254 $pay_later_statuses = array('cart' => $pay_later_settings['data']['cart']['status'] === 'enabled', 'checkout' => $pay_later_settings['data']['checkout']['status'] === 'enabled', 'product' => $pay_later_settings['data']['product']['status'] === 'enabled', 'shop' => $pay_later_settings['data']['shop']['status'] === 'enabled', 'home' => $pay_later_settings['data']['home']['status'] === 'enabled', 'custom_placement' => !empty($pay_later_settings['data']['custom_placement']) && $pay_later_settings['data']['custom_placement'][0]['status'] === 'enabled');
255 $is_pay_later_messaging_enabled_for_any_location = !array_filter($pay_later_statuses);
256 return array('statuses' => $pay_later_statuses, 'is_enabled_for_any_location' => $is_pay_later_messaging_enabled_for_any_location);
257 },
258 'settings.service.button_locations' => static function (ContainerInterface $container): array {
259 $styling_endpoint = $container->get('settings.rest.styling');
260 $styling_data = $styling_endpoint->get_details()->get_data()['data'];
261 return array('cart_enabled' => $styling_data['cart']->enabled ?? \false, 'block_checkout_enabled' => $styling_data['expressCheckout']->enabled ?? \false, 'product_enabled' => $styling_data['product']->enabled ?? \false);
262 },
263 'settings.service.gateways_status' => static function (ContainerInterface $container): array {
264 $payment_endpoint = $container->get('settings.rest.payment');
265 $settings = $payment_endpoint->get_details()->get_data();
266 return array('apple_pay' => $settings['data']['ppcp-applepay']['enabled'] ?? \false, 'google_pay' => $settings['data']['ppcp-googlepay']['enabled'] ?? \false, 'axo' => $settings['data']['ppcp-axo-gateway']['enabled'] ?? \false, 'card-button' => $settings['data']['ppcp-card-button-gateway']['enabled'] ?? \false, 'pwc' => $settings['data']['ppcp-pwc']['enabled'] ?? \false);
267 },
268 'settings.service.merchant_capabilities' => static function (ContainerInterface $container): array {
269 /**
270 * Use the REST API filter to collect eligibility flags.
271 *
272 * TODO: We should switch to using the new `*.eligibility.check` services, which return a callback instead of a boolean.
273 * Problem with booleans is, that they are evaluated during DI service creation (plugin_loaded), and some relevant filters are not registered at that point.
274 * Overthink the capability system, it's difficult to reuse across the plugin.
275 */
276 $features = apply_filters('woocommerce_paypal_payments_rest_common_merchant_features', array());
277 // TODO: This condition included in the `*.eligibility.check` services; it can be removed when we switch to those services.
278 $general_settings = $container->get('settings.data.general');
279 assert($general_settings instanceof GeneralSettings);
280 return array('apple_pay' => ($features['apple_pay']['enabled'] ?? \false) && !$general_settings->own_brand_only(), 'google_pay' => ($features['google_pay']['enabled'] ?? \false) && !$general_settings->own_brand_only(), 'acdc' => ($features['advanced_credit_and_debit_cards']['enabled'] ?? \false) && !$general_settings->own_brand_only(), 'save_paypal' => $features['save_paypal_and_venmo']['enabled'] ?? \false, 'apm' => $features['alternative_payment_methods']['enabled'] ?? \false, 'paylater' => $features['pay_later_messaging']['enabled'] ?? \false, 'installments' => $features['installments']['enabled'] ?? \false, 'pwc' => $features['pwc']['enabled'] ?? \false);
281 },
282 'settings.service.todos_eligibilities' => static function (ContainerInterface $container): TodosEligibilityService {
283 $pay_later_service = $container->get('settings.service.pay_later_status');
284 $pay_later_statuses = $pay_later_service['statuses'];
285 $is_pay_later_messaging_enabled_for_any_location = $pay_later_service['is_enabled_for_any_location'];
286 $button_locations = $container->get('settings.service.button_locations');
287 $gateways = $container->get('settings.service.gateways_status');
288 // TODO: This "merchant_capabilities" service is only used here. Could it be merged to make the code cleaner and less segmented?
289 $capabilities = $container->get('settings.service.merchant_capabilities');
290 $settings = $container->get('wcgateway.settings');
291 assert($settings instanceof Settings);
292 $settings_model = $container->get('settings.data.settings');
293 assert($settings_model instanceof SettingsModel);
294 $messages_apply = $container->get('button.helper.messages-apply');
295 assert($messages_apply instanceof MessagesApply);
296 $is_working_capital_feature_flag_enabled = apply_filters(
297 // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores -- feature flags use this convention
298 'woocommerce.feature-flags.woocommerce_paypal_payments.working_capital_enabled',
299 getenv('PCP_WORKING_CAPITAL_ENABLED') === '1'
300 );
301 $is_working_capital_eligible = $container->get('settings.data.general')->get_merchant_country() === 'US' && $settings_model->get_stay_updated();
302 $recaptcha_settings = get_option('woocommerce_ppcp-recaptcha_settings', array());
303 $is_recaptcha_enabled = isset($recaptcha_settings['enabled']) && 'yes' === $recaptcha_settings['enabled'];
304 /**
305 * Initializes TodosEligibilityService with eligibility conditions for various PayPal features.
306 * Each parameter determines whether a specific feature should be shown in the Things To Do list.
307 *
308 * Logic relies on three main factors:
309 * 1. $container->get( 'x.eligible' ) - Module based eligibility check, usually whether the WooCommerce store is using a supported country/currency matrix.
310 * 2. $capabilities - Whether the merchant is eligible for specific features on their PayPal account.
311 * 3. $gateways, $pay_later_statuses, $button_locations - Plugin settings (enabled/disabled status).
312 *
313 * @param bool $is_fastlane_eligible - Show if merchant is eligible (ACDC) but hasn't enabled Fastlane gateway.
314 * @param bool $is_pay_later_messaging_eligible - Show if Pay Later messaging is enabled for at least one location.
315 * @param bool $is_pay_later_messaging_product_eligible - Show if Pay Later is not enabled anywhere and specifically not on product page.
316 * @param bool $is_pay_later_messaging_cart_eligible - Show if Pay Later is not enabled anywhere and specifically not on cart.
317 * @param bool $is_pay_later_messaging_checkout_eligible - Show if Pay Later is not enabled anywhere and specifically not on checkout.
318 * @param bool $is_subscription_eligible - Show if WooCommerce Subscriptions plugin is active but merchant is not eligible for PayPal Vaulting.
319 * @param bool $is_paypal_buttons_cart_eligible - Show if PayPal buttons are not enabled on cart page.
320 * @param bool $is_paypal_buttons_block_checkout_eligible - Show if PayPal buttons are not enabled on blocks checkout.
321 * @param bool $is_paypal_buttons_product_eligible - Show if PayPal buttons are not enabled on product page.
322 * @param bool $is_apple_pay_domain_eligible - Show if merchant has Apple Pay capability on PayPal account.
323 * @param bool $is_digital_wallet_eligible - Show if merchant is eligible (ACDC) but doesn't have both wallet types on PayPal.
324 * @param bool $is_apple_pay_eligible - Show if merchant is eligible (ACDC) but doesn't have Apple Pay on PayPal.
325 * @param bool $is_google_pay_eligible - Show if merchant is eligible (ACDC) but doesn't have Google Pay on PayPal.
326 * @param bool $is_enable_apple_pay_eligible - Show if merchant has Apple Pay capability but hasn't enabled the gateway.
327 * @param bool $is_enable_google_pay_eligible - Show if merchant has Google Pay capability but hasn't enabled the gateway.
328 * @param bool $is_enable_installments_eligible - Show if merchant has installments capability and merchant country is MX.
329 * @param bool $is_working_capital_eligible - Show if feature flag is enabled, merchant country is US and "Stay Updated" is turned On.
330 * @param bool $is_pwc_eligible - Show if merchant has Pay with Crypto capability.
331 * @param bool $is_recaptcha_protection_eligible - Show if reCAPTCHA is not already enabled.
332 */
333 return new TodosEligibilityService(
334 $container->get('axo.eligible') && $capabilities['acdc'] && !$gateways['axo'],
335 // Enable Fastlane.
336 $is_pay_later_messaging_enabled_for_any_location,
337 // Enable Pay Later messaging.
338 !$is_pay_later_messaging_enabled_for_any_location && !$pay_later_statuses['product'],
339 // Add Pay Later messaging (Product page).
340 !$is_pay_later_messaging_enabled_for_any_location && !$pay_later_statuses['cart'],
341 // Add Pay Later messaging (Cart).
342 !$is_pay_later_messaging_enabled_for_any_location && !$pay_later_statuses['checkout'],
343 // Add Pay Later messaging (Checkout).
344 $container->has('save-payment-methods.eligible') && !$container->get('save-payment-methods.eligible') && $container->has('wc-subscriptions.helper') && $container->get('wc-subscriptions.helper')->plugin_is_active(),
345 // Configure a PayPal Subscription.
346 !$button_locations['cart_enabled'],
347 // Add PayPal buttons to cart.
348 !$button_locations['block_checkout_enabled'],
349 // Add PayPal buttons to block checkout.
350 !$button_locations['product_enabled'],
351 // Add PayPal buttons to product.
352 $container->get('applepay.eligible') && $capabilities['apple_pay'],
353 // Register Domain for Apple Pay.
354 $capabilities['acdc'] && !($capabilities['apple_pay'] && $capabilities['google_pay']),
355 // Add digital wallets to your account.
356 $container->get('applepay.eligible') && $capabilities['acdc'] && !$capabilities['apple_pay'],
357 // Add Apple Pay to your account.
358 $container->get('googlepay.eligible') && $capabilities['acdc'] && !$capabilities['google_pay'],
359 // Add Google Pay to your account.
360 $container->get('applepay.eligible') && $capabilities['apple_pay'] && !$gateways['apple_pay'],
361 // Enable Apple Pay.
362 $container->get('googlepay.eligible') && $capabilities['google_pay'] && !$gateways['google_pay'],
363 !$capabilities['installments'] && 'MX' === $container->get('settings.data.general')->get_merchant_country(),
364 // Enable Installments for Mexico.
365 $is_working_capital_feature_flag_enabled && $is_working_capital_eligible,
366 // Enable Working Capital.
367 $capabilities['pwc'] && !$gateways['pwc'],
368 // Enable Pay with Crypto.
369 $capabilities['acdc'] && !$capabilities['pwc'],
370 // Apply for Pay with Crypto.
371 !$is_recaptcha_enabled
372 );
373 },
374 'settings.rest.features' => static function (ContainerInterface $container): FeaturesRestEndpoint {
375 return new FeaturesRestEndpoint($container->get('settings.data.definition.features'), $container->get('settings.rest.settings'));
376 },
377 'settings.data.definition.features' => static function (ContainerInterface $container): FeaturesDefinition {
378 $features = apply_filters('woocommerce_paypal_payments_rest_common_merchant_features', array());
379 $payment_endpoint = $container->get('settings.rest.payment');
380 $settings = $payment_endpoint->get_details()->get_data();
381 // Settings status.
382 $gateways = array('card-button' => $settings['data']['ppcp-card-button-gateway']['enabled'] ?? \false);
383 // Merchant capabilities serve to show active or inactive badge and buttons.
384 $capabilities = array('apple_pay' => $features['apple_pay']['enabled'] ?? \false, 'google_pay' => $features['google_pay']['enabled'] ?? \false, 'acdc' => $features['advanced_credit_and_debit_cards']['enabled'] ?? \false, 'save_paypal' => $features['save_paypal_and_venmo']['enabled'] ?? \false, 'alternative_payment_methods' => $features['alternative_payment_methods']['enabled'] ?? \false, 'installments' => $features['installments']['enabled'] ?? \false, 'pwc' => $features['pwc']['enabled'] ?? \false, 'pay_later_messaging' => $features['pay_later_messaging']['enabled'] ?? \false);
385 $merchant_capabilities = array(
386 'save_paypal' => $capabilities['save_paypal'],
387 // Save PayPal and Venmo eligibility.
388 'acdc' => $capabilities['acdc'],
389 // Advanced credit and debit cards eligibility.
390 'apm' => $capabilities['alternative_payment_methods'],
391 // Alternative payment methods eligibility.
392 'google_pay' => $capabilities['acdc'] && $capabilities['google_pay'],
393 // Google Pay eligibility.
394 'apple_pay' => $capabilities['acdc'] && $capabilities['apple_pay'],
395 // Apple Pay eligibility.
396 'pay_later' => $capabilities['pay_later_messaging'] && $capabilities['acdc'] && !$gateways['card-button'],
397 // Pay Later eligibility.
398 'installments' => $capabilities['installments'],
399 // Installments eligibility.
400 'pwc' => $capabilities['pwc'],
401 );
402 return new FeaturesDefinition($container->get('settings.service.features_eligibilities'), $container->get('settings.data.general'), $merchant_capabilities, $container->get('settings.data.settings'));
403 },
404 'settings.service.features_eligibilities' => static function (ContainerInterface $container): FeaturesEligibilityService {
405 $messages_apply = $container->get('button.helper.messages-apply');
406 assert($messages_apply instanceof MessagesApply);
407 $pay_later_eligible = $messages_apply->for_country();
408 // TODO: Variable "merchant_country" contains "shop-country". Which is correct?
409 $merchant_country = $container->get('api.shop.country');
410 $ineligible_countries = array('RU', 'BR', 'JP');
411 $apm_eligible = !in_array($merchant_country, $ineligible_countries, \true);
412 return new FeaturesEligibilityService(
413 $container->get('save-payment-methods.eligible'),
414 // Save PayPal and Venmo eligibility.
415 $container->get('card-fields.eligibility.check'),
416 // Advanced credit and debit cards eligibility.
417 $apm_eligible,
418 // Alternative payment methods eligibility.
419 $container->get('googlepay.eligibility.check'),
420 // Google Pay eligibility.
421 $container->get('applepay.eligibility.check'),
422 // Apple Pay eligibility.
423 $pay_later_eligible,
424 // Pay Later eligibility.
425 'MX' === $container->get('settings.data.general')->get_merchant_country(),
426 // Installments eligibility.
427 $apm_eligible
428 );
429 },
430 'settings.service.todos_sorting' => static function (ContainerInterface $container): TodosSortingAndFilteringService {
431 return new TodosSortingAndFilteringService($container->get('settings.data.todos'));
432 },
433 'settings.service.gateway-redirect' => static function (): GatewayRedirectService {
434 return new GatewayRedirectService();
435 },
436 'settings.services.loading-screen-service' => static function (ContainerInterface $container): LoadingScreenService {
437 return new LoadingScreenService();
438 },
439 /**
440 * Returns a list of all payment gateway IDs created by this plugin.
441 *
442 * @returns string[] The list of all gateway IDs.
443 */
444 'settings.config.all-gateway-ids' => static function (): array {
445 return array(PayPalGateway::ID, CardButtonGateway::ID, CreditCardGateway::ID, AxoGateway::ID, ApplePayGateway::ID, GooglePayGateway::ID, PWCGateway::ID, BancontactGateway::ID, BlikGateway::ID, EPSGateway::ID, IDealGateway::ID, MyBankGateway::ID, P24Gateway::ID, TrustlyGateway::ID, MultibancoGateway::ID, PayUponInvoiceGateway::ID, OXXO::ID);
446 },
447 'settings.service.branded-experience.activation-detector' => static function (): ActivationDetector {
448 return new ActivationDetector();
449 },
450 'settings.service.branded-experience.path-repository' => static function (ContainerInterface $container): PathRepository {
451 return new PathRepository($container->get('settings.service.branded-experience.activation-detector'), $container->get('settings.data.general'));
452 },
453 'settings.merchant-details' => static function (ContainerInterface $container): MerchantDetails {
454 $data = $container->get('settings.data.general');
455 assert($data instanceof GeneralSettings);
456 $merchant_country = $data->get_merchant_country();
457 $woo_data = $data->get_woo_settings();
458 $eligibility_checks = $container->get('wcgateway.feature-eligibility.list');
459 return new MerchantDetails($merchant_country, $woo_data['country'], $eligibility_checks);
460 },
461 'settings.migration.bcdc-override-check' => static function (): callable {
462 return static fn(): bool => (bool) get_option(PaymentSettingsMigration::OPTION_NAME_BCDC_MIGRATION_OVERRIDE);
463 },
464 );
465 if (!\WooCommerce\PayPalCommerce\Settings\SettingsModule::should_use_the_old_ui()) {
466 /**
467 * Merchant connection details, which includes the connection status
468 * (onboarding/connected) and connection-aware environment checks.
469 * This is the preferred solution to check environment and connection state.
470 */
471 $services['settings.connection-state'] = static function (ContainerInterface $container): ConnectionState {
472 $data = $container->get('settings.data.general');
473 assert($data instanceof GeneralSettings);
474 $is_connected = $data->is_merchant_connected();
475 $environment = new Environment($data->is_sandbox_merchant());
476 return new ConnectionState($is_connected, $environment);
477 };
478 }
479 return $services;
480