woocommerce-paypal-payments/modules/ppcp-order-tracking/src/OrderTrackingModule.php

150 lines
3.9 KiB
PHP
Raw Normal View History

2022-08-11 14:22:16 +04:00
<?php
/**
* The order tracking module.
*
* @package WooCommerce\PayPalCommerce\OrderTracking
*/
declare(strict_types=1);
namespace WooCommerce\PayPalCommerce\OrderTracking;
use Dhii\Container\ServiceProvider;
use Dhii\Modular\Module\ModuleInterface;
2022-08-11 17:37:09 +04:00
use Exception;
2022-08-11 14:22:16 +04:00
use Interop\Container\ServiceProviderInterface;
use Psr\Container\ContainerInterface;
2022-08-11 17:37:09 +04:00
use Psr\Log\LoggerInterface;
2022-08-11 14:22:16 +04:00
use WC_Order;
use WooCommerce\PayPalCommerce\OrderTracking\Assets\OrderEditPageAssets;
use WooCommerce\PayPalCommerce\OrderTracking\Endpoint\OrderTrackingEndpoint;
use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException;
use WooCommerce\PayPalCommerce\WcGateway\Helper\PayUponInvoiceHelper;
use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
2022-08-16 16:49:16 +04:00
use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsListener;
2022-08-11 14:22:16 +04:00
/**
* Class OrderTrackingModule
*/
class OrderTrackingModule implements ModuleInterface {
2022-08-11 17:37:09 +04:00
/**
* {@inheritDoc}
*/
public function setup(): ServiceProviderInterface {
return new ServiceProvider(
require __DIR__ . '/../services.php',
require __DIR__ . '/../extensions.php'
);
}
/**
* {@inheritDoc}
*
* @param ContainerInterface $c A services container instance.
* @throws NotFoundException
2022-08-11 17:37:09 +04:00
*/
public function run( ContainerInterface $c ): void {
$settings = $c->get( 'wcgateway.settings' );
2022-08-17 19:06:20 +04:00
assert( $settings instanceof Settings );
$pui_helper = $c->get( 'wcgateway.pay-upon-invoice-helper' );
2022-08-17 19:06:20 +04:00
assert( $pui_helper instanceof PayUponInvoiceHelper );
if ( $pui_helper->is_pui_enabled() ) {
$settings->set( 'tracking_enabled', true );
$settings->persist();
}
2022-08-11 17:37:09 +04:00
$tracking_enabled = $settings->has( 'tracking_enabled' ) && $settings->get( 'tracking_enabled' );
if ( ! $tracking_enabled ) {
return;
}
$asset_loader = $c->get( 'order-tracking.assets' );
assert( $asset_loader instanceof OrderEditPageAssets );
$is_paypal_order_edit_page = $c->get( 'order-tracking.is-paypal-order-edit-page' );
$endpoint = $c->get( 'order-tracking.endpoint.controller' );
2022-08-17 19:06:20 +04:00
assert( $endpoint instanceof OrderTrackingEndpoint );
2022-08-11 17:37:09 +04:00
$logger = $c->get( 'woocommerce.logger.woocommerce' );
2022-08-17 19:06:20 +04:00
assert( $logger instanceof LoggerInterface );
2022-08-11 17:37:09 +04:00
add_action(
'init',
static function () use ( $asset_loader, $is_paypal_order_edit_page ) {
if ( ! $is_paypal_order_edit_page ) {
return;
}
$asset_loader->register();
}
);
add_action(
'admin_enqueue_scripts',
static function () use ( $asset_loader, $is_paypal_order_edit_page ) {
if ( ! $is_paypal_order_edit_page ) {
return;
}
$asset_loader->enqueue();
}
);
add_action(
'wc_ajax_' . OrderTrackingEndpoint::ENDPOINT,
array( $endpoint, 'handle_request' )
);
$meta_box_renderer = $c->get( 'order-tracking.meta-box.renderer' );
add_action(
'add_meta_boxes',
static function() use ( $meta_box_renderer, $is_paypal_order_edit_page ) {
if ( ! $is_paypal_order_edit_page ) {
return;
}
add_meta_box( 'ppcp_order-tracking', __( 'Tracking Information', 'woocommerce-paypal-payments' ), array( $meta_box_renderer, 'render' ), 'shop_order', 'side' );
},
10,
2
);
add_action(
'woocommerce_order_status_completed',
static function( int $order_id ) use ( $endpoint, $logger ) {
$tracking_information = $endpoint->get_tracking_information( $order_id );
if ( $tracking_information ) {
2022-08-11 17:37:09 +04:00
return;
}
2022-08-16 18:46:17 +04:00
$wc_order = wc_get_order( $order_id );
if ( ! is_a( $wc_order, WC_Order::class ) ) {
return;
}
2022-08-11 17:37:09 +04:00
$transaction_id = $wc_order->get_transaction_id();
2022-08-16 18:46:17 +04:00
if ( empty( $transaction_id ) ) {
2022-08-11 17:37:09 +04:00
return;
}
$tracking_data = array(
'transaction_id' => $transaction_id,
'status' => 'SHIPPED',
);
try {
$endpoint->add_tracking_information( $tracking_data, $order_id );
} catch ( Exception $exception ) {
$logger->error( "Couldn't create tracking information: " . $exception->getMessage() );
throw $exception;
}
}
);
}
2022-08-11 14:22:16 +04:00
}