* Add item and shipping refund calucations to taxes on order update

* Sync taxes on refund delete

* Fix up tax stats API testing

* Add refunds to tax stats API tests
This commit is contained in:
Joshua T Flowers 2019-02-18 10:20:16 +08:00 committed by GitHub
parent 6a11764397
commit f0ec3c49a1
2 changed files with 62 additions and 43 deletions

View File

@ -71,6 +71,7 @@ class WC_Admin_Reports_Taxes_Data_Store extends WC_Admin_Reports_Data_Store impl
*/ */
public static function init() { public static function init() {
add_action( 'woocommerce_reports_delete_order_stats', array( __CLASS__, 'sync_on_order_delete' ), 15 ); add_action( 'woocommerce_reports_delete_order_stats', array( __CLASS__, 'sync_on_order_delete' ), 15 );
add_action( 'woocommerce_refund_deleted', array( __CLASS__, 'sync_on_refund_delete' ), 10, 2 );
} }
/** /**
@ -267,15 +268,24 @@ class WC_Admin_Reports_Taxes_Data_Store extends WC_Admin_Reports_Data_Store impl
$num_updated = 0; $num_updated = 0;
foreach ( $tax_items as $tax_item ) { foreach ( $tax_items as $tax_item ) {
$item_refunds = 0;
$shipping_refunds = 0;
foreach ( $order->get_items() as $item_id => $item ) {
$item_refunds += $order->get_tax_refunded_for_item( $item_id, $tax_item->get_rate_id() );
}
foreach ( $order->get_items( 'shipping' ) as $item_id => $item ) {
$shipping_refunds += $order->get_tax_refunded_for_item( $item_id, $tax_item->get_rate_id(), 'shipping' );
}
$result = $wpdb->replace( $result = $wpdb->replace(
$wpdb->prefix . self::TABLE_NAME, $wpdb->prefix . self::TABLE_NAME,
array( array(
'order_id' => $order->get_id(), 'order_id' => $order->get_id(),
'date_created' => $order->get_date_created( 'edit' )->date( WC_Admin_Reports_Interval::$sql_datetime_format ), 'date_created' => $order->get_date_created( 'edit' )->date( WC_Admin_Reports_Interval::$sql_datetime_format ),
'tax_rate_id' => $tax_item->get_rate_id(), 'tax_rate_id' => $tax_item->get_rate_id(),
'shipping_tax' => $tax_item->get_shipping_tax_total(), 'shipping_tax' => $tax_item->get_shipping_tax_total() - $shipping_refunds,
'order_tax' => $tax_item->get_tax_total(), 'order_tax' => $tax_item->get_tax_total() - $item_refunds,
'total_tax' => $tax_item->get_tax_total() + $tax_item->get_shipping_tax_total(), 'total_tax' => $tax_item->get_tax_total() + $tax_item->get_shipping_tax_total() - $item_refunds - $shipping_refunds,
), ),
array( array(
'%d', '%d',
@ -326,4 +336,14 @@ class WC_Admin_Reports_Taxes_Data_Store extends WC_Admin_Reports_Data_Store impl
*/ */
do_action( 'woocommerce_reports_delete_tax', 0, $order_id ); do_action( 'woocommerce_reports_delete_tax', 0, $order_id );
} }
/**
* Syncs tax information when a refund is deleted.
*
* @param int $refund_id Refund ID.
* @param int $order_id Order ID.
*/
public static function sync_on_refund_delete( $refund_id, $order_id ) {
self::sync_order_taxes( $order_id );
}
} }

View File

@ -55,52 +55,51 @@ class WC_Tests_API_Reports_Taxes_Stats extends WC_REST_Unit_Test_Case {
WC_Helper_Reports::reset_stats_dbs(); WC_Helper_Reports::reset_stats_dbs();
// Populate all of the data. // Populate all of the data.
$tax = WC_Tax::_insert_tax_rate(
array(
'tax_rate_country' => 'US',
'tax_rate_state' => '',
'tax_rate' => '7',
'tax_rate_name' => 'TestTax',
'tax_rate_priority' => '1',
'tax_rate_compound' => '0',
'tax_rate_shipping' => '1',
'tax_rate_order' => '1',
'tax_rate_class' => '',
)
);
$product = new WC_Product_Simple(); $product = new WC_Product_Simple();
$product->set_name( 'Test Product' ); $product->set_name( 'Test Product' );
$product->set_regular_price( 25 ); $product->set_regular_price( 25 );
$product->set_tax_class( 'TestTax' );
$product->save(); $product->save();
$wpdb->insert( update_option( 'woocommerce_calc_taxes', 'yes' );
$wpdb->prefix . 'woocommerce_tax_rates',
array(
'tax_rate_id' => 1,
'tax_rate' => '7',
'tax_rate_country' => 'US',
'tax_rate_state' => 'GA',
'tax_rate_name' => 'TestTax',
'tax_rate_priority' => 1,
'tax_rate_order' => 1,
)
);
$order = WC_Helper_Order::create_order( 1, $product ); $order = WC_Helper_Order::create_order( 1, $product );
$order->set_status( 'completed' ); $order->set_status( 'completed' );
$order->set_total( 100 ); // $25 x 4. $order->set_total( 100 ); // $25 x 4.
$order->calculate_taxes();
$order->save(); $order->save();
// @todo Remove this once order data is synced to wc_order_tax_lookup // Add refunds to line items.
$wpdb->insert( foreach ( $order->get_items() as $item_id => $item ) {
$wpdb->prefix . 'wc_order_tax_lookup', $refund = array(
array( 'amount' => 1,
'order_id' => 1, 'reason' => 'Testing line item refund',
'tax_rate_id' => 1, 'order_id' => $order->get_id(),
'date_created' => date( 'Y-m-d H:i:s' ), 'line_items' => array(
'shipping_tax' => 2, $item_id => array(
'order_tax' => 5, 'qty' => 1,
'total_tax' => 7, 'refund_total' => 1,
) 'refund_tax' => array( $tax => 1 ),
); ),
$wpdb->insert( ),
$wpdb->prefix . 'wc_order_tax_lookup',
array(
'order_id' => 2,
'tax_rate_id' => 1,
'date_created' => date( 'Y-m-d H:i:s' ),
'shipping_tax' => 1,
'order_tax' => 8,
'total_tax' => 9,
)
); );
$wc_refund = wc_create_refund( $refund );
}
WC_Helper_Queue::run_all_pending();
$response = $this->server->dispatch( new WP_REST_Request( 'GET', $this->endpoint ) ); $response = $this->server->dispatch( new WP_REST_Request( 'GET', $this->endpoint ) );
$reports = $response->get_data(); $reports = $response->get_data();
@ -111,10 +110,10 @@ class WC_Tests_API_Reports_Taxes_Stats extends WC_REST_Unit_Test_Case {
$tax_report = reset( $reports ); $tax_report = reset( $reports );
$this->assertEquals( 1, $tax_report['tax_codes'] ); $this->assertEquals( 1, $tax_report['tax_codes'] );
$this->assertEquals( 16, $tax_report['total_tax'] ); $this->assertEquals( 6.7, $tax_report['total_tax'] ); // 110 * 0.07 (tax rate) - 1 (refund)
$this->assertEquals( 13, $tax_report['order_tax'] ); $this->assertEquals( 6, $tax_report['order_tax'] ); // 100 * 0.07 (tax rate) - 1 (refund)
$this->assertEquals( 3, $tax_report['shipping_tax'] ); $this->assertEquals( 0.7, $tax_report['shipping_tax'] );
$this->assertEquals( 2, $tax_report['orders_count'] ); $this->assertEquals( 1, $tax_report['orders_count'] );
} }
/** /**