/**
  * Prepare a report sales object for serialization.
  *
  * @param null $_
  * @param WP_REST_Request $request Request object.
  * @return WP_REST_Response $response Response data.
  */
 public function prepare_item_for_response($_, $request)
 {
     // Set date filtering.
     $filter = array('period' => $request['period'], 'date_min' => $request['date_min'], 'date_max' => $request['date_max']);
     $this->setup_report($filter);
     // New customers.
     $users_query = new WP_User_Query(array('fields' => array('user_registered'), 'role' => 'customer'));
     $customers = $users_query->get_results();
     foreach ($customers as $key => $customer) {
         if (strtotime($customer->user_registered) < $this->report->start_date || strtotime($customer->user_registered) > $this->report->end_date) {
             unset($customers[$key]);
         }
     }
     $total_customers = count($customers);
     $report_data = $this->report->get_report_data();
     $period_totals = array();
     // Setup period totals by ensuring each period in the interval has data.
     for ($i = 0; $i <= $this->report->chart_interval; $i++) {
         switch ($this->report->chart_groupby) {
             case 'day':
                 $time = date('Y-m-d', strtotime("+{$i} DAY", $this->report->start_date));
                 break;
             default:
                 $time = date('Y-m', strtotime("+{$i} MONTH", $this->report->start_date));
                 break;
         }
         // Set the customer signups for each period.
         $customer_count = 0;
         foreach ($customers as $customer) {
             if (date('day' == $this->report->chart_groupby ? 'Y-m-d' : 'Y-m', strtotime($customer->user_registered)) == $time) {
                 $customer_count++;
             }
         }
         $period_totals[$time] = array('sales' => wc_format_decimal(0.0, 2), 'orders' => 0, 'items' => 0, 'tax' => wc_format_decimal(0.0, 2), 'shipping' => wc_format_decimal(0.0, 2), 'discount' => wc_format_decimal(0.0, 2), 'customers' => $customer_count);
     }
     // add total sales, total order count, total tax and total shipping for each period
     foreach ($report_data->orders as $order) {
         $time = 'day' === $this->report->chart_groupby ? date('Y-m-d', strtotime($order->post_date)) : date('Y-m', strtotime($order->post_date));
         if (!isset($period_totals[$time])) {
             continue;
         }
         $period_totals[$time]['sales'] = wc_format_decimal($order->total_sales, 2);
         $period_totals[$time]['tax'] = wc_format_decimal($order->total_tax + $order->total_shipping_tax, 2);
         $period_totals[$time]['shipping'] = wc_format_decimal($order->total_shipping, 2);
     }
     foreach ($report_data->order_counts as $order) {
         $time = 'day' === $this->report->chart_groupby ? date('Y-m-d', strtotime($order->post_date)) : date('Y-m', strtotime($order->post_date));
         if (!isset($period_totals[$time])) {
             continue;
         }
         $period_totals[$time]['orders'] = (int) $order->count;
     }
     // Add total order items for each period.
     foreach ($report_data->order_items as $order_item) {
         $time = 'day' === $this->report->chart_groupby ? date('Y-m-d', strtotime($order_item->post_date)) : date('Y-m', strtotime($order_item->post_date));
         if (!isset($period_totals[$time])) {
             continue;
         }
         $period_totals[$time]['items'] = (int) $order_item->order_item_count;
     }
     // Add total discount for each period.
     foreach ($report_data->coupons as $discount) {
         $time = 'day' === $this->report->chart_groupby ? date('Y-m-d', strtotime($discount->post_date)) : date('Y-m', strtotime($discount->post_date));
         if (!isset($period_totals[$time])) {
             continue;
         }
         $period_totals[$time]['discount'] = wc_format_decimal($discount->discount_amount, 2);
     }
     $sales_data = array('total_sales' => $report_data->total_sales, 'net_sales' => $report_data->net_sales, 'average_sales' => $report_data->average_sales, 'total_orders' => $report_data->total_orders, 'total_items' => $report_data->total_items, 'total_tax' => wc_format_decimal($report_data->total_tax + $report_data->total_shipping_tax, 2), 'total_shipping' => $report_data->total_shipping, 'total_refunds' => $report_data->total_refunds, 'total_discount' => $report_data->total_coupons, 'totals_grouped_by' => $this->report->chart_groupby, 'totals' => $period_totals, 'total_customers' => $total_customers);
     $context = !empty($request['context']) ? $request['context'] : 'view';
     $data = $this->add_additional_fields_to_object($sales_data, $request);
     $data = $this->filter_response_by_context($data, $context);
     // Wrap the data in a response object.
     $response = rest_ensure_response($data);
     $response->add_links(array('about' => array('href' => rest_url(sprintf('%s/reports', $this->namespace)))));
     /**
      * Filter a report sales returned from the API.
      *
      * Allows modification of the report sales data right before it is returned.
      *
      * @param WP_REST_Response $response The response object.
      * @param stdClass         $data     The original report object.
      * @param WP_REST_Request  $request  Request used to generate the response.
      */
     return apply_filters('woocommerce_rest_prepare_report_sales', $response, (object) $sales_data, $request);
 }