diff --git a/composer.json b/composer.json index d4b023872..374752e19 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,8 @@ "dhii/containers": "v0.1.0-alpha1", "dhii/wp-containers": "v0.1.0-alpha1", "psr/log": "^1.1", - "ext-json": "*" + "ext-json": "*", + "ralouphie/getallheaders": "^3.0" }, "require-dev": { "woocommerce/woocommerce-sniffs": "^0.1.0", diff --git a/modules/ppcp-admin-notices/services.php b/modules/ppcp-admin-notices/services.php index e72ae5aeb..6dd3931fc 100644 --- a/modules/ppcp-admin-notices/services.php +++ b/modules/ppcp-admin-notices/services.php @@ -7,21 +7,13 @@ declare(strict_types=1); -namespace WooCommerce\PayPalCommerce\Button; +namespace WooCommerce\PayPalCommerce\AdminNotices; use Dhii\Data\Container\ContainerInterface; use WooCommerce\PayPalCommerce\AdminNotices\Renderer\Renderer; use WooCommerce\PayPalCommerce\AdminNotices\Renderer\RendererInterface; use WooCommerce\PayPalCommerce\AdminNotices\Repository\Repository; use WooCommerce\PayPalCommerce\AdminNotices\Repository\RepositoryInterface; -use WooCommerce\PayPalCommerce\Button\Assets\DisabledSmartButton; -use WooCommerce\PayPalCommerce\Button\Assets\SmartButton; -use WooCommerce\PayPalCommerce\Button\Assets\SmartButtonInterface; -use WooCommerce\PayPalCommerce\Button\Endpoint\ApproveOrderEndpoint; -use WooCommerce\PayPalCommerce\Button\Endpoint\ChangeCartEndpoint; -use WooCommerce\PayPalCommerce\Button\Endpoint\CreateOrderEndpoint; -use WooCommerce\PayPalCommerce\Button\Endpoint\RequestData; -use WooCommerce\PayPalCommerce\Button\Exception\RuntimeException; return array( 'admin-notices.renderer' => static function ( $container ): RendererInterface { diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index 8a0a1a39f..890e4f05e 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -15,6 +15,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache; use WooCommerce\PayPalCommerce\Onboarding\State; use WooCommerce\PayPalCommerce\WcGateway\Admin\OrderTablePaymentStatusColumn; use WooCommerce\PayPalCommerce\WcGateway\Admin\PaymentStatusOrderDetail; +use WooCommerce\PayPalCommerce\WcGateway\Admin\RenderAuthorizeAction; use WooCommerce\PayPalCommerce\WcGateway\Checkout\CheckoutPayPalAddressPreset; use WooCommerce\PayPalCommerce\WcGateway\Checkout\DisableGateways; use WooCommerce\PayPalCommerce\WcGateway\Endpoint\ReturnUrlEndpoint; @@ -137,6 +138,10 @@ return array( $payments_endpoint = $container->get( 'api.endpoint.payments' ); return new AuthorizedPaymentsProcessor( $order_endpoint, $payments_endpoint ); }, + 'wcgateway.admin.render-authorize-action' => static function ( $container ): RenderAuthorizeAction { + + return new RenderAuthorizeAction(); + }, 'wcgateway.admin.order-payment-status' => static function ( $container ): PaymentStatusOrderDetail { return new PaymentStatusOrderDetail(); }, diff --git a/modules/ppcp-wc-gateway/src/Admin/class-renderauthorizeaction.php b/modules/ppcp-wc-gateway/src/Admin/class-renderauthorizeaction.php new file mode 100644 index 000000000..ccafac8e4 --- /dev/null +++ b/modules/ppcp-wc-gateway/src/Admin/class-renderauthorizeaction.php @@ -0,0 +1,51 @@ +should_render_for_order( $wc_order ) ) { + return $order_actions; + } + + $order_actions['ppcp_authorize_order'] = esc_html__( + 'Capture authorized PayPal payment', + 'paypal-payments-for-woocommerce' + ); + return $order_actions; + } + + /** + * Whether the action should be rendered for a certain WooCommerce order. + * + * @param \WC_Order $order The Woocommerce order. + * + * @return bool + */ + private function should_render_for_order( \WC_Order $order ) : bool { + $data = $order->get_meta( PayPalGateway::CAPTURED_META_KEY ); + return in_array( $data, array( 'true', 'false' ), true ); + } +} diff --git a/modules/ppcp-wc-gateway/src/Checkout/class-disablegateways.php b/modules/ppcp-wc-gateway/src/Checkout/class-disablegateways.php index bc4064868..46e4eeb89 100644 --- a/modules/ppcp-wc-gateway/src/Checkout/class-disablegateways.php +++ b/modules/ppcp-wc-gateway/src/Checkout/class-disablegateways.php @@ -60,10 +60,7 @@ class DisableGateways { if ( ! isset( $methods[ PayPalGateway::ID ] ) && ! isset( $methods[ CreditCardGateway::ID ] ) ) { return $methods; } - if ( - ! $this->settings->has( 'merchant_email' ) - || ! is_email( $this->settings->get( 'merchant_email' ) ) - ) { + if ( $this->disable_both_gateways() ) { unset( $methods[ PayPalGateway::ID ] ); unset( $methods[ CreditCardGateway::ID ] ); return $methods; @@ -87,6 +84,22 @@ class DisableGateways { return array( PayPalGateway::ID => $methods[ PayPalGateway::ID ] ); } + /** + * Whether both gateways should be disabled or not. + * + * @return bool + */ + private function disable_both_gateways() : bool { + if ( ! $this->settings->has( 'enabled' ) || ! $this->settings->get( 'enabled' ) ) { + return true; + } + if ( ! $this->settings->has( 'merchant_email' ) || ! is_email( $this->settings->get( 'merchant_email' ) ) ) { + return true; + } + + return false; + } + /** * Whether the Gateways need to be disabled. When we come to the checkout with a running PayPal * session, we need to disable the other Gateways, so the customer can smoothly sail through the diff --git a/modules/ppcp-wc-gateway/src/class-wcgatewaymodule.php b/modules/ppcp-wc-gateway/src/class-wcgatewaymodule.php index 374ce0bd2..8a4555246 100644 --- a/modules/ppcp-wc-gateway/src/class-wcgatewaymodule.php +++ b/modules/ppcp-wc-gateway/src/class-wcgatewaymodule.php @@ -16,6 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies; use WooCommerce\PayPalCommerce\ApiClient\Repository\PayPalRequestIdRepository; use WooCommerce\PayPalCommerce\WcGateway\Admin\OrderTablePaymentStatusColumn; use WooCommerce\PayPalCommerce\WcGateway\Admin\PaymentStatusOrderDetail; +use WooCommerce\PayPalCommerce\WcGateway\Admin\RenderAuthorizeAction; use WooCommerce\PayPalCommerce\WcGateway\Checkout\CheckoutPayPalAddressPreset; use WooCommerce\PayPalCommerce\WcGateway\Checkout\DisableGateways; use WooCommerce\PayPalCommerce\WcGateway\Endpoint\ReturnUrlEndpoint; @@ -257,12 +258,20 @@ class WcGatewayModule implements ModuleInterface { private function register_order_functionality( ContainerInterface $container ) { add_filter( 'woocommerce_order_actions', - static function ( $order_actions ): array { - $order_actions['ppcp_authorize_order'] = __( - 'Capture authorized PayPal payment', - 'paypal-payments-for-woocommerce' - ); - return $order_actions; + static function ( $order_actions ) use ( $container ): array { + global $theorder; + + if ( ! is_a( $theorder, \WC_Order::class ) ) { + return $order_actions; + } + + $render = $container->get( 'wcgateway.admin.render-authorize-action' ); + /** + * Renders the authorize action in the select field. + * + * @var RenderAuthorizeAction $render + */ + return $render->render( $order_actions, $theorder ); } );