/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Taxes/Stats/Controller.php
PHP | 400 lines | 306 code | 26 blank | 68 comment | 5 complexity | 5a6687071b4edb80497b5ddb90a6fb47 MD5 | raw file
- <?php
- /**
- * REST API Reports taxes stats controller
- *
- * Handles requests to the /reports/taxes/stats endpoint.
- */
- namespace Automattic\WooCommerce\Admin\API\Reports\Taxes\Stats;
- defined( 'ABSPATH' ) || exit;
- /**
- * REST API Reports taxes stats controller class.
- *
- * @extends WC_REST_Reports_Controller
- */
- class Controller extends \WC_REST_Reports_Controller {
- /**
- * Endpoint namespace.
- *
- * @var string
- */
- protected $namespace = 'wc-analytics';
- /**
- * Route base.
- *
- * @var string
- */
- protected $rest_base = 'reports/taxes/stats';
- /**
- * Constructor.
- */
- public function __construct() {
- add_filter( 'woocommerce_analytics_taxes_stats_select_query', array( $this, 'set_default_report_data' ) );
- }
- /**
- * Set the default results to 0 if API returns an empty array
- *
- * @param Mixed $results Report data.
- * @return object
- */
- public function set_default_report_data( $results ) {
- if ( empty( $results ) ) {
- $results = new \stdClass();
- $results->total = 0;
- $results->totals = new \stdClass();
- $results->totals->tax_codes = 0;
- $results->totals->total_tax = 0;
- $results->totals->order_tax = 0;
- $results->totals->shipping_tax = 0;
- $results->totals->orders = 0;
- $results->intervals = array();
- $results->pages = 1;
- $results->page_no = 1;
- }
- return $results;
- }
- /**
- * Maps query arguments from the REST request.
- *
- * @param array $request Request array.
- * @return array
- */
- protected function prepare_reports_query( $request ) {
- $args = array();
- $args['before'] = $request['before'];
- $args['after'] = $request['after'];
- $args['interval'] = $request['interval'];
- $args['page'] = $request['page'];
- $args['per_page'] = $request['per_page'];
- $args['orderby'] = $request['orderby'];
- $args['order'] = $request['order'];
- $args['taxes'] = (array) $request['taxes'];
- $args['segmentby'] = $request['segmentby'];
- $args['fields'] = $request['fields'];
- return $args;
- }
- /**
- * Get all reports.
- *
- * @param WP_REST_Request $request Request data.
- * @return array|WP_Error
- */
- public function get_items( $request ) {
- $query_args = $this->prepare_reports_query( $request );
- $taxes_query = new Query( $query_args );
- $report_data = $taxes_query->get_data();
- $out_data = array(
- 'totals' => get_object_vars( $report_data->totals ),
- 'intervals' => array(),
- );
- foreach ( $report_data->intervals as $interval_data ) {
- $item = $this->prepare_item_for_response( (object) $interval_data, $request );
- $out_data['intervals'][] = $this->prepare_response_for_collection( $item );
- }
- $response = rest_ensure_response( $out_data );
- $response->header( 'X-WP-Total', (int) $report_data->total );
- $response->header( 'X-WP-TotalPages', (int) $report_data->pages );
- $page = $report_data->page_no;
- $max_pages = $report_data->pages;
- $base = add_query_arg( $request->get_query_params(), rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ) );
- if ( $page > 1 ) {
- $prev_page = $page - 1;
- if ( $prev_page > $max_pages ) {
- $prev_page = $max_pages;
- }
- $prev_link = add_query_arg( 'page', $prev_page, $base );
- $response->link_header( 'prev', $prev_link );
- }
- if ( $max_pages > $page ) {
- $next_page = $page + 1;
- $next_link = add_query_arg( 'page', $next_page, $base );
- $response->link_header( 'next', $next_link );
- }
- return $response;
- }
- /**
- * Prepare a report object for serialization.
- *
- * @param stdClass $report Report data.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response
- */
- public function prepare_item_for_response( $report, $request ) {
- $data = get_object_vars( $report );
- $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
- // Wrap the data in a response object.
- $response = rest_ensure_response( $data );
- /**
- * Filter a report returned from the API.
- *
- * Allows modification of the report data right before it is returned.
- *
- * @param WP_REST_Response $response The response object.
- * @param object $report The original report object.
- * @param WP_REST_Request $request Request used to generate the response.
- */
- return apply_filters( 'woocommerce_rest_prepare_report_taxes_stats', $response, $report, $request );
- }
- /**
- * Get the Report's schema, conforming to JSON Schema.
- *
- * @return array
- */
- public function get_item_schema() {
- $data_values = array(
- 'total_tax' => array(
- 'description' => __( 'Total tax.', 'woocommerce' ),
- 'type' => 'number',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'indicator' => true,
- 'format' => 'currency',
- ),
- 'order_tax' => array(
- 'description' => __( 'Order tax.', 'woocommerce' ),
- 'type' => 'number',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'indicator' => true,
- 'format' => 'currency',
- ),
- 'shipping_tax' => array(
- 'description' => __( 'Shipping tax.', 'woocommerce' ),
- 'type' => 'number',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'indicator' => true,
- 'format' => 'currency',
- ),
- 'orders_count' => array(
- 'description' => __( 'Number of orders.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'tax_codes' => array(
- 'description' => __( 'Amount of tax codes.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- );
- $segments = array(
- 'segments' => array(
- 'description' => __( 'Reports data grouped by segment condition.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'segment_id' => array(
- 'description' => __( 'Segment identificator.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'subtotals' => array(
- 'description' => __( 'Interval subtotals.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'properties' => $data_values,
- ),
- ),
- ),
- ),
- );
- $totals = array_merge( $data_values, $segments );
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => 'report_taxes_stats',
- 'type' => 'object',
- 'properties' => array(
- 'totals' => array(
- 'description' => __( 'Totals data.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'properties' => $totals,
- ),
- 'intervals' => array(
- 'description' => __( 'Reports data grouped by intervals.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'interval' => array(
- 'description' => __( 'Type of interval.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'enum' => array( 'day', 'week', 'month', 'year' ),
- ),
- 'date_start' => array(
- 'description' => __( "The date the report start, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_start_gmt' => array(
- 'description' => __( 'The date the report start, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_end' => array(
- 'description' => __( "The date the report end, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_end_gmt' => array(
- 'description' => __( 'The date the report end, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'subtotals' => array(
- 'description' => __( 'Interval subtotals.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'properties' => $totals,
- ),
- ),
- ),
- ),
- ),
- );
- return $this->add_additional_fields_schema( $schema );
- }
- /**
- * Get the query params for collections.
- *
- * @return array
- */
- public function get_collection_params() {
- $params = array();
- $params['context'] = $this->get_context_param( array( 'default' => 'view' ) );
- $params['page'] = array(
- 'description' => __( 'Current page of the collection.', 'woocommerce' ),
- 'type' => 'integer',
- 'default' => 1,
- 'sanitize_callback' => 'absint',
- 'validate_callback' => 'rest_validate_request_arg',
- 'minimum' => 1,
- );
- $params['per_page'] = array(
- 'description' => __( 'Maximum number of items to be returned in result set.', 'woocommerce' ),
- 'type' => 'integer',
- 'default' => 10,
- 'minimum' => 1,
- 'maximum' => 100,
- 'sanitize_callback' => 'absint',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['after'] = array(
- 'description' => __( 'Limit response to resources published after a given ISO8601 compliant date.', 'woocommerce' ),
- 'type' => 'string',
- 'format' => 'date-time',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['before'] = array(
- 'description' => __( 'Limit response to resources published before a given ISO8601 compliant date.', 'woocommerce' ),
- 'type' => 'string',
- 'format' => 'date-time',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['order'] = array(
- 'description' => __( 'Order sort attribute ascending or descending.', 'woocommerce' ),
- 'type' => 'string',
- 'default' => 'desc',
- 'enum' => array( 'asc', 'desc' ),
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['orderby'] = array(
- 'description' => __( 'Sort collection by object attribute.', 'woocommerce' ),
- 'type' => 'string',
- 'default' => 'date',
- 'enum' => array(
- 'date',
- 'items_sold',
- 'total_sales',
- 'orders_count',
- 'products_count',
- ),
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['interval'] = array(
- 'description' => __( 'Time interval to use for buckets in the returned data.', 'woocommerce' ),
- 'type' => 'string',
- 'default' => 'week',
- 'enum' => array(
- 'hour',
- 'day',
- 'week',
- 'month',
- 'quarter',
- 'year',
- ),
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['taxes'] = array(
- 'description' => __( 'Limit result set to all items that have the specified term assigned in the taxes taxonomy.', 'woocommerce' ),
- 'type' => 'array',
- 'sanitize_callback' => 'wp_parse_id_list',
- 'validate_callback' => 'rest_validate_request_arg',
- 'items' => array(
- 'type' => 'integer',
- ),
- );
- $params['segmentby'] = array(
- 'description' => __( 'Segment the response by additional constraint.', 'woocommerce' ),
- 'type' => 'string',
- 'enum' => array(
- 'tax_rate_id',
- ),
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['fields'] = array(
- 'description' => __( 'Limit stats fields to the specified items.', 'woocommerce' ),
- 'type' => 'array',
- 'sanitize_callback' => 'wp_parse_slug_list',
- 'validate_callback' => 'rest_validate_request_arg',
- 'items' => array(
- 'type' => 'string',
- ),
- );
- return $params;
- }
- }