/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Taxes/Controller.php
PHP | 327 lines | 223 code | 25 blank | 79 comment | 4 complexity | c2e93227466b4554383e81ff5630be06 MD5 | raw file
- <?php
- /**
- * REST API Reports taxes controller
- *
- * Handles requests to the /reports/taxes endpoint.
- */
- namespace Automattic\WooCommerce\Admin\API\Reports\Taxes;
- defined( 'ABSPATH' ) || exit;
- use \Automattic\WooCommerce\Admin\API\Reports\ExportableInterface;
- use \Automattic\WooCommerce\Admin\API\Reports\ExportableTraits;
- /**
- * REST API Reports taxes controller class.
- *
- * @extends WC_REST_Reports_Controller
- */
- class Controller extends \WC_REST_Reports_Controller implements ExportableInterface {
- /**
- * Exportable traits.
- */
- use ExportableTraits;
- /**
- * Endpoint namespace.
- *
- * @var string
- */
- protected $namespace = 'wc-analytics';
- /**
- * Route base.
- *
- * @var string
- */
- protected $rest_base = 'reports/taxes';
- /**
- * 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['page'] = $request['page'];
- $args['per_page'] = $request['per_page'];
- $args['orderby'] = $request['orderby'];
- $args['order'] = $request['order'];
- $args['taxes'] = $request['taxes'];
- 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();
- $data = array();
- foreach ( $report_data->data as $tax_data ) {
- $item = $this->prepare_item_for_response( (object) $tax_data, $request );
- $data[] = $this->prepare_response_for_collection( $item );
- }
- $response = rest_ensure_response( $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 ) {
- $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $report = $this->add_additional_fields_to_object( $report, $request );
- $report = $this->filter_response_by_context( $report, $context );
- // Wrap the data in a response object.
- $response = rest_ensure_response( $report );
- $response->add_links( $this->prepare_links( $report ) );
- /**
- * 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', $response, $report, $request );
- }
- /**
- * Prepare links for the request.
- *
- * @param WC_Reports_Query $object Object data.
- * @return array
- */
- protected function prepare_links( $object ) {
- $links = array(
- 'tax' => array(
- 'href' => rest_url( sprintf( '/%s/taxes/%d', $this->namespace, $object->tax_rate_id ) ),
- ),
- );
- return $links;
- }
- /**
- * Get the Report's schema, conforming to JSON Schema.
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => 'report_taxes',
- 'type' => 'object',
- 'properties' => array(
- 'tax_rate_id' => array(
- 'description' => __( 'Tax rate ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'name' => array(
- 'description' => __( 'Tax rate name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'tax_rate' => array(
- 'description' => __( 'Tax rate.', 'woocommerce' ),
- 'type' => 'number',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'country' => array(
- 'description' => __( 'Country / Region.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'state' => array(
- 'description' => __( 'State.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'priority' => array(
- 'description' => __( 'Priority.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total_tax' => array(
- 'description' => __( 'Total tax.', 'woocommerce' ),
- 'type' => 'number',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'order_tax' => array(
- 'description' => __( 'Order tax.', 'woocommerce' ),
- 'type' => 'number',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'shipping_tax' => array(
- 'description' => __( 'Shipping tax.', 'woocommerce' ),
- 'type' => 'number',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'orders_count' => array(
- 'description' => __( 'Number of orders.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- ),
- );
- 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' => 'tax_rate_id',
- 'enum' => array(
- 'name',
- 'tax_rate_id',
- 'tax_code',
- 'rate',
- 'order_tax',
- 'total_tax',
- 'shipping_tax',
- 'orders_count',
- ),
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['taxes'] = array(
- 'description' => __( 'Limit result set to items assigned one or more tax rates.', 'woocommerce' ),
- 'type' => 'array',
- 'sanitize_callback' => 'wp_parse_id_list',
- 'validate_callback' => 'rest_validate_request_arg',
- 'items' => array(
- 'type' => 'string',
- ),
- );
- return $params;
- }
- /**
- * Get the column names for export.
- *
- * @return array Key value pair of Column ID => Label.
- */
- public function get_export_columns() {
- return array(
- 'tax_code' => __( 'Tax code', 'woocommerce' ),
- 'rate' => __( 'Rate', 'woocommerce' ),
- 'total_tax' => __( 'Total tax', 'woocommerce' ),
- 'order_tax' => __( 'Order tax', 'woocommerce' ),
- 'shipping_tax' => __( 'Shipping tax', 'woocommerce' ),
- 'orders_count' => __( 'Orders', 'woocommerce' ),
- );
- }
- /**
- * Get the column values for export.
- *
- * @param array $item Single report item/row.
- * @return array Key value pair of Column ID => Row Value.
- */
- public function prepare_item_for_export( $item ) {
- return array(
- 'tax_code' => \WC_Tax::get_rate_code( $item['tax_rate_id'] ),
- 'rate' => $item['tax_rate'],
- 'total_tax' => self::csv_number_format( $item['total_tax'] ),
- 'order_tax' => self::csv_number_format( $item['order_tax'] ),
- 'shipping_tax' => self::csv_number_format( $item['shipping_tax'] ),
- 'orders_count' => $item['orders_count'],
- );
- }
- }