Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 42
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
Export
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 2
30
0.00% covered (danger)
0.00%
0 / 1
 configure
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 init
0.00% covered (danger)
0.00%
0 / 40
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2/**
3 * Report export bootstrap.
4 *
5 * Hand-wires the CSV export subsystem (no DI container) and registers it, gated on
6 * WooCommerce being active and Jetpack being connected. The data source is the package's
7 * own analytics proxy (see Report_Data_Fetcher).
8 *
9 * @package Automattic\Jetpack\PremiumAnalytics\Reports\Export
10 */
11
12declare( strict_types=1 );
13
14namespace Automattic\Jetpack\PremiumAnalytics\Reports\Export;
15
16use Automattic\Jetpack\Connection\Manager;
17use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Average_Items_Per_Order_Controller;
18use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Average_Order_Value_Controller;
19use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Conversion_Rate_Over_Time_Controller;
20use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Coupon_Use_Over_Time_Controller;
21use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Gross_Sales_Over_Time_Controller;
22use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Net_Sales_Over_Time_Controller;
23use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Orders_Fulfilled_Over_Time_Controller;
24use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Orders_Over_Time_Controller;
25use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Refunds_Over_Time_Controller;
26use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Revenue_By_Customer_Type_Controller;
27use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Sales_By_Campaign_Controller;
28use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Sales_By_Channel_Controller;
29use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Sales_By_Coupon_Controller;
30use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Sales_By_Device_Controller;
31use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Sales_By_Source_Controller;
32use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Sessions_By_Device_Controller;
33use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Sessions_By_Location_Controller;
34use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Tax_Rate_Breakdown_Controller;
35use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Taxes_Over_Time_Controller;
36use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Top_Performing_Products_Controller;
37use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Exports\Visitors_Over_Time_Controller;
38use Automattic\Jetpack\PremiumAnalytics\Reports\Export\Logging\Debug_Logger;
39
40defined( 'ABSPATH' ) || exit;
41
42/**
43 * Wires up and registers the report export subsystem.
44 *
45 * @since $$next-version$$
46 */
47class Export {
48
49    const SLUG = 'jetpack-premium-analytics';
50
51    /**
52     * Whether the subsystem has been wired up.
53     *
54     * @var bool
55     */
56    private static $initialized = false;
57
58    /**
59     * Hook the bootstrap on `woocommerce_init` so it only runs when WooCommerce is active
60     * (which also guarantees Action Scheduler and the WC_Email base class are available).
61     *
62     * @return void
63     */
64    public static function configure(): void {
65        add_action( 'woocommerce_init', array( self::class, 'init' ) );
66    }
67
68    /**
69     * Hand-wire the export services and register them. No-op unless Jetpack is connected.
70     *
71     * @return void
72     */
73    public static function init(): void {
74        if ( self::$initialized ) {
75            return;
76        }
77
78        // Gate on a live Jetpack connection; the proxy data source requires it.
79        if ( ! ( new Manager( self::SLUG ) )->is_connected() ) {
80            return;
81        }
82
83        self::$initialized = true;
84
85        $logger     = new Debug_Logger( \wc_get_logger() );
86        $registry   = new Report_Registry();
87        $fetcher    = new Report_Data_Fetcher( $logger );
88        $generator  = new Report_Csv_Generator( $logger );
89        $email      = new Csv_Export_Email( $logger );
90        $scheduler  = new Csv_Export_Scheduler( $registry, $fetcher, $generator, $email, $logger );
91        $controller = new Csv_Export_Controller( $registry, $fetcher, $generator, $scheduler, $logger );
92
93        // Registrable_Interface implementers: hook their routes / actions / email class.
94        $controller->register();
95        $scheduler->register();
96        $email->register();
97
98        // Report-type controllers self-register into the Report_Registry on register().
99        // Ported faithfully from woocommerce/woocommerce-analytics (develop).
100        $report_controllers = array(
101            Average_Items_Per_Order_Controller::class,
102            Average_Order_Value_Controller::class,
103            Conversion_Rate_Over_Time_Controller::class,
104            Coupon_Use_Over_Time_Controller::class,
105            Gross_Sales_Over_Time_Controller::class,
106            Net_Sales_Over_Time_Controller::class,
107            Orders_Fulfilled_Over_Time_Controller::class,
108            Orders_Over_Time_Controller::class,
109            Refunds_Over_Time_Controller::class,
110            Revenue_By_Customer_Type_Controller::class,
111            Sales_By_Campaign_Controller::class,
112            Sales_By_Channel_Controller::class,
113            Sales_By_Coupon_Controller::class,
114            Sales_By_Device_Controller::class,
115            Sales_By_Source_Controller::class,
116            Sessions_By_Device_Controller::class,
117            Sessions_By_Location_Controller::class,
118            Taxes_Over_Time_Controller::class,
119            Tax_Rate_Breakdown_Controller::class,
120            Top_Performing_Products_Controller::class,
121            Visitors_Over_Time_Controller::class,
122        );
123
124        foreach ( $report_controllers as $report_controller ) {
125            ( new $report_controller( $registry ) )->register();
126        }
127    }
128}