<?php if ( ! class_exists( 'WC_Connect_Label_Reports' ) ) { include_once WC()->plugin_path() . '/includes/admin/reports/class-wc-admin-report.php'; class WC_Connect_Label_Reports extends WC_Admin_Report { const LABELS_TRANSIENT_KEY = 'wcs_label_reports'; /** * @var WC_Connect_Service_Settings_Store */ protected $settings_store; public function __construct( WC_Connect_Service_Settings_Store $settings_store ) { $this->settings_store = $settings_store; } public function get_export_button() { $current_range = ! empty( $_GET['range'] ) ? sanitize_text_field( $_GET['range'] ) : '7day'; ?> <a href="#" download="report-shipping-labels-<?php echo esc_attr( $current_range ); ?>-<?php echo esc_html( date_i18n( 'Y-m-d', current_time( 'timestamp' ) ) ); ?>.csv" class="export_csv" data-export="table" > <?php esc_html_e( 'Export CSV', 'woocommerce-services' ); ?> </a> <?php } private function compare_label_dates_desc( $label_a, $label_b ) { return $label_b['created'] - $label_a['created']; } private function get_all_labels() { global $wpdb; $query = "SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = 'wc_connect_labels'"; $db_results = $wpdb->get_results( $query ); $results = array(); foreach ( $db_results as $meta ) { $labels = maybe_unserialize( $meta->meta_value ); if ( ! is_array( $labels ) ) { $labels = $this->settings_store->try_deserialize_labels_json( $meta->meta_value ); } if ( empty( $labels ) ) { continue; } foreach ( $labels as $label ) { $results[] = array_merge( $label, array( 'order_id' => $meta->post_id ) ); } } usort( $results, array( $this, 'compare_label_dates_desc' ) ); return $results; } private function query_labels() { $all_labels = get_transient( self::LABELS_TRANSIENT_KEY ); if ( false === $all_labels ) { $all_labels = $this->get_all_labels(); // set transient with ttl of 30 minutes set_transient( self::LABELS_TRANSIENT_KEY, $all_labels, 1800 ); } // translate timestamps to JS timestapms $start_date = $this->start_date * 1000; $end_date = $this->end_date * 1000; $results = array(); foreach ( $all_labels as $label ) { $created = $label['created']; if ( $created > $end_date ) { continue; } // labels are sorted in descending order, so if we reached the end, break the loop if ( $created < $start_date ) { break; } if ( isset( $label['error'] ) || // ignore the error labels ! isset( $label['rate'] ) ) { // labels where purchase hasn't completed for any reason continue; } // ignore labels with complete refunds if ( isset( $label['refund'] ) ) { $refund = (array) $label['refund']; if ( isset( $refund['status'] ) && 'completed' === $refund['status'] ) { continue; } } $results[] = $label; } return $results; } public function output_report() { $ranges = array( 'year' => __( 'Year', 'woocommerce-services' ), 'last_month' => __( 'Last month', 'woocommerce-services' ), 'month' => __( 'This month', 'woocommerce-services' ), '7day' => __( 'Last 7 days', 'woocommerce-services' ), ); $current_range = ! empty( $_GET['range'] ) ? sanitize_text_field( $_GET['range'] ) : '7day'; if ( ! in_array( $current_range, array( 'custom', 'year', 'last_month', 'month', '7day' ) ) ) { $current_range = '7day'; } $this->check_current_range_nonce( $current_range ); $this->calculate_current_range( $current_range ); $hide_sidebar = true; include WC()->plugin_path() . '/includes/admin/views/html-report-by-date.php'; } private function get_edit_order_link( $post_id ) { $order = wc_get_order( $post_id ); if ( ! is_a( $order, 'WC_Order' ) ) { return null; } return '<a href="' . $order->get_edit_order_url() . '">' . $order->get_order_number() . '</a>'; } private function get_label_refund_status( $label ) { if ( ! isset( $label['refund'] ) ) { return ''; } $refund = (array) $label['refund']; if ( isset( $refund['status'] ) && ( 'rejected' === $refund['status'] || 'complete' === $refund['status'] ) ) { return ''; } return __( 'Requested', 'woocommerce-services' ); } /** * Get the main chart. */ public function get_main_chart() { $labels = $this->query_labels(); ?> <table class="widefat"> <thead> <tr> <th> <?php esc_html_e( 'Time', 'woocommerce-services' ); ?> </th> <th> <?php esc_html_e( 'Order', 'woocommerce-services' ); ?> </th> <th> <?php esc_html_e( 'Price', 'woocommerce-services' ); ?> </th> <th> <?php esc_html_e( 'Service', 'woocommerce-services' ); ?> </th> <th> <?php esc_html_e( 'Refund', 'woocommerce-services' ); ?> </th> </tr> </thead> <?php if ( ! empty( $labels ) ) : ?> <tbody> <?php foreach ( $labels as $label ) : ?> <tr> <th scope="row"> <?php echo esc_html( get_date_from_gmt( date( 'Y-m-d H:i:s', $label['created'] / 1000 ) ) ); ?> </th> <td> <?php echo wp_kses( $this->get_edit_order_link( $label['order_id'] ), array( 'a' => array( 'href' => array(), ), ) ); ?> </td> <td> <?php echo wp_kses_post( wc_price( $label['rate'] ) ); ?> </td> <td> <?php echo esc_html( $label['service_name'] ); ?> </td> <td> <?php echo esc_html( $this->get_label_refund_status( $label ) ); ?> </td> </tr> <?php endforeach; ?> </tbody> <tfoot> <?php $total = array_sum( wp_list_pluck( $labels, 'rate' ) ); ?> <tr> <th scope="row"> <?php esc_html_e( 'Total', 'woocommerce-services' ); ?> </th> <th> <?php echo count( $labels ); ?> </th> <th> <?php echo wp_kses_post( wc_price( $total ) ); ?> </th> <th></th> <th></th> </tr> <?php else : ?> <tbody> <tr> <td><?php esc_html_e( 'No labels found for this period', 'woocommerce-services' ); ?></td> </tr> </tbody> <?php endif; ?> </table> <?php } } }