Skip to content

Commit

Permalink
Add coupons count to data store and hook up to summary numbers in ord…
Browse files Browse the repository at this point in the history
…ers report (woocommerce#1912)

* Change coupons sum to distinct coupon count in REST API

* Hook up unique coupon count to orders summary numbers

* Add coupons count to order segmenting

* Add coupons count to expected stats in order test and revenue tests
  • Loading branch information
joshuatf authored Apr 1, 2019
1 parent 4257b19 commit 0e2517d
Show file tree
Hide file tree
Showing 11 changed files with 205 additions and 17 deletions.
6 changes: 3 additions & 3 deletions client/analytics/report/orders/table.js
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ export default class OrdersReportTable extends Component {
num_returning_customers = 0,
products = 0,
num_items_sold = 0,
coupons = 0,
coupons_count = 0,
net_revenue = 0,
} = totals;
return [
Expand Down Expand Up @@ -222,8 +222,8 @@ export default class OrdersReportTable extends Component {
value: numberFormat( num_items_sold ),
},
{
label: _n( 'coupon', 'coupons', coupons, 'woocommerce-admin' ),
value: numberFormat( coupons ),
label: _n( 'coupon', 'coupons', coupons_count, 'woocommerce-admin' ),
value: numberFormat( coupons_count ),
},
{
label: __( 'net revenue', 'woocommerce-admin' ),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,14 @@ public function get_item_schema() {
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
'coupons' => array(
'description' => __( 'Amount discounted by coupons', 'woocommerce-admin' ),
'coupons' => array(
'description' => __( 'Amount discounted by coupons.', 'woocommerce-admin' ),
'type' => 'number',
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
'coupons_count' => array(
'description' => __( 'Unique coupons count.', 'woocommerce-admin' ),
'type' => 'number',
'context' => array( 'view', 'edit' ),
'readonly' => true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,14 @@ public function get_item_schema() {
'indicator' => true,
'format' => 'currency',
),
'coupons' => array(
'description' => __( 'Total of coupons.', 'woocommerce-admin' ),
'coupons' => array(
'description' => __( 'Amount discounted by coupons.', 'woocommerce-admin' ),
'type' => 'number',
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
'coupons_count' => array(
'description' => __( 'Unique coupons count.', 'woocommerce-admin' ),
'type' => 'number',
'context' => array( 'view', 'edit' ),
'readonly' => true,
Expand Down
1 change: 1 addition & 0 deletions includes/class-wc-admin-reports-orders-stats-query.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ protected function get_default_query_vars() {
'avg_items_per_order',
'num_items_sold',
'coupons',
'coupons_count',
'num_returning_customers',
'num_new_customers',
),
Expand Down
12 changes: 7 additions & 5 deletions includes/class-wc-admin-reports-orders-stats-segmenting.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ protected function get_segment_selections_product_level( $products_table ) {
'num_items_sold' => "SUM($products_table.product_qty) as num_items_sold",
'gross_revenue' => "SUM($products_table.product_gross_revenue) AS gross_revenue",
'coupons' => "SUM($products_table.coupon_amount) AS coupons",
'coupons_count' => 'COUNT( DISTINCT( coupon_lookup_left_join.coupon_id ) ) AS coupons_count',
'refunds' => "SUM($products_table.refund_amount) AS refunds",
'taxes' => "SUM($products_table.tax_amount) AS taxes",
'shipping' => "SUM($products_table.shipping_amount) AS shipping",
Expand Down Expand Up @@ -66,6 +67,7 @@ protected function segment_selections_orders( $order_stats_table, $overrides = a
'num_items_sold' => "SUM($order_stats_table.num_items_sold) as num_items_sold",
'gross_revenue' => "SUM($order_stats_table.gross_total) AS gross_revenue",
'coupons' => "SUM($order_stats_table.coupon_total) AS coupons",
'coupons_count' => 'COUNT( DISTINCT(coupon_lookup_left_join.coupon_id) ) AS coupons_count',
'refunds' => "SUM($order_stats_table.refund_total) AS refunds",
'taxes' => "SUM($order_stats_table.tax_total) AS taxes",
'shipping' => "SUM($order_stats_table.shipping_total) AS shipping",
Expand Down Expand Up @@ -348,6 +350,7 @@ protected function get_segments( $type, $query_params, $table_name ) {

$product_segmenting_table = $wpdb->prefix . 'wc_order_product_lookup';
$unique_orders_table = 'uniq_orders';
$segmenting_from = "LEFT JOIN {$wpdb->prefix}wc_order_coupon_lookup AS coupon_lookup_left_join ON ($table_name.order_id = coupon_lookup_left_join.order_id) ";
$segmenting_where = '';

// Product, variation, and category are bound to product, so here product segmenting table is required,
Expand All @@ -359,7 +362,7 @@ protected function get_segments( $type, $query_params, $table_name ) {
'product_level' => $this->get_segment_selections_product_level( $product_segmenting_table ),
'order_level' => $this->get_segment_selections_order_level( $unique_orders_table ),
);
$segmenting_from = "INNER JOIN $product_segmenting_table ON ($table_name.order_id = $product_segmenting_table.order_id)";
$segmenting_from .= "INNER JOIN $product_segmenting_table ON ($table_name.order_id = $product_segmenting_table.order_id)";
$segmenting_groupby = $product_segmenting_table . '.product_id';
$segmenting_dimension_name = 'product_id';

Expand All @@ -373,7 +376,7 @@ protected function get_segments( $type, $query_params, $table_name ) {
'product_level' => $this->get_segment_selections_product_level( $product_segmenting_table ),
'order_level' => $this->get_segment_selections_order_level( $unique_orders_table ),
);
$segmenting_from = "INNER JOIN $product_segmenting_table ON ($table_name.order_id = $product_segmenting_table.order_id)";
$segmenting_from .= "INNER JOIN $product_segmenting_table ON ($table_name.order_id = $product_segmenting_table.order_id)";
$segmenting_where = "AND $product_segmenting_table.product_id = {$this->query_args['product_includes'][0]}";
$segmenting_groupby = $product_segmenting_table . '.variation_id';
$segmenting_dimension_name = 'variation_id';
Expand All @@ -384,7 +387,7 @@ protected function get_segments( $type, $query_params, $table_name ) {
'product_level' => $this->get_segment_selections_product_level( $product_segmenting_table ),
'order_level' => $this->get_segment_selections_order_level( $unique_orders_table ),
);
$segmenting_from = "
$segmenting_from .= "
INNER JOIN $product_segmenting_table ON ($table_name.order_id = $product_segmenting_table.order_id)
LEFT JOIN {$wpdb->prefix}term_relationships ON {$product_segmenting_table}.product_id = {$wpdb->prefix}term_relationships.object_id
RIGHT JOIN {$wpdb->prefix}term_taxonomy ON {$wpdb->prefix}term_relationships.term_taxonomy_id = {$wpdb->prefix}term_taxonomy.term_taxonomy_id
Expand All @@ -400,15 +403,14 @@ protected function get_segments( $type, $query_params, $table_name ) {
'coupons' => 'SUM(coupon_lookup.discount_amount) AS coupons',
);
$segmenting_selections = $this->segment_selections_orders( $table_name, $coupon_override );
$segmenting_from = "
$segmenting_from .= "
INNER JOIN {$wpdb->prefix}wc_order_coupon_lookup AS coupon_lookup ON ($table_name.order_id = coupon_lookup.order_id)
";
$segmenting_groupby = 'coupon_lookup.coupon_id';

$segments = $this->get_order_related_segments( $type, $segmenting_selections, $segmenting_from, $segmenting_where, $segmenting_groupby, $table_name, $query_params );
} elseif ( 'customer_type' === $this->query_args['segmentby'] ) {
$segmenting_selections = $this->segment_selections_orders( $table_name );
$segmenting_from = '';
$segmenting_groupby = "$table_name.returning_customer";

$segments = $this->get_order_related_segments( $type, $segmenting_selections, $segmenting_from, $segmenting_where, $segmenting_groupby, $table_name, $query_params );
Expand Down
1 change: 1 addition & 0 deletions includes/class-wc-admin-reports-revenue-query.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ protected function get_default_query_vars() {
'num_items_sold',
'gross_revenue',
'coupons',
'coupons_count',
'refunds',
'taxes',
'shipping',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class WC_Admin_Reports_Orders_Stats_Data_Store extends WC_Admin_Reports_Data_Sto
'num_items_sold' => 'intval',
'gross_revenue' => 'floatval',
'coupons' => 'floatval',
'coupons_count' => 'intval',
'refunds' => 'floatval',
'taxes' => 'floatval',
'shipping' => 'floatval',
Expand All @@ -58,6 +59,7 @@ class WC_Admin_Reports_Orders_Stats_Data_Store extends WC_Admin_Reports_Data_Sto
'num_items_sold' => 'SUM(num_items_sold) as num_items_sold',
'gross_revenue' => 'SUM(gross_total) AS gross_revenue',
'coupons' => 'SUM(coupon_total) AS coupons',
'coupons_count' => 'COUNT(DISTINCT coupon_id) as coupons_count',
'refunds' => 'SUM(refund_total) AS refunds',
'taxes' => 'SUM(tax_total) AS taxes',
'shipping' => 'SUM(shipping_total) AS shipping',
Expand Down Expand Up @@ -231,6 +233,9 @@ public function get_data( $query_args ) {
FROM
{$table_name}
{$totals_query['from_clause']}
LEFT JOIN
{$wpdb->prefix}wc_order_coupon_lookup
ON {$wpdb->prefix}wc_order_coupon_lookup.order_id = {$wpdb->prefix}wc_order_stats.order_id
WHERE
1=1
{$totals_query['where_time_clause']}
Expand All @@ -253,6 +258,9 @@ public function get_data( $query_args ) {
FROM
{$table_name}
{$intervals_query['from_clause']}
LEFT JOIN
{$wpdb->prefix}wc_order_coupon_lookup
ON {$wpdb->prefix}wc_order_coupon_lookup.order_id = {$wpdb->prefix}wc_order_stats.order_id
WHERE
1=1
{$intervals_query['where_time_clause']}
Expand All @@ -277,12 +285,15 @@ public function get_data( $query_args ) {

$intervals = $wpdb->get_results(
"SELECT
MAX(date_created) AS datetime_anchor,
MAX({$table_name}.date_created) AS datetime_anchor,
{$intervals_query['select_clause']} AS time_interval
{$selections}
FROM
{$table_name}
{$intervals_query['from_clause']}
LEFT JOIN
{$wpdb->prefix}wc_order_coupon_lookup
ON {$wpdb->prefix}wc_order_coupon_lookup.order_id = {$wpdb->prefix}wc_order_stats.order_id
WHERE
1=1
{$intervals_query['where_time_clause']}
Expand Down
6 changes: 4 additions & 2 deletions tests/api/reports-orders-stats.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,13 +94,14 @@ public function test_reports_schema() {
$this->assertArrayHasKey( 'intervals', $properties );

$totals = $properties['totals']['properties'];
$this->assertEquals( 10, count( $totals ) );
$this->assertEquals( 11, count( $totals ) );
$this->assertArrayHasKey( 'net_revenue', $totals );
$this->assertArrayHasKey( 'avg_order_value', $totals );
$this->assertArrayHasKey( 'orders_count', $totals );
$this->assertArrayHasKey( 'avg_items_per_order', $totals );
$this->assertArrayHasKey( 'num_items_sold', $totals );
$this->assertArrayHasKey( 'coupons', $totals );
$this->assertArrayHasKey( 'coupons_count', $totals );
$this->assertArrayHasKey( 'num_returning_customers', $totals );
$this->assertArrayHasKey( 'num_new_customers', $totals );
$this->assertArrayHasKey( 'products', $totals );
Expand All @@ -116,13 +117,14 @@ public function test_reports_schema() {
$this->assertArrayHasKey( 'subtotals', $intervals );

$subtotals = $properties['intervals']['items']['properties']['subtotals']['properties'];
$this->assertEquals( 9, count( $subtotals ) );
$this->assertEquals( 10, count( $subtotals ) );
$this->assertArrayHasKey( 'net_revenue', $subtotals );
$this->assertArrayHasKey( 'avg_order_value', $subtotals );
$this->assertArrayHasKey( 'orders_count', $subtotals );
$this->assertArrayHasKey( 'avg_items_per_order', $subtotals );
$this->assertArrayHasKey( 'num_items_sold', $subtotals );
$this->assertArrayHasKey( 'coupons', $subtotals );
$this->assertArrayHasKey( 'coupons_count', $subtotals );
$this->assertArrayHasKey( 'num_returning_customers', $subtotals );
$this->assertArrayHasKey( 'num_new_customers', $subtotals );
$this->assertArrayHasKey( 'segments', $subtotals );
Expand Down
6 changes: 4 additions & 2 deletions tests/api/reports-revenue-stats.php
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,11 @@ public function test_reports_schema() {
$this->assertArrayHasKey( 'intervals', $properties );

$totals = $properties['totals']['properties'];
$this->assertEquals( 10, count( $totals ) );
$this->assertEquals( 11, count( $totals ) );
$this->assertArrayHasKey( 'gross_revenue', $totals );
$this->assertArrayHasKey( 'net_revenue', $totals );
$this->assertArrayHasKey( 'coupons', $totals );
$this->assertArrayHasKey( 'coupons_count', $totals );
$this->assertArrayHasKey( 'shipping', $totals );
$this->assertArrayHasKey( 'taxes', $totals );
$this->assertArrayHasKey( 'refunds', $totals );
Expand All @@ -119,10 +120,11 @@ public function test_reports_schema() {
$this->assertArrayHasKey( 'subtotals', $intervals );

$subtotals = $properties['intervals']['items']['properties']['subtotals']['properties'];
$this->assertEquals( 9, count( $subtotals ) );
$this->assertEquals( 10, count( $subtotals ) );
$this->assertArrayHasKey( 'gross_revenue', $subtotals );
$this->assertArrayHasKey( 'net_revenue', $subtotals );
$this->assertArrayHasKey( 'coupons', $subtotals );
$this->assertArrayHasKey( 'coupons_count', $subtotals );
$this->assertArrayHasKey( 'shipping', $subtotals );
$this->assertArrayHasKey( 'taxes', $subtotals );
$this->assertArrayHasKey( 'refunds', $subtotals );
Expand Down
Loading

0 comments on commit 0e2517d

Please sign in to comment.