From 7ea6b37a459fd000b5d9f8bcc8fba835d8ccbe4f Mon Sep 17 00:00:00 2001 From: Narek Zakarian Date: Mon, 16 Oct 2023 16:00:59 +0400 Subject: [PATCH] Add tracking integrations within the compat module. --- modules/ppcp-compat/src/CompatModule.php | 227 +---------------------- 1 file changed, 4 insertions(+), 223 deletions(-) diff --git a/modules/ppcp-compat/src/CompatModule.php b/modules/ppcp-compat/src/CompatModule.php index 790c3edb0..9939a2541 100644 --- a/modules/ppcp-compat/src/CompatModule.php +++ b/modules/ppcp-compat/src/CompatModule.php @@ -124,230 +124,11 @@ class CompatModule implements ModuleInterface { * @return void */ protected function initialize_tracking_compat_layer( ContainerInterface $c ): void { - $is_gzd_active = $c->get( 'compat.gzd.is_supported_plugin_version_active' ); - $is_wc_shipment_tracking_active = $c->get( 'compat.wc_shipment_tracking.is_supported_plugin_version_active' ); - $is_ywot_active = $c->get( 'compat.ywot.is_supported_plugin_version_active' ); + $order_tracking_integrations = $c->get( 'order-tracking.integrations' ); - if ( $is_gzd_active ) { - $this->initialize_gzd_compat_layer( $c ); - } - - if ( $is_wc_shipment_tracking_active ) { - $this->initialize_wc_shipment_tracking_compat_layer( $c ); - } - - if ( $is_ywot_active ) { - $this->initialize_ywot_compat_layer( $c ); - } - } - - /** - * Sets up the Germanized for WooCommerce - * plugin compatibility layer. - * - * @link https://wordpress.org/plugins/woocommerce-germanized/ - * - * @param ContainerInterface $c The Container. - * @return void - */ - protected function initialize_gzd_compat_layer( ContainerInterface $c ): void { - add_action( - 'woocommerce_gzd_shipment_status_shipped', - function( int $shipment_id, Shipment $shipment ) use ( $c ) { - if ( ! apply_filters( 'woocommerce_paypal_payments_sync_gzd_tracking', true ) ) { - return; - } - - $wc_order = $shipment->get_order(); - - if ( ! is_a( $wc_order, WC_Order::class ) ) { - return; - } - - $order_id = $wc_order->get_id(); - $transaction_id = $wc_order->get_transaction_id(); - $tracking_number = $shipment->get_tracking_id(); - $carrier = $shipment->get_shipping_provider(); - $items = array_map( - function ( ShipmentItem $item ): int { - return $item->get_order_item_id(); - }, - $shipment->get_items() - ); - - if ( ! $tracking_number || ! $carrier || ! $transaction_id ) { - return; - } - - $this->create_tracking( $c, $order_id, $transaction_id, $tracking_number, $carrier, $items ); - }, - 500, - 2 - ); - } - - /** - * Sets up the Shipment Tracking - * plugin compatibility layer. - * - * @link https://woocommerce.com/document/shipment-tracking/ - * - * @param ContainerInterface $c The Container. - * @return void - */ - protected function initialize_wc_shipment_tracking_compat_layer( ContainerInterface $c ): void { - add_action( - 'wp_ajax_wc_shipment_tracking_save_form', - function() use ( $c ) { - check_ajax_referer( 'create-tracking-item', 'security', true ); - - if ( ! apply_filters( 'woocommerce_paypal_payments_sync_wc_shipment_tracking', true ) ) { - return; - } - - $order_id = (int) wc_clean( wp_unslash( $_POST['order_id'] ?? '' ) ); - $wc_order = wc_get_order( $order_id ); - if ( ! is_a( $wc_order, WC_Order::class ) ) { - return; - } - - $transaction_id = $wc_order->get_transaction_id(); - $tracking_number = wc_clean( wp_unslash( $_POST['tracking_number'] ?? '' ) ); - $carrier = wc_clean( wp_unslash( $_POST['tracking_provider'] ?? '' ) ); - $carrier_other = wc_clean( wp_unslash( $_POST['custom_tracking_provider'] ?? '' ) ); - $carrier = $carrier ?: $carrier_other ?: ''; - - if ( ! $tracking_number || ! is_string( $tracking_number ) || ! $carrier || ! is_string( $carrier ) || ! $transaction_id ) { - return; - } - - $this->create_tracking( $c, $order_id, $transaction_id, $tracking_number, $carrier, array() ); - } - ); - - add_filter( - 'woocommerce_rest_prepare_order_shipment_tracking', - function( WP_REST_Response $response, array $tracking_item, WP_REST_Request $request ) use ( $c ): WP_REST_Response { - if ( ! apply_filters( 'woocommerce_paypal_payments_sync_wc_shipment_tracking', true ) ) { - return $response; - } - - $callback = $request->get_attributes()['callback']['1'] ?? ''; - if ( $callback !== 'create_item' ) { - return $response; - } - - $order_id = $tracking_item['order_id'] ?? 0; - $wc_order = wc_get_order( $order_id ); - if ( ! is_a( $wc_order, WC_Order::class ) ) { - return $response; - } - - $transaction_id = $wc_order->get_transaction_id(); - $tracking_number = $tracking_item['tracking_number'] ?? ''; - $carrier = $tracking_item['tracking_provider'] ?? ''; - $carrier_other = $tracking_item['custom_tracking_provider'] ?? ''; - $carrier = $carrier ?: $carrier_other ?: ''; - - if ( ! $tracking_number || ! $carrier || ! $transaction_id ) { - return $response; - } - - $this->create_tracking( $c, $order_id, $transaction_id, $tracking_number, $carrier, array() ); - - return $response; - }, - 10, - 3 - ); - } - - /** - * Sets up the YITH WooCommerce Order & Shipment Tracking - * plugin compatibility layer. - * - * @link https://wordpress.org/plugins/yith-woocommerce-order-tracking/ - * - * @param ContainerInterface $c The Container. - * @return void - */ - protected function initialize_ywot_compat_layer( ContainerInterface $c ): void { - add_action( - 'woocommerce_process_shop_order_meta', - function( int $order_id ) use ( $c ) { - if ( ! apply_filters( 'woocommerce_paypal_payments_sync_ywot_tracking', true ) ) { - return; - } - - $wc_order = wc_get_order( $order_id ); - if ( ! is_a( $wc_order, WC_Order::class ) ) { - return; - } - - $transaction_id = $wc_order->get_transaction_id(); - // phpcs:ignore WordPress.Security.NonceVerification.Missing - $tracking_number = wc_clean( wp_unslash( $_POST['ywot_tracking_code'] ?? '' ) ); - // phpcs:ignore WordPress.Security.NonceVerification.Missing - $carrier = wc_clean( wp_unslash( $_POST['ywot_carrier_name'] ?? '' ) ); - - if ( ! $tracking_number || ! is_string( $tracking_number ) || ! $carrier || ! is_string( $carrier ) || ! $transaction_id ) { - return; - } - - $this->create_tracking( $c, $order_id, $transaction_id, $tracking_number, $carrier, array() ); - }, - 500, - 1 - ); - } - - /** - * Creates PayPal tracking. - * - * @param ContainerInterface $c The Container. - * @param int $wc_order_id The WC order ID. - * @param string $transaction_id The transaction ID. - * @param string $tracking_number The tracking number. - * @param string $carrier The shipment carrier. - * @param int[] $line_items The list of shipment line item IDs. - * @return void - */ - protected function create_tracking( - ContainerInterface $c, - int $wc_order_id, - string $transaction_id, - string $tracking_number, - string $carrier, - array $line_items - ) { - $endpoint = $c->get( 'order-tracking.endpoint.controller' ); - assert( $endpoint instanceof OrderTrackingEndpoint ); - - $logger = $c->get( 'woocommerce.logger.woocommerce' ); - assert( $logger instanceof LoggerInterface ); - - $shipment_factory = $c->get( 'order-tracking.shipment.factory' ); - assert( $shipment_factory instanceof ShipmentFactoryInterface ); - - try { - $ppcp_shipment = $shipment_factory->create_shipment( - $wc_order_id, - $transaction_id, - $tracking_number, - 'SHIPPED', - 'OTHER', - $carrier, - $line_items - ); - - $tracking_information = $endpoint->get_tracking_information( $wc_order_id, $tracking_number ); - - $tracking_information - ? $endpoint->update_tracking_information( $ppcp_shipment, $wc_order_id ) - : $endpoint->add_tracking_information( $ppcp_shipment, $wc_order_id ); - - } catch ( Exception $exception ) { - $logger->error( "Couldn't sync tracking information: " . $exception->getMessage() ); + foreach ( $order_tracking_integrations as $integration ) { + assert( $integration instanceof Integration ); + $integration->integrate(); } }