diff --git a/modules/ppcp-api-client/services.php b/modules/ppcp-api-client/services.php index b46886da9..96acb585d 100644 --- a/modules/ppcp-api-client/services.php +++ b/modules/ppcp-api-client/services.php @@ -50,31 +50,31 @@ use WooCommerce\PayPalCommerce\ApiClient\Repository\PayPalRequestIdRepository; use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; return array( - 'api.host' => function( ContainerInterface $container ) : string { + 'api.host' => function( ContainerInterface $container ) : string { return PAYPAL_API_URL; }, - 'api.paypal-host' => function( ContainerInterface $container ) : string { + 'api.paypal-host' => function( ContainerInterface $container ) : string { return PAYPAL_API_URL; }, - 'api.partner_merchant_id' => static function () : string { + 'api.partner_merchant_id' => static function () : string { return ''; }, - 'api.merchant_email' => function () : string { + 'api.merchant_email' => function () : string { return ''; }, - 'api.merchant_id' => function () : string { + 'api.merchant_id' => function () : string { return ''; }, - 'api.key' => static function (): string { + 'api.key' => static function (): string { return ''; }, - 'api.secret' => static function (): string { + 'api.secret' => static function (): string { return ''; }, - 'api.prefix' => static function (): string { + 'api.prefix' => static function (): string { return 'WC-'; }, - 'api.bearer' => static function ( ContainerInterface $container ): Bearer { + 'api.bearer' => static function ( ContainerInterface $container ): Bearer { $cache = new Cache( 'ppcp-paypal-bearer' ); $key = $container->get( 'api.key' ); $secret = $container->get( 'api.secret' ); @@ -90,7 +90,7 @@ return array( $settings ); }, - 'api.endpoint.partners' => static function ( ContainerInterface $container ) : PartnersEndpoint { + 'api.endpoint.partners' => static function ( ContainerInterface $container ) : PartnersEndpoint { return new PartnersEndpoint( $container->get( 'api.host' ), $container->get( 'api.bearer' ), @@ -100,10 +100,10 @@ return array( $container->get( 'api.merchant_id' ) ); }, - 'api.factory.sellerstatus' => static function ( ContainerInterface $container ) : SellerStatusFactory { + 'api.factory.sellerstatus' => static function ( ContainerInterface $container ) : SellerStatusFactory { return new SellerStatusFactory(); }, - 'api.endpoint.payment-token' => static function ( ContainerInterface $container ) : PaymentTokenEndpoint { + 'api.endpoint.payment-token' => static function ( ContainerInterface $container ) : PaymentTokenEndpoint { return new PaymentTokenEndpoint( $container->get( 'api.host' ), $container->get( 'api.bearer' ), @@ -112,7 +112,7 @@ return array( $container->get( 'api.prefix' ) ); }, - 'api.endpoint.webhook' => static function ( ContainerInterface $container ) : WebhookEndpoint { + 'api.endpoint.webhook' => static function ( ContainerInterface $container ) : WebhookEndpoint { return new WebhookEndpoint( $container->get( 'api.host' ), @@ -122,7 +122,7 @@ return array( $container->get( 'woocommerce.logger.woocommerce' ) ); }, - 'api.endpoint.partner-referrals' => static function ( ContainerInterface $container ) : PartnerReferrals { + 'api.endpoint.partner-referrals' => static function ( ContainerInterface $container ) : PartnerReferrals { return new PartnerReferrals( $container->get( 'api.host' ), @@ -131,7 +131,7 @@ return array( $container->get( 'woocommerce.logger.woocommerce' ) ); }, - 'api.endpoint.identity-token' => static function ( ContainerInterface $container ) : IdentityToken { + 'api.endpoint.identity-token' => static function ( ContainerInterface $container ) : IdentityToken { $logger = $container->get( 'woocommerce.logger.woocommerce' ); $prefix = $container->get( 'api.prefix' ); $settings = $container->get( 'wcgateway.settings' ); @@ -143,7 +143,7 @@ return array( $settings ); }, - 'api.endpoint.payments' => static function ( ContainerInterface $container ): PaymentsEndpoint { + 'api.endpoint.payments' => static function ( ContainerInterface $container ): PaymentsEndpoint { $authorizations_factory = $container->get( 'api.factory.authorization' ); $capture_factory = $container->get( 'api.factory.capture' ); $logger = $container->get( 'woocommerce.logger.woocommerce' ); @@ -156,7 +156,7 @@ return array( $logger ); }, - 'api.endpoint.login-seller' => static function ( ContainerInterface $container ) : LoginSeller { + 'api.endpoint.login-seller' => static function ( ContainerInterface $container ) : LoginSeller { $logger = $container->get( 'woocommerce.logger.woocommerce' ); return new LoginSeller( @@ -165,7 +165,7 @@ return array( $logger ); }, - 'api.endpoint.order' => static function ( ContainerInterface $container ): OrderEndpoint { + 'api.endpoint.order' => static function ( ContainerInterface $container ): OrderEndpoint { $order_factory = $container->get( 'api.factory.order' ); $patch_collection_factory = $container->get( 'api.factory.patch-collection-factory' ); $logger = $container->get( 'woocommerce.logger.woocommerce' ); @@ -192,54 +192,54 @@ return array( $subscription_helper ); }, - 'api.endpoint.billing-agreements' => static function ( ContainerInterface $container ): BillingAgreementsEndpoint { + 'api.endpoint.billing-agreements' => static function ( ContainerInterface $container ): BillingAgreementsEndpoint { return new BillingAgreementsEndpoint( $container->get( 'api.host' ), $container->get( 'api.bearer' ), $container->get( 'woocommerce.logger.woocommerce' ) ); }, - 'api.repository.paypal-request-id' => static function( ContainerInterface $container ) : PayPalRequestIdRepository { + 'api.repository.paypal-request-id' => static function( ContainerInterface $container ) : PayPalRequestIdRepository { return new PayPalRequestIdRepository(); }, - 'api.repository.application-context' => static function( ContainerInterface $container ) : ApplicationContextRepository { + 'api.repository.application-context' => static function( ContainerInterface $container ) : ApplicationContextRepository { $settings = $container->get( 'wcgateway.settings' ); return new ApplicationContextRepository( $settings ); }, - 'api.repository.partner-referrals-data' => static function ( ContainerInterface $container ) : PartnerReferralsData { + 'api.repository.partner-referrals-data' => static function ( ContainerInterface $container ) : PartnerReferralsData { $merchant_email = $container->get( 'api.merchant_email' ); $dcc_applies = $container->get( 'api.helpers.dccapplies' ); return new PartnerReferralsData( $merchant_email, $dcc_applies ); }, - 'api.repository.cart' => static function ( ContainerInterface $container ): CartRepository { + 'api.repository.cart' => static function ( ContainerInterface $container ): CartRepository { $factory = $container->get( 'api.factory.purchase-unit' ); return new CartRepository( $factory ); }, - 'api.repository.payee' => static function ( ContainerInterface $container ): PayeeRepository { + 'api.repository.payee' => static function ( ContainerInterface $container ): PayeeRepository { $merchant_email = $container->get( 'api.merchant_email' ); $merchant_id = $container->get( 'api.merchant_id' ); return new PayeeRepository( $merchant_email, $merchant_id ); }, - 'api.factory.application-context' => static function ( ContainerInterface $container ) : ApplicationContextFactory { + 'api.factory.application-context' => static function ( ContainerInterface $container ) : ApplicationContextFactory { return new ApplicationContextFactory(); }, - 'api.factory.payment-token' => static function ( ContainerInterface $container ) : PaymentTokenFactory { + 'api.factory.payment-token' => static function ( ContainerInterface $container ) : PaymentTokenFactory { return new PaymentTokenFactory(); }, - 'api.factory.webhook' => static function ( ContainerInterface $container ): WebhookFactory { + 'api.factory.webhook' => static function ( ContainerInterface $container ): WebhookFactory { return new WebhookFactory(); }, - 'api.factory.webhook-event' => static function ( ContainerInterface $container ): WebhookEventFactory { + 'api.factory.webhook-event' => static function ( ContainerInterface $container ): WebhookEventFactory { return new WebhookEventFactory(); }, - 'api.factory.capture' => static function ( ContainerInterface $container ): CaptureFactory { + 'api.factory.capture' => static function ( ContainerInterface $container ): CaptureFactory { $amount_factory = $container->get( 'api.factory.amount' ); return new CaptureFactory( $amount_factory ); }, - 'api.factory.purchase-unit' => static function ( ContainerInterface $container ): PurchaseUnitFactory { + 'api.factory.purchase-unit' => static function ( ContainerInterface $container ): PurchaseUnitFactory { $amount_factory = $container->get( 'api.factory.amount' ); $payee_repository = $container->get( 'api.repository.payee' ); @@ -259,39 +259,39 @@ return array( $prefix ); }, - 'api.factory.patch-collection-factory' => static function ( ContainerInterface $container ): PatchCollectionFactory { + 'api.factory.patch-collection-factory' => static function ( ContainerInterface $container ): PatchCollectionFactory { return new PatchCollectionFactory(); }, - 'api.factory.payee' => static function ( ContainerInterface $container ): PayeeFactory { + 'api.factory.payee' => static function ( ContainerInterface $container ): PayeeFactory { return new PayeeFactory(); }, - 'api.factory.item' => static function ( ContainerInterface $container ): ItemFactory { + 'api.factory.item' => static function ( ContainerInterface $container ): ItemFactory { return new ItemFactory( $container->get( 'api.shop.currency' ) ); }, - 'api.factory.shipping' => static function ( ContainerInterface $container ): ShippingFactory { + 'api.factory.shipping' => static function ( ContainerInterface $container ): ShippingFactory { $address_factory = $container->get( 'api.factory.address' ); return new ShippingFactory( $address_factory ); }, - 'api.factory.amount' => static function ( ContainerInterface $container ): AmountFactory { + 'api.factory.amount' => static function ( ContainerInterface $container ): AmountFactory { $item_factory = $container->get( 'api.factory.item' ); return new AmountFactory( $item_factory, $container->get( 'api.shop.currency' ) ); }, - 'api.factory.payer' => static function ( ContainerInterface $container ): PayerFactory { + 'api.factory.payer' => static function ( ContainerInterface $container ): PayerFactory { $address_factory = $container->get( 'api.factory.address' ); return new PayerFactory( $address_factory ); }, - 'api.factory.address' => static function ( ContainerInterface $container ): AddressFactory { + 'api.factory.address' => static function ( ContainerInterface $container ): AddressFactory { return new AddressFactory(); }, - 'api.factory.payment-source' => static function ( ContainerInterface $container ): PaymentSourceFactory { + 'api.factory.payment-source' => static function ( ContainerInterface $container ): PaymentSourceFactory { return new PaymentSourceFactory(); }, - 'api.factory.order' => static function ( ContainerInterface $container ): OrderFactory { + 'api.factory.order' => static function ( ContainerInterface $container ): OrderFactory { $purchase_unit_factory = $container->get( 'api.factory.purchase-unit' ); $payer_factory = $container->get( 'api.factory.payer' ); $application_context_repository = $container->get( 'api.repository.application-context' ); @@ -305,31 +305,237 @@ return array( $payment_source_factory ); }, - 'api.factory.payments' => static function ( ContainerInterface $container ): PaymentsFactory { + 'api.factory.payments' => static function ( ContainerInterface $container ): PaymentsFactory { $authorizations_factory = $container->get( 'api.factory.authorization' ); $capture_factory = $container->get( 'api.factory.capture' ); return new PaymentsFactory( $authorizations_factory, $capture_factory ); }, - 'api.factory.authorization' => static function ( ContainerInterface $container ): AuthorizationFactory { + 'api.factory.authorization' => static function ( ContainerInterface $container ): AuthorizationFactory { return new AuthorizationFactory(); }, - 'api.helpers.dccapplies' => static function ( ContainerInterface $container ) : DccApplies { + 'api.helpers.dccapplies' => static function ( ContainerInterface $container ) : DccApplies { return new DccApplies( + $container->get( 'api.dcc-supported-country-currency-matrix' ), + $container->get( 'api.dcc-supported-country-card-matrix' ), $container->get( 'api.shop.currency' ), $container->get( 'api.shop.country' ) ); }, - 'api.helpers.currency-support' => static function ( ContainerInterface $container ) : CurrencySupport { + 'api.helpers.currency-support' => static function ( ContainerInterface $container ) : CurrencySupport { return new CurrencySupport( + $container->get( 'api.supported-currencies' ), $container->get( 'api.shop.currency' ) ); }, - 'api.shop.currency' => static function ( ContainerInterface $container ) : string { + 'api.shop.currency' => static function ( ContainerInterface $container ) : string { return get_woocommerce_currency(); }, - 'api.shop.country' => static function ( ContainerInterface $container ) : string { + 'api.shop.country' => static function ( ContainerInterface $container ) : string { $location = wc_get_base_location(); return $location['country']; }, + + /** + * Currencies supported by PayPal. + * + * From https://developer.paypal.com/docs/reports/reference/paypal-supported-currencies/ + */ + 'api.supported-currencies' => static function ( ContainerInterface $container ) : array { + return array( + 'AUD', + 'BRL', + 'CAD', + 'CNY', + 'CZK', + 'DKK', + 'EUR', + 'HKD', + 'HUF', + 'ILS', + 'JPY', + 'MYR', + 'MXN', + 'TWD', + 'NZD', + 'NOK', + 'PHP', + 'PLN', + 'GBP', + 'RUB', + 'SGD', + 'SEK', + 'CHF', + 'THB', + 'USD', + ); + }, + + /** + * The matrix which countries and currency combinations can be used for DCC. + */ + 'api.dcc-supported-country-currency-matrix' => static function ( ContainerInterface $container ) : array { + return array( + 'AU' => array( + 'AUD', + 'CAD', + 'CHF', + 'CZK', + 'DKK', + 'EUR', + 'GBP', + 'HKD', + 'HUF', + 'JPY', + 'NOK', + 'NZD', + 'PLN', + 'SEK', + 'SGD', + 'USD', + ), + 'ES' => array( + 'AUD', + 'CAD', + 'CHF', + 'CZK', + 'DKK', + 'EUR', + 'GBP', + 'HKD', + 'HUF', + 'JPY', + 'NOK', + 'NZD', + 'PLN', + 'SEK', + 'SGD', + 'USD', + ), + 'FR' => array( + 'AUD', + 'CAD', + 'CHF', + 'CZK', + 'DKK', + 'EUR', + 'GBP', + 'HKD', + 'HUF', + 'JPY', + 'NOK', + 'NZD', + 'PLN', + 'SEK', + 'SGD', + 'USD', + ), + 'GB' => array( + 'AUD', + 'CAD', + 'CHF', + 'CZK', + 'DKK', + 'EUR', + 'GBP', + 'HKD', + 'HUF', + 'JPY', + 'NOK', + 'NZD', + 'PLN', + 'SEK', + 'SGD', + 'USD', + ), + 'IT' => array( + 'AUD', + 'CAD', + 'CHF', + 'CZK', + 'DKK', + 'EUR', + 'GBP', + 'HKD', + 'HUF', + 'JPY', + 'NOK', + 'NZD', + 'PLN', + 'SEK', + 'SGD', + 'USD', + ), + 'US' => array( + 'AUD', + 'CAD', + 'EUR', + 'GBP', + 'JPY', + 'USD', + ), + 'CA' => array( + 'AUD', + 'CAD', + 'CHF', + 'CZK', + 'DKK', + 'EUR', + 'GBP', + 'HKD', + 'HUF', + 'JPY', + 'NOK', + 'NZD', + 'PLN', + 'SEK', + 'SGD', + 'USD', + ), + ); + }, + + /** + * Which countries support which credit cards. Empty credit card arrays mean no restriction on currency. + */ + 'api.dcc-supported-country-card-matrix' => static function ( ContainerInterface $container ) : array { + return array( + 'AU' => array( + 'mastercard' => array(), + 'visa' => array(), + ), + 'ES' => array( + 'mastercard' => array(), + 'visa' => array(), + 'amex' => array( 'EUR' ), + ), + 'FR' => array( + 'mastercard' => array(), + 'visa' => array(), + 'amex' => array( 'EUR' ), + ), + 'GB' => array( + 'mastercard' => array(), + 'visa' => array(), + 'amex' => array( 'GBP', 'USD' ), + ), + 'IT' => array( + 'mastercard' => array(), + 'visa' => array(), + 'amex' => array( 'EUR' ), + ), + 'US' => array( + 'mastercard' => array(), + 'visa' => array(), + 'amex' => array( 'USD' ), + 'discover' => array( 'USD' ), + ), + 'CA' => array( + 'mastercard' => array(), + 'visa' => array(), + 'amex' => array( 'CAD' ), + 'jcb' => array( 'CAD' ), + ), + ); + }, ); diff --git a/modules/ppcp-api-client/src/Helper/CurrencySupport.php b/modules/ppcp-api-client/src/Helper/CurrencySupport.php index 9c5bd5bc4..adfe13152 100644 --- a/modules/ppcp-api-client/src/Helper/CurrencySupport.php +++ b/modules/ppcp-api-client/src/Helper/CurrencySupport.php @@ -17,37 +17,9 @@ class CurrencySupport { /** * Currencies supported by PayPal. * - * From https://developer.paypal.com/docs/reports/reference/paypal-supported-currencies/ - * * @var string[] */ - private $supported_currencies = array( - 'AUD', - 'BRL', - 'CAD', - 'CNY', - 'CZK', - 'DKK', - 'EUR', - 'HKD', - 'HUF', - 'ILS', - 'JPY', - 'MYR', - 'MXN', - 'TWD', - 'NZD', - 'NOK', - 'PHP', - 'PLN', - 'GBP', - 'RUB', - 'SGD', - 'SEK', - 'CHF', - 'THB', - 'USD', - ); + private $supported_currencies; /** * 3-letter currency code of the shop. @@ -59,10 +31,12 @@ class CurrencySupport { /** * CurrencySupport constructor. * - * @param string $currency 3-letter currency code of the shop. + * @param string[] $supported_currencies Currencies supported by PayPal. + * @param string $currency 3-letter currency code of the shop. */ - public function __construct( string $currency ) { - $this->currency = $currency; + public function __construct( array $supported_currencies, string $currency ) { + $this->supported_currencies = $supported_currencies; + $this->currency = $currency; } /** diff --git a/modules/ppcp-api-client/src/Helper/DccApplies.php b/modules/ppcp-api-client/src/Helper/DccApplies.php index ce88fc476..6d694536c 100644 --- a/modules/ppcp-api-client/src/Helper/DccApplies.php +++ b/modules/ppcp-api-client/src/Helper/DccApplies.php @@ -19,169 +19,15 @@ class DccApplies { * * @var array */ - private $allowed_country_currency_matrix = array( - 'AU' => array( - 'AUD', - 'CAD', - 'CHF', - 'CZK', - 'DKK', - 'EUR', - 'GBP', - 'HKD', - 'HUF', - 'JPY', - 'NOK', - 'NZD', - 'PLN', - 'SEK', - 'SGD', - 'USD', - ), - 'ES' => array( - 'AUD', - 'CAD', - 'CHF', - 'CZK', - 'DKK', - 'EUR', - 'GBP', - 'HKD', - 'HUF', - 'JPY', - 'NOK', - 'NZD', - 'PLN', - 'SEK', - 'SGD', - 'USD', - ), - 'FR' => array( - 'AUD', - 'CAD', - 'CHF', - 'CZK', - 'DKK', - 'EUR', - 'GBP', - 'HKD', - 'HUF', - 'JPY', - 'NOK', - 'NZD', - 'PLN', - 'SEK', - 'SGD', - 'USD', - ), - 'GB' => array( - 'AUD', - 'CAD', - 'CHF', - 'CZK', - 'DKK', - 'EUR', - 'GBP', - 'HKD', - 'HUF', - 'JPY', - 'NOK', - 'NZD', - 'PLN', - 'SEK', - 'SGD', - 'USD', - ), - 'IT' => array( - 'AUD', - 'CAD', - 'CHF', - 'CZK', - 'DKK', - 'EUR', - 'GBP', - 'HKD', - 'HUF', - 'JPY', - 'NOK', - 'NZD', - 'PLN', - 'SEK', - 'SGD', - 'USD', - ), - 'US' => array( - 'AUD', - 'CAD', - 'EUR', - 'GBP', - 'JPY', - 'USD', - ), - 'CA' => array( - 'AUD', - 'CAD', - 'CHF', - 'CZK', - 'DKK', - 'EUR', - 'GBP', - 'HKD', - 'HUF', - 'JPY', - 'NOK', - 'NZD', - 'PLN', - 'SEK', - 'SGD', - 'USD', - ), - ); + private $allowed_country_currency_matrix; /** * Which countries support which credit cards. Empty credit card arrays mean no restriction on - * currency. Otherwise only the currencies in the array are supported. + * currency. * * @var array */ - private $country_card_matrix = array( - 'AU' => array( - 'mastercard' => array(), - 'visa' => array(), - ), - 'ES' => array( - 'mastercard' => array(), - 'visa' => array(), - 'amex' => array( 'EUR' ), - ), - 'FR' => array( - 'mastercard' => array(), - 'visa' => array(), - 'amex' => array( 'EUR' ), - ), - 'GB' => array( - 'mastercard' => array(), - 'visa' => array(), - 'amex' => array( 'GBP', 'USD' ), - ), - 'IT' => array( - 'mastercard' => array(), - 'visa' => array(), - 'amex' => array( 'EUR' ), - ), - 'US' => array( - 'mastercard' => array(), - 'visa' => array(), - 'amex' => array( 'USD' ), - 'discover' => array( 'USD' ), - ), - 'CA' => array( - 'mastercard' => array(), - 'visa' => array(), - 'amex' => array( 'CAD' ), - 'jcb' => array( 'CAD' ), - ), - ); + private $country_card_matrix; /** * 3-letter currency code of the shop. @@ -200,12 +46,22 @@ class DccApplies { /** * DccApplies constructor. * + * @param array $allowed_country_currency_matrix The matrix which countries and currency combinations can be used for DCC. + * @param array $country_card_matrix Which countries support which credit cards. Empty credit card arrays mean no restriction on + * currency. * @param string $currency 3-letter currency code of the shop. * @param string $country 2-letter country code of the shop. */ - public function __construct( string $currency, string $country ) { - $this->currency = $currency; - $this->country = $country; + public function __construct( + array $allowed_country_currency_matrix, + array $country_card_matrix, + string $currency, + string $country + ) { + $this->allowed_country_currency_matrix = $allowed_country_currency_matrix; + $this->country_card_matrix = $country_card_matrix; + $this->currency = $currency; + $this->country = $country; } /**